Skip to content

Commit ad8c47b

Browse files
Merge pull request #142 from ironcladlou/ca-publish-refactor
controller/certificate: relocate CA publishing
2 parents 4d8ff17 + a686f95 commit ad8c47b

File tree

10 files changed

+129
-131
lines changed

10 files changed

+129
-131
lines changed

hack/uninstall.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ if [ "$WHAT" == "all" ]; then
3232
oc delete clusterrolebindings/router-monitoring
3333
oc delete customresourcedefinition.apiextensions.k8s.io/clusteringresses.ingress.openshift.io
3434
fi
35+
36+
oc delete -n openshift-config-managed configmaps/router-ca

manifests/00-cluster-role.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ rules:
1717
verbs:
1818
- "*"
1919

20+
- apiGroups:
21+
- ""
22+
resources:
23+
- events
24+
verbs:
25+
- create
26+
2027
- apiGroups:
2128
- apps
2229
resources:

pkg/log/log.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var Logger logr.Logger
1414

1515
func init() {
1616
// Build a zap development logger.
17-
zapLogger, err := zap.NewDevelopment(zap.AddCallerSkip(1))
17+
zapLogger, err := zap.NewDevelopment(zap.AddCallerSkip(1), zap.AddStacktrace(zap.FatalLevel))
1818
if err != nil {
1919
panic(fmt.Sprintf("error building logger: %v", err))
2020
}

pkg/operator/controller/certificate/ca.go

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,14 @@ import (
1111
"math/big"
1212
"time"
1313

14+
"github.com/openshift/cluster-ingress-operator/pkg/operator/controller"
15+
1416
corev1 "k8s.io/api/core/v1"
1517

1618
"k8s.io/apimachinery/pkg/api/errors"
1719
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
18-
"k8s.io/apimachinery/pkg/types"
19-
)
20-
21-
const (
22-
// caCertSecretName is the name of the secret that holds the CA certificate
23-
// that the operator will use to create default certificates for
24-
// clusteringresses.
25-
caCertSecretName = "router-ca"
2620
)
2721

28-
// CASecretName returns the namespaced name for the router CA secret.
29-
func CASecretName(operatorNamespace string) types.NamespacedName {
30-
return types.NamespacedName{
31-
Namespace: operatorNamespace,
32-
Name: caCertSecretName,
33-
}
34-
}
35-
3622
func (r *reconciler) ensureRouterCASecret() (*corev1.Secret, error) {
3723
current, err := r.currentRouterCASecret()
3824
if err != nil {
@@ -55,7 +41,7 @@ func (r *reconciler) ensureRouterCASecret() (*corev1.Secret, error) {
5541

5642
// currentRouterCASecret returns the current router CA secret.
5743
func (r *reconciler) currentRouterCASecret() (*corev1.Secret, error) {
58-
name := CASecretName(r.operatorNamespace)
44+
name := controller.RouterCASecretName(r.operatorNamespace)
5945
secret := &corev1.Secret{}
6046
if err := r.client.Get(context.TODO(), name, secret); err != nil {
6147
if errors.IsNotFound(err) {
@@ -128,7 +114,7 @@ func desiredRouterCASecret(namespace string) (*corev1.Secret, error) {
128114
return nil, fmt.Errorf("failed to generate certificate: %v", err)
129115
}
130116

131-
name := CASecretName(namespace)
117+
name := controller.RouterCASecretName(namespace)
132118
secret := &corev1.Secret{
133119
ObjectMeta: metav1.ObjectMeta{
134120
Name: name.Name,

pkg/operator/controller/certificate/controller.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@ import (
1212

1313
ingressv1alpha1 "github.com/openshift/cluster-ingress-operator/pkg/apis/ingress/v1alpha1"
1414
logf "github.com/openshift/cluster-ingress-operator/pkg/log"
15+
"github.com/openshift/cluster-ingress-operator/pkg/operator/controller"
1516

1617
"k8s.io/apimachinery/pkg/api/errors"
1718
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
18-
"k8s.io/apimachinery/pkg/types"
1919
utilerrors "k8s.io/apimachinery/pkg/util/errors"
2020

2121
"k8s.io/client-go/tools/record"
2222

2323
appsv1 "k8s.io/api/apps/v1"
2424

2525
"sigs.k8s.io/controller-runtime/pkg/client"
26-
"sigs.k8s.io/controller-runtime/pkg/controller"
26+
runtimecontroller "sigs.k8s.io/controller-runtime/pkg/controller"
2727
"sigs.k8s.io/controller-runtime/pkg/handler"
2828
"sigs.k8s.io/controller-runtime/pkg/manager"
2929
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -36,13 +36,13 @@ const (
3636

3737
var log = logf.Logger.WithName(controllerName)
3838

39-
func New(mgr manager.Manager, client client.Client, operatorNamespace string) (controller.Controller, error) {
39+
func New(mgr manager.Manager, client client.Client, operatorNamespace string) (runtimecontroller.Controller, error) {
4040
reconciler := &reconciler{
4141
client: client,
4242
recorder: mgr.GetRecorder(controllerName),
4343
operatorNamespace: operatorNamespace,
4444
}
45-
c, err := controller.New(controllerName, mgr, controller.Options{Reconciler: reconciler})
45+
c, err := runtimecontroller.New(controllerName, mgr, runtimecontroller.Options{Reconciler: reconciler})
4646
if err != nil {
4747
return nil, err
4848
}
@@ -61,29 +61,28 @@ type reconciler struct {
6161
func (r *reconciler) Reconcile(request reconcile.Request) (reconcile.Result, error) {
6262
ca, err := r.ensureRouterCASecret()
6363
if err != nil {
64-
return reconcile.Result{}, fmt.Errorf("failed to ensure router CA secret: %v", err)
64+
return reconcile.Result{}, fmt.Errorf("failed to ensure router CA: %v", err)
6565
}
6666

6767
result := reconcile.Result{}
6868
errs := []error{}
6969
ingress := &ingressv1alpha1.ClusterIngress{}
7070
if err := r.client.Get(context.TODO(), request.NamespacedName, ingress); err != nil {
7171
if errors.IsNotFound(err) {
72-
// This means the ingress was already deleted/finalized and there are
73-
// stale queue entries (or something edge triggering from a related
74-
// resource that got deleted async).
72+
// The ingress could have been deleted and we're processing a stale queue
73+
// item, so ignore and skip.
7574
log.Info("clusteringress not found; reconciliation will be skipped", "request", request)
7675
} else {
7776
errs = append(errs, fmt.Errorf("failed to get clusteringress: %v", err))
7877
}
7978
} else {
8079
deployment := &appsv1.Deployment{}
81-
err = r.client.Get(context.TODO(), routerDeploymentName(ingress), deployment)
80+
err = r.client.Get(context.TODO(), controller.RouterDeploymentName(ingress), deployment)
8281
if err != nil {
8382
if errors.IsNotFound(err) {
8483
// All ingresses should have a deployment, so this one may not have been
8584
// created yet. Retry after a reasonable amount of time.
86-
log.Info("deployment not found for %s; will retry default cert sync", "clusteringress", ingress.Name)
85+
log.Info("deployment not found; will retry default cert sync", "clusteringress", ingress.Name)
8786
result.RequeueAfter = 5 * time.Second
8887
} else {
8988
errs = append(errs, fmt.Errorf("failed to get deployment: %v", err))
@@ -103,12 +102,13 @@ func (r *reconciler) Reconcile(request reconcile.Request) (reconcile.Result, err
103102
}
104103
}
105104
}
106-
return result, utilerrors.NewAggregate(errs)
107-
}
108105

109-
func routerDeploymentName(ci *ingressv1alpha1.ClusterIngress) types.NamespacedName {
110-
return types.NamespacedName{
111-
Namespace: "openshift-ingress",
112-
Name: "router-" + ci.Name,
106+
ingresses := &ingressv1alpha1.ClusterIngressList{}
107+
if err := r.client.List(context.TODO(), &client.ListOptions{Namespace: r.operatorNamespace}, ingresses); err != nil {
108+
errs = append(errs, fmt.Errorf("failed to list clusteringresses: %v", err))
109+
} else if err := r.ensureRouterCAConfigMap(ca, ingresses.Items); err != nil {
110+
errs = append(errs, fmt.Errorf("failed to publish router CA: %v", err))
113111
}
112+
113+
return result, utilerrors.NewAggregate(errs)
114114
}

pkg/operator/controller/certificate/default_cert.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,14 @@ import (
77
"github.com/openshift/library-go/pkg/crypto"
88

99
ingressv1alpha1 "github.com/openshift/cluster-ingress-operator/pkg/apis/ingress/v1alpha1"
10+
"github.com/openshift/cluster-ingress-operator/pkg/operator/controller"
1011

1112
corev1 "k8s.io/api/core/v1"
1213
"k8s.io/apimachinery/pkg/api/errors"
1314
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14-
"k8s.io/apimachinery/pkg/types"
1515
"k8s.io/apimachinery/pkg/util/sets"
1616
)
1717

18-
// routerDefaultCertificateSecretName returns the namespaced name for the router
19-
// default certificate secret.
20-
func routerDefaultCertificateSecretName(ci *ingressv1alpha1.ClusterIngress, namespace string) types.NamespacedName {
21-
return types.NamespacedName{
22-
Namespace: namespace,
23-
Name: fmt.Sprintf("router-certs-%s", ci.Name),
24-
}
25-
}
26-
2718
// ensureDefaultCertificateForIngress creates or deletes an operator-generated
2819
// default certificate for a given ClusterIngress as appropriate.
2920
func (r *reconciler) ensureDefaultCertificateForIngress(caSecret *corev1.Secret, namespace string, deploymentRef metav1.OwnerReference, ci *ingressv1alpha1.ClusterIngress) error {
@@ -85,7 +76,7 @@ func desiredRouterDefaultCertificateSecret(ca *crypto.CA, namespace string, depl
8576
return nil, fmt.Errorf("failed to encode certificate: %v", err)
8677
}
8778

88-
name := routerDefaultCertificateSecretName(ci, namespace)
79+
name := controller.RouterDefaultCertificateSecretName(ci, namespace)
8980
secret := &corev1.Secret{
9081
ObjectMeta: metav1.ObjectMeta{
9182
Name: name.Name,
@@ -104,7 +95,7 @@ func desiredRouterDefaultCertificateSecret(ca *crypto.CA, namespace string, depl
10495
// currentRouterDefaultCertificate returns the current router default
10596
// certificate secret.
10697
func (r *reconciler) currentRouterDefaultCertificate(ci *ingressv1alpha1.ClusterIngress, namespace string) (*corev1.Secret, error) {
107-
name := routerDefaultCertificateSecretName(ci, namespace)
98+
name := controller.RouterDefaultCertificateSecretName(ci, namespace)
10899
secret := &corev1.Secret{}
109100
if err := r.client.Get(context.TODO(), name, secret); err != nil {
110101
if errors.IsNotFound(err) {

pkg/operator/controller/controller_ca_configmap.go renamed to pkg/operator/controller/certificate/publish_ca.go

Lines changed: 36 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,17 @@
1-
package controller
1+
package certificate
22

33
import (
44
"context"
55
"fmt"
66

77
ingressv1alpha1 "github.com/openshift/cluster-ingress-operator/pkg/apis/ingress/v1alpha1"
8+
"github.com/openshift/cluster-ingress-operator/pkg/operator/controller"
89

910
corev1 "k8s.io/api/core/v1"
1011
"k8s.io/apimachinery/pkg/api/errors"
1112
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12-
"k8s.io/apimachinery/pkg/types"
1313
)
1414

15-
const (
16-
// GlobalMachineSpecifiedConfigNamespace is the location for global
17-
// config. In particular, the operator will put the configmap with the
18-
// CA certificate in this namespace.
19-
GlobalMachineSpecifiedConfigNamespace = "openshift-config-managed"
20-
21-
// caCertConfigMapName is the name of the config map with the public key
22-
// for the CA certificate, which the operator publishes for other
23-
// operators to use.
24-
caCertConfigMapName = "router-ca"
25-
)
26-
27-
// routerCAConfigMapName returns the namespaced name for the router CA
28-
// configmap.
29-
func routerCAConfigMapName() types.NamespacedName {
30-
return types.NamespacedName{
31-
Namespace: GlobalMachineSpecifiedConfigNamespace,
32-
Name: caCertConfigMapName,
33-
}
34-
}
35-
3615
// ensureRouterCAConfigMap will create, update, or delete the configmap for the
3716
// router CA as appropriate.
3817
func (r *reconciler) ensureRouterCAConfigMap(secret *corev1.Secret, ingresses []ingressv1alpha1.ClusterIngress) error {
@@ -48,16 +27,22 @@ func (r *reconciler) ensureRouterCAConfigMap(secret *corev1.Secret, ingresses []
4827
case desired == nil && current == nil:
4928
// Nothing to do.
5029
case desired == nil && current != nil:
51-
if err := r.deleteRouterCAConfigMap(current); err != nil {
30+
if deleted, err := r.deleteRouterCAConfigMap(current); err != nil {
5231
return fmt.Errorf("failed to ensure router CA was unpublished: %v", err)
32+
} else if deleted {
33+
r.recorder.Eventf(current, "Normal", "UnpublishedDefaultRouterCA", "Unpublished default router CA")
5334
}
5435
case desired != nil && current == nil:
55-
if err := r.createRouterCAConfigMap(desired); err != nil {
36+
if created, err := r.createRouterCAConfigMap(desired); err != nil {
5637
return fmt.Errorf("failed to ensure router CA was published: %v", err)
38+
} else if created {
39+
r.recorder.Eventf(desired, "Normal", "PublishedDefaultRouterCA", "Published default router CA")
5740
}
5841
case desired != nil && current != nil:
59-
if err := r.updateRouterCAConfigMap(current, desired); err != nil {
42+
if updated, err := r.updateRouterCAConfigMap(current, desired); err != nil {
6043
return fmt.Errorf("failed to update published router CA: %v", err)
44+
} else if updated {
45+
r.recorder.Eventf(desired, "Normal", "UpdatedPublishedDefaultRouterCA", "Updated the published default router CA")
6146
}
6247
}
6348
return nil
@@ -69,7 +54,7 @@ func desiredRouterCAConfigMap(secret *corev1.Secret, ingresses []ingressv1alpha1
6954
return nil, nil
7055
}
7156

72-
name := routerCAConfigMapName()
57+
name := controller.RouterCAConfigMapName()
7358
cm := &corev1.ConfigMap{
7459
ObjectMeta: metav1.ObjectMeta{
7560
Name: name.Name,
@@ -95,9 +80,9 @@ func shouldPublishRouterCA(ingresses []ingressv1alpha1.ClusterIngress) bool {
9580

9681
// currentRouterCAConfigMap returns the current router CA configmap.
9782
func (r *reconciler) currentRouterCAConfigMap() (*corev1.ConfigMap, error) {
98-
name := routerCAConfigMapName()
83+
name := controller.RouterCAConfigMapName()
9984
cm := &corev1.ConfigMap{}
100-
if err := r.Client.Get(context.TODO(), name, cm); err != nil {
85+
if err := r.client.Get(context.TODO(), name, cm); err != nil {
10186
if errors.IsNotFound(err) {
10287
return nil, nil
10388
}
@@ -106,45 +91,45 @@ func (r *reconciler) currentRouterCAConfigMap() (*corev1.ConfigMap, error) {
10691
return cm, nil
10792
}
10893

109-
// createRouterCAConfigMap creates a router CA configmap.
110-
func (r *reconciler) createRouterCAConfigMap(cm *corev1.ConfigMap) error {
111-
if err := r.Client.Create(context.TODO(), cm); err != nil {
94+
// createRouterCAConfigMap creates a router CA configmap. Returns true if the
95+
// configmap was created, false otherwise.
96+
func (r *reconciler) createRouterCAConfigMap(cm *corev1.ConfigMap) (bool, error) {
97+
if err := r.client.Create(context.TODO(), cm); err != nil {
11298
if errors.IsAlreadyExists(err) {
113-
return nil
99+
return false, nil
114100
}
115-
return err
101+
return false, err
116102
}
117-
log.Info("created configmap", "namespace", cm.Namespace, "name", cm.Name)
118-
return nil
103+
return true, nil
119104
}
120105

121-
// updateRouterCAConfigMaps updates the router CA configmap.
122-
func (r *reconciler) updateRouterCAConfigMap(current, desired *corev1.ConfigMap) error {
106+
// updateRouterCAConfigMaps updates the router CA configmap. Returns true if the
107+
// configmap was updated, false otherwise.
108+
func (r *reconciler) updateRouterCAConfigMap(current, desired *corev1.ConfigMap) (bool, error) {
123109
if routerCAConfigMapsEqual(current, desired) {
124-
return nil
110+
return false, nil
125111
}
126112
updated := current.DeepCopy()
127113
updated.Data = desired.Data
128-
if err := r.Client.Update(context.TODO(), updated); err != nil {
114+
if err := r.client.Update(context.TODO(), updated); err != nil {
129115
if errors.IsAlreadyExists(err) {
130-
return nil
116+
return false, nil
131117
}
132-
return err
118+
return false, err
133119
}
134-
log.Info("updated configmap", "namespace", updated.Namespace, "name", updated.Name)
135-
return nil
120+
return true, nil
136121
}
137122

138-
// deleteRouterCAConfigMap deletes the router CA configmap.
139-
func (r *reconciler) deleteRouterCAConfigMap(cm *corev1.ConfigMap) error {
140-
if err := r.Client.Delete(context.TODO(), cm); err != nil {
123+
// deleteRouterCAConfigMap deletes the router CA configmap. Returns true if the
124+
// configmap was deleted, false otherwise.
125+
func (r *reconciler) deleteRouterCAConfigMap(cm *corev1.ConfigMap) (bool, error) {
126+
if err := r.client.Delete(context.TODO(), cm); err != nil {
141127
if errors.IsNotFound(err) {
142-
return nil
128+
return false, nil
143129
}
144-
return err
130+
return false, err
145131
}
146-
log.Info("deleted configmap", "namespace", cm.Namespace, "name", cm.Name)
147-
return nil
132+
return true, nil
148133
}
149134

150135
// routerCAConfigMapsEqual compares two router CA configmaps.

pkg/operator/controller/controller_test.go renamed to pkg/operator/controller/certificate/publish_ca_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package controller
1+
package certificate
22

33
import (
44
"fmt"

0 commit comments

Comments
 (0)