headscale-controller: add headscaleAddress to the HeadscaleUser crd
diff --git a/core/headscale/controller/Dockerfile b/core/headscale/controller/Dockerfile
index 5a355c2..b3158b2 100644
--- a/core/headscale/controller/Dockerfile
+++ b/core/headscale/controller/Dockerfile
@@ -15,7 +15,7 @@
COPY controllers/ controllers/
# Build
-RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -o manager main.go
# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
diff --git a/core/headscale/controller/Makefile b/core/headscale/controller/Makefile
index f43f9a3..e1f6077 100644
--- a/core/headscale/controller/Makefile
+++ b/core/headscale/controller/Makefile
@@ -1,6 +1,6 @@
# Image URL to use all building/pushing image targets
-IMG ?= controller:latest
+IMG ?= giolekva/headscale-controller:latest
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
ENVTEST_K8S_VERSION = 1.24.2
@@ -70,11 +70,11 @@
.PHONY: docker-build
docker-build: test ## Build docker image with the manager.
- docker build -t ${IMG} .
+ podman build -t ${IMG} .
.PHONY: docker-push
docker-push: ## Push docker image with the manager.
- docker push ${IMG}
+ podman push ${IMG}
##@ Deployment
@@ -130,3 +130,7 @@
envtest: $(ENVTEST) ## Download envtest-setup locally if necessary.
$(ENVTEST): $(LOCALBIN)
test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
+
+generate-helm-chart: manifests kustomize
+ cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG}
+ $(KUSTOMIZE) build config/default | sed 's/: controller-system/: {{ .Release.Namespace }}/g' > ../../../charts/headscale-controller/templates/install.yaml
diff --git a/core/headscale/controller/api/v1/headscaleuser_types.go b/core/headscale/controller/api/v1/headscaleuser_types.go
index aa9162f..146388d 100644
--- a/core/headscale/controller/api/v1/headscaleuser_types.go
+++ b/core/headscale/controller/api/v1/headscaleuser_types.go
@@ -33,8 +33,9 @@
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
- Name string `json:"name,omitempty"`
- PreAuthKey PreAuthKey `json:"preAuthKey,omitempty"`
+ HeadscaleAddress string `json:"headscaleAddress,omitempty"`
+ Name string `json:"name,omitempty"`
+ PreAuthKey PreAuthKey `json:"preAuthKey,omitempty"`
}
// HeadscaleUserStatus defines the observed state of HeadscaleUser
diff --git a/core/headscale/controller/config/crd/bases/headscale.dodo.cloud_headscaleusers.yaml b/core/headscale/controller/config/crd/bases/headscale.dodo.cloud_headscaleusers.yaml
index c64333e..bc812b3 100644
--- a/core/headscale/controller/config/crd/bases/headscale.dodo.cloud_headscaleusers.yaml
+++ b/core/headscale/controller/config/crd/bases/headscale.dodo.cloud_headscaleusers.yaml
@@ -35,6 +35,8 @@
spec:
description: HeadscaleUserSpec defines the desired state of HeadscaleUser
properties:
+ headscaleAddress:
+ type: string
name:
type: string
preAuthKey:
diff --git a/core/headscale/controller/config/manager/kustomization.yaml b/core/headscale/controller/config/manager/kustomization.yaml
index 2bcd3ee..1d95deb 100644
--- a/core/headscale/controller/config/manager/kustomization.yaml
+++ b/core/headscale/controller/config/manager/kustomization.yaml
@@ -5,6 +5,12 @@
disableNameSuffixHash: true
configMapGenerator:
-- name: manager-config
- files:
+- files:
- controller_manager_config.yaml
+ name: manager-config
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+images:
+- name: controller
+ newName: giolekva/headscale-controller
+ newTag: latest
diff --git a/core/headscale/controller/controllers/headscaleuser_controller.go b/core/headscale/controller/controllers/headscaleuser_controller.go
index 5f8cd6c..bbd2103 100644
--- a/core/headscale/controller/controllers/headscaleuser_controller.go
+++ b/core/headscale/controller/controllers/headscaleuser_controller.go
@@ -37,26 +37,23 @@
)
type HeadscaleClient struct {
- address string
+ baseUrl url.URL
httpClient *http.Client
}
-func NewHeadscaleClient(address string) *HeadscaleClient {
+func NewHeadscaleClient(baseUrl url.URL) *HeadscaleClient {
return &HeadscaleClient{
- address,
+ baseUrl,
&http.Client{},
}
}
func (c *HeadscaleClient) CreateUser(name string) error {
- fmt.Println(name)
+ reqAddr := c.baseUrl
+ reqAddr.Path = "/user"
req := &http.Request{
Method: http.MethodPost,
- URL: &url.URL{
- Scheme: "http",
- Host: c.address,
- Path: "/user",
- },
+ URL: &reqAddr,
Header: map[string][]string{
"Content-Type": []string{"application/json"},
},
@@ -76,13 +73,11 @@
}
func (c *HeadscaleClient) CreateReusablePreAuthKey(user string) (string, error) {
+ reqAddr := c.baseUrl
+ reqAddr.Path = fmt.Sprintf("/user/%s/preauthkey", user)
req := &http.Request{
Method: http.MethodPost,
- URL: &url.URL{
- Scheme: "http",
- Host: c.address,
- Path: fmt.Sprintf("/user/%s/preauthkey", user),
- },
+ URL: &reqAddr,
}
resp, err := c.httpClient.Do(req)
if err != nil {
@@ -133,11 +128,16 @@
if resource.Status.Ready {
return ctrl.Result{}, nil
}
- if err := r.Headscale.CreateUser(resource.Spec.Name); err != nil {
+ baseAddr, err := url.Parse(resource.Spec.HeadscaleAddress)
+ if err != nil {
+ return ctrl.Result{RequeueAfter: time.Minute}, err
+ }
+ headscale := NewHeadscaleClient(*baseAddr)
+ if err := headscale.CreateUser(resource.Spec.Name); err != nil {
return ctrl.Result{RequeueAfter: time.Minute}, err
}
if resource.Spec.PreAuthKey.Enabled {
- key, err := r.Headscale.CreateReusablePreAuthKey(resource.Spec.Name)
+ key, err := headscale.CreateReusablePreAuthKey(resource.Spec.Name)
if err != nil {
return ctrl.Result{RequeueAfter: time.Minute}, err
}
diff --git a/core/headscale/controller/main.go b/core/headscale/controller/main.go
index c80d56b..e494441 100644
--- a/core/headscale/controller/main.go
+++ b/core/headscale/controller/main.go
@@ -52,13 +52,11 @@
var metricsAddr string
var enableLeaderElection bool
var probeAddr string
- var headscaleAddr string
flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
"Enable leader election for controller manager. "+
"Enabling this will ensure there is only one active controller manager.")
- flag.StringVar(&headscaleAddr, "headscale-api", "headscale-api", "HTTP endpoint pointing to headscale api.")
opts := zap.Options{
Development: true,
}
@@ -92,9 +90,8 @@
}
if err = (&controllers.HeadscaleUserReconciler{
- Client: mgr.GetClient(),
- Scheme: mgr.GetScheme(),
- Headscale: controllers.NewHeadscaleClient(headscaleAddr),
+ Client: mgr.GetClient(),
+ Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "HeadscaleUser")
os.Exit(1)