~muirrum/solarlib

5429fcc0859c93da965e91e94e6676c2e6cdd24e — Cara Salter 1 year, 11 months ago ec087f3
colony: Initial cloud-init support
4 files changed, 52 insertions(+), 5 deletions(-)

M Cargo.toml
A src/colony.rs
M src/lib.rs
M src/ship.rs
M Cargo.toml => Cargo.toml +2 -1
@@ 1,6 1,6 @@
[package]
name = "solarlib"
version = "1.5.0"
version = "1.6.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html


@@ 15,6 15,7 @@ thiserror = "1"

rand = "0.8"
mac_address = "1"
ulid = { version = "0.6.0", features = ["serde"] }

[dependencies.serde]
version = "1"

A src/colony.rs => src/colony.rs +38 -0
@@ 0,0 1,38 @@
/*!
 * A Colony is cloud-init data that can be used to set up a new planet
 **/

/*
 * Colonies basically need to store things like any files that need to be created in the VM and 
 * users that should be added. This needs to be serialized into a cloud-init document that can then
 * (somehow) be thrown into QEMU
 */

use serde::{Deserialize, Serialize};
use ulid::Ulid;

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Colony {
    pub user_data: UserData,
    pub meta_data: MetaData,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct UserData {
    pub users: Vec<User>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct User {
    pub name: String,
    pub groups: Vec<String>,
    pub ssh_authorized_keys: Vec<String>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MetaData {
    #[serde(rename = "instance-id")]
    pub instance_id: Ulid,
    #[serde(rename = "local-hostname")]
    pub hostname: String
}

M src/lib.rs => src/lib.rs +2 -0
@@ 6,4 6,6 @@ pub mod star;

pub mod ship;

pub mod colony;

include!(concat!(env!("OUT_DIR"), "/templates.rs"));

M src/ship.rs => src/ship.rs +10 -4
@@ 39,6 39,8 @@ pub struct Ship {
    pub download_url: String,
    /// The commonly accepted version (e.g "rolling", "21.11", "unstable")
    pub version: String,
    /// Whether this ship supports the use of cloud-init (Colonies)
    pub colonizable: bool
}

/// Describes a starship generated from a database


@@ 50,7 52,8 @@ pub struct DbShip {
    pub name: String,
    pub shasum: String,
    pub download_url: String,
    pub version: String
    pub version: String,
    pub colonizable: bool,
}

impl From<DbShip> for Ship {


@@ 59,7 62,8 @@ impl From<DbShip> for Ship {
           name: o.name,
           shasum: Sha256(o.shasum),
           download_url: o.download_url,
           version: o.version
           version: o.version,
           colonizable: o.colonizable
        }
    }
}


@@ 68,13 72,15 @@ impl Ship {
    pub fn new(name: String,
               shasum: String,
               download_url: String,
               version: String
               version: String,
               colonizable: bool,
               ) -> Self {
        Self {
            name,
            shasum: Sha256(shasum),
            download_url,
            version
            version,
            colonizable
        }
    }