Compare commits
19 Commits
914988b513
..
v0.1.3
| Author | SHA1 | Date | |
|---|---|---|---|
| 8290896f9d | |||
|
f51746c5df
|
|||
|
ca72d08cc1
|
|||
| 6a7ab1f9d5 | |||
|
f7e4a2d545
|
|||
|
7142ff0fa3
|
|||
| afcca9eb47 | |||
|
c76b0e6ade
|
|||
|
8e5e02d29d
|
|||
|
c15f1ae5c4
|
|||
|
c5d39e4e51
|
|||
|
744cf3e395
|
|||
|
a9ae86d08a
|
|||
|
8aff9de90e
|
|||
|
e60738e81d
|
|||
|
9d5c095e7f
|
|||
|
2ffa196014
|
|||
|
babcf1ec23
|
|||
|
c90e95613e
|
@@ -15,9 +15,13 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
issues: write
|
issues: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- name: Checkout
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
uses: actions/checkout@v6
|
||||||
- uses: Swatinem/rust-cache@v2
|
- name: Install rust toolchain
|
||||||
- uses: rustsec/audit-check@v2.0.0
|
uses: dtolnay/rust-toolchain@nightly
|
||||||
|
- name: Setup rust cache
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
|
- name: Audit check
|
||||||
|
uses: rustsec/audit-check@v2.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITEA_TOKEN }}
|
token: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
|||||||
@@ -7,26 +7,38 @@ on:
|
|||||||
- "*"
|
- "*"
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: "${{ github.workflow }}-${{ github.ref }}"
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
prek:
|
prek:
|
||||||
name: prek
|
name: prek
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- name: Checkout
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
uses: actions/checkout@v6
|
||||||
|
- name: Install rust toolchain
|
||||||
|
uses: dtolnay/rust-toolchain@nightly
|
||||||
with:
|
with:
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
- uses: Swatinem/rust-cache@v2
|
- name: Setup rust cache
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
- uses: j178/prek-action@v2
|
- uses: j178/prek-action@v2
|
||||||
|
|
||||||
cargo-shear:
|
cargo-shear:
|
||||||
name: cargo shear
|
name: cargo shear
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- name: Checkout
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
uses: actions/checkout@v6
|
||||||
- uses: Swatinem/rust-cache@v2
|
- name: Install rust toolchain
|
||||||
- uses: taiki-e/install-action@v2
|
uses: dtolnay/rust-toolchain@nightly
|
||||||
|
- name: Setup rust cache
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
|
- name: Install cargo shear
|
||||||
|
uses: taiki-e/install-action@v2
|
||||||
with:
|
with:
|
||||||
tool: cargo-shear
|
tool: cargo-shear
|
||||||
- run: cargo shear --deny-warnings
|
- name: cargo shear
|
||||||
|
run: cargo shear --deny-warnings
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
name: Committed
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: "${{ github.workflow }}-${{ github.ref }}"
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
committed:
|
||||||
|
name: committed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: crate-ci/committed@master
|
||||||
|
with:
|
||||||
|
commits: "origin/${{ gitea.base_ref }}..HEAD"
|
||||||
@@ -14,13 +14,17 @@ jobs:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
steps:
|
steps:
|
||||||
- &checkout
|
- &checkout
|
||||||
|
name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
- name: Install rust toolchain
|
||||||
- uses: Swatinem/rust-cache@v2
|
uses: dtolnay/rust-toolchain@nightly
|
||||||
- uses: taiki-e/install-action@v2
|
- name: Setup rust cache
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
|
- name: Install release-plz
|
||||||
|
uses: taiki-e/install-action@v2
|
||||||
with:
|
with:
|
||||||
tool: release-plz
|
tool: release-plz
|
||||||
- &git-setup
|
- &git-setup
|
||||||
@@ -28,10 +32,11 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
git config user.name "Release-plz"
|
git config user.name "Release-plz"
|
||||||
git config user.email "release-plz@noreply.huizinga.dev"
|
git config user.email "release-plz@noreply.huizinga.dev"
|
||||||
git config url.https://${{ gitea.actor }}:${{ secrets.GITEA_TOKEN }}@git.huizinga.dev/.insteadOf https://git.huizinga.dev/
|
git config url.https://${{ gitea.actor }}:${{ secrets.RELEASE_PLZ_TOKEN }}@git.huizinga.dev/.insteadOf https://git.huizinga.dev/
|
||||||
- env:
|
- name: release-plz release
|
||||||
CARGO_REGISTRIES_INFRA_TOKEN: "Bearer ${{ secrets.REGISTRY_TOKEN }}"
|
env:
|
||||||
run: release-plz release --git-token "${{ secrets.GITEA_TOKEN }}" --forge gitea --dry-run
|
CARGO_REGISTRIES_INFRA_TOKEN: "Bearer ${{ secrets.RELEASE_PLZ_TOKEN }}"
|
||||||
|
run: release-plz release --git-token "${{ secrets.RELEASE_PLZ_TOKEN }}" --forge gitea
|
||||||
|
|
||||||
release-plz-pr:
|
release-plz-pr:
|
||||||
name: Release-plz PR
|
name: Release-plz PR
|
||||||
@@ -44,10 +49,14 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- *checkout
|
- *checkout
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
- name: Install rust toolchain
|
||||||
- uses: Swatinem/rust-cache@v2
|
uses: dtolnay/rust-toolchain@nightly
|
||||||
- uses: taiki-e/install-action@v2
|
- name: Setup rust cache
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
|
- name: Install release-plz
|
||||||
|
uses: taiki-e/install-action@v2
|
||||||
with:
|
with:
|
||||||
tool: release-plz
|
tool: release-plz
|
||||||
- *git-setup
|
- *git-setup
|
||||||
- run: release-plz release-pr --git-token "${{ secrets.GITEA_TOKEN }}" --forge gitea
|
- name: release-plz release-pr
|
||||||
|
run: release-plz release-pr --git-token "${{ secrets.RELEASE_PLZ_TOKEN }}" --forge gitea
|
||||||
|
|||||||
@@ -9,6 +9,17 @@ jobs:
|
|||||||
archlinux:
|
archlinux:
|
||||||
name: Arch Linux
|
name: Arch Linux
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- name: Checkout
|
||||||
- uses: heyhusen/archlinux-package-action@v3.0.0
|
uses: actions/checkout@v6
|
||||||
|
- name: Build package
|
||||||
|
uses: https://git.huizinga.dev/infra/archlinux-package-action@v4
|
||||||
|
with:
|
||||||
|
path: .
|
||||||
|
- name: Upload package
|
||||||
|
run: |
|
||||||
|
curl --user ${{ gitea.actor }}:${{ secrets.REGISTRY_TOKEN }} \
|
||||||
|
--upload-file "$(ls | grep -E 'crete-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-.*.pkg.tar.zst')" \
|
||||||
|
https://git.huizinga.dev/api/packages/infra/arch/core
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ repos:
|
|||||||
rev: "1.0.0"
|
rev: "1.0.0"
|
||||||
hooks:
|
hooks:
|
||||||
- id: mdformat
|
- id: mdformat
|
||||||
|
exclude: "^CHANGELOG.md$"
|
||||||
|
|
||||||
- repo: local
|
- repo: local
|
||||||
hooks:
|
hooks:
|
||||||
|
|||||||
@@ -1 +1,63 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.1.3](https://git.huizinga.dev/infra/crete/compare/v0.1.2...v0.1.3) - 2026-04-21
|
||||||
|
|
||||||
|
### <!-- 0 -->Features
|
||||||
|
|
||||||
|
- Add function that applies netmask to ip
|
||||||
|
|
||||||
|
### <!-- 3 -->Refactor
|
||||||
|
|
||||||
|
- Use ViaDeserialize to convert ip address
|
||||||
|
|
||||||
|
## [0.1.2](https://git.huizinga.dev/infra/crete/compare/v0.1.1...v0.1.2) - 2026-04-17
|
||||||
|
|
||||||
|
### <!-- 0 -->Features
|
||||||
|
|
||||||
|
- Make dns optional
|
||||||
|
- Allow more than two dns entries
|
||||||
|
|
||||||
|
## [0.1.1](https://git.huizinga.dev/infra/crete/compare/v0.1.0...v0.1.1) - 2026-04-13
|
||||||
|
|
||||||
|
### <!-- 2 -->Bug Fixes
|
||||||
|
|
||||||
|
- No default value for advertise routes
|
||||||
|
|
||||||
|
## [0.1.0](https://git.huizinga.dev/infra/crete/releases/tag/v0.1.0) - 2026-04-07
|
||||||
|
|
||||||
|
### <!-- 0 -->Features
|
||||||
|
|
||||||
|
- _(package)_ Added PKGBUILD
|
||||||
|
- Set user agent
|
||||||
|
- _(performance)_ Disable request features to reduce binary size
|
||||||
|
- Generate talos configs
|
||||||
|
- Show error if no clusters are found in repo
|
||||||
|
- Initial rewrite of python render tool
|
||||||
|
|
||||||
|
### <!-- 3 -->Refactor
|
||||||
|
|
||||||
|
- Big internal refactor
|
||||||
|
|
||||||
|
### <!-- 4 -->Testing
|
||||||
|
|
||||||
|
- Disable building tests
|
||||||
|
|
||||||
|
### <!-- 5 -->Miscellaneous Tasks
|
||||||
|
|
||||||
|
- _(actions)_ Publish Arch Linux package
|
||||||
|
- _(license)_ Add GPL license
|
||||||
|
- _(actions)_ Name steps
|
||||||
|
- _(actions)_ Renamed release-plz workflow file
|
||||||
|
- _(actions)_ Use committed to check pr commits
|
||||||
|
- _(actions)_ Cancel in-progress ci runs when pushing to pr
|
||||||
|
- _(docs)_ Added README
|
||||||
|
- _(actions)_ Setup workflows
|
||||||
|
- Publish to gitea registry
|
||||||
|
- _(pre-commit)_ Update pre commit config
|
||||||
|
|||||||
Generated
+1
-1
@@ -214,7 +214,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crete"
|
name = "crete"
|
||||||
version = "0.1.0"
|
version = "0.1.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"clap_complete",
|
"clap_complete",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "crete"
|
name = "crete"
|
||||||
version = "0.1.0"
|
version = "0.1.3"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
default-run = "crete"
|
default-run = "crete"
|
||||||
publish = ["infra"]
|
publish = ["infra"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Maintainer: Tim Huizinga <tim@huizinga.dev>
|
# Maintainer: Tim Huizinga <tim@huizinga.dev>
|
||||||
pkgname=crete
|
pkgname=crete
|
||||||
pkgver=0.0.0
|
pkgver=dummy
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc='A tool that takes node and cluster configs and uses it to generate talos configs and render jinja templates'
|
pkgdesc='A tool that takes node and cluster configs and uses it to generate talos configs and render jinja templates'
|
||||||
url='https://git.huizinga.dev/infra/crete'
|
url='https://git.huizinga.dev/infra/crete'
|
||||||
|
|||||||
@@ -5,6 +5,32 @@ and render jinja templates.
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
### Arch
|
||||||
|
|
||||||
|
First import the verification key:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://git.huizinga.dev/api/packages/infra/arch/repository.key -O /tmp/repository.key
|
||||||
|
sudo pacman-key --add /tmp/repository.key
|
||||||
|
sudo pacman-key --lsign-key $(gpg --show-keys /tmp/repository.key | sed -n 2p)
|
||||||
|
```
|
||||||
|
|
||||||
|
And add the following to `/etc/pacman.conf`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[infra]
|
||||||
|
SigLevel = Required
|
||||||
|
Server = https://git.huizinga.dev/api/packages/infra/arch/core/$arch
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then install `crete` by running:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo pacman -Sy crete
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cargo install
|
||||||
|
|
||||||
Add the following to `~/.cargo.config.toml`:
|
Add the following to `~/.cargo.config.toml`:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
|||||||
@@ -140,12 +140,11 @@
|
|||||||
"array",
|
"array",
|
||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
|
"default": null,
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "ipv4"
|
"format": "ipv4"
|
||||||
},
|
}
|
||||||
"maxItems": 2,
|
|
||||||
"minItems": 2
|
|
||||||
},
|
},
|
||||||
"gateway": {
|
"gateway": {
|
||||||
"type": [
|
"type": [
|
||||||
|
|||||||
+2
-3
@@ -136,12 +136,11 @@
|
|||||||
"array",
|
"array",
|
||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
|
"default": null,
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "ipv4"
|
"format": "ipv4"
|
||||||
},
|
}
|
||||||
"maxItems": 2,
|
|
||||||
"minItems": 2
|
|
||||||
},
|
},
|
||||||
"gateway": {
|
"gateway": {
|
||||||
"type": [
|
"type": [
|
||||||
|
|||||||
+11
-5
@@ -1,8 +1,8 @@
|
|||||||
use std::net::Ipv4Addr;
|
use std::net::Ipv4Addr;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::str::FromStr;
|
|
||||||
|
|
||||||
|
use minijinja::value::ViaDeserialize;
|
||||||
use minijinja::{AutoEscape, Environment, path_loader};
|
use minijinja::{AutoEscape, Environment, path_loader};
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
@@ -16,6 +16,13 @@ pub struct PathEnvironment<'a> {
|
|||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn apply_netmask(
|
||||||
|
ip: ViaDeserialize<Ipv4Addr>,
|
||||||
|
netmask: ViaDeserialize<Ipv4Addr>,
|
||||||
|
) -> Result<String, minijinja::Error> {
|
||||||
|
Ok((*ip & *netmask).to_string())
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> PathEnvironment<'a> {
|
impl<'a> PathEnvironment<'a> {
|
||||||
pub fn new(path: &Path) -> Self {
|
pub fn new(path: &Path) -> Self {
|
||||||
let mut env = Environment::new();
|
let mut env = Environment::new();
|
||||||
@@ -27,10 +34,7 @@ impl<'a> PathEnvironment<'a> {
|
|||||||
env.set_auto_escape_callback(|_| AutoEscape::None);
|
env.set_auto_escape_callback(|_| AutoEscape::None);
|
||||||
|
|
||||||
// Add filters
|
// Add filters
|
||||||
env.add_filter("to_prefix", |netmask: String| {
|
env.add_filter("to_prefix", |netmask: ViaDeserialize<Ipv4Addr>| {
|
||||||
let netmask = Ipv4Addr::from_str(&netmask).map_err(|err| {
|
|
||||||
minijinja::Error::new(minijinja::ErrorKind::InvalidOperation, err.to_string())
|
|
||||||
})?;
|
|
||||||
let mask = netmask.to_bits();
|
let mask = netmask.to_bits();
|
||||||
let prefix = mask.leading_ones();
|
let prefix = mask.leading_ones();
|
||||||
|
|
||||||
@@ -44,6 +48,8 @@ impl<'a> PathEnvironment<'a> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
env.add_function("apply_netmask", apply_netmask);
|
||||||
|
|
||||||
// Helper function for getting the path to kubeconfig files
|
// Helper function for getting the path to kubeconfig files
|
||||||
env.add_filter("kubeconfig", move |names: Vec<String>| {
|
env.add_filter("kubeconfig", move |names: Vec<String>| {
|
||||||
names
|
names
|
||||||
|
|||||||
+9
-1
@@ -53,7 +53,8 @@ struct Network {
|
|||||||
ip: Ipv4Addr,
|
ip: Ipv4Addr,
|
||||||
netmask: Ipv4Addr,
|
netmask: Ipv4Addr,
|
||||||
gateway: Ipv4Addr,
|
gateway: Ipv4Addr,
|
||||||
dns: [Ipv4Addr; 2],
|
#[serde(default)]
|
||||||
|
dns: Option<Vec<Ipv4Addr>>,
|
||||||
#[optional_rename(OptionalTailscale)]
|
#[optional_rename(OptionalTailscale)]
|
||||||
#[optional_wrap]
|
#[optional_wrap]
|
||||||
tailscale: Tailscale,
|
tailscale: Tailscale,
|
||||||
@@ -128,6 +129,13 @@ impl Node {
|
|||||||
// Sadly we have to this manually
|
// Sadly we have to this manually
|
||||||
// TODO: Find a better way of doing this
|
// TODO: Find a better way of doing this
|
||||||
let default = OptionalNodeDeserialize {
|
let default = OptionalNodeDeserialize {
|
||||||
|
network: Some(OptionalNetwork {
|
||||||
|
tailscale: Some(OptionalTailscale {
|
||||||
|
advertise_routes: Some(false),
|
||||||
|
..Default::default()
|
||||||
|
}),
|
||||||
|
..Default::default()
|
||||||
|
}),
|
||||||
patches: Some(OptionalPatches {
|
patches: Some(OptionalPatches {
|
||||||
all: Some(vec![]),
|
all: Some(vec![]),
|
||||||
control_plane: Some(vec![]),
|
control_plane: Some(vec![]),
|
||||||
|
|||||||
+9
-1
@@ -11,7 +11,15 @@ where
|
|||||||
let path = get_talos_path().join("schematics").join(name);
|
let path = get_talos_path().join("schematics").join(name);
|
||||||
let content = std::fs::read_to_string(path).unwrap().trim().to_owned();
|
let content = std::fs::read_to_string(path).unwrap().trim().to_owned();
|
||||||
|
|
||||||
let client = reqwest::blocking::Client::new();
|
let client = reqwest::blocking::ClientBuilder::new()
|
||||||
|
.user_agent(format!(
|
||||||
|
"{}/{}",
|
||||||
|
std::env!("CARGO_PKG_NAME"),
|
||||||
|
std::env!("CARGO_PKG_VERSION")
|
||||||
|
))
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let res = client
|
let res = client
|
||||||
.post("https://factory.talos.dev/schematics")
|
.post("https://factory.talos.dev/schematics")
|
||||||
.body(content)
|
.body(content)
|
||||||
|
|||||||
Reference in New Issue
Block a user