@@ -40,8 +40,8 @@ type Client interface {
4040 Apply (ctx context.Context , template []byte , oldResources []* csov1alpha1.Resource , shouldDelete bool ) (newResources []* csov1alpha1.Resource , shouldRequeue bool , err error )
4141 Delete (ctx context.Context , template []byte , oldResources []* csov1alpha1.Resource ) (newResources []* csov1alpha1.Resource , shouldRequeue bool , err error )
4242
43- ApplyNewClusterStack (ctx context.Context , oldTemplate , newTemplate []byte ) (shouldRequeue bool , err error )
44- DeleteNewClusterStack (ctx context.Context , template []byte ) (shouldRequeue bool , err error )
43+ ApplyNewClusterStack (ctx context.Context , oldTemplate , newTemplate []byte ) (newResources [] * csov1alpha1. Resource , shouldRequeue bool , err error )
44+ DeleteNewClusterStack (ctx context.Context , template []byte ) (newResources [] * csov1alpha1. Resource , shouldRequeue bool , err error )
4545}
4646
4747// Factory creates new fake kube client factories.
@@ -67,24 +67,26 @@ func (*factory) NewClient(namespace string, resCfg *rest.Config) Client {
6767 }
6868}
6969
70- func (k * kube ) ApplyNewClusterStack (ctx context.Context , oldTemplate , newTemplate []byte ) (shouldRequeue bool , err error ) {
70+ func (k * kube ) ApplyNewClusterStack (ctx context.Context , oldTemplate , newTemplate []byte ) (newResources [] * csov1alpha1. Resource , shouldRequeue bool , err error ) {
7171 logger := log .FromContext (ctx )
7272
7373 oldObjects , err := parseK8sYaml (oldTemplate )
7474 if err != nil {
75- return false , fmt .Errorf ("failed to parse old cluster stack template: %w" , err )
75+ return nil , false , fmt .Errorf ("failed to parse old cluster stack template: %w" , err )
7676 }
7777
7878 newObjects , err := parseK8sYaml (newTemplate )
7979 if err != nil {
80- return false , fmt .Errorf ("failed to parse new cluster stack template: %w" , err )
80+ return nil , false , fmt .Errorf ("failed to parse new cluster stack template: %w" , err )
8181 }
8282
8383 for _ , newObject := range newObjects {
8484 if err := setLabel (newObject , ObjectLabelKeyOwned , ObjectLabelValueOwned ); err != nil {
85- return false , fmt .Errorf ("error setting label: %w" , err )
85+ return nil , false , fmt .Errorf ("error setting label: %w" , err )
8686 }
8787
88+ resource := csov1alpha1 .NewResourceFromUnstructured (newObject )
89+
8890 // call the function and get dynamic.ResourceInterface
8991 // getDynamicResourceInterface
9092 dr , err := getDynamicResourceInterface (k .Namespace , k .RestConfig , newObject .GroupVersionKind ())
@@ -97,50 +99,68 @@ func (k *kube) ApplyNewClusterStack(ctx context.Context, oldTemplate, newTemplat
9799
98100 if _ , err := dr .Apply (ctx , newObject .GetName (), newObject , metav1.ApplyOptions {FieldManager : "kubectl" , Force : true }); err != nil {
99101 reterr := fmt .Errorf ("failed to apply object: %w" , err )
102+ resource .Error = reterr .Error ()
103+ resource .Status = csov1alpha1 .ResourceStatusNotSynced
100104 logger .Error (reterr , "failed to apply object" , "obj" , newObject .GetObjectKind ().GroupVersionKind (), "name" , newObject .GetName (), "namespace" , newObject .GetNamespace ())
101105 shouldRequeue = true
102106 }
107+
108+ resource .Status = csov1alpha1 .ResourceStatusSynced
109+ newResources = append (newResources , resource )
103110 }
104111
105112 for _ , object := range resourcesToBeDeletedFromUnstructuredObjects (oldObjects , newObjects ) {
113+ resource := csov1alpha1 .NewResourceFromUnstructured (object )
114+
106115 dr , err := getDynamicResourceInterface (k .Namespace , k .RestConfig , object .GroupVersionKind ())
107116 if err != nil {
108- return false , fmt .Errorf ("failed to get dynamic resource interface: %w" , err )
117+ return nil , false , fmt .Errorf ("failed to get dynamic resource interface: %w" , err )
109118 }
110119
111120 if err := dr .Delete (ctx , object .GetName (), metav1.DeleteOptions {}); err != nil && ! apierrors .IsNotFound (err ) {
112121 reterr := fmt .Errorf ("failed to delete object: %w" , err )
113122 logger .Error (reterr , "failed to delete object" , "obj" , object .GroupVersionKind (), "namespacedName" , fmt .Sprintf ("%s/%s" , object .GetNamespace (), object .GetName ()))
114123 // append resource to status and requeue again to be able to retry deletion
124+ resource .Status = csov1alpha1 .ResourceStatusNotSynced
125+ resource .Error = reterr .Error ()
126+ newResources = append (newResources , resource )
115127 shouldRequeue = true
116128 }
117129 }
118130
119- return shouldRequeue , nil
131+ return newResources , shouldRequeue , nil
120132}
121133
122- func (k * kube ) DeleteNewClusterStack (ctx context.Context , template []byte ) (shouldRequeue bool , err error ) {
134+ func (k * kube ) DeleteNewClusterStack (ctx context.Context , template []byte ) (newResources [] * csov1alpha1. Resource , shouldRequeue bool , err error ) {
123135 objects , err := parseK8sYaml (template )
124136 if err != nil {
125- return false , fmt .Errorf ("failed to parse new cluster stack template: %w" , err )
137+ return nil , false , fmt .Errorf ("failed to parse new cluster stack template: %w" , err )
126138 }
127139
128140 for _ , object := range objects {
141+ resource := csov1alpha1 .NewResourceFromUnstructured (object )
142+
129143 if err := setLabel (object , ObjectLabelKeyOwned , ObjectLabelValueOwned ); err != nil {
130- return false , fmt .Errorf ("error setting label: %w" , err )
144+ return nil , false , fmt .Errorf ("error setting label: %w" , err )
131145 }
132146
133147 dr , err := getDynamicResourceInterface (k .Namespace , k .RestConfig , object .GroupVersionKind ())
134148 if err != nil {
135- return false , fmt .Errorf ("failed to get dynamic resource interface: %w" , err )
149+ return nil , false , fmt .Errorf ("failed to get dynamic resource interface: %w" , err )
136150 }
137151
138- if err := dr .Delete (ctx , object .GetName (), metav1.DeleteOptions {}); err != nil {
139- return true , fmt .Errorf ("failed to delete object %q: %w" , object .GetObjectKind ().GroupVersionKind (), err )
152+ if err := dr .Delete (ctx , object .GetName (), metav1.DeleteOptions {}); err != nil && ! apierrors .IsNotFound (err ) {
153+ reterr := fmt .Errorf ("failed to delete object %q: %w" , object .GetObjectKind ().GroupVersionKind (), err )
154+ resource .Status = csov1alpha1 .ResourceStatusNotSynced
155+ resource .Error = reterr .Error ()
156+ shouldRequeue = true
140157 }
158+
159+ resource .Status = csov1alpha1 .ResourceStatusSynced
160+ newResources = append (newResources , resource )
141161 }
142162
143- return shouldRequeue , nil
163+ return newResources , shouldRequeue , nil
144164}
145165
146166func (k * kube ) Apply (ctx context.Context , template []byte , oldResources []* csov1alpha1.Resource , shouldDelete bool ) (newResources []* csov1alpha1.Resource , shouldRequeue bool , err error ) {
@@ -192,6 +212,7 @@ func (k *kube) Apply(ctx context.Context, template []byte, oldResources []*csov1
192212 newResources = append (newResources , resource )
193213 }
194214
215+ // TODO: cleanup shouldDelete
195216 if shouldDelete {
196217 // make a diff between new objs and oldResources to find out
197218 // a) if an object is in oldResources and synced and not in new objs, then delete should be attempted
0 commit comments