Draft
Conversation
Signed-off-by: Shreya Biradar <shbirada@ibm.com>
Reviewer's GuideImplements Kubernetes finalizers for the Kruize custom resource so that when a Kruize CR is deleted, the controller first runs cleanup logic to delete associated namespaced and cluster-scoped resources before allowing the CR to be removed. Sequence diagram for Kruize CR deletion with finalizersequenceDiagram
actor User
participant APIServer
participant ControllerManager
participant KruizeReconciler
participant KruizeResourceGenerator
participant KubernetesAPI
User->>APIServer: delete KruizeCR
APIServer->>KruizeCR: set deletionTimestamp
APIServer-->>User: deletion accepted (pending finalizer)
APIServer->>ControllerManager: enqueue reconcile request
ControllerManager->>KruizeReconciler: Reconcile(req)
KruizeReconciler->>KruizeReconciler: load Kruize
KruizeReconciler->>KruizeReconciler: GetDeletionTimestamp() != nil
KruizeReconciler->>KruizeReconciler: controllerutil.ContainsFinalizer(kruizeFinalizer)
KruizeReconciler->>KruizeReconciler: finalizeKruize(ctx,kruize)
activate KruizeReconciler
KruizeReconciler->>KruizeResourceGenerator: NewKruizeResourceGenerator(namespace,autotune_image,autotune_ui_image,clusterType)
KruizeResourceGenerator-->>KruizeReconciler: generator
KruizeReconciler->>KruizeResourceGenerator: NamespacedResources()
KruizeResourceGenerator-->>KruizeReconciler: []client.Object
loop delete_namespaced_resources
KruizeReconciler->>KubernetesAPI: deleteResource(ctx,obj)
end
KruizeReconciler->>KruizeResourceGenerator: ClusterScopedResources() or KubernetesClusterScopedResources()
KruizeResourceGenerator-->>KruizeReconciler: []client.Object
loop delete_cluster_scoped_resources
KruizeReconciler->>KubernetesAPI: deleteResource(ctx,obj)
end
deactivate KruizeReconciler
KruizeReconciler->>KruizeReconciler: controllerutil.RemoveFinalizer(kruizeFinalizer)
KruizeReconciler->>KubernetesAPI: Update(kruize)
KruizeReconciler-->>ControllerManager: ctrl.Result{}
APIServer->>APIServer: all finalizers removed
APIServer->>KubernetesAPI: delete KruizeCR resources
APIServer-->>User: KruizeCR fully deleted
Sequence diagram for deleteResource helper behaviorsequenceDiagram
participant KruizeReconciler
participant KubernetesAPI
KruizeReconciler->>KruizeReconciler: deleteResource(ctx,obj)
KruizeReconciler->>KubernetesAPI: Get(ObjectKeyFromObject(obj))
alt resource_not_found
KubernetesAPI-->>KruizeReconciler: errors.IsNotFound
KruizeReconciler->>KruizeReconciler: log skip deletion
KruizeReconciler-->>KruizeReconciler: return nil
else other_get_error
KubernetesAPI-->>KruizeReconciler: error
KruizeReconciler-->>KruizeReconciler: return wrapped_error
else resource_found
KubernetesAPI-->>KruizeReconciler: found_object
KruizeReconciler->>KubernetesAPI: Delete(found_object)
alt delete_not_found
KubernetesAPI-->>KruizeReconciler: errors.IsNotFound
KruizeReconciler-->>KruizeReconciler: return nil
else delete_error
KubernetesAPI-->>KruizeReconciler: error
KruizeReconciler-->>KruizeReconciler: return wrapped_error
else delete_success
KubernetesAPI-->>KruizeReconciler: success
KruizeReconciler-->>KruizeReconciler: return nil
end
end
Class diagram for KruizeReconciler with finalizer methodsclassDiagram
class KruizeReconciler {
+Reconcile(ctx,req) ctrl_Result
+finalizeKruize(ctx,kruize) error
+deleteResource(ctx,obj) error
+deployKruize(ctx,kruize) error
+deployKruizeComponents(ctx,namespace,kruize,clusterType) error
+checkKruizePodsStatus(ctx,namespace) (bool,error)
+isTestMode() bool
+reconcileClusterResource(ctx,obj) error
}
class Kruize {
+Spec KruizeSpec
+GetDeletionTimestamp() time_Time
}
class KruizeSpec {
+Namespace string
+Cluster_type string
+Autotune_image string
+Autotune_ui_image string
}
class KruizeResourceGenerator {
+KruizeResourceGenerator(namespace,autotune_image,autotune_ui_image,clusterType)
+NamespacedResources() []client_Object
+ClusterScopedResources() []client_Object
+KubernetesClusterScopedResources() []client_Object
+KruizeServiceAccount() client_Object
+KruizeConfigMap() client_Object
}
class Constants {
+ClusterTypeOpenShift string
+IsValidClusterType(clusterType) bool
}
class ClientObject {
+GetName() string
+GetNamespace() string
+GetObjectKind() runtime_ObjectKind
+DeepCopyObject() client_Object
}
class ControllerUtil {
+ContainsFinalizer(kruize,finalizer) bool
+AddFinalizer(kruize,finalizer) void
+RemoveFinalizer(kruize,finalizer) void
}
class ControllerRuntimeClient {
+Get(ctx,key,obj) error
+Update(ctx,obj) error
+Delete(ctx,obj) error
}
KruizeReconciler --> Kruize : manages
KruizeReconciler --> KruizeResourceGenerator : uses
KruizeReconciler --> ControllerRuntimeClient : uses
KruizeReconciler --> ControllerUtil : uses
Kruize --> KruizeSpec : has
KruizeReconciler --> Constants : uses
KruizeReconciler --> ClientObject : deletes/resources
KruizeResourceGenerator --> ClientObject : produces
Flow diagram for KruizeReconciler Reconcile with finalizersflowchart TD
A_start["Reconcile start"] --> B_load_kruize["Load Kruize CR"]
B_load_kruize --> C_check_deletion["kruize.GetDeletionTimestamp() != nil?"]
C_check_deletion -- "yes" --> D_has_finalizer["controllerutil.ContainsFinalizer(kruizeFinalizer)?"]
D_has_finalizer -- "yes" --> E_finalize["finalizeKruize(ctx,kruize)"]
E_finalize --> F_remove_finalizer["controllerutil.RemoveFinalizer(kruizeFinalizer)"]
F_remove_finalizer --> G_update_remove["Update(ctx,kruize)"]
G_update_remove --> H_return_delete["return ctrl.Result{} (no requeue)"]
D_has_finalizer -- "no" --> H_return_delete
C_check_deletion -- "no" --> I_has_finalizer["controllerutil.ContainsFinalizer(kruizeFinalizer)?"]
I_has_finalizer -- "no" --> J_add_finalizer["controllerutil.AddFinalizer(kruizeFinalizer)"]
J_add_finalizer --> K_update_add["Update(ctx,kruize)"]
K_update_add --> L_deploy["deployKruize(ctx,kruize)"]
I_has_finalizer -- "yes" --> L_deploy
L_deploy --> M_check_test_mode["isTestMode()? "]
M_check_test_mode -- "true" --> N_return_no_requeue["return ctrl.Result{}"]
M_check_test_mode -- "false" --> O_return_requeue["return ctrl.Result{RequeueAfter:5m}"]
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR implements finalizers to cleanup namespace and cluster scoped resources when Kruize Custom Resource (CR) is deleted.
Summary by Sourcery
Add deletion finalization logic to the Kruize controller so that operator-managed resources are cleaned up when a Kruize CR is removed.
Bug Fixes:
Enhancements: