From cfabecd30f2db979f69fd015b39ce32a1b9e7881 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 23 Oct 2019 17:57:04 +0200 Subject: [PATCH] fix: properly set delegates to specific instances to call their methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We need to do so so that we have a semblance of polymorphism: the generic functions work on the delegate and generic role/rolebinding need to set their delegate to specific instances when these are created so that the generic functions call the most specific versions first, which can then default to non-overridden versions if not implemented… Writing OOP code in go be like 🤷‍ or 🤦‍ --- pkg/controller/capability/role.go | 6 ++++-- pkg/controller/capability/rolebinding.go | 6 ++++-- pkg/controller/component/role.go | 6 ++++-- pkg/controller/component/rolebinding.go | 6 ++++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/pkg/controller/capability/role.go b/pkg/controller/capability/role.go index cb5cc1f59..66fea8e70 100644 --- a/pkg/controller/capability/role.go +++ b/pkg/controller/capability/role.go @@ -10,6 +10,8 @@ type role struct { } func newRole(owner framework.Resource) role { - r := controller.NewOwnedRole(owner, func() string { return "scc-privileged-role" }) - return role{Role: r} + generic := controller.NewOwnedRole(owner, func() string { return "scc-privileged-role" }) + r := role{Role: generic} + generic.SetDelegate(r) + return r } diff --git a/pkg/controller/capability/rolebinding.go b/pkg/controller/capability/rolebinding.go index f51e63bea..54b33aaca 100644 --- a/pkg/controller/capability/rolebinding.go +++ b/pkg/controller/capability/rolebinding.go @@ -12,11 +12,13 @@ type roleBinding struct { } func newRoleBinding(owner framework.Resource) roleBinding { - rb := controller.NewOwnedRoleBinding(owner, + generic := controller.NewOwnedRoleBinding(owner, func() string { return "use-scc-privileged" }, func() string { return newRole(owner).Name() }, func() string { return newPostgres(owner).Name() }) - return roleBinding{RoleBinding: rb} + rb := roleBinding{RoleBinding: generic} + generic.SetDelegate(rb) + return rb } func (res roleBinding) NewInstanceWith(owner framework.Resource) framework.DependentResource { diff --git a/pkg/controller/component/role.go b/pkg/controller/component/role.go index cf63a5197..82f9686fd 100644 --- a/pkg/controller/component/role.go +++ b/pkg/controller/component/role.go @@ -12,8 +12,10 @@ type role struct { } func newRole(owner framework.Resource) role { - r := controller.NewOwnedRole(owner, func() string { return "image-scc-privileged-role" }) - return role{Role: r} + generic := controller.NewOwnedRole(owner, func() string { return "image-scc-privileged-role" }) + r := role{Role: generic} + generic.SetDelegate(r) // we need to set the parent's delegate to the object we're creating so that its specific methods are called + return r } func (res role) NewInstanceWith(owner framework.Resource) framework.DependentResource { diff --git a/pkg/controller/component/rolebinding.go b/pkg/controller/component/rolebinding.go index 89e018908..703d2b552 100644 --- a/pkg/controller/component/rolebinding.go +++ b/pkg/controller/component/rolebinding.go @@ -10,11 +10,13 @@ type roleBinding struct { } func newRoleBinding(owner framework.Resource) roleBinding { - rb := controller.NewOwnedRoleBinding(owner, + generic := controller.NewOwnedRoleBinding(owner, func() string { return "use-image-scc-privileged" }, func() string { return newRole(owner).Name() }, func() string { return ServiceAccountName(owner) }) - return roleBinding{RoleBinding: rb} + rb := roleBinding{RoleBinding: generic} + generic.SetDelegate(rb) + return rb } func (res roleBinding) NewInstanceWith(owner framework.Resource) framework.DependentResource {