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)