chart: metallb-ipaddresspool
diff --git a/charts/metallb-ipaddresspool/.helmignore b/charts/metallb-ipaddresspool/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/charts/metallb-ipaddresspool/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/charts/metallb-ipaddresspool/Chart.yaml b/charts/metallb-ipaddresspool/Chart.yaml
new file mode 100644
index 0000000..6c585c0
--- /dev/null
+++ b/charts/metallb-ipaddresspool/Chart.yaml
@@ -0,0 +1,6 @@
+apiVersion: v2
+name: metallb-ipaddresspool
+description: A Helm chart to configure Metallb IPAddressPool
+type: application
+version: 0.0.1
+appVersion: "0.0.1"
diff --git a/charts/metallb-ipaddresspool/templates/ip-address-pool.yaml b/charts/metallb-ipaddresspool/templates/ip-address-pool.yaml
new file mode 100644
index 0000000..6195194
--- /dev/null
+++ b/charts/metallb-ipaddresspool/templates/ip-address-pool.yaml
@@ -0,0 +1,18 @@
+apiVersion: metallb.io/v1beta1
+kind: IPAddressPool
+metadata:
+  name: {{ .Values.name }}
+  namespace: {{ .Release.Namespace }}
+spec:
+  autoAssign: {{ .Values.autoAssign }}
+  addresses:
+  - {{ .Values.from }}-{{ .Values.to }}
+---
+apiVersion: metallb.io/v1beta1
+kind: L2Advertisement
+metadata:
+  name: {{ .Values.name }}
+  namespace: {{ .Release.Namespace }}
+spec:
+  ipAddressPools:
+  - {{ .Values.name }}
diff --git a/charts/metallb-ipaddresspool/values.yaml b/charts/metallb-ipaddresspool/values.yaml
new file mode 100644
index 0000000..6e46b46
--- /dev/null
+++ b/charts/metallb-ipaddresspool/values.yaml
@@ -0,0 +1,4 @@
+name: foo
+autoAssign: false
+from: 10.1.0.10
+to: 10.1.0.255
diff --git a/core/installer/app.go b/core/installer/app.go
index c139071..774bea8 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -90,6 +90,7 @@
 		CreateAppHeadscale(valuesTmpls, tmpls),
 		CreateAppTailscaleProxy(valuesTmpls, tmpls),
 		CreateMetallbConfigEnv(valuesTmpls, tmpls),
+		CreateMetallbIPAddressPool(valuesTmpls, tmpls),
 		CreateEnvManager(valuesTmpls, tmpls),
 		CreateWelcome(valuesTmpls, tmpls),
 		CreateAppManager(valuesTmpls, tmpls),
@@ -400,6 +401,22 @@
 	}
 }
 
+func CreateMetallbIPAddressPool(fs embed.FS, tmpls *template.Template) App {
+	schema, err := fs.ReadFile("values-tmpl/metallb-ipaddresspool.jsonschema")
+	if err != nil {
+		panic(err)
+	}
+	return App{
+		"metallb-ipaddresspool",
+		[]string{"metallb-ipaddresspool"},
+		[]*template.Template{
+			tmpls.Lookup("metallb-ipaddresspool.yaml"),
+		},
+		string(schema),
+		tmpls.Lookup("metallb-ipaddresspool.md"),
+	}
+}
+
 func CreateEnvManager(fs embed.FS, tmpls *template.Template) App {
 	schema, err := fs.ReadFile("values-tmpl/env-manager.jsonschema")
 	if err != nil {
diff --git a/core/installer/values-tmpl/metallb-ipaddresspool.jsonschema b/core/installer/values-tmpl/metallb-ipaddresspool.jsonschema
new file mode 100644
index 0000000..479ef98
--- /dev/null
+++ b/core/installer/values-tmpl/metallb-ipaddresspool.jsonschema
@@ -0,0 +1,10 @@
+{
+  "type": "object",
+  "properties": {
+    "Name": { "type": "string" },
+	"From": { "type": "string" },
+    "To": { "type": "string" },
+	"AutoAssign": { "type": "boolean" }
+  },
+  "additionalProperties": false
+}
diff --git a/core/installer/values-tmpl/metallb-ipaddresspool.md b/core/installer/values-tmpl/metallb-ipaddresspool.md
new file mode 100644
index 0000000..e0ba8e6
--- /dev/null
+++ b/core/installer/values-tmpl/metallb-ipaddresspool.md
@@ -0,0 +1 @@
+Metallb IPAddressPool
diff --git a/core/installer/values-tmpl/metallb-ipaddresspool.yaml b/core/installer/values-tmpl/metallb-ipaddresspool.yaml
new file mode 100644
index 0000000..4eeacc9
--- /dev/null
+++ b/core/installer/values-tmpl/metallb-ipaddresspool.yaml
@@ -0,0 +1,19 @@
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: metallb-ipaddresspool-{{ .Values.Name }}
+  namespace: {{ .Release.Namespace }}
+spec:
+  chart:
+    spec:
+      chart: charts/metallb-ipaddresspool
+      sourceRef:
+        kind: GitRepository
+        name: pcloud
+        namespace: {{ .Global.Id }}
+  interval: 10m0s
+  values:
+    name: {{ .Values.Name }}
+    from: {{ .Values.From }}
+    to: {{ .Values.To }}
+    autoAssign: {{ .Values.AutoAssign }}