Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove Owner References from Grafana ConfigMap (PROJQUAY-1788) #420

Merged
merged 1 commit into from
Mar 30, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add a simple test for this?

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
}