diff --git a/pkg/ingressroute/ingressroute.go b/pkg/ingressroute/ingressroute.go index b5df5f3..4413391 100644 --- a/pkg/ingressroute/ingressroute.go +++ b/pkg/ingressroute/ingressroute.go @@ -51,31 +51,14 @@ 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, object: &obj}) } - - 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) if err == nil { - queue.Add(event{key: key, eventType: watch.Modified}) + queue.Add(event{key: key, eventType: watch.Modified, object: &newObj}) } }, DeleteFunc: func(obj interface{}) { @@ -85,7 +68,7 @@ func (i *ingressRouteClient) Watch(stopCh chan struct{}) { key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) if err == nil { - queue.Add(event{key: key, eventType: watch.Deleted}) + queue.Add(event{key: key, eventType: watch.Deleted, object: &obj}) } }, }) @@ -122,20 +105,52 @@ func (i *ingressRouteClient) processNextItem(queue workqueue.TypedRateLimitingIn return true } + convObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(event.object) + 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) } else { log.Printf("Failed to create certificate %s: %v", event.key, createErr) } + } else { + log.Printf("Certificate %s for %s created", secretName, event.key) } 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) + } else { + log.Printf("Certificate %s for %s deleted", secretName, event.key) } } @@ -145,7 +160,7 @@ func (i *ingressRouteClient) processNextItem(queue workqueue.TypedRateLimitingIn type event struct { key string eventType watch.EventType - routes []map[string]interface{} + object *interface{} } func routeInterfaceToMapSlice(input []interface{}) ([]map[string]interface{}, error) {