Skip to content

Commit 578eccc

Browse files
committed
Router: Tighten adoption filter
ListOSResourcesForAdoption only filtered by name. Resolve ProjectRef when set and include ProjectID and the immutable Distributed field in the list filter to prevent adopting a router from the wrong project or with the wrong topology. Collapse routerCreateActuator into routerActuator since the split is no longer needed now that k8sClient is on the base actuator.
1 parent bfb881a commit 578eccc

1 file changed

Lines changed: 31 additions & 24 deletions

File tree

internal/controllers/router/actuator.go

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,11 @@ type (
4848
)
4949

5050
type routerActuator struct {
51-
osClient osclients.NetworkClient
52-
}
53-
54-
type routerCreateActuator struct {
55-
routerActuator
51+
osClient osclients.NetworkClient
5652
k8sClient client.Client
5753
}
5854

59-
var _ createResourceActuator = routerCreateActuator{}
55+
var _ createResourceActuator = routerActuator{}
6056
var _ deleteResourceActuator = routerActuator{}
6157

6258
func (routerActuator) GetResourceID(osResource *osResourceT) string {
@@ -72,15 +68,37 @@ func (actuator routerActuator) GetOSResourceByID(ctx context.Context, id string)
7268
}
7369

7470
func (actuator routerActuator) ListOSResourcesForAdoption(ctx context.Context, obj *orcv1alpha1.Router) (routerIterator, bool) {
75-
if obj.Spec.Resource == nil {
71+
resource := obj.Spec.Resource
72+
if resource == nil {
7673
return nil, false
7774
}
7875

79-
listOpts := routers.ListOpts{Name: getResourceName(obj)}
76+
// Resolve the project ID from ProjectRef if set. Without the project
77+
// ID, adoption with admin-scoped credentials could match a router
78+
// in the wrong project.
79+
var projectID string
80+
if resource.ProjectRef != nil {
81+
project, rs := dependency.FetchDependency(
82+
ctx, actuator.k8sClient, obj.Namespace, resource.ProjectRef, "Project",
83+
func(dep *orcv1alpha1.Project) bool {
84+
return orcv1alpha1.IsAvailable(dep) && dep.Status.ID != nil
85+
},
86+
)
87+
if needsReschedule, _ := rs.NeedsReschedule(); needsReschedule {
88+
return nil, false
89+
}
90+
projectID = ptr.Deref(project.Status.ID, "")
91+
}
92+
93+
listOpts := routers.ListOpts{
94+
Name: getResourceName(obj),
95+
ProjectID: projectID,
96+
Distributed: resource.Distributed,
97+
}
8098
return actuator.osClient.ListRouter(ctx, listOpts), true
8199
}
82100

83-
func (actuator routerCreateActuator) ListOSResourcesForImport(ctx context.Context, obj orcObjectPT, filter filterT) (iter.Seq2[*osResourceT, error], progress.ReconcileStatus) {
101+
func (actuator routerActuator) ListOSResourcesForImport(ctx context.Context, obj orcObjectPT, filter filterT) (iter.Seq2[*osResourceT, error], progress.ReconcileStatus) {
84102
var reconcileStatus progress.ReconcileStatus
85103

86104
project, rs := dependency.FetchDependency(
@@ -108,7 +126,7 @@ func (actuator routerCreateActuator) ListOSResourcesForImport(ctx context.Contex
108126
return actuator.osClient.ListRouter(ctx, listOpts), nil
109127
}
110128

111-
func (actuator routerCreateActuator) CreateResource(ctx context.Context, obj *orcv1alpha1.Router) (*osResourceT, progress.ReconcileStatus) {
129+
func (actuator routerActuator) CreateResource(ctx context.Context, obj *orcv1alpha1.Router) (*osResourceT, progress.ReconcileStatus) {
112130
resource := obj.Spec.Resource
113131
if resource == nil {
114132
// Should have been caught by API validation
@@ -274,7 +292,7 @@ func (routerHelperFactory) NewAPIObjectAdapter(obj orcObjectPT) adapterI {
274292
}
275293

276294
func (routerHelperFactory) NewCreateActuator(ctx context.Context, orcObject orcObjectPT, controller interfaces.ResourceController) (createResourceActuator, progress.ReconcileStatus) {
277-
return newCreateActuator(ctx, orcObject, controller)
295+
return newActuator(ctx, orcObject, controller)
278296
}
279297

280298
func (routerHelperFactory) NewDeleteActuator(ctx context.Context, orcObject orcObjectPT, controller interfaces.ResourceController) (deleteResourceActuator, progress.ReconcileStatus) {
@@ -300,18 +318,7 @@ func newActuator(ctx context.Context, orcObject *orcv1alpha1.Router, controller
300318
}
301319

302320
return routerActuator{
303-
osClient: osClient,
304-
}, nil
305-
}
306-
307-
func newCreateActuator(ctx context.Context, orcObject *orcv1alpha1.Router, controller interfaces.ResourceController) (routerCreateActuator, progress.ReconcileStatus) {
308-
routerActuator, reconcileStatus := newActuator(ctx, orcObject, controller)
309-
if needsReschedule, _ := reconcileStatus.NeedsReschedule(); needsReschedule {
310-
return routerCreateActuator{}, reconcileStatus
311-
}
312-
313-
return routerCreateActuator{
314-
routerActuator: routerActuator,
315-
k8sClient: controller.GetK8sClient(),
321+
osClient: osClient,
322+
k8sClient: controller.GetK8sClient(),
316323
}, nil
317324
}

0 commit comments

Comments
 (0)