aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.settings.sh1
-rw-r--r--ansible/group_vars/all/ipam.yml12
-rwxr-xr-xbin/asdf4
-rw-r--r--terraform/hash-grafana/.terraform.lock.hcl34
-rw-r--r--terraform/hash-grafana/grafana.tf4
-rw-r--r--terraform/hash-grafana/main.tf2
-rw-r--r--utils/go.mod5
-rw-r--r--utils/go.sum4
-rw-r--r--utils/main.go160
-rw-r--r--utils/yaml_ipam/yaml_ipam.go26
10 files changed, 223 insertions, 29 deletions
diff --git a/.settings.sh b/.settings.sh
index 65db934..a166ade 100644
--- a/.settings.sh
+++ b/.settings.sh
@@ -7,6 +7,7 @@ export ANSIBLE_CONFIG=$basedir/ansible/ansible.cfg
PATH="$basedir/bin/env/bin:$PATH"
PATH="$basedir/bin:$PATH"
+PATH="$HOME/.asdf/shims:$PATH"
#echo "Adding bin/.tmp/asdf-data/shims/ to path"
#PATH="$basedir/bin/.tmp/asdf-data/shims:$PATH"
diff --git a/ansible/group_vars/all/ipam.yml b/ansible/group_vars/all/ipam.yml
index f3f75ac..aa9da27 100644
--- a/ansible/group_vars/all/ipam.yml
+++ b/ansible/group_vars/all/ipam.yml
@@ -15,25 +15,25 @@ ipam6:
node1_dn42:
range: "fdb1:4242:3538:2002::/64"
hosts:
- node1: "fdb1:4242:3538:2002::/64"
+ node1: "fdb1:4242:3538:2002::ffff"
node2_dn42:
range: "fdb1:4242:3538:2003::/64"
hosts:
- node2: "fdb1:4242:3538:2003::/64"
+ node2: "fdb1:4242:3538:2003::ffff"
knot_dn42:
range: "fdb1:4242:3538:2004::/64"
hosts:
- knot: "fdb1:4242:3538:2004::ffff/64"
+ knot: "fdb1:4242:3538:2004::ffff"
coregonus_dn42:
range: "fdb1:4242:3538:2005::/64"
hosts:
- coregonus-ix: "fdb1:4242:3538:2005::ffff/64"
+ coregonus-ix: "fdb1:4242:3538:2005::ffff"
coregonus_docker:
range: "fdb1:4242:3538:2005:df01:676a:ec28:0a00/120"
kv24_dn42:
range: "fdb1:4242:3538:2006::/64"
hosts:
- kv24ix: "fdb1:4242:3538:2006::ffff/64"
+ kv24ix: "fdb1:4242:3538:2006::ffff"
hash_dn42:
range: "fdb1:4242:3538:2007::/64"
hosts:
@@ -43,7 +43,7 @@ ipam6:
lhn2_dn42:
range: "fdb1:4242:3538:2008::/64"
hosts:
- lhn2pi: "fdb1:4242:3538:2008::ffff/64"
+ lhn2pi: "fdb1:4242:3538:2008::ffff"
conflatorio: "fdb1:4242:3538:2008:8042:32ff:fe0c:7161"
danneri: "fdb1:4242:3538:2008:9422:d355:95b7:f170"
diff --git a/bin/asdf b/bin/asdf
index aa36c16..94ea911 100755
--- a/bin/asdf
+++ b/bin/asdf
@@ -2,7 +2,7 @@
set -euo pipefail
-v="0.14.0"
+v="0.14.1"
basedir="${0%/*}"
self="${0##*/}"
@@ -18,6 +18,4 @@ then
curl -L "$url" | tar xfz - -C $dir
fi
-export ASDF_DATA_DIR="$dir/asdf-data"
-
exec "$bin" "${@}"
diff --git a/terraform/hash-grafana/.terraform.lock.hcl b/terraform/hash-grafana/.terraform.lock.hcl
index 4362198..3242795 100644
--- a/terraform/hash-grafana/.terraform.lock.hcl
+++ b/terraform/hash-grafana/.terraform.lock.hcl
@@ -43,24 +43,24 @@ provider "registry.terraform.io/hashicorp/random" {
}
provider "registry.terraform.io/kreuzwerker/docker" {
- version = "2.24.0"
- constraints = "2.24.0"
+ version = "3.0.2"
+ constraints = "3.0.2"
hashes = [
- "h1:1z0/qA77T3PS/1m4vRO8UgWjHjk5/v+f3JfGbMyzX18=",
- "zh:181fefd55c8eb75efe9815c43fdd76422b57951ef53b5d5f19273a00fdf0e2e2",
- "zh:2ec84e029d169f188be2addf7f45c2555f226f67d4b6fb66c1749ed5b2c4a76a",
- "zh:6f5cf945148485f57b919d31a30f1a5a93d45f4e8edfdb0b80b22258d51795d8",
- "zh:8d00c2c459a48453f52a00a8d1ffdb7bcf72fe4b3b09ffcfd52218c4646fa7fa",
- "zh:9bd6e06601e0a972b9ce01150e32e76b76b4caf1d9798daf4cf16d06e2a8d4a3",
- "zh:af72591132dc8cd338f293e458403851e6b8a6ac4c4d25a3268940f9763df7aa",
- "zh:c4a47c5c7ad2ff1fc5212e69c5ef837a127346264e46ce7b5d13362545e4aa70",
- "zh:c6d68f33efcd3372331ed0d58ec49e8b01ddc132934b14d2d45977076950e4b3",
- "zh:db228855ae7235095d367f3597719747e5be0dd9ce2206ea02062560b518c08a",
- "zh:e8d6ce89642925f2e813d0b829bd5562582de37eaa39351e231ab474383e703a",
- "zh:ec83d8c86a918d25eb824cc99f98924ef8949eb69aa40cb5ff2db24369e52d9c",
- "zh:ee0032d3d86adeeca7fdd4922bb8db87dbb5cd0093c054ff8efe2260de0b624c",
- "zh:f033b70f342f32eeb98c213e6fc7098d7afd22b3146a5cb6173c128b0e86d732",
- "zh:f1bc3a2c4f152f8adc9a1f9c852496232ef31073b149945756c13bc9688cf08b",
+ "h1:cT2ccWOtlfKYBUE60/v2/4Q6Stk1KYTNnhxSck+VPlU=",
+ "zh:15b0a2b2b563d8d40f62f83057d91acb02cd0096f207488d8b4298a59203d64f",
+ "zh:23d919de139f7cd5ebfd2ff1b94e6d9913f0977fcfc2ca02e1573be53e269f95",
+ "zh:38081b3fe317c7e9555b2aaad325ad3fa516a886d2dfa8605ae6a809c1072138",
+ "zh:4a9c5065b178082f79ad8160243369c185214d874ff5048556d48d3edd03c4da",
+ "zh:5438ef6afe057945f28bce43d76c4401254073de01a774760169ac1058830ac2",
+ "zh:60b7fadc287166e5c9873dfe53a7976d98244979e0ab66428ea0dea1ebf33e06",
+ "zh:61c5ec1cb94e4c4a4fb1e4a24576d5f39a955f09afb17dab982de62b70a9bdd1",
+ "zh:a38fe9016ace5f911ab00c88e64b156ebbbbfb72a51a44da3c13d442cd214710",
+ "zh:c2c4d2b1fd9ebb291c57f524b3bf9d0994ff3e815c0cd9c9bcb87166dc687005",
+ "zh:d567bb8ce483ab2cf0602e07eae57027a1a53994aba470fa76095912a505533d",
+ "zh:e83bf05ab6a19dd8c43547ce9a8a511f8c331a124d11ac64687c764ab9d5a792",
+ "zh:e90c934b5cd65516fbcc454c89a150bfa726e7cf1fe749790c7480bbeb19d387",
+ "zh:f05f167d2eaf913045d8e7b88c13757e3cf595dd5cd333057fdafc7c4b7fed62",
+ "zh:fcc9c1cea5ce85e8bcb593862e699a881bd36dffd29e2e367f82d15368659c3d",
]
}
diff --git a/terraform/hash-grafana/grafana.tf b/terraform/hash-grafana/grafana.tf
index 2c0f719..b425e72 100644
--- a/terraform/hash-grafana/grafana.tf
+++ b/terraform/hash-grafana/grafana.tf
@@ -1,5 +1,5 @@
resource "docker_image" "grafana" {
- name = "grafana/grafana-oss:10.1.5"
+ name = "grafana/grafana-oss:11.2.2"
}
resource "docker_volume" "grafana" {
@@ -38,7 +38,6 @@ resource "docker_container" "grafana" {
env = [
"GF_DATABASE_TYPE=postgres",
- # "GF_DATABASE_HOST=[fdf3:aad9:a885:b3a::1]",
"GF_DATABASE_HOST=knot.dn42.trygvis.io",
"GF_DATABASE_DATABASE=${postgresql_database.grafana.name}",
"GF_DATABASE_USER=${postgresql_role.grafana.name}",
@@ -48,5 +47,6 @@ resource "docker_container" "grafana" {
volumes {
volume_name = docker_volume.grafana.name
container_path = "/var/lib/grafana"
+ read_only = false
}
}
diff --git a/terraform/hash-grafana/main.tf b/terraform/hash-grafana/main.tf
index fb7c03a..043b778 100644
--- a/terraform/hash-grafana/main.tf
+++ b/terraform/hash-grafana/main.tf
@@ -2,7 +2,7 @@ terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
- version = "2.24.0"
+ version = "3.0.2"
}
postgresql = {
source = "cyrilgdn/postgresql"
diff --git a/utils/go.mod b/utils/go.mod
new file mode 100644
index 0000000..0090185
--- /dev/null
+++ b/utils/go.mod
@@ -0,0 +1,5 @@
+module utils
+
+go 1.23
+
+require gopkg.in/yaml.v3 v3.0.1
diff --git a/utils/go.sum b/utils/go.sum
new file mode 100644
index 0000000..a62c313
--- /dev/null
+++ b/utils/go.sum
@@ -0,0 +1,4 @@
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/utils/main.go b/utils/main.go
new file mode 100644
index 0000000..db27e9c
--- /dev/null
+++ b/utils/main.go
@@ -0,0 +1,160 @@
+package main
+
+import (
+ "fmt"
+ "log"
+ "net/netip"
+ "os"
+ "utils/yaml_ipam"
+)
+
+func main() {
+ err := work()
+ if err != nil {
+ _, _ = fmt.Fprintf(os.Stderr, "Error reading file: %v\n", err)
+ os.Exit(1)
+ }
+}
+
+func work() error {
+ ipamYaml := "../ansible/group_vars/all/ipam.yml"
+ bs, err := os.ReadFile(ipamYaml)
+ if err != nil {
+ return err
+ }
+
+ ipam, err := loadIpam(bs)
+ if err != nil {
+ return err
+ }
+
+ fmt.Printf("digraph {\n")
+ //fmt.Printf(" layout=dot\n")
+ //fmt.Printf(" layout=twopi\n")
+ fmt.Printf(" layout=circo\n")
+ //fmt.Printf(" ranksep=3\n")
+ //fmt.Printf(" ratio=auto\n")
+ //fmt.Printf(" rankdir=LR\n")
+ //fmt.Printf(" rankdir=RL\n")
+ //fmt.Printf(" rankdir=TB\n")
+ fmt.Printf("\n")
+ fmt.Printf(" # Nodes\n")
+ for _, n := range ipam.networks {
+ fmt.Printf(" %s [ label = \"%s\\n%s\"];\n", n.name, n.name, n.prefix)
+ }
+ for _, n := range ipam.FindRoots() {
+ fmt.Printf(" %s [ root = true ];\n", n.name)
+ }
+
+ fmt.Printf("\n")
+ fmt.Printf(" # Relationships\n")
+ for _, n := range ipam.networks {
+ for _, c := range ipam.networks {
+ if c.parent == n {
+ fmt.Printf(" %s -> %s;\n", n.name, c.name)
+ }
+ }
+ }
+ fmt.Printf("}\n")
+
+ return nil
+}
+
+func loadIpam(bs []byte) (*Ipam, error) {
+ parsed, err := yaml_ipam.Parse(bs)
+ if err != nil {
+ return nil, err
+ }
+
+ ipam_, err := processNetworks(parsed.Ipam6.Networks)
+ if err != nil {
+ return nil, err
+ }
+
+ ipam_.ResolveParents()
+
+ return ipam_, nil
+}
+
+type Ipam struct {
+ networks []*Network
+}
+
+func (ipam *Ipam) ResolveParents() {
+ for _, n := range ipam.networks {
+ log.Printf("network %s/%s", n.name, n.prefix)
+ for _, p := range ipam.networks {
+ if n == p {
+ continue
+ }
+ //log.Printf("candidate %s/%s", p.name, p.prefix)
+ if p.prefix.Contains(n.prefix.Addr()) {
+ if n.parent == nil {
+ log.Printf("found parent %s/%s", p.name, p.prefix)
+ n.parent = p
+ } else {
+ if n.parent.prefix.Contains(p.prefix.Addr()) {
+ log.Printf("found better parent %s/%s", p.name, p.prefix)
+ n.parent = p
+ }
+ }
+ }
+ }
+ }
+
+ return
+}
+
+func (ipam *Ipam) FindRoots() []*Network {
+ var ns []*Network
+
+ for _, n := range ipam.networks {
+ if n.parent == nil {
+ ns = append(ns, n)
+ }
+ }
+
+ return ns
+}
+
+type Network struct {
+ name string
+ parent *Network
+ prefix netip.Prefix
+ hosts []networkHost
+}
+
+type networkHost struct {
+ name string
+ address netip.Addr
+}
+
+func processNetworks(networks map[string]yaml_ipam.Network6Yaml) (*Ipam, error) {
+ var ns []*Network
+
+ for name, net := range networks {
+ log.Printf("Processing net %v\net", name)
+ prefix, err := netip.ParsePrefix(net.Range)
+ if err != nil {
+ return nil, fmt.Errorf("error parsing net range: %v\net", err)
+ }
+ log.Printf("prefix: %s", prefix.String())
+
+ n := Network{name: name, prefix: prefix}
+ for hostname, a := range net.Hosts {
+ addr, err := netip.ParseAddr(a)
+ if err != nil {
+ return nil, fmt.Errorf("network: %s, unable to parse host address %s\net", n.name, a)
+ }
+
+ n.hosts = append(n.hosts, networkHost{
+ name: hostname,
+ address: addr,
+ })
+ }
+
+ ns = append(ns, &n)
+ }
+
+ return &Ipam{networks: ns}, nil
+}
diff --git a/utils/yaml_ipam/yaml_ipam.go b/utils/yaml_ipam/yaml_ipam.go
new file mode 100644
index 0000000..ff65155
--- /dev/null
+++ b/utils/yaml_ipam/yaml_ipam.go
@@ -0,0 +1,26 @@
+package yaml_ipam
+
+import "gopkg.in/yaml.v3"
+
+type Ipam struct {
+ Ipam6 Ipam6 `yaml:"ipam6"`
+}
+
+type Ipam6 struct {
+ Networks map[string]Network6Yaml `yaml:"networks"`
+}
+
+type Network6Yaml struct {
+ Range string `yaml:"range"`
+ Hosts map[string]string `yaml:"hosts"`
+}
+
+func Parse(bs []byte) (Ipam, error) {
+ var ipam Ipam
+ err := yaml.Unmarshal(bs, &ipam)
+ if err != nil {
+ return Ipam{}, err
+ }
+
+ return ipam, nil
+}