diff --git a/pkg/controller/cluster/client.go b/pkg/controller/cluster/client.go index b0952958..785ad285 100644 --- a/pkg/controller/cluster/client.go +++ b/pkg/controller/cluster/client.go @@ -13,7 +13,7 @@ import ( "github.com/rancher/k3k/pkg/controller" ) -// newVirtualClient +// newVirtualClient creates a new Client that can be used to interact with the virtual cluster func newVirtualClient(ctx context.Context, hostClient ctrlruntimeclient.Client, clusterName, clusterNamespace string) (ctrlruntimeclient.Client, error) { var clusterKubeConfig v1.Secret diff --git a/pkg/controller/cluster/service.go b/pkg/controller/cluster/service.go index a1867f5f..1bf1b771 100644 --- a/pkg/controller/cluster/service.go +++ b/pkg/controller/cluster/service.go @@ -41,12 +41,22 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req reconcile.Request log := ctrl.LoggerFrom(ctx) log.Info("ensuring service status to virtual cluster") - var hostService, virtService v1.Service - + var hostService v1.Service if err := r.HostClient.Get(ctx, req.NamespacedName, &hostService); err != nil { return reconcile.Result{}, ctrlruntimeclient.IgnoreNotFound(err) } + // Some services are owned by the cluster but don't have the annotations set (i.e. the kubelet svc) + // They don't exists in the virtual cluster, so we can skip them + + virtualServiceName, virtualServiceNameFound := hostService.Annotations[translate.ResourceNameAnnotation] + virtualServiceNamespace, virtualServiceNamespaceFound := hostService.Annotations[translate.ResourceNamespaceAnnotation] + + if !virtualServiceNameFound || !virtualServiceNamespaceFound { + log.V(1).Info(fmt.Sprintf("service %s/%s does not have virtual service annotations, skipping", hostService.Namespace, hostService.Name)) + return reconcile.Result{}, nil + } + // get cluster from the object cluster := clusterNamespacedName(&hostService) @@ -60,17 +70,18 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req reconcile.Request } virtualServiceKey := types.NamespacedName{ - Name: hostService.Annotations[translate.ResourceNameAnnotation], - Namespace: hostService.Annotations[translate.ResourceNamespaceAnnotation], + Name: virtualServiceName, + Namespace: virtualServiceNamespace, } - if err := virtualClient.Get(ctx, virtualServiceKey, &virtService); err != nil { - return reconcile.Result{}, fmt.Errorf("failed to get virt service: %v", err) + var virtualService v1.Service + if err := virtualClient.Get(ctx, virtualServiceKey, &virtualService); err != nil { + return reconcile.Result{}, fmt.Errorf("failed to get virtual service: %v", err) } - if !equality.Semantic.DeepEqual(virtService.Status.LoadBalancer, hostService.Status.LoadBalancer) { - virtService.Status.LoadBalancer = hostService.Status.LoadBalancer - if err := virtualClient.Status().Update(ctx, &virtService); err != nil { + if !equality.Semantic.DeepEqual(virtualService.Status.LoadBalancer, hostService.Status.LoadBalancer) { + virtualService.Status.LoadBalancer = hostService.Status.LoadBalancer + if err := virtualClient.Status().Update(ctx, &virtualService); err != nil { return reconcile.Result{}, err } }