in api/v1alpha1/nginxingresscontroller_types.go [275:315]
func (n *NginxIngressController) Collides(ctx context.Context, cl client.Client) (bool, string, error) {
lgr := logr.FromContextOrDiscard(ctx).WithValues("name", n.Name, "ingressClassName", n.Spec.IngressClassName)
lgr.Info("checking for NginxIngressController collisions")
// check for NginxIngressController collisions
lgr.Info("checking for NginxIngressController collision")
var nginxIngressControllerList NginxIngressControllerList
if err := cl.List(ctx, &nginxIngressControllerList); err != nil {
lgr.Error(err, "listing NginxIngressControllers")
return false, "", fmt.Errorf("listing NginxIngressControllers: %w", err)
}
for _, nic := range nginxIngressControllerList.Items {
if nic.Spec.IngressClassName == n.Spec.IngressClassName && nic.Name != n.Name {
lgr.Info("NginxIngressController collision found")
return true, fmt.Sprintf("spec.ingressClassName \"%s\" is invalid because NginxIngressController \"%s\" already uses IngressClass \"%[1]s\"", n.Spec.IngressClassName, nic.Name), nil
}
}
// Check for an IngressClass collision.
// This is purposefully after the NginxIngressController check because if the collision is through an NginxIngressController
// that's the one we want to report as the reason since the user action for fixing that would involve working with the NginxIngressController
// resource rather than the IngressClass resource.
lgr.Info("checking for IngressClass collision")
ic := &netv1.IngressClass{
ObjectMeta: metav1.ObjectMeta{
Name: n.Spec.IngressClassName,
},
}
err := cl.Get(ctx, types.NamespacedName{Name: ic.Name}, ic)
if err == nil {
lgr.Info("IngressClass collision found")
return true, fmt.Sprintf("spec.ingressClassName \"%s\" is invalid because IngressClass \"%[1]s\" already exists", n.Spec.IngressClassName), nil
}
if !k8serrors.IsNotFound(err) {
lgr.Error(err, "checking for IngressClass collisions")
return false, "", fmt.Errorf("checking for IngressClass collisions: %w", err)
}
return false, "", nil
}