Skip to content

Commit 0c7d36d

Browse files
authored
Merge pull request #65 from cybozu-go/fix-endless-reconcile
Fix endless reconcile
2 parents 09b3372 + ba086b5 commit 0c7d36d

File tree

1 file changed

+31
-8
lines changed

1 file changed

+31
-8
lines changed

controllers/tenant_controller.go

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ func (r *TenantReconciler) disownNamespace(ctx context.Context, ns *corev1.Names
222222
}
223223

224224
func (r *TenantReconciler) removeRoleBinding(ctx context.Context, tenant *cattagev1beta1.Tenant, ns *corev1.Namespace) error {
225+
logger := log.FromContext(ctx)
225226
rb := &rbacv1.RoleBinding{}
226227
err := r.client.Get(ctx, client.ObjectKey{Namespace: ns.Name, Name: tenant.Name + "-admin"}, rb)
227228
if apierrors.IsNotFound(err) {
@@ -241,10 +242,12 @@ func (r *TenantReconciler) removeRoleBinding(ctx context.Context, tenant *cattag
241242
if err != nil {
242243
return err
243244
}
245+
logger.Info("RoleBinding deleted", "rolebinding", rb.Name)
244246
return nil
245247
}
246248

247249
func (r *TenantReconciler) removeAppProject(ctx context.Context, tenant *cattagev1beta1.Tenant) error {
250+
logger := log.FromContext(ctx)
248251
proj := argocd.AppProject()
249252
err := r.client.Get(ctx, client.ObjectKey{Namespace: r.config.ArgoCD.Namespace, Name: tenant.Name}, proj)
250253
if apierrors.IsNotFound(err) {
@@ -260,7 +263,12 @@ func (r *TenantReconciler) removeAppProject(ctx context.Context, tenant *cattage
260263
if labels == nil || labels[constants.OwnerTenant] != tenant.Name {
261264
return nil
262265
}
263-
return r.client.Delete(ctx, proj)
266+
err = r.client.Delete(ctx, proj)
267+
if err != nil {
268+
return err
269+
}
270+
logger.Info("AppProject deleted", "project", proj.GetName())
271+
return nil
264272
}
265273

266274
func (r *TenantReconciler) finalize(ctx context.Context, tenant *cattagev1beta1.Tenant) error {
@@ -300,6 +308,7 @@ func (r *TenantReconciler) finalize(ctx context.Context, tenant *cattagev1beta1.
300308
}
301309

302310
func (r *TenantReconciler) patchNamespace(ctx context.Context, ns *accorev1.NamespaceApplyConfiguration) error {
311+
logger := log.FromContext(ctx)
303312
obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(ns)
304313
if err != nil {
305314
return err
@@ -323,13 +332,15 @@ func (r *TenantReconciler) patchNamespace(ctx context.Context, ns *accorev1.Name
323332
return nil
324333
}
325334

335+
logger.Info("patching namespace", "namespace", ns, "managed", managed)
326336
return r.client.Patch(ctx, patch, client.Apply, &client.PatchOptions{
327337
FieldManager: constants.TenantFieldManager,
328338
Force: ptr.To(true),
329339
})
330340
}
331341

332342
func (r *TenantReconciler) patchRoleBinding(ctx context.Context, rb *acrbacv1.RoleBindingApplyConfiguration) error {
343+
logger := log.FromContext(ctx)
333344
obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(rb)
334345
if err != nil {
335346
return err
@@ -353,6 +364,7 @@ func (r *TenantReconciler) patchRoleBinding(ctx context.Context, rb *acrbacv1.Ro
353364
return nil
354365
}
355366

367+
logger.Info("patching RoleBinding", "rolebinding", rb, "managed", managed)
356368
return r.client.Patch(ctx, patch, client.Apply, &client.PatchOptions{
357369
FieldManager: constants.TenantFieldManager,
358370
Force: ptr.To(true),
@@ -363,18 +375,23 @@ func (r *TenantReconciler) rolesMap(ctx context.Context, delegates []cattagev1be
363375
result := make(map[string][]Role)
364376

365377
for _, d := range delegates {
378+
delegatedTenant := &cattagev1beta1.Tenant{}
379+
err := r.client.Get(ctx, client.ObjectKey{Name: d.Name}, delegatedTenant)
380+
if err != nil {
381+
return nil, err
382+
}
366383
for _, role := range d.Roles {
367-
delegatedTenant := &cattagev1beta1.Tenant{}
368-
err := r.client.Get(ctx, client.ObjectKey{Name: d.Name}, delegatedTenant)
369-
if err != nil {
370-
return nil, err
371-
}
372384
result[role] = append(result[role], Role{
373385
Name: delegatedTenant.Name,
374386
ExtraParams: delegatedTenant.Spec.ExtraParams.ToMap(),
375387
})
376388
}
377389
}
390+
for _, roles := range result {
391+
slices.SortFunc(roles, func(x, y Role) int {
392+
return cmp.Compare(x.Name, y.Name)
393+
})
394+
}
378395
return result, nil
379396
}
380397

@@ -493,6 +510,7 @@ func (r *TenantReconciler) reconcileArgoCD(ctx context.Context, tenant *cattagev
493510
return err
494511
}
495512
namespaces = append(namespaces, delegatedNamespaces...)
513+
slices.Sort(namespaces)
496514

497515
tpl, err := template.New("AppProject Template").Parse(r.config.ArgoCD.AppProjectTemplate)
498516
if err != nil {
@@ -504,6 +522,10 @@ func (r *TenantReconciler) reconcileArgoCD(ctx context.Context, tenant *cattagev
504522
return err
505523
}
506524

525+
repos := tenant.Spec.ArgoCD.Repositories
526+
slices.Sort(repos)
527+
params := tenant.Spec.ExtraParams.ToMap()
528+
507529
var buf bytes.Buffer
508530
err = tpl.Execute(&buf, struct {
509531
Name string
@@ -515,8 +537,8 @@ func (r *TenantReconciler) reconcileArgoCD(ctx context.Context, tenant *cattagev
515537
Name: tenant.Name,
516538
Namespaces: namespaces,
517539
Roles: roles,
518-
Repositories: tenant.Spec.ArgoCD.Repositories,
519-
ExtraParams: tenant.Spec.ExtraParams.ToMap(),
540+
Repositories: repos,
541+
ExtraParams: params,
520542
})
521543
if err != nil {
522544
return err
@@ -544,6 +566,7 @@ func (r *TenantReconciler) reconcileArgoCD(ctx context.Context, tenant *cattagev
544566
return nil
545567
}
546568

569+
logger.Info("patching AppProject", "namespaces", namespaces, "roles", roles, "repositories", repos, "extraParams", params)
547570
err = r.client.Patch(ctx, proj, client.Apply, &client.PatchOptions{
548571
Force: ptr.To(true),
549572
FieldManager: constants.TenantFieldManager,

0 commit comments

Comments
 (0)