Skip to content

Commit 7a535eb

Browse files
authored
Delete k8s resources by checking the label from OperandConfig (#1095)
* delete k8s resources by checking from OperandConfig Signed-off-by: YuChen <[email protected]> * new label condition check Signed-off-by: YuChen <[email protected]> --------- Signed-off-by: YuChen <[email protected]>
1 parent 885f03e commit 7a535eb

File tree

1 file changed

+60
-53
lines changed

1 file changed

+60
-53
lines changed

controllers/operandrequest/reconcile_operand.go

Lines changed: 60 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,7 @@ func (r *Reconciler) updateK8sResource(ctx context.Context, existingK8sRes unstr
11161116
if err != nil {
11171117
return false, errors.Wrapf(err, "failed to get k8s resource -- Kind: %s, NamespacedName: %s/%s", kind, namespace, name)
11181118
}
1119+
11191120
resourceVersion := existingRes.GetResourceVersion()
11201121

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

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

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

1327-
func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstructured.Unstructured, namespace string) error {
1328+
// deleteAllK8sResource remove k8s resource base on OperandConfig
1329+
func (r *Reconciler) deleteAllK8sResource(ctx context.Context, csc *operatorv1alpha1.OperandConfig, operandName, namespace string) error {
1330+
1331+
service := csc.GetService(operandName)
1332+
if service == nil {
1333+
return nil
1334+
}
1335+
1336+
var k8sResourceList []operatorv1alpha1.ConfigResource
1337+
k8sResourceList = append(k8sResourceList, service.Resources...)
1338+
1339+
merr := &util.MultiErr{}
1340+
var (
1341+
wg sync.WaitGroup
1342+
)
1343+
for _, k8sRes := range k8sResourceList {
1344+
k8sResShouldBeDeleted := unstructured.Unstructured{
1345+
Object: map[string]interface{}{
1346+
"apiVersion": k8sRes.APIVersion,
1347+
"kind": k8sRes.Kind,
1348+
"metadata": map[string]interface{}{
1349+
"name": k8sRes.Name,
1350+
},
1351+
},
1352+
}
1353+
k8sNamespace := namespace
1354+
if k8sRes.Namespace != "" {
1355+
k8sNamespace = k8sRes.Namespace
1356+
}
1357+
1358+
wg.Add(1)
1359+
go func() {
1360+
defer wg.Done()
1361+
if err := r.deleteK8sResource(ctx, k8sResShouldBeDeleted, k8sRes.Labels, k8sNamespace); err != nil {
1362+
r.Mutex.Lock()
1363+
defer r.Mutex.Unlock()
1364+
merr.Add(err)
1365+
return
1366+
}
1367+
}()
1368+
}
1369+
wg.Wait()
1370+
1371+
if len(merr.Errors) != 0 {
1372+
return merr
1373+
}
1374+
return nil
1375+
}
1376+
1377+
func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstructured.Unstructured, newLabels map[string]string, namespace string) error {
13281378

13291379
kind := existingK8sRes.GetKind()
13301380
apiversion := existingK8sRes.GetAPIVersion()
@@ -1346,7 +1396,13 @@ func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstr
13461396
if apierrors.IsNotFound(err) {
13471397
klog.V(3).Infof("There is no k8s resource: %s from kind: %s", name, kind)
13481398
} else {
1349-
if r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.OpreqLabel: "true"}) && !r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.NotUninstallLabel: "true"}) {
1399+
// If the existing k8s resources has the OpreqLabel and does not have the NotUninstallLabel, delete it
1400+
// If the OpreqLabel is difined in OperandConfig resource, delete it
1401+
hasOpreqLabel := r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.OpreqLabel: "true"})
1402+
hasNotUninstallLabel := r.CheckLabel(k8sResShouldBeDeleted, map[string]string{constant.NotUninstallLabel: "true"})
1403+
opreqLabelInConfig := newLabels != nil && newLabels[constant.OpreqLabel] == "true"
1404+
1405+
if (hasOpreqLabel && !hasNotUninstallLabel) || opreqLabelInConfig {
13501406
klog.V(3).Infof("Deleting k8s resource: %s from kind: %s", name, kind)
13511407
err := r.Delete(ctx, &k8sResShouldBeDeleted, client.PropagationPolicy(metav1.DeletePropagationBackground))
13521408
if err != nil && !apierrors.IsNotFound(err) {
@@ -1378,55 +1434,6 @@ func (r *Reconciler) deleteK8sResource(ctx context.Context, existingK8sRes unstr
13781434
return nil
13791435
}
13801436

1381-
// deleteAllK8sResource remove k8s resource base on OperandConfig
1382-
func (r *Reconciler) deleteAllK8sResource(ctx context.Context, csc *operatorv1alpha1.OperandConfig, operandName, namespace string) error {
1383-
1384-
service := csc.GetService(operandName)
1385-
if service == nil {
1386-
return nil
1387-
}
1388-
1389-
var k8sResourceList []operatorv1alpha1.ConfigResource
1390-
k8sResourceList = append(k8sResourceList, service.Resources...)
1391-
1392-
merr := &util.MultiErr{}
1393-
var (
1394-
wg sync.WaitGroup
1395-
)
1396-
for _, k8sRes := range k8sResourceList {
1397-
k8sResShouldBeDeleted := unstructured.Unstructured{
1398-
Object: map[string]interface{}{
1399-
"apiVersion": k8sRes.APIVersion,
1400-
"kind": k8sRes.Kind,
1401-
"metadata": map[string]interface{}{
1402-
"name": k8sRes.Name,
1403-
},
1404-
},
1405-
}
1406-
k8sNamespace := namespace
1407-
if k8sRes.Namespace != "" {
1408-
k8sNamespace = k8sRes.Namespace
1409-
}
1410-
1411-
wg.Add(1)
1412-
go func() {
1413-
defer wg.Done()
1414-
if err := r.deleteK8sResource(ctx, k8sResShouldBeDeleted, k8sNamespace); err != nil {
1415-
r.Mutex.Lock()
1416-
defer r.Mutex.Unlock()
1417-
merr.Add(err)
1418-
return
1419-
}
1420-
}()
1421-
}
1422-
wg.Wait()
1423-
1424-
if len(merr.Errors) != 0 {
1425-
return merr
1426-
}
1427-
return nil
1428-
}
1429-
14301437
func (r *Reconciler) checkResAuth(ctx context.Context, verbs []string, k8sResTemplate unstructured.Unstructured) bool {
14311438
kind := k8sResTemplate.GetKind()
14321439
apiversion := k8sResTemplate.GetAPIVersion()

0 commit comments

Comments
 (0)