Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 55 additions & 53 deletions controllers/operandrequest/reconcile_operand.go
Original file line number Diff line number Diff line change
Expand Up @@ -1116,6 +1116,7 @@ func (r *Reconciler) updateK8sResource(ctx context.Context, existingK8sRes unstr
if err != nil {
return false, errors.Wrapf(err, "failed to get k8s resource -- Kind: %s, NamespacedName: %s/%s", kind, namespace, name)
}

resourceVersion := existingRes.GetResourceVersion()

if !r.CheckLabel(existingRes, map[string]string{constant.OpreqLabel: "true"}) && (newLabels == nil || newLabels[constant.OpreqLabel] != "true") {
Expand Down Expand Up @@ -1253,7 +1254,7 @@ func (r *Reconciler) updateK8sJob(ctx context.Context, existingK8sRes unstructur
}
newAnnotations[constant.HashedData] = newHashedData

if err := r.deleteK8sResource(ctx, existingRes, namespace); err != nil {
if err := r.deleteK8sResource(ctx, existingRes, newLabels, namespace); err != nil {
return errors.Wrap(err, "failed to update k8s resource")
}
if err := r.createK8sResource(ctx, templatek8sRes, k8sResConfig, newLabels, newAnnotations, ownerReferences, optionalFields); err != nil {
Expand Down Expand Up @@ -1312,7 +1313,7 @@ func (r *Reconciler) updateK8sRoute(ctx context.Context, existingK8sRes unstruct
templatek8sRes.SetName(name)
templatek8sRes.SetNamespace(namespace)

if err := r.deleteK8sResource(ctx, existingRes, namespace); err != nil {
if err := r.deleteK8sResource(ctx, existingRes, newLabels, namespace); err != nil {
return errors.Wrap(err, "failed to delete Route for recreation")
}
if err := r.createK8sResource(ctx, templatek8sRes, k8sResConfig, newLabels, newAnnotations, ownerReferences, optionalFields); err != nil {
Expand All @@ -1324,7 +1325,56 @@ func (r *Reconciler) updateK8sRoute(ctx context.Context, existingK8sRes unstruct
return nil
}

func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstructured.Unstructured, namespace string) error {
// deleteAllK8sResource remove k8s resource base on OperandConfig
func (r *Reconciler) deleteAllK8sResource(ctx context.Context, csc *operatorv1alpha1.OperandConfig, operandName, namespace string) error {

service := csc.GetService(operandName)
if service == nil {
return nil
}

var k8sResourceList []operatorv1alpha1.ConfigResource
k8sResourceList = append(k8sResourceList, service.Resources...)

merr := &util.MultiErr{}
var (
wg sync.WaitGroup
)
for _, k8sRes := range k8sResourceList {
k8sResShouldBeDeleted := unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": k8sRes.APIVersion,
"kind": k8sRes.Kind,
"metadata": map[string]interface{}{
"name": k8sRes.Name,
},
},
}
k8sNamespace := namespace
if k8sRes.Namespace != "" {
k8sNamespace = k8sRes.Namespace
}

wg.Add(1)
go func() {
defer wg.Done()
if err := r.deleteK8sResource(ctx, k8sResShouldBeDeleted, k8sRes.Labels, k8sNamespace); err != nil {
r.Mutex.Lock()
defer r.Mutex.Unlock()
merr.Add(err)
return
}
}()
}
wg.Wait()

if len(merr.Errors) != 0 {
return merr
}
return nil
}

func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstructured.Unstructured, newLabels map[string]string, namespace string) error {

kind := existingK8sRes.GetKind()
apiversion := existingK8sRes.GetAPIVersion()
Expand All @@ -1346,7 +1396,8 @@ func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstr
if apierrors.IsNotFound(err) {
klog.V(3).Infof("There is no k8s resource: %s from kind: %s", name, kind)
} else {
if r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.OpreqLabel: "true"}) && !r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.NotUninstallLabel: "true"}) {

if (newLabels == nil || newLabels[constant.OpreqLabel] == "true") && !r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.NotUninstallLabel: "true"}) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am thinking if the condition should be:

The resource would be uninstalled when following conditions are met:
If (A && B || C) && D

  • A: newLabels not empty
  • B: newLabels contains opreq label
  • C: k8sResShouldBeDeleted contains opreq label)
  • D: k8sResShouldBeDeleted NOT contains notUninstall label
Suggested change
if (newLabels == nil || newLabels[constant.OpreqLabel] == "true") && !r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.NotUninstallLabel: "true"}) {
if (newLabels != nil && newLabels[constant.OpreqLabel] == "true" || r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.OpreqLabel: "true"})) && !r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.NotUninstallLabel: "true"}) {

klog.V(3).Infof("Deleting k8s resource: %s from kind: %s", name, kind)
err := r.Delete(ctx, &k8sResShouldBeDeleted, client.PropagationPolicy(metav1.DeletePropagationBackground))
if err != nil && !apierrors.IsNotFound(err) {
Expand Down Expand Up @@ -1378,55 +1429,6 @@ func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstr
return nil
}

// deleteAllK8sResource remove k8s resource base on OperandConfig
func (r *Reconciler) deleteAllK8sResource(ctx context.Context, csc *operatorv1alpha1.OperandConfig, operandName, namespace string) error {

service := csc.GetService(operandName)
if service == nil {
return nil
}

var k8sResourceList []operatorv1alpha1.ConfigResource
k8sResourceList = append(k8sResourceList, service.Resources...)

merr := &util.MultiErr{}
var (
wg sync.WaitGroup
)
for _, k8sRes := range k8sResourceList {
k8sResShouldBeDeleted := unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": k8sRes.APIVersion,
"kind": k8sRes.Kind,
"metadata": map[string]interface{}{
"name": k8sRes.Name,
},
},
}
k8sNamespace := namespace
if k8sRes.Namespace != "" {
k8sNamespace = k8sRes.Namespace
}

wg.Add(1)
go func() {
defer wg.Done()
if err := r.deleteK8sResource(ctx, k8sResShouldBeDeleted, k8sNamespace); err != nil {
r.Mutex.Lock()
defer r.Mutex.Unlock()
merr.Add(err)
return
}
}()
}
wg.Wait()

if len(merr.Errors) != 0 {
return merr
}
return nil
}

func (r *Reconciler) checkResAuth(ctx context.Context, verbs []string, k8sResTemplate unstructured.Unstructured) bool {
kind := k8sResTemplate.GetKind()
apiversion := k8sResTemplate.GetAPIVersion()
Expand Down