First look: wasmCloud and Cosmonic
Here's a first look at the developer preview of Cosmonic—a WebAssembly PaaS with its own graphical cloud user interface, robust networking, and CLI.
-
Cosmonic 0.7.0
- What is wasm?
- What is wasmCloud?
- What is Cosmonic?
- Installing and testing wasmCloud
- Installing and testing Cosmonic
- Conclusion
As you likely know by now, WebAssembly, or wasm, is an efficient, cross-platform, cross-language way to run code almost anywhere, including in a browser and on a server—even in a database. Cosmonic is a commercial platform-as-a-service (PaaS) for wasm modules. It builds on the open-source wasmCloud. This technology preview starts with a quick overview of wasm, then we'll set up wasmCloud and Cosmonic and see what we can do with them.
What is wasm?
WebAssembly (wasm) is a “binary instruction format for a stack-based virtual machine.” It’s a portable compilation target for programming languages, including C, C++, C#, Rust, Go, Java, PHP, Ruby, Swift, Python, Kotlin, Haskell, and Lua; Rust is often the preferred language for wasm. There are three wasm-specific languages: AssemblyScript, Grain, and Motoko. Wasm targets include browsers (currently Chrome, Firefox, Safari, and Edge), Node.js, Deno, Wasmtime, Wasmer, and wasm2c.
Wasm tries to run at native speed in a small amount of memory. It runs in a memory-safe, sandboxed execution environment, even on the web.
WebAssembly System Interface (WASI) is a modular system interface for WebAssembly. Wasm has a component model with a W3C proposed specification. WebAssembly Gateway Interface (Wagi) is a proposed implementation of CGI for wasm and WASI. Spin is a multi-language framework for wasm applications.
What is wasmCloud?
wasmCloud is a CNCF-owned open source software platform that uses wasm and NATS to build distributed applications composed of portable units of WebAssembly business logic called actors. wasmCloud supports TinyGo and Rust for actor development. It also supports building platforms, which are capability providers. wasmCloud includes lattice, a self-forming, self-healing mesh network using NATS that provides a unified, flattened topology. wasmCloud runs almost everywhere: in the cloud, at the edge, in the browser, on small devices, and so on. The wasmCloud host runtime uses Elixir/OTP and Rust.
Many wasmCloud committers and maintainers work for Cosmonic (the company). Additionally, the wasmCloud wash
cloud shell works with Cosmonic (the product).
What is Cosmonic?
Cosmonic is both a company and a product. The product is a WebAssembly platform as a service (PaaS) that builds on top of wasmCloud and uses wasm actors. Cosmonic offers a graphical cloud user interface for designing applications, and its own shell, cosmo
, that complements wash
and the wasmCloud GUI. Supposedly, anything you build that works in plain wasmCloud should work automatically in Cosmonic.
A host is a distributed, wasmCloud runtime process that manages actors and capability providers. An actor is a WebAssembly module that can handle messages and invoke functions on capability providers. A capability is an abstraction or representation of some functionality required by your application that is not considered part of the core business logic. A capability provider is an implementation of the representation described by a capability contract. There can be multiple providers per capability with different characteristics.
A link is a runtime-defined connection between an actor and a capability provider. Links can be changed without needing to be redeployed or recompiled.
A constellation is a managed, isolated network space that allows your actors and providers to securely communicate with each other regardless of physical or logical location; essentially, a Cosmonic-managed wasmCloud lattice. A super constellation is a larger constellation formed by securely connecting multiple environments through Cosmonic.
A wormhole is an ingress point into your constellation. An OCI distribution is a standard for artifact storage, retrieval, and distribution, implemented by (for example) the Azure Container Registry and the GitHub artifact registry.
The infrastructure view shows the virtual hosts running in your Cosmonic constellation. The logic view shows the logical relationships between components in your Cosmonic constellation or super constellation.
Installing and testing wasmCloud
Installation of wasmCloud varies with your system. I used brew
on my M1 MacBook Pro; it installed more than I wanted because of dependencies, particularly the Rust compiler and cargo package manager, which I prefer to install from the Rust language website using rustup
. Fortunately, a simple brew uninstall rust
cleared the way for a standard rustup
installation. While I was installing languages, I also installed TinyGo, the other language supported for wasmCloud actor development.
After installation, I asked the wash
shell to tell me about its capabilities:
martinheller@Martins-M1-MBP ~ % wash --help
_________________________________________________________________________________
_____ _ _ _____ _ _ _
/ ____| | | | / ____| | | | |
__ ____ _ ___ _ __ ___ | | | | ___ _ _ __| | | (___ | |__ ___| | |
\ \ /\ / / _` / __| '_ ` _ \| | | |/ _ \| | | |/ _` | \___ \| '_ \ / _ \ | |
\ V V / (_| \__ \ | | | | | |____| | (_) | |_| | (_| | ____) | | | | __/ | |
\_/\_/ \__,_|___/_| |_| |_|\_____|_|\___/ \__,_|\__,_| |_____/|_| |_|\___|_|_|
_________________________________________________________________________________
A single CLI to handle all of your wasmCloud tooling needs
Usage: wash [OPTIONS] <COMMAND>
Commands:
app Manage declarative applications and deployments (wadm) (experimental)
build Build (and sign) a wasmCloud actor, provider, or interface
call Invoke a wasmCloud actor
claims Generate and manage JWTs for wasmCloud actors
ctl Interact with a wasmCloud control interface
ctx Manage wasmCloud host configuration contexts
down Tear down a wasmCloud environment launched with wash up
drain Manage contents of local wasmCloud caches
gen Generate code from smithy IDL files
keys Utilities for generating and managing keys
lint Perform lint checks on smithy models
new Create a new project from template
par Create, inspect, and modify capability provider archive files
reg Interact with OCI compliant registries
up Bootstrap a wasmCloud environment
validate Perform validation checks on smithy models
help Print this message or the help of the given subcommand(s)
Options:
-o, --output <OUTPUT> Specify output format (text or json) [default: text]
-h, --help Print help information
-V, --version Print version information
Then I made sure I could bring up a wasmCloud:
martinheller@Martins-M1-MBP ~ % wash up
🏃 Running in interactive mode, your host is running at http://localhost:4000
🚪 Press `CTRL+c` at any time to exit
17:00:20.343 [info] Wrote configuration file host_config.json
17:00:20.344 [info] Wrote configuration file /Users/martinheller/.wash/host_config.json
17:00:20.344 [info] Connecting to control interface NATS without authentication
17:00:20.344 [info] Connecting to lattice rpc NATS without authentication
17:00:20.346 [info] Host NCZVXJWZAKMJVVBLGHTPEOVZFV4AW5VOKXMD7GWZ5OSF5YF2ECRZGXXH (gray-dawn-8348) started.
17:00:20.346 [info] Host issuer public key: CCXQKGKOAAVXUQ7MT2TQ57J4DBH67RURBKT6KEZVOHHZYPJKU6EOC3VZ
17:00:20.346 [info] Valid cluster signers: CCXQKGKOAAVXUQ7MT2TQ57J4DBH67RURBKT6KEZVOHHZYPJKU6EOC3VZ
17:00:20.351 [info] Started wasmCloud OTP Host Runtime
17:00:20.356 [info] Running WasmcloudHostWeb.Endpoint with cowboy 2.9.0 at 0.0.0.0:4000 (http)
17:00:20.357 [info] Access WasmcloudHostWeb.Endpoint at http://localhost:4000
17:00:20.453 [info] Lattice cache stream created or verified as existing (0 consumers).
17:00:20.453 [info] Attempting to create ephemeral consumer (cache loader)
17:00:20.455 [info] Created ephemeral consumer for lattice cache loader
While I had the wasmCloud running, I viewed the website at port 4000 on my local machine:
Then I stopped the wasmCloud:
martinheller@Martins-M1-MBP ~ % wash down
✅ wasmCloud host stopped successfully
✅ NATS server stopped successfully
🛁 wash down completed successfully