@@ -18,6 +18,7 @@ package controllers
1818
1919import  (
2020	"context" 
21+ 	"fmt" 
2122	"time" 
2223
2324	"github.com/go-logr/logr" 
@@ -33,15 +34,17 @@ import (
3334	"sigs.k8s.io/controller-runtime/pkg/source" 
3435
3536	infrastructurev1alpha3 "github.com/packethost/cluster-api-provider-packet/api/v1alpha3" 
37+ 	packet "github.com/packethost/cluster-api-provider-packet/pkg/cloud/packet" 
3638	"github.com/packethost/cluster-api-provider-packet/pkg/cloud/packet/scope" 
3739)
3840
3941// PacketClusterReconciler reconciles a PacketCluster object 
4042type  PacketClusterReconciler  struct  {
4143	client.Client 
42- 	Log       logr.Logger 
43- 	Recorder  record.EventRecorder 
44- 	Scheme    * runtime.Scheme 
44+ 	Log           logr.Logger 
45+ 	Recorder      record.EventRecorder 
46+ 	Scheme        * runtime.Scheme 
47+ 	PacketClient  * packet.PacketClient 
4548}
4649
4750// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=packetclusters,verbs=get;list;watch;create;update;patch;delete 
@@ -94,9 +97,30 @@ func (r *PacketClusterReconciler) Reconcile(req ctrl.Request) (_ ctrl.Result, re
9497		}
9598	}()
9699
97- 	// we have no setup to be done 
98100	clusterScope .PacketCluster .Status .Ready  =  true 
99101
102+ 	address , err  :=  r .getIP (clusterScope .PacketCluster )
103+ 	_ , isNoMachine  :=  err .(* MachineNotFound )
104+ 	_ , isNoIP  :=  err .(* MachineNoIP )
105+ 	switch  {
106+ 	case  err  !=  nil  &&  isNoMachine :
107+ 		logger .Info ("Control plan device not found. Requeueing..." )
108+ 		return  ctrl.Result {Requeue : true , RequeueAfter : 30  *  time .Second }, nil 
109+ 	case  err  !=  nil  &&  isNoIP :
110+ 		logger .Info ("Control plan device not found. Requeueing..." )
111+ 		return  ctrl.Result {Requeue : true , RequeueAfter : 30  *  time .Second }, nil 
112+ 	case  err  !=  nil :
113+ 		logger .Error (err , "error getting a control plan ip" )
114+ 		return  ctrl.Result {}, err 
115+ 	case  err  ==  nil :
116+ 		clusterScope .PacketCluster .Status .APIEndpoints  =  []infrastructurev1alpha3.APIEndpoint {
117+ 			{
118+ 				Host : address ,
119+ 				Port : 6443 ,
120+ 			},
121+ 		}
122+ 	}
123+ 
100124	return  ctrl.Result {}, nil 
101125}
102126
@@ -111,3 +135,45 @@ func (r *PacketClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
111135		).
112136		Complete (r )
113137}
138+ 
139+ func  (r  * PacketClusterReconciler ) getIP (cluster  * infrastructurev1alpha3.PacketCluster ) (string , error ) {
140+ 	if  cluster  ==  nil  {
141+ 		return  "" , fmt .Errorf ("cannot get IP of machine in nil cluster" )
142+ 	}
143+ 	tags  :=  []string {
144+ 		packet .GenerateClusterTag (string (cluster .Name )),
145+ 		infrastructurev1alpha3 .MasterTag ,
146+ 	}
147+ 	device , err  :=  r .PacketClient .GetDeviceByTags (cluster .Spec .ProjectID , tags )
148+ 	if  err  !=  nil  {
149+ 		return  "" , fmt .Errorf ("error retrieving machine: %v" , err )
150+ 	}
151+ 	if  device  ==  nil  {
152+ 		return  "" , & MachineNotFound {err : fmt .Sprintf ("machine does not exist" )}
153+ 	}
154+ 	if  device .Network  ==  nil  ||  len (device .Network ) ==  0  ||  device .Network [0 ].Address  ==  ""  {
155+ 		return  "" , & MachineNoIP {err : "machine does not yet have an IP address" }
156+ 	}
157+ 	// TODO: validate that this address exists, so we don't hit nil pointer 
158+ 	// TODO: check which address to return 
159+ 	// TODO: check address format (cidr, subnet, etc.) 
160+ 	return  device .Network [0 ].Address , nil 
161+ }
162+ 
163+ // MachineNotFound error representing that the requested device was not yet found 
164+ type  MachineNotFound  struct  {
165+ 	err  string 
166+ }
167+ 
168+ func  (e  * MachineNotFound ) Error () string  {
169+ 	return  e .err 
170+ }
171+ 
172+ // MachineNoIP error representing that the requested device does not have an IP yet assigned 
173+ type  MachineNoIP  struct  {
174+ 	err  string 
175+ }
176+ 
177+ func  (e  * MachineNoIP ) Error () string  {
178+ 	return  e .err 
179+ }
0 commit comments