Compare commits

...

3 commits

Author SHA1 Message Date
0ae856a894
fix(certmanager): improve regex to ignore "`" character
All checks were successful
ci/woodpecker/push/lint Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/push/deploy Pipeline was successful
2025-01-22 10:14:01 +01:00
065b04ba39
fix(certmanager): convert certificate to unstructured using pointer 2025-01-22 10:14:01 +01:00
7839bcf3cb
chore(ingressroute): remove hashable fields from queue store 2025-01-22 10:13:59 +01:00
2 changed files with 41 additions and 25 deletions

View file

@ -77,7 +77,7 @@ func (c *certificateClient) Create(
}, },
} }
obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(cert) obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&cert)
if err != nil { if err != nil {
return errors.Join(ErrCertificateToUnstructured, err) return errors.Join(ErrCertificateToUnstructured, err)
} }
@ -140,6 +140,7 @@ func extractHosts(routes []map[string]interface{}) []string {
} }
if match, ok = route["match"].(string); ok { if match, ok = route["match"].(string); ok {
match = strings.ReplaceAll(match, "`", "")
hostMatches := re.FindAllStringSubmatch(match, -1) hostMatches := re.FindAllStringSubmatch(match, -1)
for _, match := range hostMatches { for _, match := range hostMatches {
if len(match) > 1 { if len(match) > 1 {

View file

@ -51,31 +51,14 @@ func (i *ingressRouteClient) Watch(stopCh chan struct{}) {
_, err := informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ _, err := informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(obj) key, err := cache.MetaNamespaceKeyFunc(obj)
if err != nil { if err == nil {
return 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{}) { UpdateFunc: func(_, newObj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(newObj) key, err := cache.MetaNamespaceKeyFunc(newObj)
if err == nil { 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{}) { DeleteFunc: func(obj interface{}) {
@ -85,7 +68,7 @@ func (i *ingressRouteClient) Watch(stopCh chan struct{}) {
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
if err == nil { 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 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 //nolint:exhaustive // ignore missing switch cases
switch event.eventType { switch event.eventType {
case watch.Added, watch.Modified: 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 createErr != nil {
if errors.Is(createErr, certmanager.ErrCertificateAlreadyExist) { if errors.Is(createErr, certmanager.ErrCertificateAlreadyExist) {
log.Printf("Certificate %s for %s already exists", secretName, event.key) log.Printf("Certificate %s for %s already exists", secretName, event.key)
} else { } else {
log.Printf("Failed to create certificate %s: %v", event.key, createErr) 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: 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) 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 { type event struct {
key string key string
eventType watch.EventType eventType watch.EventType
routes []map[string]interface{} object *interface{}
} }
func routeInterfaceToMapSlice(input []interface{}) ([]map[string]interface{}, error) { func routeInterfaceToMapSlice(input []interface{}) ([]map[string]interface{}, error) {