Skip to content

Commit 467a476

Browse files
authored
feat: remove need for service finalizers on MCP (#208)
1 parent 6859d99 commit 467a476

File tree

5 files changed

+14
-44
lines changed

5 files changed

+14
-44
lines changed

api/core/v2alpha1/constants.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ const (
2121

2222
MCPFinalizer = GroupName + "/mcp"
2323

24-
// ServiceDependencyFinalizerPrefix is the prefix for the dependency finalizers that are added to MCP resources by associated services.
25-
ServiceDependencyFinalizerPrefix = "services.openmcp.cloud/"
2624
// ClusterRequestFinalizerPrefix is the prefix for the finalizers that are added to MCP resources for cluster requests.
2725
ClusterRequestFinalizerPrefix = "request.clusters.openmcp.cloud/"
2826
)

internal/controllers/managedcontrolplane/controller_test.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -588,22 +588,14 @@ var _ = Describe("ManagedControlPlane Controller", func() {
588588
Expect(obj.GetDeletionTimestamp().IsZero()).To(BeTrue())
589589
}
590590

591-
// remove service finalizers
592-
By("fake: removing service finalizers")
591+
// remove service resource finalizers
592+
By("fake: removing service resource finalizers")
593593
for _, obj := range serviceResources {
594594
By("fake: removing finalizer from service resource: " + obj.GetObjectKind().GroupVersionKind().Kind)
595595
Expect(env.Client(onboarding).Get(env.Ctx, client.ObjectKeyFromObject(obj), obj)).To(Succeed())
596596
controllerutil.RemoveFinalizer(obj, "dummy")
597597
Expect(env.Client(onboarding).Update(env.Ctx, obj)).To(Succeed())
598598
}
599-
newFins := []string{}
600-
for _, fin := range mcp.Finalizers {
601-
if !strings.HasPrefix(fin, corev2alpha1.ServiceDependencyFinalizerPrefix) {
602-
newFins = append(newFins, fin)
603-
}
604-
}
605-
mcp.Finalizers = newFins
606-
Expect(env.Client(onboarding).Update(env.Ctx, mcp)).To(Succeed())
607599

608600
// reconcile the MCP again
609601
// expected outcome:

internal/controllers/managedcontrolplane/services.go

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ package managedcontrolplane
33
import (
44
"context"
55
"fmt"
6-
"strings"
76

87
apierrors "k8s.io/apimachinery/pkg/api/errors"
98
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
10-
"k8s.io/apimachinery/pkg/util/sets"
119
"sigs.k8s.io/controller-runtime/pkg/client"
1210

1311
errutils "github.com/openmcp-project/controller-utils/pkg/errors"
@@ -18,45 +16,32 @@ import (
1816
providerv1alpha1 "github.com/openmcp-project/openmcp-operator/api/provider/v1alpha1"
1917
)
2018

21-
// deleteDependingServices deletes service resources that belong to service providers which have a 'services.openmcp.cloud/<name>' finalizer on the ManagedControlPlane.
19+
// deleteDependingServices lists all service providers and checks for all of their registered service resources whether there exists one for the given MCP. If so, it triggers their deletion.
2220
// It returns a set of service provider names for which still resources exist (should be in deletion by the time this function returns) and the total number of resources that are still left.
2321
// Deletion of the MCP should wait until the set is empty and the count is zero.
2422
func (r *ManagedControlPlaneReconciler) deleteDependingServices(ctx context.Context, mcp *corev2alpha1.ManagedControlPlaneV2) (map[string][]*unstructured.Unstructured, errutils.ReasonableError) {
2523
log := logging.FromContextOrPanic(ctx)
2624

2725
// delete depending service resources, if any
28-
serviceProviderNames := sets.New[string]()
2926

3027
if mcp == nil {
3128
log.Debug("MCP is nil, no need to check for services")
3229
return nil, nil
3330
}
3431

35-
// identify service finalizers
36-
for _, fin := range mcp.Finalizers {
37-
if service, ok := strings.CutPrefix(fin, corev2alpha1.ServiceDependencyFinalizerPrefix); ok {
38-
serviceProviderNames.Insert(service)
39-
}
40-
}
41-
42-
if serviceProviderNames.Len() == 0 {
43-
log.Debug("No service finalizers found on MCP")
44-
return nil, nil
32+
// list all ServiceProvider resources to identify service resources
33+
sps := &providerv1alpha1.ServiceProviderList{}
34+
if err := r.PlatformCluster.Client().List(ctx, sps); err != nil {
35+
return nil, errutils.WithReason(fmt.Errorf("failed to list ServiceProviders: %w", err), cconst.ReasonPlatformClusterInteractionProblem)
4536
}
4637

4738
// fetch service resources, if any exist
4839
resources := map[string][]*unstructured.Unstructured{}
4940
errs := errutils.NewReasonableErrorList()
50-
for providerName := range serviceProviderNames {
51-
sp := &providerv1alpha1.ServiceProvider{}
52-
sp.SetName(providerName)
53-
if err := r.PlatformCluster.Client().Get(ctx, client.ObjectKeyFromObject(sp), sp); err != nil {
54-
errs.Append(errutils.WithReason(fmt.Errorf("failed to get ServiceProvider %s: %w", providerName, err), cconst.ReasonPlatformClusterInteractionProblem))
55-
continue
56-
}
57-
41+
for _, sp := range sps.Items {
5842
if len(sp.Status.Resources) == 0 {
59-
errs.Append(errutils.WithReason(fmt.Errorf("a dependency finalizer for ServiceProvider '%s' exist on MCP, but the provider does not expose any service resources", providerName), cconst.ReasonInternalError))
43+
log.Debug("ServiceProvider has no registered service resources", "providerName", sp.Name)
44+
continue
6045
}
6146
serviceResources := []*unstructured.Unstructured{}
6247
for _, resourceType := range sp.Status.Resources {
@@ -67,14 +52,15 @@ func (r *ManagedControlPlaneReconciler) deleteDependingServices(ctx context.Cont
6752
res.SetNamespace(mcp.Namespace)
6853
if err := r.OnboardingCluster.Client().Get(ctx, client.ObjectKeyFromObject(res), res); err != nil {
6954
if !apierrors.IsNotFound(err) {
70-
errs.Append(errutils.WithReason(fmt.Errorf("error getting service resource [%s.%s] '%s/%s' for ServiceProvider '%s': %w", res.GetKind(), res.GetAPIVersion(), res.GetNamespace(), res.GetName(), providerName, err), cconst.ReasonOnboardingClusterInteractionProblem))
55+
errs.Append(errutils.WithReason(fmt.Errorf("error getting service resource [%s.%s] '%s/%s' for ServiceProvider '%s': %w", res.GetKind(), res.GetAPIVersion(), res.GetNamespace(), res.GetName(), sp.Name, err), cconst.ReasonOnboardingClusterInteractionProblem))
7156
}
7257
continue
7358
}
59+
log.Debug("Found service resource for ServiceProvider", "resourceKind", res.GetKind(), "resourceAPIVersion", res.GetAPIVersion(), "providerName", sp.Name)
7460
serviceResources = append(serviceResources, res)
7561
}
7662

77-
resources[providerName] = serviceResources
63+
resources[sp.Name] = serviceResources
7864
}
7965
if rerr := errs.Aggregate(); rerr != nil {
8066
return nil, rerr
@@ -85,7 +71,7 @@ func (r *ManagedControlPlaneReconciler) deleteDependingServices(ctx context.Cont
8571
remainingResources := map[string][]*unstructured.Unstructured{}
8672
for providerName, serviceResources := range resources {
8773
if len(serviceResources) == 0 {
88-
log.Debug("No service resources found for ServiceProvider", "providerName", providerName)
74+
log.Debug("No remaining service resources found for ServiceProvider", "providerName", providerName)
8975
continue
9076
}
9177
remainingServiceResources := []*unstructured.Unstructured{}

internal/controllers/managedcontrolplane/testdata/test-01/onboarding/mcp-01.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ kind: ManagedControlPlaneV2
33
metadata:
44
name: mcp-01
55
namespace: test
6-
finalizers:
7-
- services.openmcp.cloud/sp-01
8-
- services.openmcp.cloud/sp-02
96
spec:
107
iam:
118
tokens:

internal/controllers/managedcontrolplane/testdata/test-01/onboarding/mcp-03.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ kind: ManagedControlPlaneV2
33
metadata:
44
name: mcp-03
55
namespace: test
6-
finalizers:
7-
- services.openmcp.cloud/sp-01
8-
- services.openmcp.cloud/sp-02
96
spec:
107
iam:
118
tokens:

0 commit comments

Comments
 (0)