Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use ObjectGetter Interface instead of clientset.Interface for leaderelection pkg #44338

Merged
merged 1 commit into from
May 2, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/client/leaderelection/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ go_test(
tags = ["automanaged"],
deps = [
"//pkg/api/v1:go_default_library",
"//pkg/client/clientset_generated/clientset/fake:go_default_library",
"//pkg/client/clientset_generated/clientset/typed/core/v1/fake:go_default_library",
"//pkg/client/leaderelection/resourcelock:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
Expand Down
4 changes: 2 additions & 2 deletions pkg/client/leaderelection/leaderelection_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import (
core "k8s.io/client-go/testing"
"k8s.io/client-go/tools/record"
"k8s.io/kubernetes/pkg/api/v1"
fakeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake"
fakecorev1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1/fake"
rl "k8s.io/kubernetes/pkg/client/leaderelection/resourcelock"
)

Expand Down Expand Up @@ -219,7 +219,7 @@ func testTryAcquireOrRenew(t *testing.T, objectType string) {
Identity: "baz",
EventRecorder: &record.FakeRecorder{},
}
c := &fakeclientset.Clientset{Fake: core.Fake{}}
c := &fakecorev1.FakeCoreV1{Fake: &core.Fake{}}
for _, reactor := range test.reactors {
c.AddReactor(reactor.verb, objectType, reactor.reaction)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/client/leaderelection/resourcelock/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ go_library(
tags = ["automanaged"],
deps = [
"//pkg/api/v1:go_default_library",
"//pkg/client/clientset_generated/clientset:go_default_library",
"//pkg/client/clientset_generated/clientset/typed/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/client-go/tools/record:go_default_library",
],
Expand Down
10 changes: 5 additions & 5 deletions pkg/client/leaderelection/resourcelock/configmaplock.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
corev1client "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1"
)

// TODO: This is almost a exact replica of Endpoints lock.
Expand All @@ -35,7 +35,7 @@ type ConfigMapLock struct {
// ConfigMapMeta should contain a Name and a Namespace of an
// ConfigMapMeta object that the Leadercmlector will attempt to lead.
ConfigMapMeta metav1.ObjectMeta
Client clientset.Interface
Client corev1client.ConfigMapsGetter
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we pass corev1client.ConfigMapInterface around, i.e., passing Client.ConfigMaps(ConfigMapMeta.Namespace) around? It looks like federation.ConfigMapInterface has the same methods as corev1client.ConfigMapInterface, so you can reuse the leaderelection code for federation.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@caesarxuchao, even though ConfigMapInterface is the same, as they are generated. they are 2 different types today as is evident from below error i got when i passed federation corev1 client.

# k8s.io/kubernetes/federation/cmd/federation-controller-manager/app
federation/cmd/federation-controller-manager/app/controllermanager.go:163: cannot use leaderElectionClient.CoreV1() (type "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/core/v1".CoreV1Interface) as type "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1".ConfigMapsGetter in field value:
	"k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/core/v1".CoreV1Interface does not implement "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1".ConfigMapsGetter (wrong type for ConfigMaps method)
		have ConfigMaps(string) "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/core/v1".ConfigMapInterface
		want ConfigMaps(string) "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1".ConfigMapInterface

we should start using client-go, then these types will be unique

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should start using client-go, then these types will be unique

I don't think so, client-go doesn't include any federation code.

I saw this error message, it's saying federation corev1 cannot be used as clientset's ConfigMapsGetter, because although the two definitions of ConfigMapInterface are the same, to the compiler, they are two different types.

However, if you pass federation.ConfigMapInterface directly, compiler should accept it as a clientset.ConfigMapInterface, because they have the same methods defined.

I didn't try it though, so i could be wrong :)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okie, i will try. thanks for suggestion.

LockConfig ResourceLockConfig
cm *v1.ConfigMap
}
Expand All @@ -44,7 +44,7 @@ type ConfigMapLock struct {
func (cml *ConfigMapLock) Get() (*LeaderElectionRecord, error) {
var record LeaderElectionRecord
var err error
cml.cm, err = cml.Client.Core().ConfigMaps(cml.ConfigMapMeta.Namespace).Get(cml.ConfigMapMeta.Name, metav1.GetOptions{})
cml.cm, err = cml.Client.ConfigMaps(cml.ConfigMapMeta.Namespace).Get(cml.ConfigMapMeta.Name, metav1.GetOptions{})
if err != nil {
return nil, err
}
Expand All @@ -65,7 +65,7 @@ func (cml *ConfigMapLock) Create(ler LeaderElectionRecord) error {
if err != nil {
return err
}
cml.cm, err = cml.Client.Core().ConfigMaps(cml.ConfigMapMeta.Namespace).Create(&v1.ConfigMap{
cml.cm, err = cml.Client.ConfigMaps(cml.ConfigMapMeta.Namespace).Create(&v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: cml.ConfigMapMeta.Name,
Namespace: cml.ConfigMapMeta.Namespace,
Expand All @@ -87,7 +87,7 @@ func (cml *ConfigMapLock) Update(ler LeaderElectionRecord) error {
return err
}
cml.cm.Annotations[LeaderElectionRecordAnnotationKey] = string(recordBytes)
cml.cm, err = cml.Client.Core().ConfigMaps(cml.ConfigMapMeta.Namespace).Update(cml.cm)
cml.cm, err = cml.Client.ConfigMaps(cml.ConfigMapMeta.Namespace).Update(cml.cm)
return err
}

Expand Down
10 changes: 5 additions & 5 deletions pkg/client/leaderelection/resourcelock/endpointslock.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ import (

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
corev1client "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might be out of scope, but why don't we use client-go here?
Would that require a big "switch-all" to client-go?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes @luxas, it requires big "switch-all" to client-go and is out of scope for this pr.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will be done in #39173.

)

type EndpointsLock struct {
// EndpointsMeta should contain a Name and a Namespace of an
// Endpoints object that the LeaderElector will attempt to lead.
EndpointsMeta metav1.ObjectMeta
Client clientset.Interface
Client corev1client.EndpointsGetter
LockConfig ResourceLockConfig
e *v1.Endpoints
}
Expand All @@ -39,7 +39,7 @@ type EndpointsLock struct {
func (el *EndpointsLock) Get() (*LeaderElectionRecord, error) {
var record LeaderElectionRecord
var err error
el.e, err = el.Client.Core().Endpoints(el.EndpointsMeta.Namespace).Get(el.EndpointsMeta.Name, metav1.GetOptions{})
el.e, err = el.Client.Endpoints(el.EndpointsMeta.Namespace).Get(el.EndpointsMeta.Name, metav1.GetOptions{})
if err != nil {
return nil, err
}
Expand All @@ -60,7 +60,7 @@ func (el *EndpointsLock) Create(ler LeaderElectionRecord) error {
if err != nil {
return err
}
el.e, err = el.Client.Core().Endpoints(el.EndpointsMeta.Namespace).Create(&v1.Endpoints{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is Endpoints missed in federation clientset? You can generate it by adding endpoints at this line. I'm not sure if the generated client will actually work, you might need to register it to the federation's scheme as well, but it's worth a try.

el.e, err = el.Client.Endpoints(el.EndpointsMeta.Namespace).Create(&v1.Endpoints{
ObjectMeta: metav1.ObjectMeta{
Name: el.EndpointsMeta.Name,
Namespace: el.EndpointsMeta.Namespace,
Expand All @@ -82,7 +82,7 @@ func (el *EndpointsLock) Update(ler LeaderElectionRecord) error {
return err
}
el.e.Annotations[LeaderElectionRecordAnnotationKey] = string(recordBytes)
el.e, err = el.Client.Core().Endpoints(el.EndpointsMeta.Namespace).Update(el.e)
el.e, err = el.Client.Endpoints(el.EndpointsMeta.Namespace).Update(el.e)
return err
}

Expand Down