Skip to content

Commit b64539b

Browse files
committed
retrieve vpc-id
1 parent baeae76 commit b64539b

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

Diff for: cmd/main.go

-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ func main() {
143143
}
144144

145145
hostInstance, crusoeClient, err := controller.GetHostInstance(context.Background())
146-
147146
if err != nil {
148147
setupLog.Error(err, "unable to get host instance", "controller", "Service")
149148
}

Diff for: internal/controller/service_controller.go

+52-3
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,15 @@ import (
3636
"sigs.k8s.io/controller-runtime/pkg/builder"
3737
"sigs.k8s.io/controller-runtime/pkg/client"
3838
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
39+
"sigs.k8s.io/controller-runtime/pkg/event"
3940
"sigs.k8s.io/controller-runtime/pkg/handler"
4041
"sigs.k8s.io/controller-runtime/pkg/log"
4142
"sigs.k8s.io/controller-runtime/pkg/predicate"
4243
"sigs.k8s.io/controller-runtime/pkg/reconcile"
4344
)
4445

46+
const CrusoeClusterIDFlag = "crusoe-cluster-id" //nolint:gosec // false positive, this is a flag name
47+
4548
// ServiceReconciler reconciles a Service object
4649
type ServiceReconciler struct {
4750
client.Client
@@ -229,8 +232,19 @@ func (r *ServiceReconciler) handleCreate(ctx context.Context, svc *corev1.Servic
229232
healthCheckOptions := ParseHealthCheckOptionsFromAnnotations(svc.Annotations)
230233

231234
// Prepare payload for the API call
235+
// get vpc id
236+
cluster, _, err := r.CrusoeClient.KubernetesClustersApi.GetCluster(ctx, r.HostInstance.ProjectId, viper.GetString(CrusoeClusterIDFlag))
237+
if err != nil {
238+
logger.Error(err, "Failed to get cluster", "clusterID", viper.GetString(CrusoeClusterIDFlag))
239+
return ctrl.Result{}, err
240+
}
241+
subnet, _, err := r.CrusoeClient.VPCSubnetsApi.GetVPCSubnet(ctx, r.HostInstance.ProjectId, cluster.SubnetId)
242+
if err != nil {
243+
logger.Error(err, "Failed to get vpc network id from cluster subnet id ", "subnetID", cluster.SubnetId)
244+
return ctrl.Result{}, err
245+
}
232246
apiPayload := crusoeapi.ExternalLoadBalancerPostRequest{
233-
VpcId: viper.GetString(CrusoeVPCIDFlag),
247+
VpcId: subnet.VpcNetworkId,
234248
Name: svc.Name,
235249
Location: r.HostInstance.Location,
236250
Protocol: "LOAD_BALANCER_PROTOCOL_TCP", // only TCP supported currently
@@ -369,6 +383,40 @@ func (r *ServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {
369383
return ok && svc.Spec.Type == corev1.ServiceTypeLoadBalancer
370384
})
371385

386+
nodeCreateDeletePredicate := predicate.Funcs{
387+
// Called for new Node objects
388+
CreateFunc: func(e event.CreateEvent) bool {
389+
return true
390+
},
391+
// Called for Node updates e.g. node from not ready to ready
392+
UpdateFunc: func(e event.UpdateEvent) bool {
393+
oldNode, oldOk := e.ObjectOld.(*corev1.Node)
394+
newNode, newOk := e.ObjectNew.(*corev1.Node)
395+
if !oldOk || !newOk {
396+
return false
397+
}
398+
399+
oldReady := isNodeReady(oldNode)
400+
newReady := isNodeReady(newNode)
401+
402+
// Only trigger if the node transitioned from NotReady -> Ready or vice versa
403+
if oldReady != newReady {
404+
log.Log.Info("Node readiness changed", "node", newNode.Name, "oldReady", oldReady, "newReady", newReady)
405+
return true
406+
}
407+
408+
return false // Skip other updates
409+
},
410+
// Called for Node deletions
411+
DeleteFunc: func(e event.DeleteEvent) bool {
412+
return true
413+
},
414+
// Rare, generic events are usually no-ops here
415+
GenericFunc: func(e event.GenericEvent) bool {
416+
return false
417+
},
418+
}
419+
372420
mapNodeToLBServices := handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
373421

374422
node, ok := obj.(*corev1.Node)
@@ -398,15 +446,16 @@ func (r *ServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {
398446
},
399447
)
400448
return ctrl.NewControllerManagedBy(mgr).
401-
// Watch only Service objects of type=LoadBalancer
449+
// Watch Service objects of type=LoadBalancer
402450
For(
403451
&corev1.Service{},
404452
builder.WithPredicates(loadBalancerPredicate),
405453
).
406-
// Also watch Node events, with no filter so they pass
454+
// Also watch Node events to update backends list
407455
Watches(
408456
&corev1.Node{},
409457
mapNodeToLBServices,
458+
builder.WithPredicates(nodeCreateDeletePredicate),
410459
).
411460
Complete(r)
412461

Diff for: internal/utils/utils.go

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const (
2828
CrusoeAPIEndpointFlag = "crusoe-api-endpoint"
2929
CrusoeAccessKeyFlag = "crusoe-elb-access-key"
3030
CrusoeSecretKeyFlag = "crusoe-elb-secret-key" //nolint:gosec // false positive, this is a flag name
31+
CrusoeClusterIDFlag = "crusoe-cluster-id" //nolint:gosec // false positive, this is a flag name
3132
CrusoeProjectIDFlag = "crusoe-project-id"
3233
CrusoeVPCIDFlag = "crusoe-vpc-id"
3334
NodeNameFlag = "node-name"
@@ -154,5 +155,8 @@ func BindEnvs() error {
154155
if err := viper.BindEnv(NodeNameFlag, "NODE_NAME"); err != nil {
155156
return fmt.Errorf("Failed to bind env NODE_NAME: %v", err)
156157
}
158+
if err := viper.BindEnv(CrusoeClusterIDFlag, "CRUSOE_CLUSTER_ID"); err != nil {
159+
return fmt.Errorf("Failed to bind env CRUSOE_CLUSTER_ID: %v", err)
160+
}
157161
return nil
158162
}

0 commit comments

Comments
 (0)