Skip to content

Commit c840b9e

Browse files
authored
update the logic for updating the k8s resourcces (#752)
* update the logic for updating the k8s resourcces * wait the deletion of existing k8s resource * remove debug info
1 parent 4eab970 commit c840b9e

File tree

1 file changed

+51
-82
lines changed

1 file changed

+51
-82
lines changed

controllers/operandrequest/reconcile_operand.go

Lines changed: 51 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)