@@ -18,128 +18,20 @@ package cdk8sappproxy
1818
1919import (
2020 "context"
21- "strings"
22-
2321 addonsv1alpha1 "github.com/PatrickLaabs/cluster-api-addon-provider-cdk8s/api/v1alpha1"
2422 "github.com/pkg/errors"
25- corev1 "k8s.io/api/core/v1"
26- apierrors "k8s.io/apimachinery/pkg/api/errors"
2723 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2824 "k8s.io/apimachinery/pkg/labels"
29- "k8s.io/apimachinery/pkg/runtime/schema"
30- "k8s.io/apimachinery/pkg/types"
31- "k8s.io/client-go/dynamic"
32- "k8s.io/client-go/tools/clientcmd"
3325 clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
34- "sigs.k8s.io/cluster-api/util/conditions"
3526 ctrl "sigs.k8s.io/controller-runtime"
3627 "sigs.k8s.io/controller-runtime/pkg/client"
37- "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3828 "sigs.k8s.io/controller-runtime/pkg/handler"
3929 "sigs.k8s.io/controller-runtime/pkg/log"
4030)
4131
42- func (r * Reconciler ) checkIfResourceExists (ctx context.Context , dynClient dynamic.Interface , gvr schema.GroupVersionResource , namespace string , name string ) (bool , error ) {
43- resourceGetter := dynClient .Resource (gvr )
44- if namespace != "" {
45- _ , err := resourceGetter .Namespace (namespace ).Get (ctx , name , metav1.GetOptions {})
46- if err != nil {
47- if apierrors .IsNotFound (err ) {
48- return false , nil
49- }
50-
51- return false , errors .Wrapf (err , "failed to get namespaced resource %s/%s with GVR %s" , namespace , name , gvr .String ())
52- }
53- } else {
54- _ , err := resourceGetter .Get (ctx , name , metav1.GetOptions {})
55- if err != nil {
56- if apierrors .IsNotFound (err ) {
57- return false , nil
58- }
59-
60- return false , errors .Wrapf (err , "failed to get cluster-scoped resource %s with GVR %s" , name , gvr .String ())
61- }
62- }
63-
64- return true , nil
65- }
66-
67- func (r * Reconciler ) getDynamicClientForCluster (ctx context.Context , secretNamespace , clusterName string ) (dynamicClient dynamic.Interface , err error ) {
68- logger := log .FromContext (ctx ).WithValues ("secretNamespace" , secretNamespace , "clusterName" , clusterName )
69- kubeconfigSecretName := clusterName + "-kubeconfig"
70-
71- kubeconfigSecret := & corev1.Secret {}
72- if err = r .Get (ctx , client.ObjectKey {Namespace : secretNamespace , Name : kubeconfigSecretName }, kubeconfigSecret ); err != nil {
73- logger .Error (err , "Failed to get Kubeconfig secret" )
74-
75- return nil , errors .Wrapf (err , "failed to get kubeconfig secret %s/%s" , secretNamespace , kubeconfigSecretName )
76- }
77- kubeconfigData , ok := kubeconfigSecret .Data ["value" ]
78- if ! ok || len (kubeconfigData ) == 0 {
79- newErr := errors .Errorf ("kubeconfig secret %s/%s does not contain 'value' data" , secretNamespace , kubeconfigSecretName )
80- logger .Error (newErr , "Invalid Kubeconfig secret" )
81-
82- return nil , newErr
83- }
84- logger .Info ("Successfully retrieved Kubeconfig data" )
85- restConfig , err := clientcmd .RESTConfigFromKubeConfig (kubeconfigData )
86- if err != nil {
87- logger .Error (err , "Failed to create REST config from Kubeconfig" )
88-
89- return dynamicClient , errors .Wrapf (err , "failed to create REST config from kubeconfig for cluster %s" , clusterName )
90- }
91- dynamicClient , err = dynamic .NewForConfig (restConfig )
92- if err != nil {
93- logger .Error (err , "Failed to create dynamic client" )
94-
95- return dynamicClient , errors .Wrapf (err , "failed to create dynamic client for cluster %s" , clusterName )
96- }
97- logger .Info ("Successfully created dynamic client" )
98-
99- return dynamicClient , err
100- }
101-
102- // Consolidated error handling.
103- func (r * Reconciler ) updateStatusWithError (ctx context.Context , cdk8sAppProxy * addonsv1alpha1.Cdk8sAppProxy , reason , message string , err error , removeFinalizer bool ) error {
104- logger := log .FromContext (ctx ).WithValues ("cdk8sappproxy" , types.NamespacedName {Name : cdk8sAppProxy .Name , Namespace : cdk8sAppProxy .Namespace })
105-
106- if err != nil {
107- logger .Error (err , message , "reason" , reason )
108- conditions .MarkFalse (cdk8sAppProxy , addonsv1alpha1 .DeploymentProgressingCondition , reason , clusterv1 .ConditionSeverityError , "%s: %v" , message , err )
109- } else {
110- logger .Info (message , "reason" , reason )
111- }
112-
113- if removeFinalizer {
114- controllerutil .RemoveFinalizer (cdk8sAppProxy , Finalizer )
115- if updateErr := r .Update (ctx , cdk8sAppProxy ); updateErr != nil {
116- logger .Error (updateErr , "Failed to remove finalizer after error" )
117-
118- return updateErr
119- }
120- logger .Info ("Removed finalizer after error/condition" )
121- } else {
122- if statusUpdateErr := r .Status ().Update (ctx , cdk8sAppProxy ); statusUpdateErr != nil {
123- logger .Error (statusUpdateErr , "Failed to update status after error" )
124- }
125- }
126-
127- return err
128- }
129-
130- // TODO: This is a naive pluralization and might not work for all kinds.
131- // A more robust solution would use discovery client or a predefined map.
132- func getPluralFromKind (kind string ) string {
133- lowerKind := strings .ToLower (kind )
134- if strings .HasSuffix (lowerKind , "s" ) {
135- return lowerKind + "es"
136- }
137- if strings .HasSuffix (lowerKind , "y" ) {
138- return strings .TrimSuffix (lowerKind , "y" ) + "ies"
139- }
140-
141- return lowerKind + "s"
142- }
32+ const (
33+ Finalizer = "cdk8sappproxy.addons.cluster.x-k8s.io/finalizer"
34+ )
14335
14436// SetupWithManager sets up the controller with the Manager.
14537func (r * Reconciler ) SetupWithManager (mgr ctrl.Manager ) error {
0 commit comments