Skip to content

Commit 2d9d426

Browse files
committed
feat: new terraform stack for new switch
1 parent 1c35ed9 commit 2d9d426

File tree

20 files changed

+486
-125
lines changed

20 files changed

+486
-125
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: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
"nixpkgs": "nixpkgs"
66
},
77
"locked": {
8-
"lastModified": 1740026216,
8+
"lastModified": 1743781909,
99
"owner": "dagger",
1010
"repo": "nix",
11-
"rev": "578e8c28bba72e4269cfe15de4a7097c1b3ebcff",
11+
"rev": "21aa7e33f3cec8f77d7e59558a7210b99049e1ed",
1212
"type": "github"
1313
},
1414
"original": {
@@ -20,10 +20,10 @@
2020
"devenv": {
2121
"locked": {
2222
"dir": "src/modules",
23-
"lastModified": 1740575096,
23+
"lastModified": 1743783972,
2424
"owner": "cachix",
2525
"repo": "devenv",
26-
"rev": "4000b0153c6f54a57368c0b066aaa0024450618c",
26+
"rev": "2f53e2f867e0c2ba18b880e66169366e5f8ca554",
2727
"type": "github"
2828
},
2929
"original": {
@@ -53,10 +53,10 @@
5353
"nixpkgs-lib": "nixpkgs-lib"
5454
},
5555
"locked": {
56-
"lastModified": 1738453229,
56+
"lastModified": 1743550720,
5757
"owner": "hercules-ci",
5858
"repo": "flake-parts",
59-
"rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd",
59+
"rev": "c621e8422220273271f52058f618c94e405bb0f5",
6060
"type": "github"
6161
},
6262
"original": {
@@ -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
},
@@ -87,10 +108,10 @@
87108
},
88109
"nixpkgs": {
89110
"locked": {
90-
"lastModified": 1740547748,
111+
"lastModified": 1743938762,
91112
"owner": "NixOS",
92113
"repo": "nixpkgs",
93-
"rev": "3a05eebede89661660945da1f151959900903b6a",
114+
"rev": "74a40410369a1c35ee09b8a1abee6f4acbedc059",
94115
"type": "github"
95116
},
96117
"original": {
@@ -102,22 +123,24 @@
102123
},
103124
"nixpkgs-lib": {
104125
"locked": {
105-
"lastModified": 1740642049,
106-
"narHash": "sha256-vJzFZGaCpnmo7I6i416HaBLpC+hvcURh/BQwROcGIp8=",
107-
"type": "tarball",
108-
"url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz"
126+
"lastModified": 1743901752,
127+
"owner": "nix-community",
128+
"repo": "nixpkgs.lib",
129+
"rev": "2bb0af21f02e8c61a5dded3832b92db47d6a0411",
130+
"type": "github"
109131
},
110132
"original": {
111-
"type": "tarball",
112-
"url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz"
133+
"owner": "nix-community",
134+
"repo": "nixpkgs.lib",
135+
"type": "github"
113136
}
114137
},
115138
"nixpkgs_2": {
116139
"locked": {
117-
"lastModified": 1740547748,
140+
"lastModified": 1743938762,
118141
"owner": "NixOS",
119142
"repo": "nixpkgs",
120-
"rev": "3a05eebede89661660945da1f151959900903b6a",
143+
"rev": "74a40410369a1c35ee09b8a1abee6f4acbedc059",
121144
"type": "github"
122145
},
123146
"original": {
@@ -129,10 +152,10 @@
129152
},
130153
"nixpkgs_3": {
131154
"locked": {
132-
"lastModified": 1740367490,
155+
"lastModified": 1743827369,
133156
"owner": "nixos",
134157
"repo": "nixpkgs",
135-
"rev": "0196c0175e9191c474c26ab5548db27ef5d34b05",
158+
"rev": "42a1c966be226125b48c384171c44c651c236c22",
136159
"type": "github"
137160
},
138161
"original": {
@@ -142,33 +165,15 @@
142165
"type": "github"
143166
}
144167
},
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-
},
166168
"root": {
167169
"inputs": {
168170
"dagger": "dagger",
169171
"devenv": "devenv",
172+
"git-hooks": "git-hooks",
170173
"nixpkgs": "nixpkgs_2",
171-
"pre-commit-hooks": "pre-commit-hooks",
174+
"pre-commit-hooks": [
175+
"git-hooks"
176+
],
172177
"talhelper": "talhelper"
173178
}
174179
},
@@ -178,10 +183,10 @@
178183
"nixpkgs": "nixpkgs_3"
179184
},
180185
"locked": {
181-
"lastModified": 1740628241,
186+
"lastModified": 1743729608,
182187
"owner": "budimanjojo",
183188
"repo": "talhelper",
184-
"rev": "e23e0e77e3c7c9fb08e0d783a11fa1d92227a70d",
189+
"rev": "e5f08adb209adc686a217b48aa7d50b2bee2b3a9",
185190
"type": "github"
186191
},
187192
"original": {

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+
}
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 "management_port" {
6+
type = string
7+
}
8+
9+
variable "management_address" {
10+
type = string
11+
}
12+
13+
variable "management_vlan_id" {
14+
type = number
15+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
data "routeros_interfaces" "ether" {
2+
filter = {
3+
type = "ether"
4+
}
5+
}
6+
7+
resource "routeros_interface_list" "admin" {
8+
name = "admin-ifces"
9+
}
10+
11+
resource "routeros_interface_list_member" "admin_port" {
12+
list = routeros_interface_list.admin.name
13+
interface = var.management_port
14+
}
15+
16+
resource "routeros_interface_list_member" "admin_vlan" {
17+
list = routeros_interface_list.admin.name
18+
interface = routeros_interface_vlan.admin.name
19+
}
20+
21+
# resource "routeros_interface_bridge_vlan" "admin" {
22+
# bridge = var.bridge_name
23+
# vlan_ids = [routeros_interface_vlan.admin.vlan_id]
24+
# tagged = concat([var.bridge_name], var.management_tagged_ports)
25+
# }
26+
#
27+
# resource "routeros_interface_bridge_vlan" "srv" {
28+
# bridge = var.bridge_name
29+
# vlan_ids = [10]
30+
# tagged = concat([var.bridge_name], var.trunk_ports)
31+
# }
32+
#
33+
# resource "routeros_interface_bridge_vlan" "lan" {
34+
# bridge = var.bridge_name
35+
# vlan_ids = [100]
36+
# tagged = concat([var.bridge_name], var.trunk_ports)
37+
# }
38+
#
39+
# resource "routeros_interface_bridge_vlan" "iot" {
40+
# bridge = var.bridge_name
41+
# vlan_ids = [101]
42+
# tagged = concat([var.bridge_name], var.trunk_ports)
43+
# }
44+
45+
resource "routeros_interface_vlan" "admin" {
46+
interface = var.bridge_name
47+
name = "admin-vlan"
48+
vlan_id = var.management_vlan_id
49+
}
50+
51+
resource "routeros_interface_vlan" "srv" {
52+
interface = var.bridge_name
53+
name = "srv-vlan"
54+
vlan_id = 10
55+
}
56+
57+
resource "routeros_interface_vlan" "lan" {
58+
interface = var.bridge_name
59+
name = "lan-vlan"
60+
vlan_id = 100
61+
}
62+
63+
resource "routeros_interface_vlan" "iot" {
64+
interface = var.bridge_name
65+
name = "iot-vlan"
66+
vlan_id = 101
67+
}
68+
69+
# resource "routeros_ip_address" "admin" {
70+
# # interface = routeros_interface_vlan.admin.name
71+
# address = "${var.management_address}/32"
72+
# interface = "admin-vrrp-oob"
73+
# # address = "10.99.0.2/32"
74+
# }

0 commit comments

Comments
 (0)