#automation #peace #compile-time #framework #profile #macro #validation

macro peace_static_check_macros

Compile time validation macros for the peace automation framework

11 releases

0.0.13 Feb 3, 2024
0.0.12 Dec 29, 2023
0.0.11 Jun 27, 2023
0.0.8 Mar 25, 2023
0.0.4 Nov 29, 2022

#31 in #peace

Download history 23/week @ 2023-12-03 21/week @ 2023-12-10 50/week @ 2023-12-17 120/week @ 2023-12-24 38/week @ 2023-12-31 41/week @ 2024-01-07 26/week @ 2024-01-14 21/week @ 2024-01-21 57/week @ 2024-01-28 40/week @ 2024-02-04 32/week @ 2024-02-11 67/week @ 2024-02-18 119/week @ 2024-02-25 49/week @ 2024-03-03 72/week @ 2024-03-10 64/week @ 2024-03-17

304 downloads per month
Used in 27 crates (via peace_core)

MIT/Apache

18KB
189 lines

🕊️ peace – zero stress automation

Crates.io docs.rs CI Coverage Status

peace is a framework to build empathetic and forgiving software automation.

See:

  • peace.mk for the project vision.
  • Background for the motivation to create this framework.
  • Operations UX for a book about the dimensions considered during peace's design and development.

Guiding Principles

  • A joy to use.
  • Ergonomic API and guidance to do the right thing.
  • Understandable output.

Features

Symbol Meaning
🟢 Works well
🟡 Partial support
Planned
🔵 Compatible by design
🟣 Works, "fun idea"
  • 🟢 Idempotent: Multiple invocations result in the goal outcome.
  • 🟢 Clean: Every item creation is paired with how it is cleaned up.
  • 🟢 Understandable: Progress is shown at an understandable level of detail.
  • 🔵 Understandable: Error reporting is compatible with miette.
  • 🟡 Interruptible: Execution can be interrupted.
  • 🟢 Resumable: Automation resumes where it was interrupted.
  • 🟢 Diffable: States and diffs are serialized as YAML.
  • 🟢 Efficient: Tasks are concurrently executed via fn_graph.
  • 🟢 Namespaced: Profile directories isolate environments from each other.
  • 🟢 Type Safe: Items and parameters are defined in code, not configuration.

Roadmap

  • 🟢 Define items to manage with automation.
  • 🟢 Define dependencies between items.
  • 🟢 Define "apply" logic.
  • 🟢 Define "clean up" logic.
  • 🟢 Discover current and goal states.
  • 🟢 Define diff calculation between states.
  • 🟢 Store and recall parameters across commands.
  • 🟢 Diff states between multiple profiles.
  • 🟢 Type-safe referential parameters -- specify usage of values generated during automation as parameters to subsequent items.
  • 🟡 Feature-gated incremental functionality.
  • 🟡 Off-the-shelf support for common items.
  • 🟡 Dry run.
  • 🟣 WASM support.
  • ⚫ Cancel-safe interruption via tokio-graceful-shutdown.
  • ⚫ Secure-by-design Support: Encrypted value storage, decrypted per execution / time based agent.
  • ⚫ Tutorial for writing a software lifecycle management tool.
  • ⚫ Built-in application execution methods -- CLI, web service.
  • peace binary for configuration based workflows.
  • ⚫ Web based UI with interactive graph.
  • ⚫ Agent mode to run peace on servers (Web API invocation).

Further ideas:

  • Back up current state.
  • Restore previous state.
  • Telemetry / metrics logging for analysis.

Examples

Examples are run using --package instead of --example, as each example is organized as its own crate.

cargo run --package $example_name --all-features

# e.g.
cargo build --package download --all-features
cargo run -q --package download --all-features -- init https://ifconfig.me ip.json

for cmd in status goal diff ensure ensure diff clean clean diff
do
    printf "=== ${cmd} ===\n"
    cargo run -q --package download --all-features -- --format text $cmd
    printf '\n'
done

# Look at metadata that Peace has saved
find .peace -type f -exec bash -c 'echo \# {}; cat {}; echo' \;

# Clean up the metadata directory
rm -rf .peace

WASM

The download example can be built as a web assembly application using wasm-pack:

cd examples/download
wasm-pack build --target web

In the examples/download directory, start an HTTP server, and open http://localhost:8000/:

python3 -m http.server 8000 # or
simple-http-server --nocache --port 8000 -i

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~310–760KB
~18K SLoC