reorder run params & update README
All checks were successful
Run Check Script / check (pull_request) Successful in -49s

This commit is contained in:
Ian Letourneau 2025-08-04 16:56:19 -04:00
parent eab27b1f66
commit acf7e2f8b8
9 changed files with 44 additions and 45 deletions

View File

@ -1,5 +1,6 @@
# Harmony : Open-source infrastructure orchestration that treats your platform like first-class code. # Harmony : Open-source infrastructure orchestration that treats your platform like first-class code
*By [NationTech](https://nationtech.io)*
_By [NationTech](https://nationtech.io)_
[![Build](https://git.nationtech.io/NationTech/harmony/actions/workflows/check.yml/badge.svg)](https://git.nationtech.io/nationtech/harmony) [![Build](https://git.nationtech.io/NationTech/harmony/actions/workflows/check.yml/badge.svg)](https://git.nationtech.io/nationtech/harmony)
[![License](https://img.shields.io/badge/license-AGPLv3-blue?style=flat-square)](LICENSE) [![License](https://img.shields.io/badge/license-AGPLv3-blue?style=flat-square)](LICENSE)
@ -23,11 +24,11 @@ From a **developer laptop** to a **global production cluster**, a single **sourc
Infrastructure is essential, but it shouldnt be your core business. Harmony is built on three guiding principles that make modern platforms reliable, repeatable, and easy to reason about. Infrastructure is essential, but it shouldnt be your core business. Harmony is built on three guiding principles that make modern platforms reliable, repeatable, and easy to reason about.
| Principle | What it means for you | | Principle | What it means for you |
|-----------|-----------------------| | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Infrastructure as Resilient Code** | Replace sprawling YAML and bash scripts with type-safe Rust. Test, refactor, and version your platform just like application code. | | **Infrastructure as Resilient Code** | Replace sprawling YAML and bash scripts with type-safe Rust. Test, refactor, and version your platform just like application code. |
| **Prove It Works — Before You Deploy** | Harmony uses the compiler to verify that your applications needs match the target environments capabilities at **compile-time**, eliminating an entire class of runtime outages. | | **Prove It Works — Before You Deploy** | Harmony uses the compiler to verify that your applications needs match the target environments capabilities at **compile-time**, eliminating an entire class of runtime outages. |
| **One Unified Model** | Software and infrastructure are a single system. Harmony models them together, enabling deep automation—from bare-metal servers to Kubernetes workloads—with zero context switching. | | **One Unified Model** | Software and infrastructure are a single system. Harmony models them together, enabling deep automation—from bare-metal servers to Kubernetes workloads—with zero context switching. |
These principles surface as simple, ergonomic Rust APIs that let teams focus on their product while trusting the platform underneath. These principles surface as simple, ergonomic Rust APIs that let teams focus on their product while trusting the platform underneath.
@ -63,22 +64,20 @@ async fn main() {
}, },
}; };
// 2. Pick where it should run // 2. Enhance with extra scores (monitoring, CI/CD, …)
let mut maestro = Maestro::<K8sAnywhereTopology>::initialize(
Inventory::autoload(), // auto-detect hardware / kube-config
K8sAnywhereTopology::from_env(), // local k3d, CI, staging, prod…
)
.await
.unwrap();
// 3. Enhance with extra scores (monitoring, CI/CD, …)
let mut monitoring = MonitoringAlertingStackScore::new(); let mut monitoring = MonitoringAlertingStackScore::new();
monitoring.namespace = Some(lamp_stack.config.namespace.clone()); monitoring.namespace = Some(lamp_stack.config.namespace.clone());
maestro.register_all(vec![Box::new(lamp_stack), Box::new(monitoring)]); // 3. Run your scores on the desired topology & inventory
harmony_cli::run(
// 4. Launch an interactive CLI / TUI Inventory::autoload(), // auto-detect hardware / kube-config
harmony_cli::init(maestro, None).await.unwrap(); K8sAnywhereTopology::from_env(), // local k3d, CI, staging, prod…
vec![
Box::new(lamp_stack),
Box::new(monitoring)
],
None
).await.unwrap();
} }
``` ```
@ -94,13 +93,13 @@ Harmony analyses the code, shows an execution plan in a TUI, and applies it once
## 3 · Core Concepts ## 3 · Core Concepts
| Term | One-liner | | Term | One-liner |
|------|-----------| | ---------------- | ---------------------------------------------------------------------------------------------------- |
| **Score<T>** | Declarative description of the desired state (e.g., `LAMPScore`). | | **Score<T>** | Declarative description of the desired state (e.g., `LAMPScore`). |
| **Interpret<T>** | Imperative logic that realises a `Score` on a specific environment. | | **Interpret<T>** | Imperative logic that realises a `Score` on a specific environment. |
| **Topology** | An environment (local k3d, AWS, bare-metal) exposing verified *Capabilities* (Kubernetes, DNS, …). | | **Topology** | An environment (local k3d, AWS, bare-metal) exposing verified _Capabilities_ (Kubernetes, DNS, …). |
| **Maestro** | Orchestrator that compiles Scores + Topology, ensuring all capabilities line up **at compile-time**. | | **Maestro** | Orchestrator that compiles Scores + Topology, ensuring all capabilities line up **at compile-time**. |
| **Inventory** | Optional catalogue of physical assets for bare-metal and edge deployments. | | **Inventory** | Optional catalogue of physical assets for bare-metal and edge deployments. |
A visual overview is in the diagram below. A visual overview is in the diagram below.
@ -112,9 +111,9 @@ A visual overview is in the diagram below.
Prerequisites: Prerequisites:
* Rust - Rust
* Docker (if you deploy locally) - Docker (if you deploy locally)
* `kubectl` / `helm` for Kubernetes-based topologies - `kubectl` / `helm` for Kubernetes-based topologies
```bash ```bash
git clone https://git.nationtech.io/nationtech/harmony git clone https://git.nationtech.io/nationtech/harmony
@ -126,15 +125,15 @@ cargo build --release # builds the CLI, TUI and libraries
## 5 · Learning More ## 5 · Learning More
* **Architectural Decision Records** dive into the rationale - **Architectural Decision Records** dive into the rationale
- [ADR-001 · Why Rust](adr/001-rust.md) - [ADR-001 · Why Rust](adr/001-rust.md)
- [ADR-003 · Infrastructure Abstractions](adr/003-infrastructure-abstractions.md) - [ADR-003 · Infrastructure Abstractions](adr/003-infrastructure-abstractions.md)
- [ADR-006 · Secret Management](adr/006-secret-management.md) - [ADR-006 · Secret Management](adr/006-secret-management.md)
- [ADR-011 · Multi-Tenant Cluster](adr/011-multi-tenant-cluster.md) - [ADR-011 · Multi-Tenant Cluster](adr/011-multi-tenant-cluster.md)
* **Extending Harmony** write new Scores / Interprets, add hardware like OPNsense firewalls, or embed Harmony in your own tooling (`/docs`). - **Extending Harmony** write new Scores / Interprets, add hardware like OPNsense firewalls, or embed Harmony in your own tooling (`/docs`).
* **Community** discussions and roadmap live in [GitLab issues](https://git.nationtech.io/nationtech/harmony/-/issues). PRs, ideas, and feedback are welcome! - **Community** discussions and roadmap live in [GitLab issues](https://git.nationtech.io/nationtech/harmony/-/issues). PRs, ideas, and feedback are welcome!
--- ---
@ -148,4 +147,4 @@ See [LICENSE](LICENSE) for the full text.
--- ---
*Made with ❤️ & 🦀 by the NationTech and the Harmony community* _Made with ❤️ & 🦀 by the NationTech and the Harmony community_

View File

@ -7,8 +7,8 @@ use harmony::{
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
harmony_cli::run( harmony_cli::run(
LocalhostTopology::new(),
Inventory::autoload(), Inventory::autoload(),
LocalhostTopology::new(),
vec![ vec![
Box::new(SuccessScore {}), Box::new(SuccessScore {}),
Box::new(ErrorScore {}), Box::new(ErrorScore {}),

View File

@ -43,8 +43,8 @@ async fn main() {
// locally, to development environment from a CI, to staging, and to production with settings // locally, to development environment from a CI, to staging, and to production with settings
// that automatically adapt to each environment grade. // that automatically adapt to each environment grade.
harmony_cli::run( harmony_cli::run(
K8sAnywhereTopology::from_env(),
Inventory::autoload(), Inventory::autoload(),
K8sAnywhereTopology::from_env(),
vec![Box::new(lamp_stack)], vec![Box::new(lamp_stack)],
None, None,
) )

View File

@ -75,8 +75,8 @@ async fn main() {
}; };
harmony_cli::run( harmony_cli::run(
K8sAnywhereTopology::from_env(),
Inventory::autoload(), Inventory::autoload(),
K8sAnywhereTopology::from_env(),
vec![Box::new(alerting_score)], vec![Box::new(alerting_score)],
None, None,
) )

View File

@ -79,8 +79,8 @@ async fn main() {
}; };
harmony_cli::run( harmony_cli::run(
K8sAnywhereTopology::from_env(),
Inventory::autoload(), Inventory::autoload(),
K8sAnywhereTopology::from_env(),
vec![Box::new(tenant), Box::new(alerting_score)], vec![Box::new(tenant), Box::new(alerting_score)],
None, None,
) )

View File

@ -5,8 +5,8 @@ use harmony::{
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
harmony_cli::run( harmony_cli::run(
K8sAnywhereTopology::from_env(),
Inventory::autoload(), Inventory::autoload(),
K8sAnywhereTopology::from_env(),
vec![Box::new(NtfyScore { vec![Box::new(NtfyScore {
namespace: "monitoring".to_string(), namespace: "monitoring".to_string(),
host: "localhost".to_string(), host: "localhost".to_string(),

View File

@ -31,8 +31,8 @@ async fn main() {
}; };
harmony_cli::run( harmony_cli::run(
K8sAnywhereTopology::from_env(),
Inventory::autoload(), Inventory::autoload(),
K8sAnywhereTopology::from_env(),
vec![Box::new(app)], vec![Box::new(app)],
None, None,
) )

View File

@ -16,8 +16,8 @@ async fn main() {
}; };
harmony_cli::run( harmony_cli::run(
K8sAnywhereTopology::from_env(),
Inventory::autoload(), Inventory::autoload(),
K8sAnywhereTopology::from_env(),
vec![Box::new(tenant)], vec![Box::new(tenant)],
None, None,
) )

View File

@ -87,8 +87,8 @@ fn list_scores_with_index<T: Topology>(scores_vec: &Vec<Box<dyn Score<T>>>) -> S
} }
pub async fn run<T: Topology + Send + Sync + 'static>( pub async fn run<T: Topology + Send + Sync + 'static>(
topology: T,
inventory: Inventory, inventory: Inventory,
topology: T,
scores: Vec<Box<dyn Score<T>>>, scores: Vec<Box<dyn Score<T>>>,
args_struct: Option<Args>, args_struct: Option<Args>,
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {