Resync order resources when their issuers change

Signed-off-by: James Munnelly <james@munnelly.eu>
This commit is contained in:
James Munnelly 2018-11-28 19:16:00 +00:00
parent 5a9553e5ca
commit 2da01a0a01
2 changed files with 60 additions and 8 deletions

View File

@ -16,4 +16,60 @@ limitations under the License.
package acmeorders
// no checks for the acme orders controller yet
import (
"fmt"
cmapi "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1alpha1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/runtime"
)
func (c *Controller) handleGenericIssuer(obj interface{}) {
iss, ok := obj.(cmapi.GenericIssuer)
if !ok {
runtime.HandleError(fmt.Errorf("Object does not implement GenericIssuer %#v", obj))
return
}
certs, err := c.ordersForGenericIssuer(iss)
if err != nil {
runtime.HandleError(fmt.Errorf("Error looking up Orders observing Issuer/ClusterIssuer: %s/%s", iss.GetObjectMeta().Namespace, iss.GetObjectMeta().Name))
return
}
for _, crt := range certs {
key, err := keyFunc(crt)
if err != nil {
runtime.HandleError(err)
continue
}
c.queue.Add(key)
}
}
func (c *Controller) ordersForGenericIssuer(iss cmapi.GenericIssuer) ([]*cmapi.Order, error) {
orders, err := c.orderLister.List(labels.NewSelector())
if err != nil {
return nil, fmt.Errorf("error listing certificiates: %s", err.Error())
}
_, isClusterIssuer := iss.(*cmapi.ClusterIssuer)
var affected []*cmapi.Order
for _, o := range orders {
if isClusterIssuer && o.Spec.IssuerRef.Kind != cmapi.ClusterIssuerKind {
continue
}
if !isClusterIssuer {
if o.Namespace != iss.GetObjectMeta().Namespace {
continue
}
}
if o.Spec.IssuerRef.Name != iss.GetObjectMeta().Name {
continue
}
affected = append(affected, o)
}
return affected, nil
}

View File

@ -72,26 +72,22 @@ func New(ctx *controllerpkg.Context) *Controller {
ctrl.watchedInformers = append(ctrl.watchedInformers, orderInformer.Informer().HasSynced)
ctrl.orderLister = orderInformer.Lister()
// issuerInformer.Informer().AddEventHandler(&controllerpkg.QueuingEventHandler{Queue: ctrl.queue})
issuerInformer := ctrl.SharedInformerFactory.Certmanager().V1alpha1().Issuers()
issuerInformer.Informer().AddEventHandler(&controllerpkg.BlockingEventHandler{WorkFunc: ctrl.handleGenericIssuer})
ctrl.watchedInformers = append(ctrl.watchedInformers, issuerInformer.Informer().HasSynced)
ctrl.issuerLister = issuerInformer.Lister()
// clusterIssuerInformer.Informer().AddEventHandler(&controllerpkg.QueuingEventHandler{Queue: ctrl.queue})
clusterIssuerInformer := ctrl.SharedInformerFactory.Certmanager().V1alpha1().ClusterIssuers()
clusterIssuerInformer.Informer().AddEventHandler(&controllerpkg.BlockingEventHandler{WorkFunc: ctrl.handleGenericIssuer})
ctrl.watchedInformers = append(ctrl.watchedInformers, clusterIssuerInformer.Informer().HasSynced)
ctrl.clusterIssuerLister = clusterIssuerInformer.Lister()
// TODO: the same problem here as with Certificates creating Orders occurs.
// The informer notices the new challenge resources which causes a resync
// of the owning Order resource before the order.status.url field is set.
// we need to detect this and not sync the order again automatically to
// prevent another order being created with the acme server.
challengeInformer := ctrl.SharedInformerFactory.Certmanager().V1alpha1().Challenges()
challengeInformer.Informer().AddEventHandler(&controllerpkg.BlockingEventHandler{WorkFunc: ctrl.handleOwnedResource})
ctrl.watchedInformers = append(ctrl.watchedInformers, challengeInformer.Informer().HasSynced)
ctrl.challengeLister = challengeInformer.Lister()
// TODO: detect changes to secrets referenced by order's issuers.
secretInformer := ctrl.KubeSharedInformerFactory.Core().V1().Secrets()
ctrl.watchedInformers = append(ctrl.watchedInformers, secretInformer.Informer().HasSynced)
ctrl.secretLister = secretInformer.Lister()