@@ -32,6 +32,7 @@ import (
3232 "github.com/pkg/errors"
3333 apierrors "k8s.io/apimachinery/pkg/api/errors"
3434 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
35+ runtime "k8s.io/apimachinery/pkg/runtime"
3536 "k8s.io/apimachinery/pkg/types"
3637 "k8s.io/apimachinery/pkg/util/wait"
3738 "k8s.io/klog"
@@ -207,11 +208,6 @@ func (r *Reconciler) reconcileCRwithConfig(ctx context.Context, service *operato
207208 k8sRes .SetName (res .Name )
208209 k8sRes .SetNamespace (k8sResNs )
209210
210- var k8sResConfig []byte
211- if res .Data != nil {
212- k8sResConfig = res .Data .Raw
213- }
214-
215211 err := r .Client .Get (ctx , types.NamespacedName {
216212 Name : res .Name ,
217213 Namespace : k8sResNs ,
@@ -220,14 +216,14 @@ func (r *Reconciler) reconcileCRwithConfig(ctx context.Context, service *operato
220216 if err != nil && ! apierrors .IsNotFound (err ) {
221217 merr .Add (errors .Wrapf (err , "failed to get k8s resource %s/%s" , k8sResNs , res .Name ))
222218 } else if apierrors .IsNotFound (err ) {
223- if err := r .createK8sResource (ctx , k8sRes , k8sResConfig , res .Labels , res .Annotations ); err != nil {
219+ if err := r .createK8sResource (ctx , k8sRes , res . Data , res .Labels , res .Annotations ); err != nil {
224220 merr .Add (err )
225221 }
226222 } else {
227223 if checkLabel (k8sRes , map [string ]string {constant .OpreqLabel : "true" }) && res .Force {
228224 // Update k8s resource
229225 klog .V (3 ).Info ("Found existing k8s resource: " + res .Name )
230- if err := r .updateK8sResource (ctx , k8sRes , k8sResConfig , res .Labels , res .Annotations ); err != nil {
226+ if err := r .updateK8sResource (ctx , k8sRes , res . Data , res .Labels , res .Annotations ); err != nil {
231227 merr .Add (err )
232228 }
233229 } else {
@@ -775,19 +771,21 @@ func (r *Reconciler) checkCustomResource(ctx context.Context, requestInstance *o
775771 return nil
776772}
777773
778- func (r * Reconciler ) createK8sResource (ctx context.Context , k8sResTemplate unstructured.Unstructured , k8sResConfig [] byte , newLabels , newAnnotations map [string ]string ) error {
774+ func (r * Reconciler ) createK8sResource (ctx context.Context , k8sResTemplate unstructured.Unstructured , k8sResConfig * runtime. RawExtension , newLabels , newAnnotations map [string ]string ) error {
779775 kind := k8sResTemplate .GetKind ()
780776 name := k8sResTemplate .GetName ()
781777 namespace := k8sResTemplate .GetNamespace ()
782778
783- k8sResConfigDecoded := make (map [string ]interface {})
784- k8sResConfigUnmarshalErr := json .Unmarshal (k8sResConfig , & k8sResConfigDecoded )
785- if k8sResConfigUnmarshalErr != nil {
786- klog .Errorf ("failed to unmarshal k8s Resource Config: %v" , k8sResConfigUnmarshalErr )
787- }
779+ if k8sResConfig != nil {
780+ k8sResConfigDecoded := make (map [string ]interface {})
781+ k8sResConfigUnmarshalErr := json .Unmarshal (k8sResConfig .Raw , & k8sResConfigDecoded )
782+ if k8sResConfigUnmarshalErr != nil {
783+ klog .Errorf ("failed to unmarshal k8s Resource Config: %v" , k8sResConfigUnmarshalErr )
784+ }
788785
789- for k , v := range k8sResConfigDecoded {
790- k8sResTemplate .Object [k ] = v
786+ for k , v := range k8sResConfigDecoded {
787+ k8sResTemplate .Object [k ] = v
788+ }
791789 }
792790
793791 ensureLabel (k8sResTemplate , map [string ]string {constant .OpreqLabel : "true" })
@@ -805,89 +803,60 @@ func (r *Reconciler) createK8sResource(ctx context.Context, k8sResTemplate unstr
805803 return nil
806804}
807805
808- func (r * Reconciler ) updateK8sResource (ctx context.Context , existingK8sRes unstructured.Unstructured , k8sResConfig [] byte , newLabels , newAnnotations map [string ]string ) error {
806+ func (r * Reconciler ) updateK8sResource (ctx context.Context , existingK8sRes unstructured.Unstructured , k8sResConfig * runtime. RawExtension , newLabels , newAnnotations map [string ]string ) error {
809807 kind := existingK8sRes .GetKind ()
810808 apiversion := existingK8sRes .GetAPIVersion ()
811809 name := existingK8sRes .GetName ()
812810 namespace := existingK8sRes .GetNamespace ()
813811
814- // Update the k8s res
815- err := wait .PollImmediate (constant .DefaultCRFetchPeriod , constant .DefaultCRFetchTimeout , func () (bool , error ) {
812+ existingK8sRes = unstructured.Unstructured {
813+ Object : map [string ]interface {}{
814+ "apiVersion" : apiversion ,
815+ "kind" : kind ,
816+ },
817+ }
816818
817- existingK8sRes := unstructured. Unstructured {
818- Object : map [ string ] interface {}{
819- "apiVersion" : apiversion ,
820- "kind" : kind ,
821- },
822- }
819+ if err := r . Client . Get ( ctx , types. NamespacedName {
820+ Name : name ,
821+ Namespace : namespace ,
822+ }, & existingK8sRes ); err != nil {
823+ return errors . Wrapf ( err , "failed to get k8s resource -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
824+ }
823825
826+ if ! checkLabel (existingK8sRes , map [string ]string {constant .OpreqLabel : "true" }) {
827+ return nil
828+ }
829+
830+ // delete the existing k8s resource, some resources could not be updated after it has been created
831+ if err := r .Client .Delete (ctx , & existingK8sRes ); err != nil {
832+ return errors .Wrapf (err , "failed to delete existing k8s resource -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
833+ }
834+
835+ // wait for the resource has been deleted
836+ err := wait .PollImmediate (constant .DefaultCRFetchPeriod , constant .DefaultCRFetchTimeout , func () (bool , error ) {
824837 err := r .Client .Get (ctx , types.NamespacedName {
825838 Name : name ,
826839 Namespace : namespace ,
827840 }, & existingK8sRes )
828-
829- if err != nil {
830- return false , errors .Wrapf (err , "failed to get k8s resource -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
831- }
832-
833- if ! checkLabel (existingK8sRes , map [string ]string {constant .OpreqLabel : "true" }) {
841+ if err == nil {
842+ // continue wait for the deletion
843+ return false , nil
844+ } else if err != nil && apierrors .IsNotFound (err ) {
834845 return true , nil
835846 }
836-
837- // isEqual := checkAnnotation(existingK8sRes, newAnnotations) && checkLabel(existingK8sRes, newLabels)
838- k8sResConfigDecoded := make (map [string ]interface {})
839- k8sResConfigUnmarshalErr := json .Unmarshal (k8sResConfig , & k8sResConfigDecoded )
840- if k8sResConfigUnmarshalErr != nil {
841- klog .Errorf ("failed to unmarshal k8s Resource Config: %v" , k8sResConfigUnmarshalErr )
842- }
843-
844- for k , v := range k8sResConfigDecoded {
845- // isEqual = isEqual && reflect.DeepEqual(existingK8sRes.Object[k], v)
846- existingK8sRes .Object [k ] = v
847- }
848-
849- CRgeneration := existingK8sRes .GetGeneration ()
850-
851- // if isEqual {
852- // return true, nil
853- // }
854-
855- ensureAnnotation (existingK8sRes , newAnnotations )
856- ensureLabel (existingK8sRes , newLabels )
857-
858- klog .V (2 ).Infof ("updating k8s resource with apiversion: %s, kind: %s, %s/%s" , apiversion , kind , namespace , name )
859-
860- err = r .Update (ctx , & existingK8sRes )
861-
862- if err != nil {
863- return false , errors .Wrapf (err , "failed to update k8s resource -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
864- }
865-
866- UpdatedK8sRes := unstructured.Unstructured {
867- Object : map [string ]interface {}{
868- "apiVersion" : apiversion ,
869- "kind" : kind ,
870- },
871- }
872-
873- err = r .Client .Get (ctx , types.NamespacedName {
874- Name : name ,
875- Namespace : namespace ,
876- }, & UpdatedK8sRes )
877-
878- if err != nil {
879- return false , errors .Wrapf (err , "failed to get k8s resource -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
880-
881- }
882-
883- if UpdatedK8sRes .GetGeneration () != CRgeneration {
884- klog .V (2 ).Infof ("Finish updating the k8s Resource: -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
885- }
886-
887- return true , nil
847+ return false , errors .Wrapf (err , "failed to wait k8s resource deleted -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
888848 })
889849
890850 if err != nil {
851+ return errors .Wrapf (err , "failed to wait k8s resource deleted -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
852+ }
853+
854+ var k8sRes unstructured.Unstructured
855+ k8sRes .SetAPIVersion (apiversion )
856+ k8sRes .SetKind (kind )
857+ k8sRes .SetName (name )
858+ k8sRes .SetNamespace (namespace )
859+ if err = r .createK8sResource (ctx , k8sRes , k8sResConfig , newLabels , newAnnotations ); err != nil {
891860 return errors .Wrapf (err , "failed to update k8s resource -- Kind: %s, NamespacedName: %s/%s" , kind , namespace , name )
892861 }
893862
0 commit comments