Skip to content

Commit fd1e79c

Browse files
authored
feat: new terraform stack for new switch (#162)
1 parent 1c35ed9 commit fd1e79c

File tree

19 files changed

+363
-67
lines changed

19 files changed

+363
-67
lines changed

dagger.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
"sdk": {
55
"source": "go"
66
},
7+
"include": [
8+
"!**/.devenv",
9+
"!**/.direnv",
10+
"!**/.terraform"
11+
],
712
"dependencies": [
813
{
914
"name": "containers",
@@ -19,6 +24,5 @@
1924
"pin": "789200f43579a799b237c660e2faa79a83404104"
2025
}
2126
],
22-
"include": ["!**/.devenv", "!**/.direnv", "!**/.terraform"],
2327
"source": ".dagger"
2428
}

devenv.lock

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,31 @@
6565
"type": "github"
6666
}
6767
},
68+
"git-hooks": {
69+
"inputs": {
70+
"flake-compat": "flake-compat",
71+
"gitignore": "gitignore",
72+
"nixpkgs": [
73+
"nixpkgs"
74+
]
75+
},
76+
"locked": {
77+
"lastModified": 1742649964,
78+
"owner": "cachix",
79+
"repo": "git-hooks.nix",
80+
"rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82",
81+
"type": "github"
82+
},
83+
"original": {
84+
"owner": "cachix",
85+
"repo": "git-hooks.nix",
86+
"type": "github"
87+
}
88+
},
6889
"gitignore": {
6990
"inputs": {
7091
"nixpkgs": [
71-
"pre-commit-hooks",
92+
"git-hooks",
7293
"nixpkgs"
7394
]
7495
},
@@ -142,33 +163,15 @@
142163
"type": "github"
143164
}
144165
},
145-
"pre-commit-hooks": {
146-
"inputs": {
147-
"flake-compat": "flake-compat",
148-
"gitignore": "gitignore",
149-
"nixpkgs": [
150-
"nixpkgs"
151-
]
152-
},
153-
"locked": {
154-
"lastModified": 1737465171,
155-
"owner": "cachix",
156-
"repo": "pre-commit-hooks.nix",
157-
"rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17",
158-
"type": "github"
159-
},
160-
"original": {
161-
"owner": "cachix",
162-
"repo": "pre-commit-hooks.nix",
163-
"type": "github"
164-
}
165-
},
166166
"root": {
167167
"inputs": {
168168
"dagger": "dagger",
169169
"devenv": "devenv",
170+
"git-hooks": "git-hooks",
170171
"nixpkgs": "nixpkgs_2",
171-
"pre-commit-hooks": "pre-commit-hooks",
172+
"pre-commit-hooks": [
173+
"git-hooks"
174+
],
172175
"talhelper": "talhelper"
173176
}
174177
},

devenv.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
talosctl
2424
timoni
2525
go-task
26+
iptables
2627
]);
2728

2829
languages = {

terraform/.dagger/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (m *Terraform) Base() *dagger.Container {
6565
Wolfi().
6666
Container(dagger.WolfiContainerOpts{
6767
Packages: []string{
68-
"opentofu=1.8.2",
68+
"opentofu=1.9.0",
6969
"tflint=0.53.0",
7070
},
7171
})
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
variable "bridge_name" {
2+
type = string
3+
}
4+
5+
variable "bridge_ports" {
6+
type = map(object({
7+
comment = optional(string)
8+
vlan_ids = optional(list(number), [])
9+
pvid = optional(number)
10+
}))
11+
}
12+
13+
variable "ignore_interfaces" {
14+
type = list(string)
15+
default = []
16+
}

terraform/modules/ros-bridge/main.tf

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
data "routeros_interfaces" "ether" {
2+
filter = {
3+
type = "ether"
4+
}
5+
}
6+
7+
locals {
8+
interface_list = toset([
9+
for idx, item in data.routeros_interfaces.ether.interfaces : item.name
10+
if !contains(var.ignore_interfaces, item.name)
11+
])
12+
vlan_ids = distinct(flatten([for _, item in var.bridge_ports : try(item.vlan_ids, [])]))
13+
}
14+
15+
resource "routeros_interface_ethernet" "self" {
16+
for_each = local.interface_list
17+
factory_name = each.key
18+
name = each.key
19+
comment = try(var.bridge_ports[each.key].comment, null)
20+
}
21+
22+
resource "routeros_interface_bridge" "self" {
23+
name = var.bridge_name
24+
vlan_filtering = true
25+
}
26+
27+
resource "routeros_interface_bridge_port" "self" {
28+
for_each = local.interface_list
29+
bridge = routeros_interface_bridge.self.name
30+
interface = each.key
31+
pvid = try(var.bridge_ports[each.key].pvid, 1)
32+
comment = try(var.bridge_ports[each.key].comment, null)
33+
}
34+
35+
resource "routeros_interface_bridge_vlan" "self" {
36+
for_each = { for id in local.vlan_ids : "vlan${id}" => id }
37+
bridge = routeros_interface_bridge.self.name
38+
vlan_ids = [each.value]
39+
tagged = concat(
40+
[routeros_interface_bridge.self.name],
41+
[for k, v in var.bridge_ports : k if contains(try(v.vlan_ids, []), each.value)]
42+
)
43+
}
44+
45+
output "debug" {
46+
value = {
47+
bridge_ports = var.bridge_ports
48+
vlan_ids = local.vlan_ids
49+
tagged99 = [for k, v in var.bridge_ports : k if contains(try(v.vlan_ids, []), 99)]
50+
}
51+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
output "bridge_name" {
2+
value = routeros_interface_bridge.self.name
3+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
terraform {
2+
required_version = ">= 1.9.0"
3+
4+
required_providers {
5+
routeros = {
6+
source = "terraform-routeros/routeros"
7+
version = "1.76.7"
8+
}
9+
}
10+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
variable "bridge_name" {
2+
type = string
3+
}
4+
5+
variable "oob_mgmt_port" {
6+
type = string
7+
}
8+
9+
variable "oob_mgmt_address" {
10+
type = string
11+
}
12+
13+
variable "mgmt_vlan_id" {
14+
type = number
15+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# TODO: add dhcp-server on management subnet
2+
# TODO: add dhcp-client on admin vlan
3+
# TODO: implement VRF for services
4+
5+
resource "routeros_interface_list" "admin" {
6+
name = "admin-ifces"
7+
}
8+
9+
resource "routeros_interface_list_member" "admin_port" {
10+
list = routeros_interface_list.admin.name
11+
interface = var.oob_mgmt_port
12+
}
13+
14+
resource "routeros_interface_list_member" "admin_vlan" {
15+
list = routeros_interface_list.admin.name
16+
interface = routeros_interface_vlan.admin.name
17+
}
18+
19+
resource "routeros_interface_vlan" "admin" {
20+
interface = var.bridge_name
21+
name = "admin-vlan"
22+
vlan_id = var.mgmt_vlan_id
23+
}
24+
25+
resource "routeros_ip_address" "admin" {
26+
interface = var.oob_mgmt_port
27+
address = var.oob_mgmt_address
28+
}

0 commit comments

Comments
 (0)