diff --git a/pkg/ingressroute/ingressroute.go b/pkg/ingressroute/ingressroute.go index b5df5f3..9b2310b 100644 --- a/pkg/ingressroute/ingressroute.go +++ b/pkg/ingressroute/ingressroute.go @@ -51,26 +51,9 @@ func (i *ingressRouteClient) Watch(stopCh chan struct{}) { _, err := informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { key, err := cache.MetaNamespaceKeyFunc(obj) - if err != nil { - return + if err == nil { + queue.Add(event{key: key, eventType: watch.Added}) } - - convObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj) - if err != nil { - return - } - - rawRoutes, found, err := unstructured.NestedSlice(convObj, "spec", "routes") - if err != nil || !found { - return - } - - routes, err := routeInterfaceToMapSlice(rawRoutes) - if err != nil { - return - } - - queue.Add(event{key: key, eventType: watch.Added, routes: routes}) }, UpdateFunc: func(_, newObj interface{}) { key, err := cache.MetaNamespaceKeyFunc(newObj) @@ -96,12 +79,12 @@ func (i *ingressRouteClient) Watch(stopCh chan struct{}) { go informer.Run(stopCh) wait.Until(func() { - for i.processNextItem(queue) { + for i.processNextItem(queue, informer) { } }, time.Second, stopCh) } -func (i *ingressRouteClient) processNextItem(queue workqueue.TypedRateLimitingInterface[any]) bool { +func (i *ingressRouteClient) processNextItem(queue workqueue.TypedRateLimitingInterface[any], informer cache.SharedInformer) bool { item, quit := queue.Get() if quit { return false @@ -122,10 +105,44 @@ func (i *ingressRouteClient) processNextItem(queue workqueue.TypedRateLimitingIn return true } + obj, exists, err := informer.GetStore().GetByKey(event.key) + if err != nil || !exists { + log.Printf("Failed to retrieve object for key %s: %v", event.key, err) + return true + } + + convObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj) + if err != nil { + log.Printf("Failed to convert unstructured object for key %s: %v", event.key, err) + return true + } + + rawRoutes, found, err := unstructured.NestedSlice(convObj, "spec", "routes") + if err != nil || !found { + log.Printf("No routes found for key %s", event.key) + return true + } + + secretName, found, err := unstructured.NestedString(convObj, "spec", "tls", "secretName") + if err != nil { + log.Printf("Failed to scrape secret name for %s: %v", event.key, err) + return true + } + if !found { + log.Printf("No secret name found, using ingressroute name %s", name) + secretName = name + } + + routes, err := routeInterfaceToMapSlice(rawRoutes) + if err != nil { + log.Printf("Failed to convert routes for key %s: %v", event.key, err) + return true + } + //nolint:exhaustive // ignore missing switch cases switch event.eventType { case watch.Added, watch.Modified: - createErr := i.client.certmanager.Certificates.Create(context.Background(), namespace, name, event.routes) + createErr := i.client.certmanager.Certificates.Create(context.Background(), namespace, secretName, routes) if createErr != nil { if errors.Is(createErr, certmanager.ErrCertificateAlreadyExist) { log.Printf("Certificate %s for %s already exists", secretName, event.key) @@ -134,7 +151,7 @@ func (i *ingressRouteClient) processNextItem(queue workqueue.TypedRateLimitingIn } } case watch.Deleted: - if deleteErr := i.client.certmanager.Certificates.Delete(context.Background(), namespace, name); deleteErr != nil { + if deleteErr := i.client.certmanager.Certificates.Delete(context.Background(), namespace, secretName); deleteErr != nil { log.Printf("Failed to delete certificate %s: %v", event.key, deleteErr) } } @@ -145,7 +162,6 @@ func (i *ingressRouteClient) processNextItem(queue workqueue.TypedRateLimitingIn type event struct { key string eventType watch.EventType - routes []map[string]interface{} } func routeInterfaceToMapSlice(input []interface{}) ([]map[string]interface{}, error) {