Skip to content

Commit

Permalink
remove owner references from grafana config map
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathankingfc committed Mar 30, 2021
1 parent ef2d623 commit 7639152
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 5 deletions.
19 changes: 19 additions & 0 deletions apis/quay/v1/quayregistry_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,25 @@ func EnsureOwnerReference(quay *QuayRegistry, obj runtime.Object) (runtime.Objec
return obj, nil
}

// RemoveOwnerReference removes the `ownerReference` of `QuayRegistry` on the given object.
func RemoveOwnerReference(quay *QuayRegistry, obj runtime.Object) (runtime.Object, error) {
filteredOwnerReferences := []metav1.OwnerReference{}

objectMeta, err := meta.Accessor(obj)
if err != nil {
return nil, err
}

for _, ownerRef := range objectMeta.GetOwnerReferences() {
if ownerRef.Name != quay.GetName() {
filteredOwnerReferences = append(filteredOwnerReferences, ownerRef)
}
}
objectMeta.SetOwnerReferences(filteredOwnerReferences)

return obj, nil
}

const ManagedKeysName = "quay-registry-managed-secret-keys"

// ManagedKeysSecretNameFor returns the name of the `Secret` in which generated secret keys are stored.
Expand Down
42 changes: 37 additions & 5 deletions controllers/quay/quayregistry_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ const (
// QuayRegistryReconciler reconciles a QuayRegistry object
type QuayRegistryReconciler struct {
client.Client
Log logr.Logger
Scheme *runtime.Scheme
EventRecorder record.EventRecorder
Log logr.Logger
Scheme *runtime.Scheme
EventRecorder record.EventRecorder
WatchNamespace string
}

Expand Down Expand Up @@ -100,6 +100,7 @@ func (r *QuayRegistryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error

isQuayMarkedToBeDeleted := quay.GetDeletionTimestamp() != nil
if isQuayMarkedToBeDeleted {
log.Info("`QuayRegistry` to be deleted")
if controllerutil.ContainsFinalizer(updatedQuay, QuayOperatorFinalizer) {
if err := r.finalizeQuay(ctx, updatedQuay); err != nil {
return ctrl.Result{}, err
Expand Down Expand Up @@ -475,10 +476,18 @@ func (r *QuayRegistryReconciler) createOrUpdateObject(ctx context.Context, obj k
obj, err := v1.EnsureOwnerReference(&quay, obj)
if err != nil {
log.Error(err, "could not ensure `ownerReferences` before creating object", objectMeta.GetName(), "GroupVersionKind", groupVersionKind)

return err
}

// Remove owner reference to prevent cross-namespace owner reference
if isGrafanaConfigMap(obj) {
obj, err = v1.RemoveOwnerReference(&quay, obj)
if err != nil {
log.Error(err, "could not remove `ownerReferences` before creating object", objectMeta.GetName(), "GroupVersionKind", groupVersionKind)
return err
}
}

// managedFields cannot be set on a PATCH.
objectMeta.SetManagedFields([]metav1.ManagedFieldsEntry{})

Expand Down Expand Up @@ -665,7 +674,30 @@ func (r *QuayRegistryReconciler) cleanupNamespaceLabels(ctx context.Context, qua
return nil
}

// cleanupGrafanaConfigMap cleans up the monitoring config map that is created in the `openshift-config-managed` namespace
// This runs as part of the finalizer which is invoked when a registry is deleted
func (r *QuayRegistryReconciler) cleanupGrafanaConfigMap(ctx context.Context, quay *v1.QuayRegistry) error {
var grafanaConfigMap corev1.ConfigMap
if err := r.Client.Get(ctx, types.NamespacedName{Name: quay.GetName() + "-" + GrafanaDashboardConfigMapNameSuffix, Namespace: GrafanaDashboardConfigNamespace}, &grafanaConfigMap); err == nil || !errors.IsNotFound(err) {
return r.Client.Delete(ctx, &grafanaConfigMap)
}
return nil
}

// finalizeQuay runs the Cleanup operations when a `QuayRegistry` is deleted
func (r *QuayRegistryReconciler) finalizeQuay(ctx context.Context, quay *v1.QuayRegistry) error {
return r.cleanupNamespaceLabels(ctx, quay)

r.Log.Info("cleaning up namespace labels")
if err := r.cleanupNamespaceLabels(ctx, quay); err != nil {
return err
}
r.Log.Info("successfully cleaned up namespace labels")

r.Log.Info("cleaning up grafana config map")
if err := r.cleanupGrafanaConfigMap(ctx, quay); err != nil {
return err
}
r.Log.Info("successfully cleaned up grafana config map")

return nil
}

0 comments on commit 7639152

Please sign in to comment.