Skip to content

Commit

Permalink
Project finalizer should use versioned informer
Browse files Browse the repository at this point in the history
  • Loading branch information
smarterclayton committed Jun 20, 2017
1 parent 1d4dd0d commit 5d01e5a
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 31 deletions.
4 changes: 2 additions & 2 deletions pkg/cmd/server/origin/controller/project.go
Expand Up @@ -7,8 +7,8 @@ import (

func RunOriginNamespaceController(ctx ControllerContext) (bool, error) {
controller := projectcontroller.NewProjectFinalizerController(
ctx.InternalKubeInformers.Core().InternalVersion().Namespaces(),
ctx.ClientBuilder.KubeInternalClientOrDie(bootstrappolicy.InfraOriginNamespaceServiceAccountName),
ctx.ExternalKubeInformers.Core().V1().Namespaces(),
ctx.ClientBuilder.ClientOrDie(bootstrappolicy.InfraOriginNamespaceServiceAccountName),
)
go controller.Run(ctx.Stop, 5)
return true, nil
Expand Down
18 changes: 9 additions & 9 deletions pkg/project/controller/project_finalizer_controller.go
Expand Up @@ -7,17 +7,17 @@ import (
"k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/workqueue"
kapi "k8s.io/kubernetes/pkg/api"
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/core/internalversion"
"k8s.io/kubernetes/pkg/api/v1"
kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/core/v1"

"github.com/golang/glog"
projectutil "github.com/openshift/origin/pkg/project/util"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
)

// ProjectFinalizerController is responsible for participating in Kubernetes Namespace termination
type ProjectFinalizerController struct {
client internalclientset.Interface
client kclientset.Interface

queue workqueue.RateLimitingInterface
maxRetries int
Expand All @@ -29,7 +29,7 @@ type ProjectFinalizerController struct {
syncHandler func(key string) error
}

func NewProjectFinalizerController(namespaces informers.NamespaceInformer, client internalclientset.Interface) *ProjectFinalizerController {
func NewProjectFinalizerController(namespaces informers.NamespaceInformer, client kclientset.Interface) *ProjectFinalizerController {
c := &ProjectFinalizerController{
client: client,
controller: namespaces.Informer().GetController(),
Expand Down Expand Up @@ -73,7 +73,7 @@ func (c *ProjectFinalizerController) Run(stopCh <-chan struct{}, workers int) {
}

func (c *ProjectFinalizerController) enqueueNamespace(obj interface{}) {
ns, ok := obj.(*kapi.Namespace)
ns, ok := obj.(*v1.Namespace)
if !ok {
return
}
Expand Down Expand Up @@ -120,13 +120,13 @@ func (c *ProjectFinalizerController) syncNamespace(key string) error {
if !exists {
return nil
}
return c.finalize(item.(*kapi.Namespace))
return c.finalize(item.(*v1.Namespace))
}

// finalize processes a namespace and deletes content in origin if its terminating
func (c *ProjectFinalizerController) finalize(namespace *kapi.Namespace) error {
func (c *ProjectFinalizerController) finalize(namespace *v1.Namespace) error {
// if namespace is not terminating, ignore it
if namespace.Status.Phase != kapi.NamespaceTerminating {
if namespace.Status.Phase != v1.NamespaceTerminating {
return nil
}

Expand Down
26 changes: 13 additions & 13 deletions pkg/project/controller/project_finalizer_controller_test.go
Expand Up @@ -6,10 +6,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
clientgotesting "k8s.io/client-go/testing"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1"

"github.com/openshift/origin/pkg/project/api"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
projectapiv1 "github.com/openshift/origin/pkg/project/api/v1"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake"
)

func TestSyncNamespaceThatIsTerminating(t *testing.T) {
Expand All @@ -18,17 +18,17 @@ func TestSyncNamespaceThatIsTerminating(t *testing.T) {
client: mockKubeClient,
}
now := metav1.Now()
testNamespace := &kapi.Namespace{
testNamespace := &v1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
ResourceVersion: "1",
DeletionTimestamp: &now,
},
Spec: kapi.NamespaceSpec{
Finalizers: []kapi.FinalizerName{kapi.FinalizerKubernetes, api.FinalizerOrigin},
Spec: v1.NamespaceSpec{
Finalizers: []v1.FinalizerName{v1.FinalizerKubernetes, projectapiv1.FinalizerOrigin},
},
Status: kapi.NamespaceStatus{
Phase: kapi.NamespaceTerminating,
Status: v1.NamespaceStatus{
Phase: v1.NamespaceTerminating,
},
}
err := nm.finalize(testNamespace)
Expand All @@ -55,16 +55,16 @@ func TestSyncNamespaceThatIsActive(t *testing.T) {
nm := &ProjectFinalizerController{
client: mockKubeClient,
}
testNamespace := &kapi.Namespace{
testNamespace := &v1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
ResourceVersion: "1",
},
Spec: kapi.NamespaceSpec{
Finalizers: []kapi.FinalizerName{kapi.FinalizerKubernetes, api.FinalizerOrigin},
Spec: v1.NamespaceSpec{
Finalizers: []v1.FinalizerName{v1.FinalizerKubernetes, projectapiv1.FinalizerOrigin},
},
Status: kapi.NamespaceStatus{
Phase: kapi.NamespaceActive,
Status: v1.NamespaceStatus{
Phase: v1.NamespaceActive,
},
}
err := nm.finalize(testNamespace)
Expand Down
42 changes: 35 additions & 7 deletions pkg/project/util/util.go
Expand Up @@ -5,10 +5,13 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
kapi "k8s.io/kubernetes/pkg/api"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
internalclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"

oapi "github.com/openshift/origin/pkg/api"
"github.com/openshift/origin/pkg/project/api"
projectapiv1 "github.com/openshift/origin/pkg/project/api/v1"
)

// Associated returns true if the spec.finalizers contains the origin finalizer
Expand All @@ -22,25 +25,25 @@ func Associated(namespace *kapi.Namespace) bool {
}

// Associate adds the origin finalizer to spec.finalizers if its not there already
func Associate(kubeClient clientset.Interface, namespace *kapi.Namespace) (*kapi.Namespace, error) {
func Associate(kubeClient internalclientset.Interface, namespace *kapi.Namespace) (*kapi.Namespace, error) {
if Associated(namespace) {
return namespace, nil
}
return finalizeInternal(kubeClient, namespace, true)
}

// Finalized returns true if the spec.finalizers does not contain the origin finalizer
func Finalized(namespace *kapi.Namespace) bool {
func Finalized(namespace *v1.Namespace) bool {
for i := range namespace.Spec.Finalizers {
if api.FinalizerOrigin == namespace.Spec.Finalizers[i] {
if projectapiv1.FinalizerOrigin == namespace.Spec.Finalizers[i] {
return false
}
}
return true
}

// Finalize will remove the origin finalizer from the namespace
func Finalize(kubeClient clientset.Interface, namespace *kapi.Namespace) (result *kapi.Namespace, err error) {
func Finalize(kubeClient clientset.Interface, namespace *v1.Namespace) (result *v1.Namespace, err error) {
if Finalized(namespace) {
return namespace, nil
}
Expand All @@ -49,7 +52,7 @@ func Finalize(kubeClient clientset.Interface, namespace *kapi.Namespace) (result
// as a result, we handle resource conflicts in case multiple finalizers try
// to finalize at same time
for {
result, err = finalizeInternal(kubeClient, namespace, false)
result, err = finalizeInternalV1(kubeClient, namespace, false)
if err == nil {
return result, nil
}
Expand All @@ -66,7 +69,8 @@ func Finalize(kubeClient clientset.Interface, namespace *kapi.Namespace) (result
}

// finalizeInternal will update the namespace finalizer list to either have or not have origin finalizer
func finalizeInternal(kubeClient clientset.Interface, namespace *kapi.Namespace, withOrigin bool) (*kapi.Namespace, error) {
// TODO: remove me
func finalizeInternal(kubeClient internalclientset.Interface, namespace *kapi.Namespace, withOrigin bool) (*kapi.Namespace, error) {
namespaceFinalize := kapi.Namespace{}
namespaceFinalize.ObjectMeta = namespace.ObjectMeta
namespaceFinalize.Spec = namespace.Spec
Expand All @@ -89,6 +93,30 @@ func finalizeInternal(kubeClient clientset.Interface, namespace *kapi.Namespace,
return kubeClient.Core().Namespaces().Finalize(&namespaceFinalize)
}

// finalizeInternalV1 will update the namespace finalizer list to either have or not have origin finalizer
func finalizeInternalV1(kubeClient clientset.Interface, namespace *v1.Namespace, withOrigin bool) (*v1.Namespace, error) {
namespaceFinalize := v1.Namespace{}
namespaceFinalize.ObjectMeta = namespace.ObjectMeta
namespaceFinalize.Spec = namespace.Spec

finalizerSet := sets.NewString()
for i := range namespace.Spec.Finalizers {
finalizerSet.Insert(string(namespace.Spec.Finalizers[i]))
}

if withOrigin {
finalizerSet.Insert(string(projectapiv1.FinalizerOrigin))
} else {
finalizerSet.Delete(string(projectapiv1.FinalizerOrigin))
}

namespaceFinalize.Spec.Finalizers = make([]v1.FinalizerName, 0, len(finalizerSet))
for _, value := range finalizerSet.List() {
namespaceFinalize.Spec.Finalizers = append(namespaceFinalize.Spec.Finalizers, v1.FinalizerName(value))
}
return kubeClient.Core().Namespaces().Finalize(&namespaceFinalize)
}

// ConvertNamespace transforms a Namespace into a Project
func ConvertNamespace(namespace *kapi.Namespace) *api.Project {
return &api.Project{
Expand Down

0 comments on commit 5d01e5a

Please sign in to comment.