Merge pull request #32316 from deads2k/client-05-remaining-clients

Automatic merge from submit-queue

remove the rest of the non-generated clients from the kubectl code

Die `Client` Die!

It's always bigger than you think.  Last bit @kargakis after this, it's gone.
This commit is contained in:
Kubernetes Submit Queue
2016-09-12 21:45:16 -07:00
committed by GitHub
59 changed files with 1570 additions and 800 deletions

View File

@@ -43,6 +43,7 @@ var (
"extensions/", "extensions/",
"rbac/", "rbac/",
"storage/", "storage/",
"apps/",
}, "group/versions that client-gen will generate clients for. At most one version per group is allowed. Specified in the format \"group1/version1,group2/version2...\". Default to \"api/,extensions/,autoscaling/,batch/,rbac/\"") }, "group/versions that client-gen will generate clients for. At most one version per group is allowed. Specified in the format \"group1/version1,group2/version2...\". Default to \"api/,extensions/,autoscaling/,batch/,rbac/\"")
includedTypesOverrides = flag.StringSlice("included-types-overrides", []string{}, "list of group/version/type for which client should be generated. By default, client is generated for all types which have genclient=true in types.go. This overrides that. For each groupVersion in this list, only the types mentioned here will be included. The default check of genclient=true will be used for other group versions.") includedTypesOverrides = flag.StringSlice("included-types-overrides", []string{}, "list of group/version/type for which client should be generated. By default, client is generated for all types which have genclient=true in types.go. This overrides that. For each groupVersion in this list, only the types mentioned here will be included. The default check of genclient=true will be used for other group versions.")
basePath = flag.String("input-base", "k8s.io/kubernetes/pkg/apis", "base path to look for the api group. Default to \"k8s.io/kubernetes/pkg/apis\"") basePath = flag.String("input-base", "k8s.io/kubernetes/pkg/apis", "base path to look for the api group. Default to \"k8s.io/kubernetes/pkg/apis\"")

View File

@@ -21,6 +21,8 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
) )
// +genclient=true
// PetSet represents a set of pods with consistent identities. // PetSet represents a set of pods with consistent identities.
// Identities are defined as: // Identities are defined as:
// - Network: A single stable DNS and hostname. // - Network: A single stable DNS and hostname.

View File

@@ -826,6 +826,8 @@ type PodSecurityPolicyList struct {
Items []PodSecurityPolicy `json:"items"` Items []PodSecurityPolicy `json:"items"`
} }
// +genclient=true
type NetworkPolicy struct { type NetworkPolicy struct {
unversioned.TypeMeta `json:",inline"` unversioned.TypeMeta `json:",inline"`
api.ObjectMeta `json:"metadata,omitempty"` api.ObjectMeta `json:"metadata,omitempty"`

View File

@@ -18,6 +18,7 @@ package internalclientset
import ( import (
"github.com/golang/glog" "github.com/golang/glog"
unversionedapps "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/unversioned"
unversionedauthentication "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned" unversionedauthentication "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned"
unversionedauthorization "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned" unversionedauthorization "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned"
unversionedautoscaling "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned" unversionedautoscaling "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned"
@@ -43,6 +44,7 @@ type Interface interface {
Extensions() unversionedextensions.ExtensionsInterface Extensions() unversionedextensions.ExtensionsInterface
Rbac() unversionedrbac.RbacInterface Rbac() unversionedrbac.RbacInterface
Storage() unversionedstorage.StorageInterface Storage() unversionedstorage.StorageInterface
Apps() unversionedapps.AppsInterface
} }
// Clientset contains the clients for groups. Each group has exactly one // Clientset contains the clients for groups. Each group has exactly one
@@ -58,6 +60,7 @@ type Clientset struct {
*unversionedextensions.ExtensionsClient *unversionedextensions.ExtensionsClient
*unversionedrbac.RbacClient *unversionedrbac.RbacClient
*unversionedstorage.StorageClient *unversionedstorage.StorageClient
*unversionedapps.AppsClient
} }
// Core retrieves the CoreClient // Core retrieves the CoreClient
@@ -132,6 +135,14 @@ func (c *Clientset) Storage() unversionedstorage.StorageInterface {
return c.StorageClient return c.StorageClient
} }
// Apps retrieves the AppsClient
func (c *Clientset) Apps() unversionedapps.AppsInterface {
if c == nil {
return nil
}
return c.AppsClient
}
// Discovery retrieves the DiscoveryClient // Discovery retrieves the DiscoveryClient
func (c *Clientset) Discovery() discovery.DiscoveryInterface { func (c *Clientset) Discovery() discovery.DiscoveryInterface {
return c.DiscoveryClient return c.DiscoveryClient
@@ -181,6 +192,10 @@ func NewForConfig(c *restclient.Config) (*Clientset, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
clientset.AppsClient, err = unversionedapps.NewForConfig(&configShallowCopy)
if err != nil {
return nil, err
}
clientset.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) clientset.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
if err != nil { if err != nil {
@@ -203,6 +218,7 @@ func NewForConfigOrDie(c *restclient.Config) *Clientset {
clientset.ExtensionsClient = unversionedextensions.NewForConfigOrDie(c) clientset.ExtensionsClient = unversionedextensions.NewForConfigOrDie(c)
clientset.RbacClient = unversionedrbac.NewForConfigOrDie(c) clientset.RbacClient = unversionedrbac.NewForConfigOrDie(c)
clientset.StorageClient = unversionedstorage.NewForConfigOrDie(c) clientset.StorageClient = unversionedstorage.NewForConfigOrDie(c)
clientset.AppsClient = unversionedapps.NewForConfigOrDie(c)
clientset.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) clientset.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
return &clientset return &clientset
@@ -220,6 +236,7 @@ func New(c *restclient.RESTClient) *Clientset {
clientset.ExtensionsClient = unversionedextensions.New(c) clientset.ExtensionsClient = unversionedextensions.New(c)
clientset.RbacClient = unversionedrbac.New(c) clientset.RbacClient = unversionedrbac.New(c)
clientset.StorageClient = unversionedstorage.New(c) clientset.StorageClient = unversionedstorage.New(c)
clientset.AppsClient = unversionedapps.New(c)
clientset.DiscoveryClient = discovery.NewDiscoveryClient(c) clientset.DiscoveryClient = discovery.NewDiscoveryClient(c)
return &clientset return &clientset

View File

@@ -20,6 +20,8 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
unversionedapps "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/unversioned"
fakeunversionedapps "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/unversioned/fake"
unversionedauthentication "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned" unversionedauthentication "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned"
fakeunversionedauthentication "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned/fake" fakeunversionedauthentication "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned/fake"
unversionedauthorization "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned" unversionedauthorization "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned"
@@ -122,3 +124,8 @@ func (c *Clientset) Rbac() unversionedrbac.RbacInterface {
func (c *Clientset) Storage() unversionedstorage.StorageInterface { func (c *Clientset) Storage() unversionedstorage.StorageInterface {
return &fakeunversionedstorage.FakeStorage{Fake: &c.Fake} return &fakeunversionedstorage.FakeStorage{Fake: &c.Fake}
} }
// Apps retrieves the AppsClient
func (c *Clientset) Apps() unversionedapps.AppsInterface {
return &fakeunversionedapps.FakeApps{Fake: &c.Fake}
}

View File

@@ -0,0 +1,101 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package unversioned
import (
api "k8s.io/kubernetes/pkg/api"
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
restclient "k8s.io/kubernetes/pkg/client/restclient"
)
type AppsInterface interface {
GetRESTClient() *restclient.RESTClient
PetSetsGetter
}
// AppsClient is used to interact with features provided by the Apps group.
type AppsClient struct {
*restclient.RESTClient
}
func (c *AppsClient) PetSets(namespace string) PetSetInterface {
return newPetSets(c, namespace)
}
// NewForConfig creates a new AppsClient for the given config.
func NewForConfig(c *restclient.Config) (*AppsClient, error) {
config := *c
if err := setConfigDefaults(&config); err != nil {
return nil, err
}
client, err := restclient.RESTClientFor(&config)
if err != nil {
return nil, err
}
return &AppsClient{client}, nil
}
// NewForConfigOrDie creates a new AppsClient for the given config and
// panics if there is an error in the config.
func NewForConfigOrDie(c *restclient.Config) *AppsClient {
client, err := NewForConfig(c)
if err != nil {
panic(err)
}
return client
}
// New creates a new AppsClient for the given RESTClient.
func New(c *restclient.RESTClient) *AppsClient {
return &AppsClient{c}
}
func setConfigDefaults(config *restclient.Config) error {
// if apps group is not registered, return an error
g, err := registered.Group("apps")
if err != nil {
return err
}
config.APIPath = "/apis"
if config.UserAgent == "" {
config.UserAgent = restclient.DefaultKubernetesUserAgent()
}
// TODO: Unconditionally set the config.Version, until we fix the config.
//if config.Version == "" {
copyGroupVersion := g.GroupVersion
config.GroupVersion = &copyGroupVersion
//}
config.NegotiatedSerializer = api.Codecs
if config.QPS == 0 {
config.QPS = 5
}
if config.Burst == 0 {
config.Burst = 10
}
return nil
}
// GetRESTClient returns a RESTClient that is used to communicate
// with API server by this client implementation.
func (c *AppsClient) GetRESTClient() *restclient.RESTClient {
if c == nil {
return nil
}
return c.RESTClient
}

View File

@@ -0,0 +1,20 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// This package is generated by client-gen with the default arguments.
// This package has the automatically generated typed clients.
package unversioned

View File

@@ -0,0 +1,20 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// This package is generated by client-gen with the default arguments.
// Package fake has the automatically generated clients.
package fake

View File

@@ -0,0 +1,37 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package fake
import (
unversioned "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/unversioned"
restclient "k8s.io/kubernetes/pkg/client/restclient"
core "k8s.io/kubernetes/pkg/client/testing/core"
)
type FakeApps struct {
*core.Fake
}
func (c *FakeApps) PetSets(namespace string) unversioned.PetSetInterface {
return &FakePetSets{c, namespace}
}
// GetRESTClient returns a RESTClient that is used to communicate
// with API server by this client implementation.
func (c *FakeApps) GetRESTClient() *restclient.RESTClient {
return nil
}

View File

@@ -0,0 +1,127 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package fake
import (
api "k8s.io/kubernetes/pkg/api"
unversioned "k8s.io/kubernetes/pkg/api/unversioned"
apps "k8s.io/kubernetes/pkg/apis/apps"
core "k8s.io/kubernetes/pkg/client/testing/core"
labels "k8s.io/kubernetes/pkg/labels"
watch "k8s.io/kubernetes/pkg/watch"
)
// FakePetSets implements PetSetInterface
type FakePetSets struct {
Fake *FakeApps
ns string
}
var petsetsResource = unversioned.GroupVersionResource{Group: "apps", Version: "", Resource: "petsets"}
func (c *FakePetSets) Create(petSet *apps.PetSet) (result *apps.PetSet, err error) {
obj, err := c.Fake.
Invokes(core.NewCreateAction(petsetsResource, c.ns, petSet), &apps.PetSet{})
if obj == nil {
return nil, err
}
return obj.(*apps.PetSet), err
}
func (c *FakePetSets) Update(petSet *apps.PetSet) (result *apps.PetSet, err error) {
obj, err := c.Fake.
Invokes(core.NewUpdateAction(petsetsResource, c.ns, petSet), &apps.PetSet{})
if obj == nil {
return nil, err
}
return obj.(*apps.PetSet), err
}
func (c *FakePetSets) UpdateStatus(petSet *apps.PetSet) (*apps.PetSet, error) {
obj, err := c.Fake.
Invokes(core.NewUpdateSubresourceAction(petsetsResource, "status", c.ns, petSet), &apps.PetSet{})
if obj == nil {
return nil, err
}
return obj.(*apps.PetSet), err
}
func (c *FakePetSets) Delete(name string, options *api.DeleteOptions) error {
_, err := c.Fake.
Invokes(core.NewDeleteAction(petsetsResource, c.ns, name), &apps.PetSet{})
return err
}
func (c *FakePetSets) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error {
action := core.NewDeleteCollectionAction(petsetsResource, c.ns, listOptions)
_, err := c.Fake.Invokes(action, &apps.PetSetList{})
return err
}
func (c *FakePetSets) Get(name string) (result *apps.PetSet, err error) {
obj, err := c.Fake.
Invokes(core.NewGetAction(petsetsResource, c.ns, name), &apps.PetSet{})
if obj == nil {
return nil, err
}
return obj.(*apps.PetSet), err
}
func (c *FakePetSets) List(opts api.ListOptions) (result *apps.PetSetList, err error) {
obj, err := c.Fake.
Invokes(core.NewListAction(petsetsResource, c.ns, opts), &apps.PetSetList{})
if obj == nil {
return nil, err
}
label := opts.LabelSelector
if label == nil {
label = labels.Everything()
}
list := &apps.PetSetList{}
for _, item := range obj.(*apps.PetSetList).Items {
if label.Matches(labels.Set(item.Labels)) {
list.Items = append(list.Items, item)
}
}
return list, err
}
// Watch returns a watch.Interface that watches the requested petSets.
func (c *FakePetSets) Watch(opts api.ListOptions) (watch.Interface, error) {
return c.Fake.
InvokesWatch(core.NewWatchAction(petsetsResource, c.ns, opts))
}
// Patch applies the patch and returns the patched petSet.
func (c *FakePetSets) Patch(name string, pt api.PatchType, data []byte, subresources ...string) (result *apps.PetSet, err error) {
obj, err := c.Fake.
Invokes(core.NewPatchSubresourceAction(petsetsResource, c.ns, name, data, subresources...), &apps.PetSet{})
if obj == nil {
return nil, err
}
return obj.(*apps.PetSet), err
}

View File

@@ -0,0 +1,19 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package unversioned
type PetSetExpansion interface{}

View File

@@ -0,0 +1,165 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package unversioned
import (
api "k8s.io/kubernetes/pkg/api"
apps "k8s.io/kubernetes/pkg/apis/apps"
watch "k8s.io/kubernetes/pkg/watch"
)
// PetSetsGetter has a method to return a PetSetInterface.
// A group's client should implement this interface.
type PetSetsGetter interface {
PetSets(namespace string) PetSetInterface
}
// PetSetInterface has methods to work with PetSet resources.
type PetSetInterface interface {
Create(*apps.PetSet) (*apps.PetSet, error)
Update(*apps.PetSet) (*apps.PetSet, error)
UpdateStatus(*apps.PetSet) (*apps.PetSet, error)
Delete(name string, options *api.DeleteOptions) error
DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error
Get(name string) (*apps.PetSet, error)
List(opts api.ListOptions) (*apps.PetSetList, error)
Watch(opts api.ListOptions) (watch.Interface, error)
Patch(name string, pt api.PatchType, data []byte, subresources ...string) (result *apps.PetSet, err error)
PetSetExpansion
}
// petSets implements PetSetInterface
type petSets struct {
client *AppsClient
ns string
}
// newPetSets returns a PetSets
func newPetSets(c *AppsClient, namespace string) *petSets {
return &petSets{
client: c,
ns: namespace,
}
}
// Create takes the representation of a petSet and creates it. Returns the server's representation of the petSet, and an error, if there is any.
func (c *petSets) Create(petSet *apps.PetSet) (result *apps.PetSet, err error) {
result = &apps.PetSet{}
err = c.client.Post().
Namespace(c.ns).
Resource("petsets").
Body(petSet).
Do().
Into(result)
return
}
// Update takes the representation of a petSet and updates it. Returns the server's representation of the petSet, and an error, if there is any.
func (c *petSets) Update(petSet *apps.PetSet) (result *apps.PetSet, err error) {
result = &apps.PetSet{}
err = c.client.Put().
Namespace(c.ns).
Resource("petsets").
Name(petSet.Name).
Body(petSet).
Do().
Into(result)
return
}
func (c *petSets) UpdateStatus(petSet *apps.PetSet) (result *apps.PetSet, err error) {
result = &apps.PetSet{}
err = c.client.Put().
Namespace(c.ns).
Resource("petsets").
Name(petSet.Name).
SubResource("status").
Body(petSet).
Do().
Into(result)
return
}
// Delete takes name of the petSet and deletes it. Returns an error if one occurs.
func (c *petSets) Delete(name string, options *api.DeleteOptions) error {
return c.client.Delete().
Namespace(c.ns).
Resource("petsets").
Name(name).
Body(options).
Do().
Error()
}
// DeleteCollection deletes a collection of objects.
func (c *petSets) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error {
return c.client.Delete().
Namespace(c.ns).
Resource("petsets").
VersionedParams(&listOptions, api.ParameterCodec).
Body(options).
Do().
Error()
}
// Get takes name of the petSet, and returns the corresponding petSet object, and an error if there is any.
func (c *petSets) Get(name string) (result *apps.PetSet, err error) {
result = &apps.PetSet{}
err = c.client.Get().
Namespace(c.ns).
Resource("petsets").
Name(name).
Do().
Into(result)
return
}
// List takes label and field selectors, and returns the list of PetSets that match those selectors.
func (c *petSets) List(opts api.ListOptions) (result *apps.PetSetList, err error) {
result = &apps.PetSetList{}
err = c.client.Get().
Namespace(c.ns).
Resource("petsets").
VersionedParams(&opts, api.ParameterCodec).
Do().
Into(result)
return
}
// Watch returns a watch.Interface that watches the requested petSets.
func (c *petSets) Watch(opts api.ListOptions) (watch.Interface, error) {
return c.client.Get().
Prefix("watch").
Namespace(c.ns).
Resource("petsets").
VersionedParams(&opts, api.ParameterCodec).
Watch()
}
// Patch applies the patch and returns the patched petSet.
func (c *petSets) Patch(name string, pt api.PatchType, data []byte, subresources ...string) (result *apps.PetSet, err error) {
result = &apps.PetSet{}
err = c.client.Patch(pt).
Namespace(c.ns).
Resource("petsets").
SubResource(subresources...).
Name(name).
Body(data).
Do().
Into(result)
return
}

View File

@@ -27,6 +27,7 @@ type ExtensionsInterface interface {
DaemonSetsGetter DaemonSetsGetter
DeploymentsGetter DeploymentsGetter
IngressesGetter IngressesGetter
NetworkPoliciesGetter
PodSecurityPoliciesGetter PodSecurityPoliciesGetter
ReplicaSetsGetter ReplicaSetsGetter
ScalesGetter ScalesGetter
@@ -50,6 +51,10 @@ func (c *ExtensionsClient) Ingresses(namespace string) IngressInterface {
return newIngresses(c, namespace) return newIngresses(c, namespace)
} }
func (c *ExtensionsClient) NetworkPolicies(namespace string) NetworkPolicyInterface {
return newNetworkPolicies(c, namespace)
}
func (c *ExtensionsClient) PodSecurityPolicies() PodSecurityPolicyInterface { func (c *ExtensionsClient) PodSecurityPolicies() PodSecurityPolicyInterface {
return newPodSecurityPolicies(c) return newPodSecurityPolicies(c)
} }

View File

@@ -38,6 +38,10 @@ func (c *FakeExtensions) Ingresses(namespace string) unversioned.IngressInterfac
return &FakeIngresses{c, namespace} return &FakeIngresses{c, namespace}
} }
func (c *FakeExtensions) NetworkPolicies(namespace string) unversioned.NetworkPolicyInterface {
return &FakeNetworkPolicies{c, namespace}
}
func (c *FakeExtensions) PodSecurityPolicies() unversioned.PodSecurityPolicyInterface { func (c *FakeExtensions) PodSecurityPolicies() unversioned.PodSecurityPolicyInterface {
return &FakePodSecurityPolicies{c} return &FakePodSecurityPolicies{c}
} }

View File

@@ -0,0 +1,117 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package fake
import (
api "k8s.io/kubernetes/pkg/api"
unversioned "k8s.io/kubernetes/pkg/api/unversioned"
extensions "k8s.io/kubernetes/pkg/apis/extensions"
core "k8s.io/kubernetes/pkg/client/testing/core"
labels "k8s.io/kubernetes/pkg/labels"
watch "k8s.io/kubernetes/pkg/watch"
)
// FakeNetworkPolicies implements NetworkPolicyInterface
type FakeNetworkPolicies struct {
Fake *FakeExtensions
ns string
}
var networkpoliciesResource = unversioned.GroupVersionResource{Group: "extensions", Version: "", Resource: "networkpolicies"}
func (c *FakeNetworkPolicies) Create(networkPolicy *extensions.NetworkPolicy) (result *extensions.NetworkPolicy, err error) {
obj, err := c.Fake.
Invokes(core.NewCreateAction(networkpoliciesResource, c.ns, networkPolicy), &extensions.NetworkPolicy{})
if obj == nil {
return nil, err
}
return obj.(*extensions.NetworkPolicy), err
}
func (c *FakeNetworkPolicies) Update(networkPolicy *extensions.NetworkPolicy) (result *extensions.NetworkPolicy, err error) {
obj, err := c.Fake.
Invokes(core.NewUpdateAction(networkpoliciesResource, c.ns, networkPolicy), &extensions.NetworkPolicy{})
if obj == nil {
return nil, err
}
return obj.(*extensions.NetworkPolicy), err
}
func (c *FakeNetworkPolicies) Delete(name string, options *api.DeleteOptions) error {
_, err := c.Fake.
Invokes(core.NewDeleteAction(networkpoliciesResource, c.ns, name), &extensions.NetworkPolicy{})
return err
}
func (c *FakeNetworkPolicies) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error {
action := core.NewDeleteCollectionAction(networkpoliciesResource, c.ns, listOptions)
_, err := c.Fake.Invokes(action, &extensions.NetworkPolicyList{})
return err
}
func (c *FakeNetworkPolicies) Get(name string) (result *extensions.NetworkPolicy, err error) {
obj, err := c.Fake.
Invokes(core.NewGetAction(networkpoliciesResource, c.ns, name), &extensions.NetworkPolicy{})
if obj == nil {
return nil, err
}
return obj.(*extensions.NetworkPolicy), err
}
func (c *FakeNetworkPolicies) List(opts api.ListOptions) (result *extensions.NetworkPolicyList, err error) {
obj, err := c.Fake.
Invokes(core.NewListAction(networkpoliciesResource, c.ns, opts), &extensions.NetworkPolicyList{})
if obj == nil {
return nil, err
}
label := opts.LabelSelector
if label == nil {
label = labels.Everything()
}
list := &extensions.NetworkPolicyList{}
for _, item := range obj.(*extensions.NetworkPolicyList).Items {
if label.Matches(labels.Set(item.Labels)) {
list.Items = append(list.Items, item)
}
}
return list, err
}
// Watch returns a watch.Interface that watches the requested networkPolicies.
func (c *FakeNetworkPolicies) Watch(opts api.ListOptions) (watch.Interface, error) {
return c.Fake.
InvokesWatch(core.NewWatchAction(networkpoliciesResource, c.ns, opts))
}
// Patch applies the patch and returns the patched networkPolicy.
func (c *FakeNetworkPolicies) Patch(name string, pt api.PatchType, data []byte, subresources ...string) (result *extensions.NetworkPolicy, err error) {
obj, err := c.Fake.
Invokes(core.NewPatchSubresourceAction(networkpoliciesResource, c.ns, name, data, subresources...), &extensions.NetworkPolicy{})
if obj == nil {
return nil, err
}
return obj.(*extensions.NetworkPolicy), err
}

View File

@@ -20,6 +20,8 @@ type DaemonSetExpansion interface{}
type IngressExpansion interface{} type IngressExpansion interface{}
type NetworkPolicyExpansion interface{}
type PodSecurityPolicyExpansion interface{} type PodSecurityPolicyExpansion interface{}
type ReplicaSetExpansion interface{} type ReplicaSetExpansion interface{}

View File

@@ -0,0 +1,151 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package unversioned
import (
api "k8s.io/kubernetes/pkg/api"
extensions "k8s.io/kubernetes/pkg/apis/extensions"
watch "k8s.io/kubernetes/pkg/watch"
)
// NetworkPoliciesGetter has a method to return a NetworkPolicyInterface.
// A group's client should implement this interface.
type NetworkPoliciesGetter interface {
NetworkPolicies(namespace string) NetworkPolicyInterface
}
// NetworkPolicyInterface has methods to work with NetworkPolicy resources.
type NetworkPolicyInterface interface {
Create(*extensions.NetworkPolicy) (*extensions.NetworkPolicy, error)
Update(*extensions.NetworkPolicy) (*extensions.NetworkPolicy, error)
Delete(name string, options *api.DeleteOptions) error
DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error
Get(name string) (*extensions.NetworkPolicy, error)
List(opts api.ListOptions) (*extensions.NetworkPolicyList, error)
Watch(opts api.ListOptions) (watch.Interface, error)
Patch(name string, pt api.PatchType, data []byte, subresources ...string) (result *extensions.NetworkPolicy, err error)
NetworkPolicyExpansion
}
// networkPolicies implements NetworkPolicyInterface
type networkPolicies struct {
client *ExtensionsClient
ns string
}
// newNetworkPolicies returns a NetworkPolicies
func newNetworkPolicies(c *ExtensionsClient, namespace string) *networkPolicies {
return &networkPolicies{
client: c,
ns: namespace,
}
}
// Create takes the representation of a networkPolicy and creates it. Returns the server's representation of the networkPolicy, and an error, if there is any.
func (c *networkPolicies) Create(networkPolicy *extensions.NetworkPolicy) (result *extensions.NetworkPolicy, err error) {
result = &extensions.NetworkPolicy{}
err = c.client.Post().
Namespace(c.ns).
Resource("networkpolicies").
Body(networkPolicy).
Do().
Into(result)
return
}
// Update takes the representation of a networkPolicy and updates it. Returns the server's representation of the networkPolicy, and an error, if there is any.
func (c *networkPolicies) Update(networkPolicy *extensions.NetworkPolicy) (result *extensions.NetworkPolicy, err error) {
result = &extensions.NetworkPolicy{}
err = c.client.Put().
Namespace(c.ns).
Resource("networkpolicies").
Name(networkPolicy.Name).
Body(networkPolicy).
Do().
Into(result)
return
}
// Delete takes name of the networkPolicy and deletes it. Returns an error if one occurs.
func (c *networkPolicies) Delete(name string, options *api.DeleteOptions) error {
return c.client.Delete().
Namespace(c.ns).
Resource("networkpolicies").
Name(name).
Body(options).
Do().
Error()
}
// DeleteCollection deletes a collection of objects.
func (c *networkPolicies) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error {
return c.client.Delete().
Namespace(c.ns).
Resource("networkpolicies").
VersionedParams(&listOptions, api.ParameterCodec).
Body(options).
Do().
Error()
}
// Get takes name of the networkPolicy, and returns the corresponding networkPolicy object, and an error if there is any.
func (c *networkPolicies) Get(name string) (result *extensions.NetworkPolicy, err error) {
result = &extensions.NetworkPolicy{}
err = c.client.Get().
Namespace(c.ns).
Resource("networkpolicies").
Name(name).
Do().
Into(result)
return
}
// List takes label and field selectors, and returns the list of NetworkPolicies that match those selectors.
func (c *networkPolicies) List(opts api.ListOptions) (result *extensions.NetworkPolicyList, err error) {
result = &extensions.NetworkPolicyList{}
err = c.client.Get().
Namespace(c.ns).
Resource("networkpolicies").
VersionedParams(&opts, api.ParameterCodec).
Do().
Into(result)
return
}
// Watch returns a watch.Interface that watches the requested networkPolicies.
func (c *networkPolicies) Watch(opts api.ListOptions) (watch.Interface, error) {
return c.client.Get().
Prefix("watch").
Namespace(c.ns).
Resource("networkpolicies").
VersionedParams(&opts, api.ParameterCodec).
Watch()
}
// Patch applies the patch and returns the patched networkPolicy.
func (c *networkPolicies) Patch(name string, pt api.PatchType, data []byte, subresources ...string) (result *extensions.NetworkPolicy, err error) {
result = &extensions.NetworkPolicy{}
err = c.client.Patch(pt).
Namespace(c.ns).
Resource("networkpolicies").
SubResource(subresources...).
Name(name).
Body(data).
Do().
Into(result)
return
}

View File

@@ -25,20 +25,24 @@ import (
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
appsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/unversioned"
batchclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
) )
// ControllerHasDesiredReplicas returns a condition that will be true if and only if // ControllerHasDesiredReplicas returns a condition that will be true if and only if
// the desired replica count for a controller's ReplicaSelector equals the Replicas count. // the desired replica count for a controller's ReplicaSelector equals the Replicas count.
func ControllerHasDesiredReplicas(c Interface, controller *api.ReplicationController) wait.ConditionFunc { func ControllerHasDesiredReplicas(rcClient coreclient.ReplicationControllersGetter, controller *api.ReplicationController) wait.ConditionFunc {
// If we're given a controller where the status lags the spec, it either means that the controller is stale, // If we're given a controller where the status lags the spec, it either means that the controller is stale,
// or that the rc manager hasn't noticed the update yet. Polling status.Replicas is not safe in the latter case. // or that the rc manager hasn't noticed the update yet. Polling status.Replicas is not safe in the latter case.
desiredGeneration := controller.Generation desiredGeneration := controller.Generation
return func() (bool, error) { return func() (bool, error) {
ctrl, err := c.ReplicationControllers(controller.Namespace).Get(controller.Name) ctrl, err := rcClient.ReplicationControllers(controller.Namespace).Get(controller.Name)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -52,7 +56,7 @@ func ControllerHasDesiredReplicas(c Interface, controller *api.ReplicationContro
// ReplicaSetHasDesiredReplicas returns a condition that will be true if and only if // ReplicaSetHasDesiredReplicas returns a condition that will be true if and only if
// the desired replica count for a ReplicaSet's ReplicaSelector equals the Replicas count. // the desired replica count for a ReplicaSet's ReplicaSelector equals the Replicas count.
func ReplicaSetHasDesiredReplicas(c ExtensionsInterface, replicaSet *extensions.ReplicaSet) wait.ConditionFunc { func ReplicaSetHasDesiredReplicas(rsClient extensionsclient.ReplicaSetsGetter, replicaSet *extensions.ReplicaSet) wait.ConditionFunc {
// If we're given a ReplicaSet where the status lags the spec, it either means that the // If we're given a ReplicaSet where the status lags the spec, it either means that the
// ReplicaSet is stale, or that the ReplicaSet manager hasn't noticed the update yet. // ReplicaSet is stale, or that the ReplicaSet manager hasn't noticed the update yet.
@@ -60,7 +64,7 @@ func ReplicaSetHasDesiredReplicas(c ExtensionsInterface, replicaSet *extensions.
desiredGeneration := replicaSet.Generation desiredGeneration := replicaSet.Generation
return func() (bool, error) { return func() (bool, error) {
rs, err := c.ReplicaSets(replicaSet.Namespace).Get(replicaSet.Name) rs, err := rsClient.ReplicaSets(replicaSet.Namespace).Get(replicaSet.Name)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -73,10 +77,10 @@ func ReplicaSetHasDesiredReplicas(c ExtensionsInterface, replicaSet *extensions.
} }
} }
func PetSetHasDesiredPets(c AppsInterface, petset *apps.PetSet) wait.ConditionFunc { func PetSetHasDesiredPets(psClient appsclient.PetSetsGetter, petset *apps.PetSet) wait.ConditionFunc {
// TODO: Differentiate between 0 pets and a really quick scale down using generation. // TODO: Differentiate between 0 pets and a really quick scale down using generation.
return func() (bool, error) { return func() (bool, error) {
ps, err := c.PetSets(petset.Namespace).Get(petset.Name) ps, err := psClient.PetSets(petset.Namespace).Get(petset.Name)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -86,10 +90,9 @@ func PetSetHasDesiredPets(c AppsInterface, petset *apps.PetSet) wait.ConditionFu
// JobHasDesiredParallelism returns a condition that will be true if the desired parallelism count // JobHasDesiredParallelism returns a condition that will be true if the desired parallelism count
// for a job equals the current active counts or is less by an appropriate successful/unsuccessful count. // for a job equals the current active counts or is less by an appropriate successful/unsuccessful count.
func JobHasDesiredParallelism(c BatchInterface, job *batch.Job) wait.ConditionFunc { func JobHasDesiredParallelism(jobClient batchclient.JobsGetter, job *batch.Job) wait.ConditionFunc {
return func() (bool, error) { return func() (bool, error) {
job, err := c.Jobs(job.Namespace).Get(job.Name) job, err := jobClient.Jobs(job.Namespace).Get(job.Name)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -112,7 +115,7 @@ func JobHasDesiredParallelism(c BatchInterface, job *batch.Job) wait.ConditionFu
// DeploymentHasDesiredReplicas returns a condition that will be true if and only if // DeploymentHasDesiredReplicas returns a condition that will be true if and only if
// the desired replica count for a deployment equals its updated replicas count. // the desired replica count for a deployment equals its updated replicas count.
// (non-terminated pods that have the desired template spec). // (non-terminated pods that have the desired template spec).
func DeploymentHasDesiredReplicas(c ExtensionsInterface, deployment *extensions.Deployment) wait.ConditionFunc { func DeploymentHasDesiredReplicas(dClient extensionsclient.DeploymentsGetter, deployment *extensions.Deployment) wait.ConditionFunc {
// If we're given a deployment where the status lags the spec, it either // If we're given a deployment where the status lags the spec, it either
// means that the deployment is stale, or that the deployment manager hasn't // means that the deployment is stale, or that the deployment manager hasn't
// noticed the update yet. Polling status.Replicas is not safe in the latter // noticed the update yet. Polling status.Replicas is not safe in the latter
@@ -120,7 +123,7 @@ func DeploymentHasDesiredReplicas(c ExtensionsInterface, deployment *extensions.
desiredGeneration := deployment.Generation desiredGeneration := deployment.Generation
return func() (bool, error) { return func() (bool, error) {
deployment, err := c.Deployments(deployment.Namespace).Get(deployment.Name) deployment, err := dClient.Deployments(deployment.Namespace).Get(deployment.Name)
if err != nil { if err != nil {
return false, err return false, err
} }

View File

@@ -47,12 +47,12 @@ func RunApiVersions(f *cmdutil.Factory, w io.Writer) error {
printDeprecationWarning("api-versions", "apiversions") printDeprecationWarning("api-versions", "apiversions")
} }
client, err := f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
groupList, err := client.Discovery().ServerGroups() groupList, err := clientset.Discovery().ServerGroups()
if err != nil { if err != nil {
return fmt.Errorf("Couldn't get available api versions from server: %v\n", err) return fmt.Errorf("Couldn't get available api versions from server: %v\n", err)
} }

View File

@@ -102,7 +102,7 @@ func TestPodAndContainerAttach(t *testing.T) {
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }), Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{} tf.ClientConfig = defaultClientConfig()
cmd := &cobra.Command{} cmd := &cobra.Command{}
options := test.p options := test.p

View File

@@ -25,7 +25,6 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
) )
@@ -86,17 +85,17 @@ func setupOutputWriter(cmd *cobra.Command, defaultWriter io.Writer, filename str
} }
func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer) error { func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer) error {
var c *unversioned.Client clientset, err := f.ClientSet()
var err error if err != nil {
if c, err = f.Client(); err != nil {
return err return err
} }
printer, _, err := kubectl.GetPrinter("json", "", false) printer, _, err := kubectl.GetPrinter("json", "", false)
if err != nil { if err != nil {
return err return err
} }
nodes, err := c.Nodes().List(api.ListOptions{}) nodes, err := clientset.Core().Nodes().List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -107,7 +106,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
var namespaces []string var namespaces []string
if cmdutil.GetFlagBool(cmd, "all-namespaces") { if cmdutil.GetFlagBool(cmd, "all-namespaces") {
namespaceList, err := c.Namespaces().List(api.ListOptions{}) namespaceList, err := clientset.Core().Namespaces().List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -130,7 +129,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
for _, namespace := range namespaces { for _, namespace := range namespaces {
// TODO: this is repetitive in the extreme. Use reflection or // TODO: this is repetitive in the extreme. Use reflection or
// something to make this a for loop. // something to make this a for loop.
events, err := c.Events(namespace).List(api.ListOptions{}) events, err := clientset.Core().Events(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -138,7 +137,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
return err return err
} }
rcs, err := c.ReplicationControllers(namespace).List(api.ListOptions{}) rcs, err := clientset.Core().ReplicationControllers(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -146,7 +145,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
return err return err
} }
svcs, err := c.Services(namespace).List(api.ListOptions{}) svcs, err := clientset.Core().Services(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -154,7 +153,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
return err return err
} }
sets, err := c.DaemonSets(namespace).List(api.ListOptions{}) sets, err := clientset.Extensions().DaemonSets(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -162,7 +161,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
return err return err
} }
deps, err := c.Deployments(namespace).List(api.ListOptions{}) deps, err := clientset.Extensions().Deployments(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -170,7 +169,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
return err return err
} }
rps, err := c.ReplicaSets(namespace).List(api.ListOptions{}) rps, err := clientset.Extensions().ReplicaSets(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -178,7 +177,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
return err return err
} }
pods, err := c.Pods(namespace).List(api.ListOptions{}) pods, err := clientset.Core().Pods(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return err return err
} }

View File

@@ -37,7 +37,6 @@ import (
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/typed/discovery"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientset "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/client/unversioned/fake"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@@ -61,9 +60,22 @@ func defaultHeader() http.Header {
func defaultClientConfig() *restclient.Config { func defaultClientConfig() *restclient.Config {
return &restclient.Config{ return &restclient.Config{
APIPath: "/api",
ContentConfig: restclient.ContentConfig{ ContentConfig: restclient.ContentConfig{
ContentType: runtime.ContentTypeJSON, NegotiatedSerializer: api.Codecs,
GroupVersion: testapi.Default.GroupVersion(), ContentType: runtime.ContentTypeJSON,
GroupVersion: testapi.Default.GroupVersion(),
},
}
}
func defaultClientConfigForVersion(version *unversioned.GroupVersion) *restclient.Config {
return &restclient.Config{
APIPath: "/api",
ContentConfig: restclient.ContentConfig{
NegotiatedSerializer: api.Codecs,
ContentType: runtime.ContentTypeJSON,
GroupVersion: version,
}, },
} }
} }
@@ -289,20 +301,25 @@ func NewAPIFactory() (*cmdutil.Factory, *testFactory, runtime.Codec, runtime.Neg
return kubectl.ShortcutExpander{RESTMapper: mapper}, typer, nil return kubectl.ShortcutExpander{RESTMapper: mapper}, typer, nil
}, },
Client: func() (*client.Client, error) { ClientSet: func() (*internalclientset.Clientset, error) {
// Swap out the HTTP client out of the client with the fake's version. // Swap out the HTTP client out of the client with the fake's version.
fakeClient := t.Client.(*fake.RESTClient) fakeClient := t.Client.(*fake.RESTClient)
c := client.NewOrDie(t.ClientConfig) restClient, err := restclient.RESTClientFor(t.ClientConfig)
c.Client = fakeClient.Client if err != nil {
c.ExtensionsClient.Client = fakeClient.Client panic(err)
return c, t.Err }
restClient.Client = fakeClient.Client
return internalclientset.New(restClient), t.Err
}, },
ClientSet: func() (*internalclientset.Clientset, error) { RESTClient: func() (*restclient.RESTClient, error) {
// Swap out the HTTP client out of the client with the fake's version.
fakeClient := t.Client.(*fake.RESTClient) fakeClient := t.Client.(*fake.RESTClient)
c := client.NewOrDie(t.ClientConfig) restClient, err := restclient.RESTClientFor(t.ClientConfig)
c.Client = fakeClient.Client if err != nil {
c.ExtensionsClient.Client = fakeClient.Client panic(err)
return clientset.FromUnversionedClient(c), nil }
restClient.Client = fakeClient.Client
return restClient, t.Err
}, },
ClientForMapping: func(*meta.RESTMapping) (resource.RESTClient, error) { ClientForMapping: func(*meta.RESTMapping) (resource.RESTClient, error) {
return t.Client, t.Err return t.Client, t.Err

View File

@@ -28,7 +28,8 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/resource"
@@ -37,7 +38,8 @@ import (
) )
type DrainOptions struct { type DrainOptions struct {
client *client.Client client *internalclientset.Clientset
restClient *restclient.RESTClient
factory *cmdutil.Factory factory *cmdutil.Factory
Force bool Force bool
GracePeriodSeconds int GracePeriodSeconds int
@@ -177,7 +179,12 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error {
return cmdutil.UsageError(cmd, fmt.Sprintf("USAGE: %s [flags]", cmd.Use)) return cmdutil.UsageError(cmd, fmt.Sprintf("USAGE: %s [flags]", cmd.Use))
} }
if o.client, err = o.factory.Client(); err != nil { if o.client, err = o.factory.ClientSet(); err != nil {
return err
}
o.restClient, err = o.factory.RESTClient()
if err != nil {
return err return err
} }
@@ -227,13 +234,13 @@ func (o *DrainOptions) RunDrain() error {
func (o *DrainOptions) getController(sr *api.SerializedReference) (interface{}, error) { func (o *DrainOptions) getController(sr *api.SerializedReference) (interface{}, error) {
switch sr.Reference.Kind { switch sr.Reference.Kind {
case "ReplicationController": case "ReplicationController":
return o.client.ReplicationControllers(sr.Reference.Namespace).Get(sr.Reference.Name) return o.client.Core().ReplicationControllers(sr.Reference.Namespace).Get(sr.Reference.Name)
case "DaemonSet": case "DaemonSet":
return o.client.DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name) return o.client.Extensions().DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name)
case "Job": case "Job":
return o.client.ExtensionsClient.Jobs(sr.Reference.Namespace).Get(sr.Reference.Name) return o.client.Batch().Jobs(sr.Reference.Namespace).Get(sr.Reference.Name)
case "ReplicaSet": case "ReplicaSet":
return o.client.ExtensionsClient.ReplicaSets(sr.Reference.Namespace).Get(sr.Reference.Name) return o.client.Extensions().ReplicaSets(sr.Reference.Namespace).Get(sr.Reference.Name)
} }
return nil, fmt.Errorf("Unknown controller kind %q", sr.Reference.Kind) return nil, fmt.Errorf("Unknown controller kind %q", sr.Reference.Kind)
} }
@@ -284,7 +291,7 @@ func (o *DrainOptions) daemonsetFilter(pod api.Pod) (bool, *warning, *fatal) {
if sr == nil || sr.Reference.Kind != "DaemonSet" { if sr == nil || sr.Reference.Kind != "DaemonSet" {
return true, nil, nil return true, nil, nil
} }
if _, err := o.client.DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name); err != nil { if _, err := o.client.Extensions().DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name); err != nil {
return false, nil, &fatal{err.Error()} return false, nil, &fatal{err.Error()}
} }
if !o.IgnoreDaemonsets { if !o.IgnoreDaemonsets {
@@ -335,7 +342,7 @@ func (ps podStatuses) Message() string {
// getPodsForDeletion returns all the pods we're going to delete. If there are // getPodsForDeletion returns all the pods we're going to delete. If there are
// any pods preventing us from deleting, we return that list in an error. // any pods preventing us from deleting, we return that list in an error.
func (o *DrainOptions) getPodsForDeletion() (pods []api.Pod, err error) { func (o *DrainOptions) getPodsForDeletion() (pods []api.Pod, err error) {
podList, err := o.client.Pods(api.NamespaceAll).List(api.ListOptions{ podList, err := o.client.Core().Pods(api.NamespaceAll).List(api.ListOptions{
FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": o.nodeInfo.Name})}) FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": o.nodeInfo.Name})})
if err != nil { if err != nil {
return pods, err return pods, err
@@ -380,7 +387,7 @@ func (o *DrainOptions) deletePods(pods []api.Pod) error {
} }
for _, pod := range pods { for _, pod := range pods {
err := o.client.Pods(pod.Namespace).Delete(pod.Name, &deleteOptions) err := o.client.Core().Pods(pod.Namespace).Delete(pod.Name, &deleteOptions)
if err != nil { if err != nil {
return err return err
} }
@@ -403,7 +410,7 @@ func (o *DrainOptions) RunCordonOrUncordon(desired bool) error {
if unsched.Bool() == desired { if unsched.Bool() == desired {
cmdutil.PrintSuccess(o.mapper, false, o.out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, already(desired)) cmdutil.PrintSuccess(o.mapper, false, o.out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, already(desired))
} else { } else {
helper := resource.NewHelper(o.client, o.nodeInfo.Mapping) helper := resource.NewHelper(o.restClient, o.nodeInfo.Mapping)
unsched.SetBool(desired) unsched.SetBool(desired)
_, err := helper.Replace(cmdNamespace, o.nodeInfo.Name, true, o.nodeInfo.Object) _, err := helper.Replace(cmdNamespace, o.nodeInfo.Name, true, o.nodeInfo.Object)
if err != nil { if err != nil {

View File

@@ -552,7 +552,10 @@ type MyReq struct {
func (m *MyReq) isFor(method string, path string) bool { func (m *MyReq) isFor(method string, path string) bool {
req := m.Request req := m.Request
return method == req.Method && (req.URL.Path == path || req.URL.Path == strings.Join([]string{"/api/v1", path}, "") || req.URL.Path == strings.Join([]string{"/apis/extensions/v1beta1", path}, "")) return method == req.Method && (req.URL.Path == path ||
req.URL.Path == strings.Join([]string{"/api/v1", path}, "") ||
req.URL.Path == strings.Join([]string{"/apis/extensions/v1beta1", path}, "") ||
req.URL.Path == strings.Join([]string{"/apis/batch/v1", path}, ""))
} }
func refJson(t *testing.T, o runtime.Object) string { func refJson(t *testing.T, o runtime.Object) string {

View File

@@ -24,9 +24,10 @@ import (
dockerterm "github.com/docker/docker/pkg/term" dockerterm "github.com/docker/docker/pkg/term"
"github.com/renstrom/dedent" "github.com/renstrom/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/remotecommand" "k8s.io/kubernetes/pkg/client/unversioned/remotecommand"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand"
@@ -132,7 +133,7 @@ type ExecOptions struct {
FullCmdName string FullCmdName string
Executor RemoteExecutor Executor RemoteExecutor
Client *client.Client PodClient coreclient.PodsGetter
Config *restclient.Config Config *restclient.Config
} }
@@ -172,11 +173,11 @@ func (p *ExecOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, argsIn []
} }
p.Config = config p.Config = config
client, err := f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
p.Client = client p.PodClient = clientset.Core()
return nil return nil
} }
@@ -192,7 +193,7 @@ func (p *ExecOptions) Validate() error {
if p.Out == nil || p.Err == nil { if p.Out == nil || p.Err == nil {
return fmt.Errorf("both output and error output must be provided") return fmt.Errorf("both output and error output must be provided")
} }
if p.Executor == nil || p.Client == nil || p.Config == nil { if p.Executor == nil || p.PodClient == nil || p.Config == nil {
return fmt.Errorf("client, client config, and executor must be provided") return fmt.Errorf("client, client config, and executor must be provided")
} }
return nil return nil
@@ -252,7 +253,7 @@ func (o *StreamOptions) setupTTY() term.TTY {
// Run executes a validated remote execution against a pod. // Run executes a validated remote execution against a pod.
func (p *ExecOptions) Run() error { func (p *ExecOptions) Run() error {
pod, err := p.Client.Pods(p.Namespace).Get(p.PodName) pod, err := p.PodClient.Pods(p.Namespace).Get(p.PodName)
if err != nil { if err != nil {
return err return err
} }
@@ -283,8 +284,13 @@ func (p *ExecOptions) Run() error {
} }
fn := func() error { fn := func() error {
restClient, err := restclient.RESTClientFor(p.Config)
if err != nil {
return err
}
// TODO: consider abstracting into a client invocation or client helper // TODO: consider abstracting into a client invocation or client helper
req := p.Client.RESTClient.Post(). req := restClient.Post().
Resource("pods"). Resource("pods").
Name(pod.Name). Name(pod.Name).
Namespace(pod.Namespace). Namespace(pod.Namespace).

View File

@@ -31,7 +31,6 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/client/unversioned/fake"
"k8s.io/kubernetes/pkg/util/term" "k8s.io/kubernetes/pkg/util/term"
@@ -133,7 +132,7 @@ func TestPodAndContainer(t *testing.T) {
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }), Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{} tf.ClientConfig = defaultClientConfig()
cmd := &cobra.Command{} cmd := &cobra.Command{}
options := test.p options := test.p
@@ -162,20 +161,18 @@ func TestPodAndContainer(t *testing.T) {
func TestExec(t *testing.T) { func TestExec(t *testing.T) {
version := testapi.Default.GroupVersion().Version version := testapi.Default.GroupVersion().Version
tests := []struct { tests := []struct {
name, version, podPath, execPath, container string name, podPath, execPath, container string
pod *api.Pod pod *api.Pod
execErr bool execErr bool
}{ }{
{ {
name: "pod exec", name: "pod exec",
version: version,
podPath: "/api/" + version + "/namespaces/test/pods/foo", podPath: "/api/" + version + "/namespaces/test/pods/foo",
execPath: "/api/" + version + "/namespaces/test/pods/foo/exec", execPath: "/api/" + version + "/namespaces/test/pods/foo/exec",
pod: execPod(), pod: execPod(),
}, },
{ {
name: "pod exec error", name: "pod exec error",
version: version,
podPath: "/api/" + version + "/namespaces/test/pods/foo", podPath: "/api/" + version + "/namespaces/test/pods/foo",
execPath: "/api/" + version + "/namespaces/test/pods/foo/exec", execPath: "/api/" + version + "/namespaces/test/pods/foo/exec",
pod: execPod(), pod: execPod(),
@@ -199,7 +196,7 @@ func TestExec(t *testing.T) {
}), }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} tf.ClientConfig = defaultClientConfig()
bufOut := bytes.NewBuffer([]byte{}) bufOut := bytes.NewBuffer([]byte{})
bufErr := bytes.NewBuffer([]byte{}) bufErr := bytes.NewBuffer([]byte{})
bufIn := bytes.NewBuffer([]byte{}) bufIn := bytes.NewBuffer([]byte{})

View File

@@ -22,6 +22,7 @@ import (
"github.com/renstrom/dedent" "github.com/renstrom/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@@ -126,12 +127,12 @@ func NewCmdGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer) *cobra.Comma
// TODO: convert all direct flag accessors to a struct and pass that instead of cmd // TODO: convert all direct flag accessors to a struct and pass that instead of cmd
func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Command, args []string, options *GetOptions) error { func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Command, args []string, options *GetOptions) error {
if len(options.Raw) > 0 { if len(options.Raw) > 0 {
client, err := f.Client() restClient, err := f.RESTClient()
if err != nil { if err != nil {
return err return err
} }
stream, err := client.RESTClient.Get().RequestURI(options.Raw).Stream() stream, err := restClient.Get().RequestURI(options.Raw).Stream()
if err != nil { if err != nil {
return err return err
} }

View File

@@ -25,9 +25,10 @@ import (
"github.com/renstrom/dedent" "github.com/renstrom/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/portforward" "k8s.io/kubernetes/pkg/client/unversioned/portforward"
"k8s.io/kubernetes/pkg/client/unversioned/remotecommand" "k8s.io/kubernetes/pkg/client/unversioned/remotecommand"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@@ -37,8 +38,9 @@ import (
type PortForwardOptions struct { type PortForwardOptions struct {
Namespace string Namespace string
PodName string PodName string
RESTClient *restclient.RESTClient
Config *restclient.Config Config *restclient.Config
Client *client.Client PodClient coreclient.PodsGetter
Ports []string Ports []string
PortForwarder portForwarder PortForwarder portForwarder
StopChannel chan struct{} StopChannel chan struct{}
@@ -130,15 +132,20 @@ func (o *PortForwardOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, ar
return err return err
} }
o.Client, err = f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
o.PodClient = clientset.Core()
o.Config, err = f.ClientConfig() o.Config, err = f.ClientConfig()
if err != nil { if err != nil {
return err return err
} }
o.RESTClient, err = f.RESTClient()
if err != nil {
return err
}
o.StopChannel = make(chan struct{}, 1) o.StopChannel = make(chan struct{}, 1)
o.ReadyChannel = make(chan struct{}) o.ReadyChannel = make(chan struct{})
@@ -155,15 +162,15 @@ func (o PortForwardOptions) Validate() error {
return fmt.Errorf("at least 1 PORT is required for port-forward") return fmt.Errorf("at least 1 PORT is required for port-forward")
} }
if o.PortForwarder == nil || o.Client == nil || o.Config == nil { if o.PortForwarder == nil || o.PodClient == nil || o.RESTClient == nil || o.Config == nil {
return fmt.Errorf("client, client config, and portforwarder must be provided") return fmt.Errorf("client, client config, restClient, and portforwarder must be provided")
} }
return nil return nil
} }
// RunPortForward implements all the necessary functionality for port-forward cmd. // RunPortForward implements all the necessary functionality for port-forward cmd.
func (o PortForwardOptions) RunPortForward() error { func (o PortForwardOptions) RunPortForward() error {
pod, err := o.Client.Pods(o.Namespace).Get(o.PodName) pod, err := o.PodClient.Pods(o.Namespace).Get(o.PodName)
if err != nil { if err != nil {
return err return err
} }
@@ -183,7 +190,7 @@ func (o PortForwardOptions) RunPortForward() error {
} }
}() }()
req := o.Client.RESTClient.Post(). req := o.RESTClient.Post().
Resource("pods"). Resource("pods").
Namespace(o.Namespace). Namespace(o.Namespace).
Name(pod.Name). Name(pod.Name).

View File

@@ -27,8 +27,6 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/client/unversioned/fake"
) )
@@ -48,20 +46,19 @@ func TestPortForward(t *testing.T) {
version := testapi.Default.GroupVersion().Version version := testapi.Default.GroupVersion().Version
tests := []struct { tests := []struct {
name, version, podPath, pfPath, container string name string
pod *api.Pod podPath, pfPath, container string
pfErr bool pod *api.Pod
pfErr bool
}{ }{
{ {
name: "pod portforward", name: "pod portforward",
version: version,
podPath: "/api/" + version + "/namespaces/test/pods/foo", podPath: "/api/" + version + "/namespaces/test/pods/foo",
pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward",
pod: execPod(), pod: execPod(),
}, },
{ {
name: "pod portforward error", name: "pod portforward error",
version: version,
podPath: "/api/" + version + "/namespaces/test/pods/foo", podPath: "/api/" + version + "/namespaces/test/pods/foo",
pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward",
pod: execPod(), pod: execPod(),
@@ -86,7 +83,7 @@ func TestPortForward(t *testing.T) {
}), }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} tf.ClientConfig = defaultClientConfig()
ff := &fakePortForwarder{} ff := &fakePortForwarder{}
if test.pfErr { if test.pfErr {
ff.pfErr = fmt.Errorf("pf error") ff.pfErr = fmt.Errorf("pf error")
@@ -130,20 +127,18 @@ func TestPortForwardWithPFlag(t *testing.T) {
version := testapi.Default.GroupVersion().Version version := testapi.Default.GroupVersion().Version
tests := []struct { tests := []struct {
name, version, podPath, pfPath, container string name, podPath, pfPath, container string
pod *api.Pod pod *api.Pod
pfErr bool pfErr bool
}{ }{
{ {
name: "pod portforward", name: "pod portforward",
version: version,
podPath: "/api/" + version + "/namespaces/test/pods/foo", podPath: "/api/" + version + "/namespaces/test/pods/foo",
pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward",
pod: execPod(), pod: execPod(),
}, },
{ {
name: "pod portforward error", name: "pod portforward error",
version: version,
podPath: "/api/" + version + "/namespaces/test/pods/foo", podPath: "/api/" + version + "/namespaces/test/pods/foo",
pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward",
pod: execPod(), pod: execPod(),
@@ -168,7 +163,7 @@ func TestPortForwardWithPFlag(t *testing.T) {
}), }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} tf.ClientConfig = defaultClientConfig()
ff := &fakePortForwarder{} ff := &fakePortForwarder{}
if test.pfErr { if test.pfErr {
ff.pfErr = fmt.Errorf("pf error") ff.pfErr = fmt.Errorf("pf error")

View File

@@ -27,6 +27,7 @@ import (
"github.com/renstrom/dedent" "github.com/renstrom/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
@@ -177,24 +178,25 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
return err return err
} }
client, err := f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
coreClient := clientset.Core()
var newRc *api.ReplicationController var newRc *api.ReplicationController
// fetch rc // fetch rc
oldRc, err := client.ReplicationControllers(cmdNamespace).Get(oldName) oldRc, err := coreClient.ReplicationControllers(cmdNamespace).Get(oldName)
if err != nil { if err != nil {
if !errors.IsNotFound(err) || len(image) == 0 || len(args) > 1 { if !errors.IsNotFound(err) || len(image) == 0 || len(args) > 1 {
return err return err
} }
// We're in the middle of a rename, look for an RC with a source annotation of oldName // We're in the middle of a rename, look for an RC with a source annotation of oldName
newRc, err := kubectl.FindSourceController(client, cmdNamespace, oldName) newRc, err := kubectl.FindSourceController(coreClient, cmdNamespace, oldName)
if err != nil { if err != nil {
return err return err
} }
return kubectl.Rename(client, newRc, oldName) return kubectl.Rename(coreClient, newRc, oldName)
} }
var keepOldName bool var keepOldName bool
@@ -248,10 +250,10 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
// than the old rc. This selector is the hash of the rc, with a suffix to provide uniqueness for // than the old rc. This selector is the hash of the rc, with a suffix to provide uniqueness for
// same-image updates. // same-image updates.
if len(image) != 0 { if len(image) != 0 {
codec := api.Codecs.LegacyCodec(client.APIVersion()) codec := api.Codecs.LegacyCodec(clientset.CoreClient.APIVersion())
keepOldName = len(args) == 1 keepOldName = len(args) == 1
newName := findNewName(args, oldRc) newName := findNewName(args, oldRc)
if newRc, err = kubectl.LoadExistingNextReplicationController(client, cmdNamespace, newName); err != nil { if newRc, err = kubectl.LoadExistingNextReplicationController(coreClient, cmdNamespace, newName); err != nil {
return err return err
} }
if newRc != nil { if newRc != nil {
@@ -274,7 +276,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
} }
config.PullPolicy = api.PullPolicy(pullPolicy) config.PullPolicy = api.PullPolicy(pullPolicy)
} }
newRc, err = kubectl.CreateNewControllerFromCurrentController(client, codec, config) newRc, err = kubectl.CreateNewControllerFromCurrentController(coreClient, codec, config)
if err != nil { if err != nil {
return err return err
} }
@@ -287,7 +289,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
} }
// If new image is same as old, the hash may not be distinct, so add a suffix. // If new image is same as old, the hash may not be distinct, so add a suffix.
oldHash += "-orig" oldHash += "-orig"
oldRc, err = kubectl.UpdateExistingReplicationController(client, oldRc, cmdNamespace, newRc.Name, deploymentKey, oldHash, out) oldRc, err = kubectl.UpdateExistingReplicationController(coreClient, coreClient, oldRc, cmdNamespace, newRc.Name, deploymentKey, oldHash, out)
if err != nil { if err != nil {
return err return err
} }
@@ -296,7 +298,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
if rollback { if rollback {
keepOldName = len(args) == 1 keepOldName = len(args) == 1
newName := findNewName(args, oldRc) newName := findNewName(args, oldRc)
if newRc, err = kubectl.LoadExistingNextReplicationController(client, cmdNamespace, newName); err != nil { if newRc, err = kubectl.LoadExistingNextReplicationController(coreClient, cmdNamespace, newName); err != nil {
return err return err
} }
@@ -310,7 +312,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
filename, oldName) filename, oldName)
} }
updater := kubectl.NewRollingUpdater(newRc.Namespace, client) updater := kubectl.NewRollingUpdater(newRc.Namespace, coreClient, coreClient)
// To successfully pull off a rolling update the new and old rc have to differ // To successfully pull off a rolling update the new and old rc have to differ
// by at least one selector. Every new pod should have the selector and every // by at least one selector. Every new pod should have the selector and every
@@ -367,7 +369,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
if err != nil { if err != nil {
return err return err
} }
client.ReplicationControllers(config.NewRc.Namespace).Update(config.NewRc) coreClient.ReplicationControllers(config.NewRc.Namespace).Update(config.NewRc)
} }
err = updater.Update(config) err = updater.Update(config)
if err != nil { if err != nil {
@@ -380,7 +382,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
} else { } else {
message = fmt.Sprintf("rolling updated to %q", newRc.Name) message = fmt.Sprintf("rolling updated to %q", newRc.Name)
} }
newRc, err = client.ReplicationControllers(cmdNamespace).Get(newRc.Name) newRc, err = coreClient.ReplicationControllers(cmdNamespace).Get(newRc.Name)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -32,7 +32,7 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1" batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1"
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
client "k8s.io/kubernetes/pkg/client/unversioned" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/resource"
@@ -179,11 +179,11 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob
generatorName = "scheduledjob/v2alpha1" generatorName = "scheduledjob/v2alpha1"
} }
if len(generatorName) == 0 { if len(generatorName) == 0 {
client, err := f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
resourcesList, err := client.Discovery().ServerResources() resourcesList, err := clientset.Discovery().ServerResources()
// ServerResources ignores errors for old servers do not expose discovery // ServerResources ignores errors for old servers do not expose discovery
if err != nil { if err != nil {
return fmt.Errorf("failed to discover supported resources: %v", err) return fmt.Errorf("failed to discover supported resources: %v", err)
@@ -270,11 +270,6 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob
} }
opts.Config = config opts.Config = config
client, err := f.Client()
if err != nil {
return err
}
clientset, err := f.ClientSet() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
@@ -285,7 +280,7 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob
if err != nil { if err != nil {
return err return err
} }
err = handleAttachPod(f, client, attachablePod.Namespace, attachablePod.Name, opts, quiet) err = handleAttachPod(f, clientset.Core(), attachablePod.Namespace, attachablePod.Name, opts, quiet)
if err != nil { if err != nil {
return err return err
} }
@@ -294,7 +289,7 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob
leaveStdinOpen := cmdutil.GetFlagBool(cmd, "leave-stdin-open") leaveStdinOpen := cmdutil.GetFlagBool(cmd, "leave-stdin-open")
waitForExitCode := !leaveStdinOpen && restartPolicy == api.RestartPolicyNever waitForExitCode := !leaveStdinOpen && restartPolicy == api.RestartPolicyNever
if waitForExitCode { if waitForExitCode {
pod, err = waitForPodTerminated(client, attachablePod.Namespace, attachablePod.Name, opts.Out, quiet) pod, err = waitForPodTerminated(clientset.Core(), attachablePod.Namespace, attachablePod.Name, opts.Out, quiet)
if err != nil { if err != nil {
return err return err
} }
@@ -377,8 +372,8 @@ func contains(resourcesList map[string]*unversioned.APIResourceList, resource un
// waitForPod watches the given pod until the exitCondition is true. Each two seconds // waitForPod watches the given pod until the exitCondition is true. Each two seconds
// the tick function is called e.g. for progress output. // the tick function is called e.g. for progress output.
func waitForPod(c *client.Client, ns, name string, exitCondition func(*api.Pod) bool, tick func(*api.Pod)) (*api.Pod, error) { func waitForPod(podClient coreclient.PodsGetter, ns, name string, exitCondition func(*api.Pod) bool, tick func(*api.Pod)) (*api.Pod, error) {
pod, err := c.Pods(ns).Get(name) pod, err := podClient.Pods(ns).Get(name)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -388,7 +383,7 @@ func waitForPod(c *client.Client, ns, name string, exitCondition func(*api.Pod)
tick(pod) tick(pod)
w, err := c.Pods(ns).Watch(api.SingleObject(api.ObjectMeta{Name: pod.Name, ResourceVersion: pod.ResourceVersion})) w, err := podClient.Pods(ns).Watch(api.SingleObject(api.ObjectMeta{Name: pod.Name, ResourceVersion: pod.ResourceVersion}))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -424,7 +419,7 @@ func waitForPod(c *client.Client, ns, name string, exitCondition func(*api.Pod)
return result, err return result, err
} }
func waitForPodRunning(c *client.Client, ns, name string, out io.Writer, quiet bool) (*api.Pod, error) { func waitForPodRunning(podClient coreclient.PodsGetter, ns, name string, out io.Writer, quiet bool) (*api.Pod, error) {
exitCondition := func(pod *api.Pod) bool { exitCondition := func(pod *api.Pod) bool {
switch pod.Status.Phase { switch pod.Status.Phase {
case api.PodRunning: case api.PodRunning:
@@ -440,26 +435,26 @@ func waitForPodRunning(c *client.Client, ns, name string, out io.Writer, quiet b
return false return false
} }
} }
return waitForPod(c, ns, name, exitCondition, func(pod *api.Pod) { return waitForPod(podClient, ns, name, exitCondition, func(pod *api.Pod) {
if !quiet { if !quiet {
fmt.Fprintf(out, "Waiting for pod %s/%s to be running, status is %s, pod ready: false\n", pod.Namespace, pod.Name, pod.Status.Phase) fmt.Fprintf(out, "Waiting for pod %s/%s to be running, status is %s, pod ready: false\n", pod.Namespace, pod.Name, pod.Status.Phase)
} }
}) })
} }
func waitForPodTerminated(c *client.Client, ns, name string, out io.Writer, quiet bool) (*api.Pod, error) { func waitForPodTerminated(podClient coreclient.PodsGetter, ns, name string, out io.Writer, quiet bool) (*api.Pod, error) {
exitCondition := func(pod *api.Pod) bool { exitCondition := func(pod *api.Pod) bool {
return pod.Status.Phase == api.PodSucceeded || pod.Status.Phase == api.PodFailed return pod.Status.Phase == api.PodSucceeded || pod.Status.Phase == api.PodFailed
} }
return waitForPod(c, ns, name, exitCondition, func(pod *api.Pod) { return waitForPod(podClient, ns, name, exitCondition, func(pod *api.Pod) {
if !quiet { if !quiet {
fmt.Fprintf(out, "Waiting for pod %s/%s to terminate, status is %s\n", pod.Namespace, pod.Name, pod.Status.Phase) fmt.Fprintf(out, "Waiting for pod %s/%s to terminate, status is %s\n", pod.Namespace, pod.Name, pod.Status.Phase)
} }
}) })
} }
func handleAttachPod(f *cmdutil.Factory, c *client.Client, ns, name string, opts *AttachOptions, quiet bool) error { func handleAttachPod(f *cmdutil.Factory, podClient coreclient.PodsGetter, ns, name string, opts *AttachOptions, quiet bool) error {
pod, err := waitForPodRunning(c, ns, name, opts.Out, quiet) pod, err := waitForPodRunning(podClient, ns, name, opts.Out, quiet)
if err != nil { if err != nil {
return err return err
} }
@@ -481,11 +476,7 @@ func handleAttachPod(f *cmdutil.Factory, c *client.Client, ns, name string, opts
return err return err
} }
clientset, err := f.ClientSet() opts.PodClient = podClient
if err != nil {
return nil
}
opts.PodClient = clientset.Core()
opts.PodName = name opts.PodName = name
opts.Namespace = ns opts.Namespace = ns

View File

@@ -20,12 +20,13 @@ import (
"errors" "errors"
"io" "io"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/metricsutil"
"github.com/renstrom/dedent" "github.com/renstrom/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/metricsutil"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
) )
@@ -33,6 +34,7 @@ import (
type TopNodeOptions struct { type TopNodeOptions struct {
ResourceName string ResourceName string
Selector string Selector string
NodeClient coreclient.NodesGetter
Client *metricsutil.HeapsterMetricsClient Client *metricsutil.HeapsterMetricsClient
Printer *metricsutil.TopCmdPrinter Printer *metricsutil.TopCmdPrinter
} }
@@ -84,11 +86,12 @@ func (o *TopNodeOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, args [
return cmdutil.UsageError(cmd, cmd.Use) return cmdutil.UsageError(cmd, cmd.Use)
} }
cli, err := f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
o.Client = metricsutil.DefaultHeapsterMetricsClient(cli) o.NodeClient = clientset.Core()
o.Client = metricsutil.DefaultHeapsterMetricsClient(clientset.Core())
o.Printer = metricsutil.NewTopCmdPrinter(out) o.Printer = metricsutil.NewTopCmdPrinter(out)
return nil return nil
} }
@@ -122,13 +125,13 @@ func (o TopNodeOptions) RunTopNode() error {
var nodes []api.Node var nodes []api.Node
if len(o.ResourceName) > 0 { if len(o.ResourceName) > 0 {
node, err := o.Client.Nodes().Get(o.ResourceName) node, err := o.NodeClient.Nodes().Get(o.ResourceName)
if err != nil { if err != nil {
return err return err
} }
nodes = append(nodes, *node) nodes = append(nodes, *node)
} else { } else {
nodeList, err := o.Client.Nodes().List(api.ListOptions{ nodeList, err := o.NodeClient.Nodes().List(api.ListOptions{
LabelSelector: selector, LabelSelector: selector,
}) })
if err != nil { if err != nil {

View File

@@ -25,8 +25,6 @@ import (
"k8s.io/heapster/metrics/apis/metrics/v1alpha1" "k8s.io/heapster/metrics/apis/metrics/v1alpha1"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/client/unversioned/fake"
"net/url" "net/url"
) )
@@ -63,7 +61,7 @@ func TestTopNodeAllMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopNode(f, buf) cmd := NewCmdTopNode(f, buf)
@@ -111,7 +109,7 @@ func TestTopNodeWithNameMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopNode(f, buf) cmd := NewCmdTopNode(f, buf)
@@ -170,7 +168,7 @@ func TestTopNodeWithLabelSelectorMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = "test" tf.Namespace = "test"
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopNode(f, buf) cmd := NewCmdTopNode(f, buf)

View File

@@ -23,6 +23,7 @@ import (
"time" "time"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/metricsutil" "k8s.io/kubernetes/pkg/kubectl/metricsutil"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
@@ -38,6 +39,7 @@ type TopPodOptions struct {
Selector string Selector string
AllNamespaces bool AllNamespaces bool
PrintContainers bool PrintContainers bool
PodClient coreclient.PodsGetter
Client *metricsutil.HeapsterMetricsClient Client *metricsutil.HeapsterMetricsClient
Printer *metricsutil.TopCmdPrinter Printer *metricsutil.TopCmdPrinter
} }
@@ -103,11 +105,12 @@ func (o *TopPodOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, args []
if err != nil { if err != nil {
return err return err
} }
cli, err := f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
o.Client = metricsutil.DefaultHeapsterMetricsClient(cli) o.PodClient = clientset.Core()
o.Client = metricsutil.DefaultHeapsterMetricsClient(clientset.Core())
o.Printer = metricsutil.NewTopCmdPrinter(out) o.Printer = metricsutil.NewTopCmdPrinter(out)
return nil return nil
} }
@@ -147,7 +150,7 @@ func (o TopPodOptions) RunTopPod() error {
func verifyEmptyMetrics(o TopPodOptions, selector labels.Selector) error { func verifyEmptyMetrics(o TopPodOptions, selector labels.Selector) error {
if len(o.ResourceName) > 0 { if len(o.ResourceName) > 0 {
pod, err := o.Client.Pods(o.Namespace).Get(o.ResourceName) pod, err := o.PodClient.Pods(o.Namespace).Get(o.ResourceName)
if err != nil { if err != nil {
return err return err
} }
@@ -155,7 +158,7 @@ func verifyEmptyMetrics(o TopPodOptions, selector labels.Selector) error {
return err return err
} }
} else { } else {
pods, err := o.Client.Pods(o.Namespace).List(api.ListOptions{ pods, err := o.PodClient.Pods(o.Namespace).List(api.ListOptions{
LabelSelector: selector, LabelSelector: selector,
}) })
if err != nil { if err != nil {

View File

@@ -24,8 +24,6 @@ import (
"testing" "testing"
metrics_api "k8s.io/heapster/metrics/apis/metrics/v1alpha1" metrics_api "k8s.io/heapster/metrics/apis/metrics/v1alpha1"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/client/unversioned/fake"
"net/url" "net/url"
) )
@@ -61,7 +59,7 @@ func TestTopPodAllNamespacesMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = firstTestNamespace tf.Namespace = firstTestNamespace
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopPod(f, buf) cmd := NewCmdTopPod(f, buf)
@@ -120,7 +118,7 @@ func TestTopPodAllInNamespaceMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = testNamespace tf.Namespace = testNamespace
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopPod(f, buf) cmd := NewCmdTopPod(f, buf)
@@ -171,7 +169,7 @@ func TestTopPodWithNameMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = testNamespace tf.Namespace = testNamespace
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopPod(f, buf) cmd := NewCmdTopPod(f, buf)
@@ -224,7 +222,7 @@ func TestTopPodWithLabelSelectorMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = testNamespace tf.Namespace = testNamespace
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopPod(f, buf) cmd := NewCmdTopPod(f, buf)
@@ -276,7 +274,7 @@ func TestTopPodWithContainersMetrics(t *testing.T) {
}), }),
} }
tf.Namespace = testNamespace tf.Namespace = testNamespace
tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} tf.ClientConfig = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
cmd := NewCmdTopPod(f, buf) cmd := NewCmdTopPod(f, buf)

View File

@@ -32,8 +32,8 @@ import (
) )
const ( const (
baseHeapsterServiceAddress = "/api/v1/namespaces/kube-system/services/http:heapster:" baseHeapsterServiceAddress = "/api/v1/proxy/namespaces/kube-system/services/http:heapster:"
baseMetricsAddress = baseHeapsterServiceAddress + "/proxy/apis/metrics" baseMetricsAddress = baseHeapsterServiceAddress + "/apis/metrics"
metricsApiVersion = "v1alpha1" metricsApiVersion = "v1alpha1"
) )

View File

@@ -20,6 +20,7 @@ import (
fed_clientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset" fed_clientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
@@ -27,7 +28,7 @@ import (
func NewClientCache(loader clientcmd.ClientConfig) *ClientCache { func NewClientCache(loader clientcmd.ClientConfig) *ClientCache {
return &ClientCache{ return &ClientCache{
clients: make(map[unversioned.GroupVersion]*client.Client), clientsets: make(map[unversioned.GroupVersion]*internalclientset.Clientset),
configs: make(map[unversioned.GroupVersion]*restclient.Config), configs: make(map[unversioned.GroupVersion]*restclient.Config),
fedClientSets: make(map[unversioned.GroupVersion]fed_clientset.Interface), fedClientSets: make(map[unversioned.GroupVersion]fed_clientset.Interface),
loader: loader, loader: loader,
@@ -38,7 +39,7 @@ func NewClientCache(loader clientcmd.ClientConfig) *ClientCache {
// is invoked only once // is invoked only once
type ClientCache struct { type ClientCache struct {
loader clientcmd.ClientConfig loader clientcmd.ClientConfig
clients map[unversioned.GroupVersion]*client.Client clientsets map[unversioned.GroupVersion]*internalclientset.Clientset
fedClientSets map[unversioned.GroupVersion]fed_clientset.Interface fedClientSets map[unversioned.GroupVersion]fed_clientset.Interface
configs map[unversioned.GroupVersion]*restclient.Config configs map[unversioned.GroupVersion]*restclient.Config
defaultConfig *restclient.Config defaultConfig *restclient.Config
@@ -95,12 +96,12 @@ func (c *ClientCache) ClientConfigForVersion(version *unversioned.GroupVersion)
return &config, nil return &config, nil
} }
// ClientForVersion initializes or reuses a client for the specified version, or returns an // ClientSetForVersion initializes or reuses a clientset for the specified version, or returns an
// error if that is not possible // error if that is not possible
func (c *ClientCache) ClientForVersion(version *unversioned.GroupVersion) (*client.Client, error) { func (c *ClientCache) ClientSetForVersion(version *unversioned.GroupVersion) (*internalclientset.Clientset, error) {
if version != nil { if version != nil {
if client, ok := c.clients[*version]; ok { if clientset, ok := c.clientsets[*version]; ok {
return client, nil return clientset, nil
} }
} }
config, err := c.ClientConfigForVersion(version) config, err := c.ClientConfigForVersion(version)
@@ -108,25 +109,25 @@ func (c *ClientCache) ClientForVersion(version *unversioned.GroupVersion) (*clie
return nil, err return nil, err
} }
kubeclient, err := client.New(config) clientset, err := internalclientset.NewForConfig(config)
if err != nil { if err != nil {
return nil, err return nil, err
} }
c.clients[*config.GroupVersion] = kubeclient c.clientsets[*config.GroupVersion] = clientset
// `version` does not necessarily equal `config.Version`. However, we know that if we call this method again with // `version` does not necessarily equal `config.Version`. However, we know that if we call this method again with
// `version`, we should get a client based on the same config we just found. There's no guarantee that a client // `version`, we should get a client based on the same config we just found. There's no guarantee that a client
// is copiable, so create a new client and save it in the cache. // is copiable, so create a new client and save it in the cache.
if version != nil { if version != nil {
configCopy := *config configCopy := *config
kubeclient, err := client.New(&configCopy) clientset, err := internalclientset.NewForConfig(&configCopy)
if err != nil { if err != nil {
return nil, err return nil, err
} }
c.clients[*version] = kubeclient c.clientsets[*version] = clientset
} }
return kubeclient, nil return clientset, nil
} }
func (c *ClientCache) FederationClientSetForVersion(version *unversioned.GroupVersion) (fed_clientset.Interface, error) { func (c *ClientCache) FederationClientSetForVersion(version *unversioned.GroupVersion) (fed_clientset.Interface, error) {

View File

@@ -49,17 +49,13 @@ import (
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/autoscaling"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/certificates"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/apis/policy"
"k8s.io/kubernetes/pkg/apis/rbac"
"k8s.io/kubernetes/pkg/apis/storage"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/typed/discovery"
"k8s.io/kubernetes/pkg/client/typed/dynamic" "k8s.io/kubernetes/pkg/client/typed/dynamic"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientset "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
@@ -97,10 +93,10 @@ type Factory struct {
Decoder func(toInternal bool) runtime.Decoder Decoder func(toInternal bool) runtime.Decoder
// Returns an encoder capable of encoding a provided object into JSON in the default desired version. // Returns an encoder capable of encoding a provided object into JSON in the default desired version.
JSONEncoder func() runtime.Encoder JSONEncoder func() runtime.Encoder
// Returns a client for accessing Kubernetes resources or an error.
Client func() (*client.Client, error)
// ClientSet gives you back an internal, generated clientset // ClientSet gives you back an internal, generated clientset
ClientSet func() (*internalclientset.Clientset, error) ClientSet func() (*internalclientset.Clientset, error)
// Returns a RESTClient for accessing Kubernetes resources or an error.
RESTClient func() (*restclient.RESTClient, error)
// Returns a client.Config for accessing the Kubernetes server. // Returns a client.Config for accessing the Kubernetes server.
ClientConfig func() (*restclient.Config, error) ClientConfig func() (*restclient.Config, error)
// Returns a RESTClient for working with the specified RESTMapping or an error. This is intended // Returns a RESTClient for working with the specified RESTMapping or an error. This is intended
@@ -308,14 +304,14 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
cmdApiVersion = *cfg.GroupVersion cmdApiVersion = *cfg.GroupVersion
} }
if discoverDynamicAPIs { if discoverDynamicAPIs {
client, err := clients.ClientForVersion(&unversioned.GroupVersion{Version: "v1"}) clientset, err := clients.ClientSetForVersion(&unversioned.GroupVersion{Version: "v1"})
checkErrWithPrefix("failed to find client for version v1: ", err) checkErrWithPrefix("failed to find client for version v1: ", err)
var versions []unversioned.GroupVersion var versions []unversioned.GroupVersion
var gvks []unversioned.GroupVersionKind var gvks []unversioned.GroupVersionKind
retries := 3 retries := 3
for i := 0; i < retries; i++ { for i := 0; i < retries; i++ {
versions, gvks, err = GetThirdPartyGroupVersions(client.Discovery()) versions, gvks, err = GetThirdPartyGroupVersions(clientset.Discovery())
// Retry if we got a NotFound error, because user may delete // Retry if we got a NotFound error, because user may delete
// a thirdparty group when the GetThirdPartyGroupVersions is // a thirdparty group when the GetThirdPartyGroupVersions is
// running. // running.
@@ -418,17 +414,15 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return kubectl.ShortcutExpander{RESTMapper: mapper}, typer, nil return kubectl.ShortcutExpander{RESTMapper: mapper}, typer, nil
}, },
Client: func() (*client.Client, error) { RESTClient: func() (*restclient.RESTClient, error) {
return clients.ClientForVersion(nil) clientConfig, err := clients.ClientConfigForVersion(nil)
},
ClientSet: func() (*internalclientset.Clientset, error) {
cfg, err := clients.ClientConfigForVersion(nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return restclient.RESTClientFor(clientConfig)
return internalclientset.NewForConfig(cfg) },
ClientSet: func() (*internalclientset.Clientset, error) {
return clients.ClientSetForVersion(nil)
}, },
ClientConfig: func() (*restclient.Config, error) { ClientConfig: func() (*restclient.Config, error) {
return clients.ClientConfigForVersion(nil) return clients.ClientConfigForVersion(nil)
@@ -486,11 +480,11 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return &kubectl.ClusterDescriber{Interface: fedClientSet}, nil return &kubectl.ClusterDescriber{Interface: fedClientSet}, nil
} }
} }
client, err := clients.ClientForVersion(&mappingVersion) clientset, err := clients.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if describer, ok := kubectl.DescriberFor(mapping.GroupVersionKind.GroupKind(), client); ok { if describer, ok := kubectl.DescriberFor(mapping.GroupVersionKind.GroupKind(), clientset); ok {
return describer, nil return describer, nil
} }
return nil, fmt.Errorf("no description has been implemented for %q", mapping.GroupVersionKind.Kind) return nil, fmt.Errorf("no description has been implemented for %q", mapping.GroupVersionKind.Kind)
@@ -594,7 +588,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return meta.NewAccessor().Labels(object) return meta.NewAccessor().Labels(object)
}, },
LogsForObject: func(object, options runtime.Object) (*restclient.Request, error) { LogsForObject: func(object, options runtime.Object) (*restclient.Request, error) {
c, err := clients.ClientForVersion(nil) clientset, err := clients.ClientSetForVersion(nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -605,7 +599,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
if !ok { if !ok {
return nil, errors.New("provided options object is not a PodLogOptions") return nil, errors.New("provided options object is not a PodLogOptions")
} }
return c.Pods(t.Namespace).GetLogs(t.Name, opts), nil return clientset.Core().Pods(t.Namespace).GetLogs(t.Name, opts), nil
case *api.ReplicationController: case *api.ReplicationController:
opts, ok := options.(*api.PodLogOptions) opts, ok := options.(*api.PodLogOptions)
@@ -614,7 +608,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
} }
selector := labels.SelectorFromSet(t.Spec.Selector) selector := labels.SelectorFromSet(t.Spec.Selector)
sortBy := func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) } sortBy := func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) }
pod, numPods, err := GetFirstPod(c, t.Namespace, selector, 20*time.Second, sortBy) pod, numPods, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 20*time.Second, sortBy)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -622,7 +616,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
fmt.Fprintf(os.Stderr, "Found %v pods, using pod/%v\n", numPods, pod.Name) fmt.Fprintf(os.Stderr, "Found %v pods, using pod/%v\n", numPods, pod.Name)
} }
return c.Pods(pod.Namespace).GetLogs(pod.Name, opts), nil return clientset.Core().Pods(pod.Namespace).GetLogs(pod.Name, opts), nil
case *extensions.ReplicaSet: case *extensions.ReplicaSet:
opts, ok := options.(*api.PodLogOptions) opts, ok := options.(*api.PodLogOptions)
@@ -634,7 +628,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
sortBy := func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) } sortBy := func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) }
pod, numPods, err := GetFirstPod(c, t.Namespace, selector, 20*time.Second, sortBy) pod, numPods, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 20*time.Second, sortBy)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -642,7 +636,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
fmt.Fprintf(os.Stderr, "Found %v pods, using pod/%v\n", numPods, pod.Name) fmt.Fprintf(os.Stderr, "Found %v pods, using pod/%v\n", numPods, pod.Name)
} }
return c.Pods(pod.Namespace).GetLogs(pod.Name, opts), nil return clientset.Core().Pods(pod.Namespace).GetLogs(pod.Name, opts), nil
default: default:
gvks, _, err := api.Scheme.ObjectKinds(object) gvks, _, err := api.Scheme.ObjectKinds(object)
@@ -653,7 +647,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
} }
}, },
PauseObject: func(object runtime.Object) (bool, error) { PauseObject: func(object runtime.Object) (bool, error) {
c, err := clients.ClientForVersion(nil) clientset, err := clients.ClientSetForVersion(nil)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -664,7 +658,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return true, nil return true, nil
} }
t.Spec.Paused = true t.Spec.Paused = true
_, err := c.Extensions().Deployments(t.Namespace).Update(t) _, err := clientset.Extensions().Deployments(t.Namespace).Update(t)
return false, err return false, err
default: default:
gvks, _, err := api.Scheme.ObjectKinds(object) gvks, _, err := api.Scheme.ObjectKinds(object)
@@ -675,7 +669,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
} }
}, },
ResumeObject: func(object runtime.Object) (bool, error) { ResumeObject: func(object runtime.Object) (bool, error) {
c, err := clients.ClientForVersion(nil) clientset, err := clients.ClientSetForVersion(nil)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -686,7 +680,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return true, nil return true, nil
} }
t.Spec.Paused = false t.Spec.Paused = false
_, err := c.Extensions().Deployments(t.Namespace).Update(t) _, err := clientset.Extensions().Deployments(t.Namespace).Update(t)
return false, err return false, err
default: default:
gvks, _, err := api.Scheme.ObjectKinds(object) gvks, _, err := api.Scheme.ObjectKinds(object)
@@ -698,55 +692,61 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
}, },
Scaler: func(mapping *meta.RESTMapping) (kubectl.Scaler, error) { Scaler: func(mapping *meta.RESTMapping) (kubectl.Scaler, error) {
mappingVersion := mapping.GroupVersionKind.GroupVersion() mappingVersion := mapping.GroupVersionKind.GroupVersion()
client, err := clients.ClientForVersion(&mappingVersion) clientset, err := clients.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return kubectl.ScalerFor(mapping.GroupVersionKind.GroupKind(), client) return kubectl.ScalerFor(mapping.GroupVersionKind.GroupKind(), clientset)
}, },
Reaper: func(mapping *meta.RESTMapping) (kubectl.Reaper, error) { Reaper: func(mapping *meta.RESTMapping) (kubectl.Reaper, error) {
mappingVersion := mapping.GroupVersionKind.GroupVersion() mappingVersion := mapping.GroupVersionKind.GroupVersion()
client, err := clients.ClientForVersion(&mappingVersion) clientset, err := clients.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return kubectl.ReaperFor(mapping.GroupVersionKind.GroupKind(), client) return kubectl.ReaperFor(mapping.GroupVersionKind.GroupKind(), clientset)
}, },
HistoryViewer: func(mapping *meta.RESTMapping) (kubectl.HistoryViewer, error) { HistoryViewer: func(mapping *meta.RESTMapping) (kubectl.HistoryViewer, error) {
mappingVersion := mapping.GroupVersionKind.GroupVersion() mappingVersion := mapping.GroupVersionKind.GroupVersion()
client, err := clients.ClientForVersion(&mappingVersion) clientset, err := clients.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clientset := clientset.FromUnversionedClient(client)
return kubectl.HistoryViewerFor(mapping.GroupVersionKind.GroupKind(), clientset) return kubectl.HistoryViewerFor(mapping.GroupVersionKind.GroupKind(), clientset)
}, },
Rollbacker: func(mapping *meta.RESTMapping) (kubectl.Rollbacker, error) { Rollbacker: func(mapping *meta.RESTMapping) (kubectl.Rollbacker, error) {
mappingVersion := mapping.GroupVersionKind.GroupVersion() mappingVersion := mapping.GroupVersionKind.GroupVersion()
client, err := clients.ClientForVersion(&mappingVersion) clientset, err := clients.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clientset := clientset.FromUnversionedClient(client)
return kubectl.RollbackerFor(mapping.GroupVersionKind.GroupKind(), clientset) return kubectl.RollbackerFor(mapping.GroupVersionKind.GroupKind(), clientset)
}, },
StatusViewer: func(mapping *meta.RESTMapping) (kubectl.StatusViewer, error) { StatusViewer: func(mapping *meta.RESTMapping) (kubectl.StatusViewer, error) {
mappingVersion := mapping.GroupVersionKind.GroupVersion() mappingVersion := mapping.GroupVersionKind.GroupVersion()
client, err := clients.ClientForVersion(&mappingVersion) clientset, err := clients.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return kubectl.StatusViewerFor(mapping.GroupVersionKind.GroupKind(), client) return kubectl.StatusViewerFor(mapping.GroupVersionKind.GroupKind(), clientset)
}, },
Validator: func(validate bool, cacheDir string) (validation.Schema, error) { Validator: func(validate bool, cacheDir string) (validation.Schema, error) {
if validate { if validate {
client, err := clients.ClientForVersion(nil) clientConfig, err := clients.ClientConfigForVersion(nil)
if err != nil {
return nil, err
}
restclient, err := restclient.RESTClientFor(clientConfig)
if err != nil {
return nil, err
}
clientset, err := clients.ClientSetForVersion(nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
dir := cacheDir dir := cacheDir
if len(dir) > 0 { if len(dir) > 0 {
version, err := client.ServerVersion() version, err := clientset.Discovery().ServerVersion()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -757,7 +757,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return nil, err return nil, err
} }
return &clientSwaggerSchema{ return &clientSwaggerSchema{
c: client, c: restclient,
fedc: fedClient, fedc: fedClient,
cacheDir: dir, cacheDir: dir,
mapper: api.RESTMapper, mapper: api.RESTMapper,
@@ -766,18 +766,12 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return validation.NullSchema{}, nil return validation.NullSchema{}, nil
}, },
SwaggerSchema: func(gvk unversioned.GroupVersionKind) (*swagger.ApiDeclaration, error) { SwaggerSchema: func(gvk unversioned.GroupVersionKind) (*swagger.ApiDeclaration, error) {
// discovery doesn't care about which groupversion you get a client for, version := gvk.GroupVersion()
// so get whichever one you happen to have available and use that. clientset, err := clients.ClientSetForVersion(&version)
cfg, err := clients.ClientConfigForVersion(nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
dc, err := discovery.NewDiscoveryClientForConfig(cfg) return clientset.Discovery().SwaggerSchema(version)
if err != nil {
return nil, err
}
return dc.SwaggerSchema(gvk.GroupVersion())
}, },
DefaultNamespace: func() (string, bool, error) { DefaultNamespace: func() (string, bool, error) {
return clientConfig.Namespace() return clientConfig.Namespace()
@@ -804,7 +798,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return nil return nil
}, },
AttachablePodForObject: func(object runtime.Object) (*api.Pod, error) { AttachablePodForObject: func(object runtime.Object) (*api.Pod, error) {
client, err := clients.ClientForVersion(nil) clientset, err := clients.ClientSetForVersion(nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -812,7 +806,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
case *api.ReplicationController: case *api.ReplicationController:
selector := labels.SelectorFromSet(t.Spec.Selector) selector := labels.SelectorFromSet(t.Spec.Selector)
sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) } sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }
pod, _, err := GetFirstPod(client, t.Namespace, selector, 1*time.Minute, sortBy) pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy)
return pod, err return pod, err
case *extensions.Deployment: case *extensions.Deployment:
selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector)
@@ -820,7 +814,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) } sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }
pod, _, err := GetFirstPod(client, t.Namespace, selector, 1*time.Minute, sortBy) pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy)
return pod, err return pod, err
case *batch.Job: case *batch.Job:
selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector)
@@ -828,7 +822,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) } sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }
pod, _, err := GetFirstPod(client, t.Namespace, selector, 1*time.Minute, sortBy) pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy)
return pod, err return pod, err
case *api.Pod: case *api.Pod:
return t, nil return t, nil
@@ -900,7 +894,7 @@ See http://releases.k8s.io/HEAD/docs/user-guide/services-firewalls.md for more d
// GetFirstPod returns a pod matching the namespace and label selector // GetFirstPod returns a pod matching the namespace and label selector
// and the number of all pods that match the label selector. // and the number of all pods that match the label selector.
func GetFirstPod(client client.PodsNamespacer, namespace string, selector labels.Selector, timeout time.Duration, sortBy func([]*api.Pod) sort.Interface) (*api.Pod, int, error) { func GetFirstPod(client coreclient.PodsGetter, namespace string, selector labels.Selector, timeout time.Duration, sortBy func([]*api.Pod) sort.Interface) (*api.Pod, int, error) {
options := api.ListOptions{LabelSelector: selector} options := api.ListOptions{LabelSelector: selector}
podList, err := client.Pods(namespace).List(options) podList, err := client.Pods(namespace).List(options)
@@ -1026,7 +1020,7 @@ func getServiceProtocols(spec api.ServiceSpec) map[string]string {
} }
type clientSwaggerSchema struct { type clientSwaggerSchema struct {
c *client.Client c *restclient.RESTClient
fedc *restclient.RESTClient fedc *restclient.RESTClient
cacheDir string cacheDir string
mapper meta.RESTMapper mapper meta.RESTMapper
@@ -1157,60 +1151,24 @@ func (c *clientSwaggerSchema) ValidateBytes(data []byte) error {
if ok := registered.IsEnabledVersion(gvk.GroupVersion()); !ok { if ok := registered.IsEnabledVersion(gvk.GroupVersion()); !ok {
return fmt.Errorf("API version %q isn't supported, only supports API versions %q", gvk.GroupVersion().String(), registered.EnabledVersions()) return fmt.Errorf("API version %q isn't supported, only supports API versions %q", gvk.GroupVersion().String(), registered.EnabledVersions())
} }
switch gvk.Group {
case autoscaling.GroupName:
if c.c.AutoscalingClient == nil {
return errors.New("unable to validate: no autoscaling client")
}
return getSchemaAndValidate(c.c.AutoscalingClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
case policy.GroupName:
if c.c.PolicyClient == nil {
return errors.New("unable to validate: no policy client")
}
return getSchemaAndValidate(c.c.PolicyClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
case apps.GroupName:
if c.c.AppsClient == nil {
return errors.New("unable to validate: no apps client")
}
return getSchemaAndValidate(c.c.AppsClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
case batch.GroupName:
if c.c.BatchClient == nil {
return errors.New("unable to validate: no batch client")
}
return getSchemaAndValidate(c.c.BatchClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
case rbac.GroupName:
if c.c.RbacClient == nil {
return errors.New("unable to validate: no rbac client")
}
return getSchemaAndValidate(c.c.RbacClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
case storage.GroupName:
if c.c.StorageClient == nil {
return errors.New("unable to validate: no storage client")
}
return getSchemaAndValidate(c.c.StorageClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
}
if registered.IsThirdPartyAPIGroupVersion(gvk.GroupVersion()) { if registered.IsThirdPartyAPIGroupVersion(gvk.GroupVersion()) {
// Don't attempt to validate third party objects // Don't attempt to validate third party objects
return nil return nil
} }
switch gvk.Group { switch gvk.Group {
case extensions.GroupName:
if c.c.ExtensionsClient == nil {
return errors.New("unable to validate: no experimental client")
}
return getSchemaAndValidate(c.c.ExtensionsClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
case federation.GroupName: case federation.GroupName:
if c.fedc == nil { if c.fedc == nil {
return errors.New("unable to validate: no federation client") return errors.New("unable to validate: no federation client")
} }
return getSchemaAndValidate(c.fedc, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c) return getSchemaAndValidate(c.fedc, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
case certificates.GroupName:
if c.c.CertificatesClient == nil { case api.GroupName:
return errors.New("unable to validate: no certificates client") return getSchemaAndValidate(c.c, data, "api", gvk.GroupVersion().String(), c.cacheDir, c)
}
return getSchemaAndValidate(c.c.CertificatesClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c) default:
return getSchemaAndValidate(c.c, data, "apis/", gvk.GroupVersion().String(), c.cacheDir, c)
} }
return getSchemaAndValidate(c.c.RESTClient, data, "api", gvk.GroupVersion().String(), c.cacheDir, c)
} }
// DefaultClientConfig creates a clientcmd.ClientConfig with the following hierarchy: // DefaultClientConfig creates a clientcmd.ClientConfig with the following hierarchy:

View File

@@ -36,10 +36,11 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
testcore "k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
"k8s.io/kubernetes/pkg/client/unversioned/fake" manualfake "k8s.io/kubernetes/pkg/client/unversioned/fake"
"k8s.io/kubernetes/pkg/client/unversioned/testclient"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
@@ -262,9 +263,9 @@ func TestRefetchSchemaWhenValidationFails(t *testing.T) {
} }
requests := map[string]int{} requests := map[string]int{}
c := &fake.RESTClient{ c := &manualfake.RESTClient{
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: testapi.Default.NegotiatedSerializer(),
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { Client: manualfake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
switch p, m := req.URL.Path, req.Method; { switch p, m := req.URL.Path, req.Method; {
case strings.HasPrefix(p, "/swaggerapi") && m == "GET": case strings.HasPrefix(p, "/swaggerapi") && m == "GET":
requests[p] = requests[p] + 1 requests[p] = requests[p] + 1
@@ -319,9 +320,9 @@ func TestValidateCachesSchema(t *testing.T) {
} }
requests := map[string]int{} requests := map[string]int{}
c := &fake.RESTClient{ c := &manualfake.RESTClient{
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: testapi.Default.NegotiatedSerializer(),
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { Client: manualfake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
switch p, m := req.URL.Path, req.Method; { switch p, m := req.URL.Path, req.Method; {
case strings.HasPrefix(p, "/swaggerapi") && m == "GET": case strings.HasPrefix(p, "/swaggerapi") && m == "GET":
requests[p] = requests[p] + 1 requests[p] = requests[p] + 1
@@ -587,10 +588,7 @@ func TestGetFirstPod(t *testing.T) {
for i := range tests { for i := range tests {
test := tests[i] test := tests[i]
client := &testclient.Fake{} fake := fake.NewSimpleClientset(test.podList)
client.PrependReactor("list", "pods", func(action testclient.Action) (handled bool, ret runtime.Object, err error) {
return true, test.podList, nil
})
if len(test.watching) > 0 { if len(test.watching) > 0 {
watcher := watch.NewFake() watcher := watch.NewFake()
for _, event := range test.watching { for _, event := range test.watching {
@@ -601,11 +599,11 @@ func TestGetFirstPod(t *testing.T) {
go watcher.Modify(event.Object) go watcher.Modify(event.Object)
} }
} }
client.PrependWatchReactor("pods", testclient.DefaultWatchReactor(watcher, nil)) fake.PrependWatchReactor("pods", testcore.DefaultWatchReactor(watcher, nil))
} }
selector := labels.Set(labelSet).AsSelector() selector := labels.Set(labelSet).AsSelector()
pod, numPods, err := GetFirstPod(client, api.NamespaceDefault, selector, 1*time.Minute, test.sortBy) pod, numPods, err := GetFirstPod(fake.Core(), api.NamespaceDefault, selector, 1*time.Minute, test.sortBy)
if !test.expectedErr && err != nil { if !test.expectedErr && err != nil {
t.Errorf("%s: unexpected error: %v", test.name, err) t.Errorf("%s: unexpected error: %v", test.name, err)
continue continue

View File

@@ -17,6 +17,7 @@ limitations under the License.
package cmd package cmd
import ( import (
"fmt"
"io" "io"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@@ -45,11 +46,16 @@ func RunVersion(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command) error {
return nil return nil
} }
client, err := f.Client() clientset, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
kubectl.GetServerVersion(out, client) serverVersion, err := clientset.Discovery().ServerVersion()
if err != nil {
return err
}
fmt.Fprintf(out, "Server Version: %#v\n", *serverVersion)
return nil return nil
} }

View File

@@ -42,7 +42,6 @@ import (
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
adapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/fieldpath" "k8s.io/kubernetes/pkg/fieldpath"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
@@ -89,7 +88,7 @@ func (e ErrNoDescriber) Error() string {
return fmt.Sprintf("no describer has been defined for %v", e.Types) return fmt.Sprintf("no describer has been defined for %v", e.Types)
} }
func describerMap(c *client.Client) map[unversioned.GroupKind]Describer { func describerMap(c clientset.Interface) map[unversioned.GroupKind]Describer {
m := map[unversioned.GroupKind]Describer{ m := map[unversioned.GroupKind]Describer{
api.Kind("Pod"): &PodDescriber{c}, api.Kind("Pod"): &PodDescriber{c},
api.Kind("ReplicationController"): &ReplicationControllerDescriber{c}, api.Kind("ReplicationController"): &ReplicationControllerDescriber{c},
@@ -110,11 +109,11 @@ func describerMap(c *client.Client) map[unversioned.GroupKind]Describer {
extensions.Kind("NetworkPolicy"): &NetworkPolicyDescriber{c}, extensions.Kind("NetworkPolicy"): &NetworkPolicyDescriber{c},
autoscaling.Kind("HorizontalPodAutoscaler"): &HorizontalPodAutoscalerDescriber{c}, autoscaling.Kind("HorizontalPodAutoscaler"): &HorizontalPodAutoscalerDescriber{c},
extensions.Kind("DaemonSet"): &DaemonSetDescriber{c}, extensions.Kind("DaemonSet"): &DaemonSetDescriber{c},
extensions.Kind("Deployment"): &DeploymentDescriber{adapter.FromUnversionedClient(c)}, extensions.Kind("Deployment"): &DeploymentDescriber{c},
extensions.Kind("Job"): &JobDescriber{c}, extensions.Kind("Job"): &JobDescriber{c},
extensions.Kind("Ingress"): &IngressDescriber{c}, extensions.Kind("Ingress"): &IngressDescriber{c},
batch.Kind("Job"): &JobDescriber{c}, batch.Kind("Job"): &JobDescriber{c},
batch.Kind("ScheduledJob"): &ScheduledJobDescriber{adapter.FromUnversionedClient(c)}, batch.Kind("ScheduledJob"): &ScheduledJobDescriber{c},
apps.Kind("PetSet"): &PetSetDescriber{c}, apps.Kind("PetSet"): &PetSetDescriber{c},
certificates.Kind("CertificateSigningRequest"): &CertificateSigningRequestDescriber{c}, certificates.Kind("CertificateSigningRequest"): &CertificateSigningRequestDescriber{c},
storage.Kind("StorageClass"): &StorageClassDescriber{c}, storage.Kind("StorageClass"): &StorageClassDescriber{c},
@@ -136,7 +135,7 @@ func DescribableResources() []string {
// Describer returns the default describe functions for each of the standard // Describer returns the default describe functions for each of the standard
// Kubernetes types. // Kubernetes types.
func DescriberFor(kind unversioned.GroupKind, c *client.Client) (Describer, bool) { func DescriberFor(kind unversioned.GroupKind, c clientset.Interface) (Describer, bool) {
f, ok := describerMap(c)[kind] f, ok := describerMap(c)[kind]
return f, ok return f, ok
} }
@@ -164,19 +163,19 @@ func init() {
// NamespaceDescriber generates information about a namespace // NamespaceDescriber generates information about a namespace
type NamespaceDescriber struct { type NamespaceDescriber struct {
client.Interface clientset.Interface
} }
func (d *NamespaceDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *NamespaceDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
ns, err := d.Namespaces().Get(name) ns, err := d.Core().Namespaces().Get(name)
if err != nil { if err != nil {
return "", err return "", err
} }
resourceQuotaList, err := d.ResourceQuotas(name).List(api.ListOptions{}) resourceQuotaList, err := d.Core().ResourceQuotas(name).List(api.ListOptions{})
if err != nil { if err != nil {
return "", err return "", err
} }
limitRangeList, err := d.LimitRanges(name).List(api.ListOptions{}) limitRangeList, err := d.Core().LimitRanges(name).List(api.ListOptions{})
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -320,11 +319,11 @@ func DescribeResourceQuotas(quotas *api.ResourceQuotaList, w io.Writer) {
// LimitRangeDescriber generates information about a limit range // LimitRangeDescriber generates information about a limit range
type LimitRangeDescriber struct { type LimitRangeDescriber struct {
client.Interface clientset.Interface
} }
func (d *LimitRangeDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *LimitRangeDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
lr := d.LimitRanges(namespace) lr := d.Core().LimitRanges(namespace)
limitRange, err := lr.Get(name) limitRange, err := lr.Get(name)
if err != nil { if err != nil {
@@ -407,11 +406,11 @@ func describeLimitRange(limitRange *api.LimitRange) (string, error) {
// ResourceQuotaDescriber generates information about a resource quota // ResourceQuotaDescriber generates information about a resource quota
type ResourceQuotaDescriber struct { type ResourceQuotaDescriber struct {
client.Interface clientset.Interface
} }
func (d *ResourceQuotaDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *ResourceQuotaDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
rq := d.ResourceQuotas(namespace) rq := d.Core().ResourceQuotas(namespace)
resourceQuota, err := rq.Get(name) resourceQuota, err := rq.Get(name)
if err != nil { if err != nil {
@@ -476,14 +475,14 @@ func describeQuota(resourceQuota *api.ResourceQuota) (string, error) {
// PodDescriber generates information about a pod and the replication controllers that // PodDescriber generates information about a pod and the replication controllers that
// create it. // create it.
type PodDescriber struct { type PodDescriber struct {
client.Interface clientset.Interface
} }
func (d *PodDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *PodDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
pod, err := d.Pods(namespace).Get(name) pod, err := d.Core().Pods(namespace).Get(name)
if err != nil { if err != nil {
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
eventsInterface := d.Events(namespace) eventsInterface := d.Core().Events(namespace)
selector := eventsInterface.GetFieldSelector(&name, &namespace, nil, nil) selector := eventsInterface.GetFieldSelector(&name, &namespace, nil, nil)
options := api.ListOptions{FieldSelector: selector} options := api.ListOptions{FieldSelector: selector}
events, err2 := eventsInterface.List(options) events, err2 := eventsInterface.List(options)
@@ -504,7 +503,7 @@ func (d *PodDescriber) Describe(namespace, name string, describerSettings Descri
glog.Errorf("Unable to construct reference to '%#v': %v", pod, err) glog.Errorf("Unable to construct reference to '%#v': %v", pod, err)
} else { } else {
ref.Kind = "" ref.Kind = ""
events, _ = d.Events(namespace).Search(ref) events, _ = d.Core().Events(namespace).Search(ref)
} }
} }
@@ -759,11 +758,11 @@ func printCinderVolumeSource(cinder *api.CinderVolumeSource, out io.Writer) {
} }
type PersistentVolumeDescriber struct { type PersistentVolumeDescriber struct {
client.Interface clientset.Interface
} }
func (d *PersistentVolumeDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *PersistentVolumeDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := d.PersistentVolumes() c := d.Core().PersistentVolumes()
pv, err := c.Get(name) pv, err := c.Get(name)
if err != nil { if err != nil {
@@ -774,7 +773,7 @@ func (d *PersistentVolumeDescriber) Describe(namespace, name string, describerSe
var events *api.EventList var events *api.EventList
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ = d.Events(namespace).Search(pv) events, _ = d.Core().Events(namespace).Search(pv)
} }
return tabbedString(func(out io.Writer) error { return tabbedString(func(out io.Writer) error {
@@ -824,11 +823,11 @@ func (d *PersistentVolumeDescriber) Describe(namespace, name string, describerSe
} }
type PersistentVolumeClaimDescriber struct { type PersistentVolumeClaimDescriber struct {
client.Interface clientset.Interface
} }
func (d *PersistentVolumeClaimDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *PersistentVolumeClaimDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := d.PersistentVolumeClaims(namespace) c := d.Core().PersistentVolumeClaims(namespace)
pvc, err := c.Get(name) pvc, err := c.Get(name)
if err != nil { if err != nil {
@@ -844,7 +843,7 @@ func (d *PersistentVolumeClaimDescriber) Describe(namespace, name string, descri
capacity = storage.String() capacity = storage.String()
} }
events, _ := d.Events(namespace).Search(pvc) events, _ := d.Core().Events(namespace).Search(pvc)
return tabbedString(func(out io.Writer) error { return tabbedString(func(out io.Writer) error {
fmt.Fprintf(out, "Name:\t%s\n", pvc.Name) fmt.Fprintf(out, "Name:\t%s\n", pvc.Name)
@@ -1096,12 +1095,12 @@ func printBool(value bool) string {
// ReplicationControllerDescriber generates information about a replication controller // ReplicationControllerDescriber generates information about a replication controller
// and the pods it has created. // and the pods it has created.
type ReplicationControllerDescriber struct { type ReplicationControllerDescriber struct {
client.Interface clientset.Interface
} }
func (d *ReplicationControllerDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *ReplicationControllerDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
rc := d.ReplicationControllers(namespace) rc := d.Core().ReplicationControllers(namespace)
pc := d.Pods(namespace) pc := d.Core().Pods(namespace)
controller, err := rc.Get(name) controller, err := rc.Get(name)
if err != nil { if err != nil {
@@ -1115,7 +1114,7 @@ func (d *ReplicationControllerDescriber) Describe(namespace, name string, descri
var events *api.EventList var events *api.EventList
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ = d.Events(namespace).Search(controller) events, _ = d.Core().Events(namespace).Search(controller)
} }
return describeReplicationController(controller, events, running, waiting, succeeded, failed) return describeReplicationController(controller, events, running, waiting, succeeded, failed)
@@ -1165,12 +1164,12 @@ func DescribePodTemplate(template *api.PodTemplateSpec, out io.Writer) {
// ReplicaSetDescriber generates information about a ReplicaSet and the pods it has created. // ReplicaSetDescriber generates information about a ReplicaSet and the pods it has created.
type ReplicaSetDescriber struct { type ReplicaSetDescriber struct {
client.Interface clientset.Interface
} }
func (d *ReplicaSetDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *ReplicaSetDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
rsc := d.Extensions().ReplicaSets(namespace) rsc := d.Extensions().ReplicaSets(namespace)
pc := d.Pods(namespace) pc := d.Core().Pods(namespace)
rs, err := rsc.Get(name) rs, err := rsc.Get(name)
if err != nil { if err != nil {
@@ -1189,7 +1188,7 @@ func (d *ReplicaSetDescriber) Describe(namespace, name string, describerSettings
var events *api.EventList var events *api.EventList
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ = d.Events(namespace).Search(rs) events, _ = d.Core().Events(namespace).Search(rs)
} }
return describeReplicaSet(rs, events, running, waiting, succeeded, failed) return describeReplicaSet(rs, events, running, waiting, succeeded, failed)
@@ -1214,7 +1213,7 @@ func describeReplicaSet(rs *extensions.ReplicaSet, events *api.EventList, runnin
// JobDescriber generates information about a job and the pods it has created. // JobDescriber generates information about a job and the pods it has created.
type JobDescriber struct { type JobDescriber struct {
client.Interface clientset.Interface
} }
func (d *JobDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *JobDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
@@ -1225,7 +1224,7 @@ func (d *JobDescriber) Describe(namespace, name string, describerSettings Descri
var events *api.EventList var events *api.EventList
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ = d.Events(namespace).Search(job) events, _ = d.Core().Events(namespace).Search(job)
} }
return describeJob(job, events) return describeJob(job, events)
@@ -1348,12 +1347,12 @@ func printActiveJobs(out io.Writer, title string, jobs []api.ObjectReference) {
// DaemonSetDescriber generates information about a daemon set and the pods it has created. // DaemonSetDescriber generates information about a daemon set and the pods it has created.
type DaemonSetDescriber struct { type DaemonSetDescriber struct {
client.Interface clientset.Interface
} }
func (d *DaemonSetDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *DaemonSetDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
dc := d.Extensions().DaemonSets(namespace) dc := d.Extensions().DaemonSets(namespace)
pc := d.Pods(namespace) pc := d.Core().Pods(namespace)
daemon, err := dc.Get(name) daemon, err := dc.Get(name)
if err != nil { if err != nil {
@@ -1371,7 +1370,7 @@ func (d *DaemonSetDescriber) Describe(namespace, name string, describerSettings
var events *api.EventList var events *api.EventList
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ = d.Events(namespace).Search(daemon) events, _ = d.Core().Events(namespace).Search(daemon)
} }
return describeDaemonSet(daemon, events, running, waiting, succeeded, failed) return describeDaemonSet(daemon, events, running, waiting, succeeded, failed)
@@ -1402,11 +1401,11 @@ func describeDaemonSet(daemon *extensions.DaemonSet, events *api.EventList, runn
// SecretDescriber generates information about a secret // SecretDescriber generates information about a secret
type SecretDescriber struct { type SecretDescriber struct {
client.Interface clientset.Interface
} }
func (d *SecretDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *SecretDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := d.Secrets(namespace) c := d.Core().Secrets(namespace)
secret, err := c.Get(name) secret, err := c.Get(name)
if err != nil { if err != nil {
@@ -1440,11 +1439,11 @@ func describeSecret(secret *api.Secret) (string, error) {
} }
type IngressDescriber struct { type IngressDescriber struct {
client.Interface clientset.Interface
} }
func (i *IngressDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (i *IngressDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := i.Extensions().Ingress(namespace) c := i.Extensions().Ingresses(namespace)
ing, err := c.Get(name) ing, err := c.Get(name)
if err != nil { if err != nil {
return "", err return "", err
@@ -1453,8 +1452,8 @@ func (i *IngressDescriber) Describe(namespace, name string, describerSettings De
} }
func (i *IngressDescriber) describeBackend(ns string, backend *extensions.IngressBackend) string { func (i *IngressDescriber) describeBackend(ns string, backend *extensions.IngressBackend) string {
endpoints, _ := i.Endpoints(ns).Get(backend.ServiceName) endpoints, _ := i.Core().Endpoints(ns).Get(backend.ServiceName)
service, _ := i.Services(ns).Get(backend.ServiceName) service, _ := i.Core().Services(ns).Get(backend.ServiceName)
spName := "" spName := ""
for i := range service.Spec.Ports { for i := range service.Spec.Ports {
sp := &service.Spec.Ports[i] sp := &service.Spec.Ports[i]
@@ -1515,7 +1514,7 @@ func (i *IngressDescriber) describeIngress(ing *extensions.Ingress, describerSet
describeIngressAnnotations(out, ing.Annotations) describeIngressAnnotations(out, ing.Annotations)
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ := i.Events(ing.Namespace).Search(ing) events, _ := i.Core().Events(ing.Namespace).Search(ing)
if events != nil { if events != nil {
DescribeEvents(events, out) DescribeEvents(events, out)
} }
@@ -1552,21 +1551,21 @@ func describeIngressAnnotations(out io.Writer, annotations map[string]string) {
// ServiceDescriber generates information about a service. // ServiceDescriber generates information about a service.
type ServiceDescriber struct { type ServiceDescriber struct {
client.Interface clientset.Interface
} }
func (d *ServiceDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *ServiceDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := d.Services(namespace) c := d.Core().Services(namespace)
service, err := c.Get(name) service, err := c.Get(name)
if err != nil { if err != nil {
return "", err return "", err
} }
endpoints, _ := d.Endpoints(namespace).Get(name) endpoints, _ := d.Core().Endpoints(namespace).Get(name)
var events *api.EventList var events *api.EventList
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ = d.Events(namespace).Search(service) events, _ = d.Core().Events(namespace).Search(service)
} }
return describeService(service, endpoints, events) return describeService(service, endpoints, events)
} }
@@ -1631,11 +1630,11 @@ func describeService(service *api.Service, endpoints *api.Endpoints, events *api
// EndpointsDescriber generates information about an Endpoint. // EndpointsDescriber generates information about an Endpoint.
type EndpointsDescriber struct { type EndpointsDescriber struct {
client.Interface clientset.Interface
} }
func (d *EndpointsDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *EndpointsDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := d.Endpoints(namespace) c := d.Core().Endpoints(namespace)
ep, err := c.Get(name) ep, err := c.Get(name)
if err != nil { if err != nil {
@@ -1644,7 +1643,7 @@ func (d *EndpointsDescriber) Describe(namespace, name string, describerSettings
var events *api.EventList var events *api.EventList
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ = d.Events(namespace).Search(ep) events, _ = d.Core().Events(namespace).Search(ep)
} }
return describeEndpoints(ep, events) return describeEndpoints(ep, events)
@@ -1704,11 +1703,11 @@ func describeEndpoints(ep *api.Endpoints, events *api.EventList) (string, error)
// ServiceAccountDescriber generates information about a service. // ServiceAccountDescriber generates information about a service.
type ServiceAccountDescriber struct { type ServiceAccountDescriber struct {
client.Interface clientset.Interface
} }
func (d *ServiceAccountDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *ServiceAccountDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := d.ServiceAccounts(namespace) c := d.Core().ServiceAccounts(namespace)
serviceAccount, err := c.Get(name) serviceAccount, err := c.Get(name)
if err != nil { if err != nil {
@@ -1719,7 +1718,7 @@ func (d *ServiceAccountDescriber) Describe(namespace, name string, describerSett
tokenSelector := fields.SelectorFromSet(map[string]string{api.SecretTypeField: string(api.SecretTypeServiceAccountToken)}) tokenSelector := fields.SelectorFromSet(map[string]string{api.SecretTypeField: string(api.SecretTypeServiceAccountToken)})
options := api.ListOptions{FieldSelector: tokenSelector} options := api.ListOptions{FieldSelector: tokenSelector}
secrets, err := d.Secrets(namespace).List(options) secrets, err := d.Core().Secrets(namespace).List(options)
if err == nil { if err == nil {
for _, s := range secrets.Items { for _, s := range secrets.Items {
name, _ := s.Annotations[api.ServiceAccountNameKey] name, _ := s.Annotations[api.ServiceAccountNameKey]
@@ -1785,11 +1784,11 @@ func describeServiceAccount(serviceAccount *api.ServiceAccount, tokens []api.Sec
// NodeDescriber generates information about a node. // NodeDescriber generates information about a node.
type NodeDescriber struct { type NodeDescriber struct {
client.Interface clientset.Interface
} }
func (d *NodeDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *NodeDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
mc := d.Nodes() mc := d.Core().Nodes()
node, err := mc.Get(name) node, err := mc.Get(name)
if err != nil { if err != nil {
return "", err return "", err
@@ -1802,7 +1801,7 @@ func (d *NodeDescriber) Describe(namespace, name string, describerSettings Descr
// in a policy aware setting, users may have access to a node, but not all pods // in a policy aware setting, users may have access to a node, but not all pods
// in that case, we note that the user does not have access to the pods // in that case, we note that the user does not have access to the pods
canViewPods := true canViewPods := true
nodeNonTerminatedPodsList, err := d.Pods(namespace).List(api.ListOptions{FieldSelector: fieldSelector}) nodeNonTerminatedPodsList, err := d.Core().Pods(namespace).List(api.ListOptions{FieldSelector: fieldSelector})
if err != nil { if err != nil {
if !errors.IsForbidden(err) { if !errors.IsForbidden(err) {
return "", err return "", err
@@ -1817,7 +1816,7 @@ func (d *NodeDescriber) Describe(namespace, name string, describerSettings Descr
} else { } else {
// TODO: We haven't decided the namespace for Node object yet. // TODO: We haven't decided the namespace for Node object yet.
ref.UID = types.UID(ref.Name) ref.UID = types.UID(ref.Name)
events, _ = d.Events("").Search(ref) events, _ = d.Core().Events("").Search(ref)
} }
} }
@@ -1904,7 +1903,7 @@ func describeNode(node *api.Node, nodeNonTerminatedPodsList *api.PodList, events
} }
type PetSetDescriber struct { type PetSetDescriber struct {
client *client.Client client clientset.Interface
} }
func (p *PetSetDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (p *PetSetDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
@@ -1912,7 +1911,7 @@ func (p *PetSetDescriber) Describe(namespace, name string, describerSettings Des
if err != nil { if err != nil {
return "", err return "", err
} }
pc := p.client.Pods(namespace) pc := p.client.Core().Pods(namespace)
selector, err := unversioned.LabelSelectorAsSelector(ps.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(ps.Spec.Selector)
if err != nil { if err != nil {
@@ -1936,7 +1935,7 @@ func (p *PetSetDescriber) Describe(namespace, name string, describerSettings Des
fmt.Fprintf(out, "Pods Status:\t%d Running / %d Waiting / %d Succeeded / %d Failed\n", running, waiting, succeeded, failed) fmt.Fprintf(out, "Pods Status:\t%d Running / %d Waiting / %d Succeeded / %d Failed\n", running, waiting, succeeded, failed)
describeVolumes(ps.Spec.Template.Spec.Volumes, out, "") describeVolumes(ps.Spec.Template.Spec.Volumes, out, "")
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ := p.client.Events(namespace).Search(ps) events, _ := p.client.Core().Events(namespace).Search(ps)
if events != nil { if events != nil {
DescribeEvents(events, out) DescribeEvents(events, out)
} }
@@ -1946,7 +1945,7 @@ func (p *PetSetDescriber) Describe(namespace, name string, describerSettings Des
} }
type CertificateSigningRequestDescriber struct { type CertificateSigningRequestDescriber struct {
client *client.Client client clientset.Interface
} }
func (p *CertificateSigningRequestDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (p *CertificateSigningRequestDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
@@ -2004,7 +2003,7 @@ func (p *CertificateSigningRequestDescriber) Describe(namespace, name string, de
} }
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ := p.client.Events(namespace).Search(csr) events, _ := p.client.Core().Events(namespace).Search(csr)
if events != nil { if events != nil {
DescribeEvents(events, out) DescribeEvents(events, out)
} }
@@ -2015,7 +2014,7 @@ func (p *CertificateSigningRequestDescriber) Describe(namespace, name string, de
// HorizontalPodAutoscalerDescriber generates information about a horizontal pod autoscaler. // HorizontalPodAutoscalerDescriber generates information about a horizontal pod autoscaler.
type HorizontalPodAutoscalerDescriber struct { type HorizontalPodAutoscalerDescriber struct {
client *client.Client client clientset.Interface
} }
func (d *HorizontalPodAutoscalerDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *HorizontalPodAutoscalerDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
@@ -2051,7 +2050,7 @@ func (d *HorizontalPodAutoscalerDescriber) Describe(namespace, name string, desc
// TODO: switch to scale subresource once the required code is submitted. // TODO: switch to scale subresource once the required code is submitted.
if strings.ToLower(hpa.Spec.ScaleTargetRef.Kind) == "replicationcontroller" { if strings.ToLower(hpa.Spec.ScaleTargetRef.Kind) == "replicationcontroller" {
fmt.Fprintf(out, "ReplicationController pods:\t") fmt.Fprintf(out, "ReplicationController pods:\t")
rc, err := d.client.ReplicationControllers(hpa.Namespace).Get(hpa.Spec.ScaleTargetRef.Name) rc, err := d.client.Core().ReplicationControllers(hpa.Namespace).Get(hpa.Spec.ScaleTargetRef.Name)
if err == nil { if err == nil {
fmt.Fprintf(out, "%d current / %d desired\n", rc.Status.Replicas, rc.Spec.Replicas) fmt.Fprintf(out, "%d current / %d desired\n", rc.Status.Replicas, rc.Spec.Replicas)
} else { } else {
@@ -2060,7 +2059,7 @@ func (d *HorizontalPodAutoscalerDescriber) Describe(namespace, name string, desc
} }
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, _ := d.client.Events(namespace).Search(hpa) events, _ := d.client.Core().Events(namespace).Search(hpa)
if events != nil { if events != nil {
DescribeEvents(events, out) DescribeEvents(events, out)
} }
@@ -2301,11 +2300,11 @@ func getPodStatusForController(c client.PodInterface, selector labels.Selector)
// ConfigMapDescriber generates information about a ConfigMap // ConfigMapDescriber generates information about a ConfigMap
type ConfigMapDescriber struct { type ConfigMapDescriber struct {
client.Interface clientset.Interface
} }
func (d *ConfigMapDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *ConfigMapDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
c := d.ConfigMaps(namespace) c := d.Core().ConfigMaps(namespace)
configMap, err := c.Get(name) configMap, err := c.Get(name)
if err != nil { if err != nil {
@@ -2373,7 +2372,7 @@ func describeCluster(cluster *federation.Cluster) (string, error) {
// NetworkPolicyDescriber generates information about a NetworkPolicy // NetworkPolicyDescriber generates information about a NetworkPolicy
type NetworkPolicyDescriber struct { type NetworkPolicyDescriber struct {
client.Interface clientset.Interface
} }
func (d *NetworkPolicyDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (d *NetworkPolicyDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
@@ -2399,7 +2398,7 @@ func describeNetworkPolicy(networkPolicy *extensions.NetworkPolicy) (string, err
} }
type StorageClassDescriber struct { type StorageClassDescriber struct {
client.Interface clientset.Interface
} }
func (s *StorageClassDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (s *StorageClassDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
@@ -2413,7 +2412,7 @@ func (s *StorageClassDescriber) Describe(namespace, name string, describerSettin
fmt.Fprintf(out, "Provisioner:\t%s\n", sc.Provisioner) fmt.Fprintf(out, "Provisioner:\t%s\n", sc.Provisioner)
fmt.Fprintf(out, "Parameters:\t%s\n", labels.FormatLabels(sc.Parameters)) fmt.Fprintf(out, "Parameters:\t%s\n", labels.FormatLabels(sc.Parameters))
if describerSettings.ShowEvents { if describerSettings.ShowEvents {
events, err := s.Events(namespace).Search(sc) events, err := s.Core().Events(namespace).Search(sc)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -32,20 +32,19 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/testclient"
) )
type describeClient struct { type describeClient struct {
T *testing.T T *testing.T
Namespace string Namespace string
Err error Err error
client.Interface internalclientset.Interface
} }
func TestDescribePod(t *testing.T) { func TestDescribePod(t *testing.T) {
fake := testclient.NewSimpleFake(&api.Pod{ fake := fake.NewSimpleClientset(&api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -67,7 +66,7 @@ func TestDescribePodTolerations(t *testing.T) {
podTolerations := []api.Toleration{{Key: "key1", Value: "value1"}, podTolerations := []api.Toleration{{Key: "key1", Value: "value1"},
{Key: "key2", Value: "value2"}} {Key: "key2", Value: "value2"}}
pt, _ := json.Marshal(podTolerations) pt, _ := json.Marshal(podTolerations)
fake := testclient.NewSimpleFake(&api.Pod{ fake := fake.NewSimpleClientset(&api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -88,7 +87,7 @@ func TestDescribePodTolerations(t *testing.T) {
} }
func TestDescribeService(t *testing.T) { func TestDescribeService(t *testing.T) {
fake := testclient.NewSimpleFake(&api.Service{ fake := fake.NewSimpleClientset(&api.Service{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -107,34 +106,40 @@ func TestDescribeService(t *testing.T) {
func TestPodDescribeResultsSorted(t *testing.T) { func TestPodDescribeResultsSorted(t *testing.T) {
// Arrange // Arrange
fake := testclient.NewSimpleFake(&api.EventList{ fake := fake.NewSimpleClientset(
Items: []api.Event{ &api.EventList{
{ Items: []api.Event{
Source: api.EventSource{Component: "kubelet"}, {
Message: "Item 1", ObjectMeta: api.ObjectMeta{Name: "one"},
FirstTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), Source: api.EventSource{Component: "kubelet"},
LastTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), Message: "Item 1",
Count: 1, FirstTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)),
Type: api.EventTypeNormal, LastTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)),
}, Count: 1,
{ Type: api.EventTypeNormal,
Source: api.EventSource{Component: "scheduler"}, },
Message: "Item 2", {
FirstTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), ObjectMeta: api.ObjectMeta{Name: "two"},
LastTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), Source: api.EventSource{Component: "scheduler"},
Count: 1, Message: "Item 2",
Type: api.EventTypeNormal, FirstTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)),
}, LastTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)),
{ Count: 1,
Source: api.EventSource{Component: "kubelet"}, Type: api.EventTypeNormal,
Message: "Item 3", },
FirstTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), {
LastTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), ObjectMeta: api.ObjectMeta{Name: "three"},
Count: 1, Source: api.EventSource{Component: "kubelet"},
Type: api.EventTypeNormal, Message: "Item 3",
FirstTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)),
LastTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)),
Count: 1,
Type: api.EventTypeNormal,
},
}, },
}, },
}) &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "bar"}},
)
c := &describeClient{T: t, Namespace: "foo", Interface: fake} c := &describeClient{T: t, Namespace: "foo", Interface: fake}
d := PodDescriber{c} d := PodDescriber{c}
@@ -483,6 +488,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
tests := map[string]*api.PersistentVolume{ tests := map[string]*api.PersistentVolume{
"hostpath": { "hostpath": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
HostPath: &api.HostPathVolumeSource{}, HostPath: &api.HostPathVolumeSource{},
@@ -490,6 +496,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"gce": { "gce": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{},
@@ -497,6 +504,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"ebs": { "ebs": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
AWSElasticBlockStore: &api.AWSElasticBlockStoreVolumeSource{}, AWSElasticBlockStore: &api.AWSElasticBlockStoreVolumeSource{},
@@ -504,6 +512,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"nfs": { "nfs": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
NFS: &api.NFSVolumeSource{}, NFS: &api.NFSVolumeSource{},
@@ -511,6 +520,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"iscsi": { "iscsi": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
ISCSI: &api.ISCSIVolumeSource{}, ISCSI: &api.ISCSIVolumeSource{},
@@ -518,6 +528,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"gluster": { "gluster": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
Glusterfs: &api.GlusterfsVolumeSource{}, Glusterfs: &api.GlusterfsVolumeSource{},
@@ -525,6 +536,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"rbd": { "rbd": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
RBD: &api.RBDVolumeSource{}, RBD: &api.RBDVolumeSource{},
@@ -532,6 +544,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"quobyte": { "quobyte": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
Quobyte: &api.QuobyteVolumeSource{}, Quobyte: &api.QuobyteVolumeSource{},
@@ -539,6 +552,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
}, },
}, },
"cinder": { "cinder": {
ObjectMeta: api.ObjectMeta{Name: "bar"},
Spec: api.PersistentVolumeSpec{ Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{ PersistentVolumeSource: api.PersistentVolumeSource{
Cinder: &api.CinderVolumeSource{}, Cinder: &api.CinderVolumeSource{},
@@ -548,7 +562,7 @@ func TestPersistentVolumeDescriber(t *testing.T) {
} }
for name, pv := range tests { for name, pv := range tests {
fake := testclient.NewSimpleFake(pv) fake := fake.NewSimpleClientset(pv)
c := PersistentVolumeDescriber{fake} c := PersistentVolumeDescriber{fake}
str, err := c.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) str, err := c.Describe("foo", "bar", DescriberSettings{ShowEvents: true})
if err != nil { if err != nil {
@@ -615,7 +629,7 @@ func TestDescribeCluster(t *testing.T) {
} }
func TestDescribeStorageClass(t *testing.T) { func TestDescribeStorageClass(t *testing.T) {
f := testclient.NewSimpleFake(&storage.StorageClass{ f := fake.NewSimpleClientset(&storage.StorageClass{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Name: "foo",
ResourceVersion: "4", ResourceVersion: "4",
@@ -659,7 +673,7 @@ func TestDescribeEvents(t *testing.T) {
m := map[string]Describer{ m := map[string]Describer{
"DaemonSetDescriber": &DaemonSetDescriber{ "DaemonSetDescriber": &DaemonSetDescriber{
testclient.NewSimpleFake(&extensions.DaemonSet{ fake.NewSimpleClientset(&extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -675,7 +689,7 @@ func TestDescribeEvents(t *testing.T) {
}, events), }, events),
}, },
"EndpointsDescriber": &EndpointsDescriber{ "EndpointsDescriber": &EndpointsDescriber{
testclient.NewSimpleFake(&api.Endpoints{ fake.NewSimpleClientset(&api.Endpoints{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -687,25 +701,23 @@ func TestDescribeEvents(t *testing.T) {
// - IngressDescriber // - IngressDescriber
// - JobDescriber // - JobDescriber
"NodeDescriber": &NodeDescriber{ "NodeDescriber": &NodeDescriber{
testclient.NewSimpleFake(&api.Node{ fake.NewSimpleClientset(&api.Node{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", SelfLink: "url/url/url",
SelfLink: "url/url/url",
}, },
}, events), }, events),
}, },
"PersistentVolumeDescriber": &PersistentVolumeDescriber{ "PersistentVolumeDescriber": &PersistentVolumeDescriber{
testclient.NewSimpleFake(&api.PersistentVolume{ fake.NewSimpleClientset(&api.PersistentVolume{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", SelfLink: "url/url/url",
SelfLink: "url/url/url",
}, },
}, events), }, events),
}, },
"PodDescriber": &PodDescriber{ "PodDescriber": &PodDescriber{
testclient.NewSimpleFake(&api.Pod{ fake.NewSimpleClientset(&api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -714,7 +726,7 @@ func TestDescribeEvents(t *testing.T) {
}, events), }, events),
}, },
"ReplicaSetDescriber": &ReplicaSetDescriber{ "ReplicaSetDescriber": &ReplicaSetDescriber{
testclient.NewSimpleFake(&extensions.ReplicaSet{ fake.NewSimpleClientset(&extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -722,7 +734,7 @@ func TestDescribeEvents(t *testing.T) {
}, events), }, events),
}, },
"ReplicationControllerDescriber": &ReplicationControllerDescriber{ "ReplicationControllerDescriber": &ReplicationControllerDescriber{
testclient.NewSimpleFake(&api.ReplicationController{ fake.NewSimpleClientset(&api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -730,7 +742,7 @@ func TestDescribeEvents(t *testing.T) {
}, events), }, events),
}, },
"Service": &ServiceDescriber{ "Service": &ServiceDescriber{
testclient.NewSimpleFake(&api.Service{ fake.NewSimpleClientset(&api.Service{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
@@ -738,10 +750,9 @@ func TestDescribeEvents(t *testing.T) {
}, events), }, events),
}, },
"StorageClass": &StorageClassDescriber{ "StorageClass": &StorageClassDescriber{
testclient.NewSimpleFake(&storage.StorageClass{ fake.NewSimpleClientset(&storage.StorageClass{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo",
}, },
}, events), }, events),
}, },

View File

@@ -25,7 +25,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
client "k8s.io/kubernetes/pkg/client/unversioned" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
) )
@@ -46,16 +46,16 @@ var (
) )
type HeapsterMetricsClient struct { type HeapsterMetricsClient struct {
*client.Client SVCClient coreclient.ServicesGetter
HeapsterNamespace string HeapsterNamespace string
HeapsterScheme string HeapsterScheme string
HeapsterService string HeapsterService string
HeapsterPort string HeapsterPort string
} }
func NewHeapsterMetricsClient(client *client.Client, namespace, scheme, service, port string) *HeapsterMetricsClient { func NewHeapsterMetricsClient(svcClient coreclient.ServicesGetter, namespace, scheme, service, port string) *HeapsterMetricsClient {
return &HeapsterMetricsClient{ return &HeapsterMetricsClient{
Client: client, SVCClient: svcClient,
HeapsterNamespace: namespace, HeapsterNamespace: namespace,
HeapsterScheme: scheme, HeapsterScheme: scheme,
HeapsterService: service, HeapsterService: service,
@@ -63,8 +63,8 @@ func NewHeapsterMetricsClient(client *client.Client, namespace, scheme, service,
} }
} }
func DefaultHeapsterMetricsClient(client *client.Client) *HeapsterMetricsClient { func DefaultHeapsterMetricsClient(svcClient coreclient.ServicesGetter) *HeapsterMetricsClient {
return NewHeapsterMetricsClient(client, DefaultHeapsterNamespace, DefaultHeapsterScheme, DefaultHeapsterService, DefaultHeapsterPort) return NewHeapsterMetricsClient(svcClient, DefaultHeapsterNamespace, DefaultHeapsterScheme, DefaultHeapsterService, DefaultHeapsterPort)
} }
func podMetricsUrl(namespace string, name string) (string, error) { func podMetricsUrl(namespace string, name string) (string, error) {
@@ -161,7 +161,7 @@ func (cli *HeapsterMetricsClient) GetPodMetrics(namespace string, podName string
} }
func GetHeapsterMetrics(cli *HeapsterMetricsClient, path string, params map[string]string) ([]byte, error) { func GetHeapsterMetrics(cli *HeapsterMetricsClient, path string, params map[string]string) ([]byte, error) {
return cli.Services(cli.HeapsterNamespace). return cli.SVCClient.Services(cli.HeapsterNamespace).
ProxyGet(cli.HeapsterScheme, cli.HeapsterService, cli.HeapsterPort, path, params). ProxyGet(cli.HeapsterScheme, cli.HeapsterService, cli.HeapsterPort, path, params).
DoRaw() DoRaw()
} }

View File

@@ -27,6 +27,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
@@ -109,8 +110,8 @@ const (
// RollingUpdater provides methods for updating replicated pods in a predictable, // RollingUpdater provides methods for updating replicated pods in a predictable,
// fault-tolerant way. // fault-tolerant way.
type RollingUpdater struct { type RollingUpdater struct {
// Client interface for creating and updating controllers rcClient coreclient.ReplicationControllersGetter
c client.Interface podClient coreclient.PodsGetter
// Namespace for resources // Namespace for resources
ns string ns string
// scaleAndWait scales a controller and returns its updated state. // scaleAndWait scales a controller and returns its updated state.
@@ -127,10 +128,11 @@ type RollingUpdater struct {
} }
// NewRollingUpdater creates a RollingUpdater from a client. // NewRollingUpdater creates a RollingUpdater from a client.
func NewRollingUpdater(namespace string, client client.Interface) *RollingUpdater { func NewRollingUpdater(namespace string, rcClient coreclient.ReplicationControllersGetter, podClient coreclient.PodsGetter) *RollingUpdater {
updater := &RollingUpdater{ updater := &RollingUpdater{
c: client, rcClient: rcClient,
ns: namespace, podClient: podClient,
ns: namespace,
} }
// Inject real implementations. // Inject real implementations.
updater.scaleAndWait = updater.scaleAndWaitWithScaler updater.scaleAndWait = updater.scaleAndWaitWithScaler
@@ -189,7 +191,7 @@ func (r *RollingUpdater) Update(config *RollingUpdaterConfig) error {
// annotation if it doesn't yet exist. // annotation if it doesn't yet exist.
_, hasOriginalAnnotation := oldRc.Annotations[originalReplicasAnnotation] _, hasOriginalAnnotation := oldRc.Annotations[originalReplicasAnnotation]
if !hasOriginalAnnotation { if !hasOriginalAnnotation {
existing, err := r.c.ReplicationControllers(oldRc.Namespace).Get(oldRc.Name) existing, err := r.rcClient.ReplicationControllers(oldRc.Namespace).Get(oldRc.Name)
if err != nil { if err != nil {
return err return err
} }
@@ -200,7 +202,7 @@ func (r *RollingUpdater) Update(config *RollingUpdaterConfig) error {
} }
rc.Annotations[originalReplicasAnnotation] = originReplicas rc.Annotations[originalReplicasAnnotation] = originReplicas
} }
if oldRc, err = updateRcWithRetries(r.c, existing.Namespace, existing, applyUpdate); err != nil { if oldRc, err = updateRcWithRetries(r.rcClient, existing.Namespace, existing, applyUpdate); err != nil {
return err return err
} }
} }
@@ -390,14 +392,11 @@ func (r *RollingUpdater) scaleDown(newRc, oldRc *api.ReplicationController, desi
// scalerScaleAndWait scales a controller using a Scaler and a real client. // scalerScaleAndWait scales a controller using a Scaler and a real client.
func (r *RollingUpdater) scaleAndWaitWithScaler(rc *api.ReplicationController, retry *RetryParams, wait *RetryParams) (*api.ReplicationController, error) { func (r *RollingUpdater) scaleAndWaitWithScaler(rc *api.ReplicationController, retry *RetryParams, wait *RetryParams) (*api.ReplicationController, error) {
scaler, err := ScalerFor(api.Kind("ReplicationController"), r.c) scaler := &ReplicationControllerScaler{r.rcClient}
if err != nil {
return nil, fmt.Errorf("Couldn't make scaler: %s", err)
}
if err := scaler.Scale(rc.Namespace, rc.Name, uint(rc.Spec.Replicas), &ScalePrecondition{-1, ""}, retry, wait); err != nil { if err := scaler.Scale(rc.Namespace, rc.Name, uint(rc.Spec.Replicas), &ScalePrecondition{-1, ""}, retry, wait); err != nil {
return nil, err return nil, err
} }
return r.c.ReplicationControllers(rc.Namespace).Get(rc.Name) return r.rcClient.ReplicationControllers(rc.Namespace).Get(rc.Name)
} }
// readyPods returns the old and new ready counts for their pods. // readyPods returns the old and new ready counts for their pods.
@@ -415,7 +414,7 @@ func (r *RollingUpdater) readyPods(oldRc, newRc *api.ReplicationController, minR
controller := controllers[i] controller := controllers[i]
selector := labels.Set(controller.Spec.Selector).AsSelector() selector := labels.Set(controller.Spec.Selector).AsSelector()
options := api.ListOptions{LabelSelector: selector} options := api.ListOptions{LabelSelector: selector}
pods, err := r.c.Pods(controller.Namespace).List(options) pods, err := r.podClient.Pods(controller.Namespace).List(options)
if err != nil { if err != nil {
return 0, 0, err return 0, 0, err
} }
@@ -460,7 +459,7 @@ func (r *RollingUpdater) getOrCreateTargetControllerWithClient(controller *api.R
controller.Annotations[desiredReplicasAnnotation] = fmt.Sprintf("%d", controller.Spec.Replicas) controller.Annotations[desiredReplicasAnnotation] = fmt.Sprintf("%d", controller.Spec.Replicas)
controller.Annotations[sourceIdAnnotation] = sourceId controller.Annotations[sourceIdAnnotation] = sourceId
controller.Spec.Replicas = 0 controller.Spec.Replicas = 0
newRc, err := r.c.ReplicationControllers(r.ns).Create(controller) newRc, err := r.rcClient.ReplicationControllers(r.ns).Create(controller)
return newRc, false, err return newRc, false, err
} }
// Validate and use the existing controller. // Validate and use the existing controller.
@@ -480,7 +479,7 @@ func (r *RollingUpdater) existingController(controller *api.ReplicationControlle
return nil, errors.NewNotFound(api.Resource("replicationcontrollers"), controller.Name) return nil, errors.NewNotFound(api.Resource("replicationcontrollers"), controller.Name)
} }
// controller name is required to get rc back // controller name is required to get rc back
return r.c.ReplicationControllers(controller.Namespace).Get(controller.Name) return r.rcClient.ReplicationControllers(controller.Namespace).Get(controller.Name)
} }
// cleanupWithClients performs cleanup tasks after the rolling update. Update // cleanupWithClients performs cleanup tasks after the rolling update. Update
@@ -489,7 +488,7 @@ func (r *RollingUpdater) existingController(controller *api.ReplicationControlle
func (r *RollingUpdater) cleanupWithClients(oldRc, newRc *api.ReplicationController, config *RollingUpdaterConfig) error { func (r *RollingUpdater) cleanupWithClients(oldRc, newRc *api.ReplicationController, config *RollingUpdaterConfig) error {
// Clean up annotations // Clean up annotations
var err error var err error
newRc, err = r.c.ReplicationControllers(r.ns).Get(newRc.Name) newRc, err = r.rcClient.ReplicationControllers(r.ns).Get(newRc.Name)
if err != nil { if err != nil {
return err return err
} }
@@ -497,14 +496,14 @@ func (r *RollingUpdater) cleanupWithClients(oldRc, newRc *api.ReplicationControl
delete(rc.Annotations, sourceIdAnnotation) delete(rc.Annotations, sourceIdAnnotation)
delete(rc.Annotations, desiredReplicasAnnotation) delete(rc.Annotations, desiredReplicasAnnotation)
} }
if newRc, err = updateRcWithRetries(r.c, r.ns, newRc, applyUpdate); err != nil { if newRc, err = updateRcWithRetries(r.rcClient, r.ns, newRc, applyUpdate); err != nil {
return err return err
} }
if err = wait.Poll(config.Interval, config.Timeout, client.ControllerHasDesiredReplicas(r.c, newRc)); err != nil { if err = wait.Poll(config.Interval, config.Timeout, client.ControllerHasDesiredReplicas(r.rcClient, newRc)); err != nil {
return err return err
} }
newRc, err = r.c.ReplicationControllers(r.ns).Get(newRc.Name) newRc, err = r.rcClient.ReplicationControllers(r.ns).Get(newRc.Name)
if err != nil { if err != nil {
return err return err
} }
@@ -513,15 +512,15 @@ func (r *RollingUpdater) cleanupWithClients(oldRc, newRc *api.ReplicationControl
case DeleteRollingUpdateCleanupPolicy: case DeleteRollingUpdateCleanupPolicy:
// delete old rc // delete old rc
fmt.Fprintf(config.Out, "Update succeeded. Deleting %s\n", oldRc.Name) fmt.Fprintf(config.Out, "Update succeeded. Deleting %s\n", oldRc.Name)
return r.c.ReplicationControllers(r.ns).Delete(oldRc.Name, nil) return r.rcClient.ReplicationControllers(r.ns).Delete(oldRc.Name, nil)
case RenameRollingUpdateCleanupPolicy: case RenameRollingUpdateCleanupPolicy:
// delete old rc // delete old rc
fmt.Fprintf(config.Out, "Update succeeded. Deleting old controller: %s\n", oldRc.Name) fmt.Fprintf(config.Out, "Update succeeded. Deleting old controller: %s\n", oldRc.Name)
if err := r.c.ReplicationControllers(r.ns).Delete(oldRc.Name, nil); err != nil { if err := r.rcClient.ReplicationControllers(r.ns).Delete(oldRc.Name, nil); err != nil {
return err return err
} }
fmt.Fprintf(config.Out, "Renaming %s to %s\n", oldRc.Name, newRc.Name) fmt.Fprintf(config.Out, "Renaming %s to %s\n", oldRc.Name, newRc.Name)
return Rename(r.c, newRc, oldRc.Name) return Rename(r.rcClient, newRc, oldRc.Name)
case PreserveRollingUpdateCleanupPolicy: case PreserveRollingUpdateCleanupPolicy:
return nil return nil
default: default:
@@ -529,7 +528,7 @@ func (r *RollingUpdater) cleanupWithClients(oldRc, newRc *api.ReplicationControl
} }
} }
func Rename(c client.ReplicationControllersNamespacer, rc *api.ReplicationController, newName string) error { func Rename(c coreclient.ReplicationControllersGetter, rc *api.ReplicationController, newName string) error {
oldName := rc.Name oldName := rc.Name
rc.Name = newName rc.Name = newName
rc.ResourceVersion = "" rc.ResourceVersion = ""
@@ -560,7 +559,7 @@ func Rename(c client.ReplicationControllersNamespacer, rc *api.ReplicationContro
return nil return nil
} }
func LoadExistingNextReplicationController(c client.ReplicationControllersNamespacer, namespace, newName string) (*api.ReplicationController, error) { func LoadExistingNextReplicationController(c coreclient.ReplicationControllersGetter, namespace, newName string) (*api.ReplicationController, error) {
if len(newName) == 0 { if len(newName) == 0 {
return nil, nil return nil, nil
} }
@@ -580,10 +579,10 @@ type NewControllerConfig struct {
PullPolicy api.PullPolicy PullPolicy api.PullPolicy
} }
func CreateNewControllerFromCurrentController(c client.Interface, codec runtime.Codec, cfg *NewControllerConfig) (*api.ReplicationController, error) { func CreateNewControllerFromCurrentController(rcClient coreclient.ReplicationControllersGetter, codec runtime.Codec, cfg *NewControllerConfig) (*api.ReplicationController, error) {
containerIndex := 0 containerIndex := 0
// load the old RC into the "new" RC // load the old RC into the "new" RC
newRc, err := c.ReplicationControllers(cfg.Namespace).Get(cfg.OldName) newRc, err := rcClient.ReplicationControllers(cfg.Namespace).Get(cfg.OldName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -669,21 +668,21 @@ func SetNextControllerAnnotation(rc *api.ReplicationController, name string) {
rc.Annotations[nextControllerAnnotation] = name rc.Annotations[nextControllerAnnotation] = name
} }
func UpdateExistingReplicationController(c client.Interface, oldRc *api.ReplicationController, namespace, newName, deploymentKey, deploymentValue string, out io.Writer) (*api.ReplicationController, error) { func UpdateExistingReplicationController(rcClient coreclient.ReplicationControllersGetter, podClient coreclient.PodsGetter, oldRc *api.ReplicationController, namespace, newName, deploymentKey, deploymentValue string, out io.Writer) (*api.ReplicationController, error) {
if _, found := oldRc.Spec.Selector[deploymentKey]; !found { if _, found := oldRc.Spec.Selector[deploymentKey]; !found {
SetNextControllerAnnotation(oldRc, newName) SetNextControllerAnnotation(oldRc, newName)
return AddDeploymentKeyToReplicationController(oldRc, c, deploymentKey, deploymentValue, namespace, out) return AddDeploymentKeyToReplicationController(oldRc, rcClient, podClient, deploymentKey, deploymentValue, namespace, out)
} else { } else {
// If we didn't need to update the controller for the deployment key, we still need to write // If we didn't need to update the controller for the deployment key, we still need to write
// the "next" controller. // the "next" controller.
applyUpdate := func(rc *api.ReplicationController) { applyUpdate := func(rc *api.ReplicationController) {
SetNextControllerAnnotation(rc, newName) SetNextControllerAnnotation(rc, newName)
} }
return updateRcWithRetries(c, namespace, oldRc, applyUpdate) return updateRcWithRetries(rcClient, namespace, oldRc, applyUpdate)
} }
} }
func AddDeploymentKeyToReplicationController(oldRc *api.ReplicationController, client client.Interface, deploymentKey, deploymentValue, namespace string, out io.Writer) (*api.ReplicationController, error) { func AddDeploymentKeyToReplicationController(oldRc *api.ReplicationController, rcClient coreclient.ReplicationControllersGetter, podClient coreclient.PodsGetter, deploymentKey, deploymentValue, namespace string, out io.Writer) (*api.ReplicationController, error) {
var err error var err error
// First, update the template label. This ensures that any newly created pods will have the new label // First, update the template label. This ensures that any newly created pods will have the new label
applyUpdate := func(rc *api.ReplicationController) { applyUpdate := func(rc *api.ReplicationController) {
@@ -692,7 +691,7 @@ func AddDeploymentKeyToReplicationController(oldRc *api.ReplicationController, c
} }
rc.Spec.Template.Labels[deploymentKey] = deploymentValue rc.Spec.Template.Labels[deploymentKey] = deploymentValue
} }
if oldRc, err = updateRcWithRetries(client, namespace, oldRc, applyUpdate); err != nil { if oldRc, err = updateRcWithRetries(rcClient, namespace, oldRc, applyUpdate); err != nil {
return nil, err return nil, err
} }
@@ -700,7 +699,7 @@ func AddDeploymentKeyToReplicationController(oldRc *api.ReplicationController, c
// TODO: extract the code from the label command and re-use it here. // TODO: extract the code from the label command and re-use it here.
selector := labels.SelectorFromSet(oldRc.Spec.Selector) selector := labels.SelectorFromSet(oldRc.Spec.Selector)
options := api.ListOptions{LabelSelector: selector} options := api.ListOptions{LabelSelector: selector}
podList, err := client.Pods(namespace).List(options) podList, err := podClient.Pods(namespace).List(options)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -715,7 +714,7 @@ func AddDeploymentKeyToReplicationController(oldRc *api.ReplicationController, c
p.Labels[deploymentKey] = deploymentValue p.Labels[deploymentKey] = deploymentValue
} }
} }
if pod, err = updatePodWithRetries(client, namespace, pod, applyUpdate); err != nil { if pod, err = updatePodWithRetries(podClient, namespace, pod, applyUpdate); err != nil {
return nil, err return nil, err
} }
} }
@@ -732,7 +731,7 @@ func AddDeploymentKeyToReplicationController(oldRc *api.ReplicationController, c
rc.Spec.Selector[deploymentKey] = deploymentValue rc.Spec.Selector[deploymentKey] = deploymentValue
} }
// Update the selector of the rc so it manages all the pods we updated above // Update the selector of the rc so it manages all the pods we updated above
if oldRc, err = updateRcWithRetries(client, namespace, oldRc, applyUpdate); err != nil { if oldRc, err = updateRcWithRetries(rcClient, namespace, oldRc, applyUpdate); err != nil {
return nil, err return nil, err
} }
@@ -741,11 +740,11 @@ func AddDeploymentKeyToReplicationController(oldRc *api.ReplicationController, c
// we've finished re-adopting existing pods to the rc. // we've finished re-adopting existing pods to the rc.
selector = labels.SelectorFromSet(selectorCopy) selector = labels.SelectorFromSet(selectorCopy)
options = api.ListOptions{LabelSelector: selector} options = api.ListOptions{LabelSelector: selector}
podList, err = client.Pods(namespace).List(options) podList, err = podClient.Pods(namespace).List(options)
for ix := range podList.Items { for ix := range podList.Items {
pod := &podList.Items[ix] pod := &podList.Items[ix]
if value, found := pod.Labels[deploymentKey]; !found || value != deploymentValue { if value, found := pod.Labels[deploymentKey]; !found || value != deploymentValue {
if err := client.Pods(namespace).Delete(pod.Name, nil); err != nil { if err := podClient.Pods(namespace).Delete(pod.Name, nil); err != nil {
return nil, err return nil, err
} }
} }
@@ -760,7 +759,7 @@ type updateRcFunc func(controller *api.ReplicationController)
// 1. Get latest resource // 1. Get latest resource
// 2. applyUpdate // 2. applyUpdate
// 3. Update the resource // 3. Update the resource
func updateRcWithRetries(c client.Interface, namespace string, rc *api.ReplicationController, applyUpdate updateRcFunc) (*api.ReplicationController, error) { func updateRcWithRetries(rcClient coreclient.ReplicationControllersGetter, namespace string, rc *api.ReplicationController, applyUpdate updateRcFunc) (*api.ReplicationController, error) {
// Deep copy the rc in case we failed on Get during retry loop // Deep copy the rc in case we failed on Get during retry loop
obj, err := api.Scheme.Copy(rc) obj, err := api.Scheme.Copy(rc)
if err != nil { if err != nil {
@@ -770,14 +769,14 @@ func updateRcWithRetries(c client.Interface, namespace string, rc *api.Replicati
err = client.RetryOnConflict(client.DefaultBackoff, func() (e error) { err = client.RetryOnConflict(client.DefaultBackoff, func() (e error) {
// Apply the update, then attempt to push it to the apiserver. // Apply the update, then attempt to push it to the apiserver.
applyUpdate(rc) applyUpdate(rc)
if rc, e = c.ReplicationControllers(namespace).Update(rc); e == nil { if rc, e = rcClient.ReplicationControllers(namespace).Update(rc); e == nil {
// rc contains the latest controller post update // rc contains the latest controller post update
return return
} }
updateErr := e updateErr := e
// Update the controller with the latest resource version, if the update failed we // Update the controller with the latest resource version, if the update failed we
// can't trust rc so use oldRc.Name. // can't trust rc so use oldRc.Name.
if rc, e = c.ReplicationControllers(namespace).Get(oldRc.Name); e != nil { if rc, e = rcClient.ReplicationControllers(namespace).Get(oldRc.Name); e != nil {
// The Get failed: Value in rc cannot be trusted. // The Get failed: Value in rc cannot be trusted.
rc = oldRc rc = oldRc
} }
@@ -795,7 +794,7 @@ type updatePodFunc func(controller *api.Pod)
// 1. Get latest resource // 1. Get latest resource
// 2. applyUpdate // 2. applyUpdate
// 3. Update the resource // 3. Update the resource
func updatePodWithRetries(c client.Interface, namespace string, pod *api.Pod, applyUpdate updatePodFunc) (*api.Pod, error) { func updatePodWithRetries(podClient coreclient.PodsGetter, namespace string, pod *api.Pod, applyUpdate updatePodFunc) (*api.Pod, error) {
// Deep copy the pod in case we failed on Get during retry loop // Deep copy the pod in case we failed on Get during retry loop
obj, err := api.Scheme.Copy(pod) obj, err := api.Scheme.Copy(pod)
if err != nil { if err != nil {
@@ -805,11 +804,11 @@ func updatePodWithRetries(c client.Interface, namespace string, pod *api.Pod, ap
err = client.RetryOnConflict(client.DefaultBackoff, func() (e error) { err = client.RetryOnConflict(client.DefaultBackoff, func() (e error) {
// Apply the update, then attempt to push it to the apiserver. // Apply the update, then attempt to push it to the apiserver.
applyUpdate(pod) applyUpdate(pod)
if pod, e = c.Pods(namespace).Update(pod); e == nil { if pod, e = podClient.Pods(namespace).Update(pod); e == nil {
return return
} }
updateErr := e updateErr := e
if pod, e = c.Pods(namespace).Get(oldPod.Name); e != nil { if pod, e = podClient.Pods(namespace).Get(oldPod.Name); e != nil {
pod = oldPod pod = oldPod
} }
// Only return the error from update // Only return the error from update
@@ -820,7 +819,7 @@ func updatePodWithRetries(c client.Interface, namespace string, pod *api.Pod, ap
return pod, err return pod, err
} }
func FindSourceController(r client.ReplicationControllersNamespacer, namespace, name string) (*api.ReplicationController, error) { func FindSourceController(r coreclient.ReplicationControllersGetter, namespace, name string) (*api.ReplicationController, error) {
list, err := r.ReplicationControllers(namespace).List(api.ListOptions{}) list, err := r.ReplicationControllers(namespace).List(api.ListOptions{})
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -31,10 +31,11 @@ import (
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
apitesting "k8s.io/kubernetes/pkg/api/testing" apitesting "k8s.io/kubernetes/pkg/api/testing"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned" testcore "k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/client/unversioned/fake" manualfake "k8s.io/kubernetes/pkg/client/unversioned/fake"
"k8s.io/kubernetes/pkg/client/unversioned/testclient"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/intstr"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
@@ -43,8 +44,9 @@ import (
func oldRc(replicas int, original int) *api.ReplicationController { func oldRc(replicas int, original int) *api.ReplicationController {
return &api.ReplicationController{ return &api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo-v1", Namespace: api.NamespaceDefault,
UID: "7764ae47-9092-11e4-8393-42010af018ff", Name: "foo-v1",
UID: "7764ae47-9092-11e4-8393-42010af018ff",
Annotations: map[string]string{ Annotations: map[string]string{
originalReplicasAnnotation: fmt.Sprintf("%d", original), originalReplicasAnnotation: fmt.Sprintf("%d", original),
}, },
@@ -75,7 +77,8 @@ func newRc(replicas int, desired int) *api.ReplicationController {
} }
rc.Spec.Selector = map[string]string{"version": "v2"} rc.Spec.Selector = map[string]string{"version": "v2"}
rc.ObjectMeta = api.ObjectMeta{ rc.ObjectMeta = api.ObjectMeta{
Name: "foo-v2", Namespace: api.NamespaceDefault,
Name: "foo-v2",
Annotations: map[string]string{ Annotations: map[string]string{
desiredReplicasAnnotation: fmt.Sprintf("%d", desired), desiredReplicasAnnotation: fmt.Sprintf("%d", desired),
sourceIdAnnotation: "foo-v1:7764ae47-9092-11e4-8393-42010af018ff", sourceIdAnnotation: "foo-v1:7764ae47-9092-11e4-8393-42010af018ff",
@@ -891,21 +894,11 @@ func TestUpdate_assignOriginalAnnotation(t *testing.T) {
oldRc := oldRc(1, 1) oldRc := oldRc(1, 1)
delete(oldRc.Annotations, originalReplicasAnnotation) delete(oldRc.Annotations, originalReplicasAnnotation)
newRc := newRc(1, 1) newRc := newRc(1, 1)
var updatedOldRc *api.ReplicationController fake := fake.NewSimpleClientset(oldRc)
fake := &testclient.Fake{}
fake.AddReactor("*", "*", func(action testclient.Action) (handled bool, ret runtime.Object, err error) {
switch a := action.(type) {
case testclient.GetAction:
return true, oldRc, nil
case testclient.UpdateAction:
updatedOldRc = a.GetObject().(*api.ReplicationController)
return true, updatedOldRc, nil
}
return false, nil, nil
})
updater := &RollingUpdater{ updater := &RollingUpdater{
c: fake, rcClient: fake.Core(),
ns: "default", podClient: fake.Core(),
ns: "default",
scaleAndWait: func(rc *api.ReplicationController, retry *RetryParams, wait *RetryParams) (*api.ReplicationController, error) { scaleAndWait: func(rc *api.ReplicationController, retry *RetryParams, wait *RetryParams) (*api.ReplicationController, error) {
return rc, nil return rc, nil
}, },
@@ -934,10 +927,11 @@ func TestUpdate_assignOriginalAnnotation(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if updatedOldRc == nil { updateAction := fake.Actions()[1].(testcore.UpdateAction)
t.Fatalf("expected rc to be updated") if updateAction.GetResource().GroupResource() != api.Resource("replicationcontrollers") {
t.Fatalf("expected rc to be updated: %#v", updateAction)
} }
if e, a := "1", updatedOldRc.Annotations[originalReplicasAnnotation]; e != a { if e, a := "1", updateAction.GetObject().(*api.ReplicationController).Annotations[originalReplicasAnnotation]; e != a {
t.Fatalf("expected annotation value %s, got %s", e, a) t.Fatalf("expected annotation value %s, got %s", e, a)
} }
} }
@@ -954,7 +948,8 @@ func TestRollingUpdater_multipleContainersInPod(t *testing.T) {
{ {
oldRc: &api.ReplicationController{ oldRc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Namespace: api.NamespaceDefault,
Name: "foo",
}, },
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Selector: map[string]string{ Selector: map[string]string{
@@ -983,7 +978,8 @@ func TestRollingUpdater_multipleContainersInPod(t *testing.T) {
}, },
newRc: &api.ReplicationController{ newRc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Namespace: api.NamespaceDefault,
Name: "foo",
}, },
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Selector: map[string]string{ Selector: map[string]string{
@@ -1017,7 +1013,8 @@ func TestRollingUpdater_multipleContainersInPod(t *testing.T) {
{ {
oldRc: &api.ReplicationController{ oldRc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Namespace: api.NamespaceDefault,
Name: "bar",
}, },
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Selector: map[string]string{ Selector: map[string]string{
@@ -1042,7 +1039,8 @@ func TestRollingUpdater_multipleContainersInPod(t *testing.T) {
}, },
newRc: &api.ReplicationController{ newRc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Namespace: api.NamespaceDefault,
Name: "bar",
}, },
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Selector: map[string]string{ Selector: map[string]string{
@@ -1072,14 +1070,7 @@ func TestRollingUpdater_multipleContainersInPod(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
fake := &testclient.Fake{} fake := fake.NewSimpleClientset(test.oldRc)
fake.AddReactor("*", "*", func(action testclient.Action) (handled bool, ret runtime.Object, err error) {
switch action.(type) {
case testclient.GetAction:
return true, test.oldRc, nil
}
return false, nil, nil
})
codec := testapi.Default.Codec() codec := testapi.Default.Codec()
@@ -1093,13 +1084,14 @@ func TestRollingUpdater_multipleContainersInPod(t *testing.T) {
test.newRc.Name = fmt.Sprintf("%s-%s", test.newRc.Name, deploymentHash) test.newRc.Name = fmt.Sprintf("%s-%s", test.newRc.Name, deploymentHash)
config := &NewControllerConfig{ config := &NewControllerConfig{
Namespace: api.NamespaceDefault,
OldName: test.oldRc.ObjectMeta.Name, OldName: test.oldRc.ObjectMeta.Name,
NewName: test.newRc.ObjectMeta.Name, NewName: test.newRc.ObjectMeta.Name,
Image: test.image, Image: test.image,
Container: test.container, Container: test.container,
DeploymentKey: test.deploymentKey, DeploymentKey: test.deploymentKey,
} }
updatedRc, err := CreateNewControllerFromCurrentController(fake, codec, config) updatedRc, err := CreateNewControllerFromCurrentController(fake.Core(), codec, config)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@@ -1168,10 +1160,13 @@ func TestRollingUpdater_cleanupWithClients(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
fake := testclient.NewSimpleFake(test.responses...) objs := []runtime.Object{rc}
objs = append(objs, test.responses...)
fake := fake.NewSimpleClientset(objs...)
updater := &RollingUpdater{ updater := &RollingUpdater{
ns: "default", ns: "default",
c: fake, rcClient: fake.Core(),
podClient: fake.Core(),
} }
config := &RollingUpdaterConfig{ config := &RollingUpdaterConfig{
Out: ioutil.Discard, Out: ioutil.Discard,
@@ -1206,20 +1201,20 @@ func TestRollingUpdater_cleanupWithClients_Rename(t *testing.T) {
rc := oldRc(2, 2) rc := oldRc(2, 2)
rcExisting := newRc(1, 3) rcExisting := newRc(1, 3)
expectedActions := []string{"delete", "get", "create"} expectedActions := []string{"delete", "get", "create"}
fake := &testclient.Fake{} fake := fake.NewSimpleClientset()
fake.AddReactor("*", "*", func(action testclient.Action) (handled bool, ret runtime.Object, err error) { fake.AddReactor("*", "*", func(action testcore.Action) (handled bool, ret runtime.Object, err error) {
switch action.(type) { switch action.(type) {
case testclient.CreateAction: case testcore.CreateAction:
return true, nil, nil return true, nil, nil
case testclient.GetAction: case testcore.GetAction:
return true, nil, errors.NewNotFound(unversioned.GroupResource{}, "") return true, nil, errors.NewNotFound(unversioned.GroupResource{}, "")
case testclient.DeleteAction: case testcore.DeleteAction:
return true, nil, nil return true, nil, nil
} }
return false, nil, nil return false, nil, nil
}) })
err := Rename(fake, rcExisting, rc.Name) err := Rename(fake.Core(), rcExisting, rc.Name)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@@ -1233,7 +1228,8 @@ func TestRollingUpdater_cleanupWithClients_Rename(t *testing.T) {
func TestFindSourceController(t *testing.T) { func TestFindSourceController(t *testing.T) {
ctrl1 := api.ReplicationController{ ctrl1 := api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "foo", Namespace: api.NamespaceDefault,
Name: "foo",
Annotations: map[string]string{ Annotations: map[string]string{
sourceIdAnnotation: "bar:1234", sourceIdAnnotation: "bar:1234",
}, },
@@ -1241,7 +1237,8 @@ func TestFindSourceController(t *testing.T) {
} }
ctrl2 := api.ReplicationController{ ctrl2 := api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "bar", Namespace: api.NamespaceDefault,
Name: "bar",
Annotations: map[string]string{ Annotations: map[string]string{
sourceIdAnnotation: "foo:12345", sourceIdAnnotation: "foo:12345",
}, },
@@ -1249,6 +1246,8 @@ func TestFindSourceController(t *testing.T) {
} }
ctrl3 := api.ReplicationController{ ctrl3 := api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "baz",
Annotations: map[string]string{ Annotations: map[string]string{
sourceIdAnnotation: "baz:45667", sourceIdAnnotation: "baz:45667",
}, },
@@ -1302,8 +1301,8 @@ func TestFindSourceController(t *testing.T) {
}, },
} }
for _, test := range tests { for _, test := range tests {
fakeClient := testclient.NewSimpleFake(test.list) fakeClient := fake.NewSimpleClientset(test.list)
ctrl, err := FindSourceController(fakeClient, "default", test.name) ctrl, err := FindSourceController(fakeClient.Core(), "default", test.name)
if test.expectError && err == nil { if test.expectError && err == nil {
t.Errorf("unexpected non-error") t.Errorf("unexpected non-error")
} }
@@ -1328,6 +1327,10 @@ func TestUpdateExistingReplicationController(t *testing.T) {
}{ }{
{ {
rc: &api.ReplicationController{ rc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
},
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Template: &api.PodTemplateSpec{}, Template: &api.PodTemplateSpec{},
}, },
@@ -1338,6 +1341,8 @@ func TestUpdateExistingReplicationController(t *testing.T) {
expectedRc: &api.ReplicationController{ expectedRc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
Annotations: map[string]string{ Annotations: map[string]string{
"kubectl.kubernetes.io/next-controller-id": "foo", "kubectl.kubernetes.io/next-controller-id": "foo",
}, },
@@ -1358,6 +1363,10 @@ func TestUpdateExistingReplicationController(t *testing.T) {
}, },
{ {
rc: &api.ReplicationController{ rc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
},
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Template: &api.PodTemplateSpec{ Template: &api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
@@ -1377,6 +1386,8 @@ func TestUpdateExistingReplicationController(t *testing.T) {
expectedRc: &api.ReplicationController{ expectedRc: &api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
Annotations: map[string]string{ Annotations: map[string]string{
"kubectl.kubernetes.io/next-controller-id": "foo", "kubectl.kubernetes.io/next-controller-id": "foo",
}, },
@@ -1398,8 +1409,8 @@ func TestUpdateExistingReplicationController(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
buffer := &bytes.Buffer{} buffer := &bytes.Buffer{}
fakeClient := testclient.NewSimpleFake(test.expectedRc) fakeClient := fake.NewSimpleClientset(test.expectedRc)
rc, err := UpdateExistingReplicationController(fakeClient, test.rc, "default", test.name, test.deploymentKey, test.deploymentValue, buffer) rc, err := UpdateExistingReplicationController(fakeClient.Core(), fakeClient.Core(), test.rc, "default", test.name, test.deploymentKey, test.deploymentValue, buffer)
if !reflect.DeepEqual(rc, test.expectedRc) { if !reflect.DeepEqual(rc, test.expectedRc) {
t.Errorf("expected:\n%#v\ngot:\n%#v\n", test.expectedRc, rc) t.Errorf("expected:\n%#v\ngot:\n%#v\n", test.expectedRc, rc)
} }
@@ -1453,9 +1464,9 @@ func TestUpdateRcWithRetries(t *testing.T) {
{StatusCode: 500, Header: header, Body: objBody(codec, &api.ReplicationController{})}, {StatusCode: 500, Header: header, Body: objBody(codec, &api.ReplicationController{})},
{StatusCode: 200, Header: header, Body: objBody(codec, rc)}, {StatusCode: 200, Header: header, Body: objBody(codec, rc)},
} }
fakeClient := &fake.RESTClient{ fakeClient := &manualfake.RESTClient{
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: testapi.Default.NegotiatedSerializer(),
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { Client: manualfake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
switch p, m := req.URL.Path, req.Method; { switch p, m := req.URL.Path, req.Method; {
case p == testapi.Default.ResourcePath("replicationcontrollers", "default", "rc") && m == "PUT": case p == testapi.Default.ResourcePath("replicationcontrollers", "default", "rc") && m == "PUT":
update := updates[0] update := updates[0]
@@ -1480,12 +1491,13 @@ func TestUpdateRcWithRetries(t *testing.T) {
} }
}), }),
} }
clientConfig := &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} clientConfig := &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs, GroupVersion: testapi.Default.GroupVersion()}}
client := client.NewOrDie(clientConfig) restClient, _ := restclient.RESTClientFor(clientConfig)
client.Client = fakeClient.Client restClient.Client = fakeClient.Client
clientset := internalclientset.New(restClient)
if rc, err := updateRcWithRetries( if rc, err := updateRcWithRetries(
client, "default", rc, func(c *api.ReplicationController) { clientset, "default", rc, func(c *api.ReplicationController) {
c.Spec.Selector["baz"] = "foobar" c.Spec.Selector["baz"] = "foobar"
}); err != nil { }); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@@ -1544,9 +1556,9 @@ func TestAddDeploymentHash(t *testing.T) {
seen := sets.String{} seen := sets.String{}
updatedRc := false updatedRc := false
fakeClient := &fake.RESTClient{ fakeClient := &manualfake.RESTClient{
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: testapi.Default.NegotiatedSerializer(),
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { Client: manualfake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
header := http.Header{} header := http.Header{}
header.Set("Content-Type", runtime.ContentTypeJSON) header.Set("Content-Type", runtime.ContentTypeJSON)
switch p, m := req.URL.Path, req.Method; { switch p, m := req.URL.Path, req.Method; {
@@ -1579,11 +1591,12 @@ func TestAddDeploymentHash(t *testing.T) {
} }
}), }),
} }
clientConfig := &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} clientConfig := &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs, GroupVersion: testapi.Default.GroupVersion()}}
client := client.NewOrDie(clientConfig) restClient, _ := restclient.RESTClientFor(clientConfig)
client.Client = fakeClient.Client restClient.Client = fakeClient.Client
clientset := internalclientset.New(restClient)
if _, err := AddDeploymentKeyToReplicationController(rc, client, "dk", "hash", api.NamespaceDefault, buf); err != nil { if _, err := AddDeploymentKeyToReplicationController(rc, clientset.Core(), clientset.Core(), "dk", "hash", api.NamespaceDefault, buf); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
for _, pod := range podList.Items { for _, pod := range podList.Items {
@@ -1597,8 +1610,10 @@ func TestAddDeploymentHash(t *testing.T) {
} }
func TestRollingUpdater_readyPods(t *testing.T) { func TestRollingUpdater_readyPods(t *testing.T) {
count := 0
now := unversioned.Date(2016, time.April, 1, 1, 0, 0, 0, time.UTC) now := unversioned.Date(2016, time.April, 1, 1, 0, 0, 0, time.UTC)
mkpod := func(owner *api.ReplicationController, ready bool, readyTime unversioned.Time) *api.Pod { mkpod := func(owner *api.ReplicationController, ready bool, readyTime unversioned.Time) *api.Pod {
count = count + 1
labels := map[string]string{} labels := map[string]string{}
for k, v := range owner.Spec.Selector { for k, v := range owner.Spec.Selector {
labels[k] = v labels[k] = v
@@ -1609,8 +1624,9 @@ func TestRollingUpdater_readyPods(t *testing.T) {
} }
return &api.Pod{ return &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "pod", Namespace: api.NamespaceDefault,
Labels: labels, Name: fmt.Sprintf("pod-%d", count),
Labels: labels,
}, },
Status: api.PodStatus{ Status: api.PodStatus{
Conditions: []api.PodCondition{ Conditions: []api.PodCondition{
@@ -1728,12 +1744,13 @@ func TestRollingUpdater_readyPods(t *testing.T) {
for _, ready := range test.newPods { for _, ready := range test.newPods {
pods = append(pods, mkpod(test.newRc, ready, test.podReadyTimeFn())) pods = append(pods, mkpod(test.newRc, ready, test.podReadyTimeFn()))
} }
client := testclient.NewSimpleFake(pods...) client := fake.NewSimpleClientset(pods...)
updater := &RollingUpdater{ updater := &RollingUpdater{
ns: "default", ns: "default",
c: client, rcClient: client.Core(),
nowFn: test.nowFn, podClient: client.Core(),
nowFn: test.nowFn,
} }
oldReady, newReady, err := updater.readyPods(test.oldRc, test.newRc, test.minReadySeconds) oldReady, newReady, err := updater.readyPods(test.oldRc, test.newRc, test.minReadySeconds)
if err != nil { if err != nil {

View File

@@ -21,7 +21,8 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned"
) )
// StatusViewer provides an interface for resources that provides rollout status. // StatusViewer provides an interface for resources that provides rollout status.
@@ -29,7 +30,7 @@ type StatusViewer interface {
Status(namespace, name string) (string, bool, error) Status(namespace, name string) (string, bool, error)
} }
func StatusViewerFor(kind unversioned.GroupKind, c client.Interface) (StatusViewer, error) { func StatusViewerFor(kind unversioned.GroupKind, c internalclientset.Interface) (StatusViewer, error) {
switch kind { switch kind {
case extensions.Kind("Deployment"): case extensions.Kind("Deployment"):
return &DeploymentStatusViewer{c.Extensions()}, nil return &DeploymentStatusViewer{c.Extensions()}, nil
@@ -38,7 +39,7 @@ func StatusViewerFor(kind unversioned.GroupKind, c client.Interface) (StatusView
} }
type DeploymentStatusViewer struct { type DeploymentStatusViewer struct {
c client.ExtensionsInterface c extensionsclient.DeploymentsGetter
} }
// Status returns a message describing deployment status, and a bool value indicating if the status is considered done // Status returns a message describing deployment status, and a bool value indicating if the status is considered done

View File

@@ -21,7 +21,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/unversioned/testclient" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
) )
func TestDeploymentStatusViewerStatus(t *testing.T) { func TestDeploymentStatusViewerStatus(t *testing.T) {
@@ -107,6 +107,7 @@ func TestDeploymentStatusViewerStatus(t *testing.T) {
for _, test := range tests { for _, test := range tests {
d := &extensions.Deployment{ d := &extensions.Deployment{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Namespace: "bar",
Name: "foo", Name: "foo",
UID: "8764ae47-9092-11e4-8393-42010af018ff", UID: "8764ae47-9092-11e4-8393-42010af018ff",
Generation: test.generation, Generation: test.generation,
@@ -116,7 +117,7 @@ func TestDeploymentStatusViewerStatus(t *testing.T) {
}, },
Status: test.status, Status: test.status,
} }
client := testclient.NewSimpleFake(d).Extensions() client := fake.NewSimpleClientset(d).Extensions()
dsv := &DeploymentStatusViewer{c: client} dsv := &DeploymentStatusViewer{c: client}
msg, done, err := dsv.Status("bar", "foo") msg, done, err := dsv.Status("bar", "foo")
if err != nil { if err != nil {

View File

@@ -27,6 +27,11 @@ import (
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
appsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/unversioned"
batchclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
@@ -44,10 +49,10 @@ type Scaler interface {
ScaleSimple(namespace, name string, preconditions *ScalePrecondition, newSize uint) (updatedResourceVersion string, err error) ScaleSimple(namespace, name string, preconditions *ScalePrecondition, newSize uint) (updatedResourceVersion string, err error)
} }
func ScalerFor(kind unversioned.GroupKind, c client.Interface) (Scaler, error) { func ScalerFor(kind unversioned.GroupKind, c internalclientset.Interface) (Scaler, error) {
switch kind { switch kind {
case api.Kind("ReplicationController"): case api.Kind("ReplicationController"):
return &ReplicationControllerScaler{c}, nil return &ReplicationControllerScaler{c.Core()}, nil
case extensions.Kind("ReplicaSet"): case extensions.Kind("ReplicaSet"):
return &ReplicaSetScaler{c.Extensions()}, nil return &ReplicaSetScaler{c.Extensions()}, nil
case extensions.Kind("Job"), batch.Kind("Job"): case extensions.Kind("Job"), batch.Kind("Job"):
@@ -155,7 +160,7 @@ func (precondition *ScalePrecondition) ValidateReplicationController(controller
} }
type ReplicationControllerScaler struct { type ReplicationControllerScaler struct {
c client.Interface c coreclient.ReplicationControllersGetter
} }
// ScaleSimple does a simple one-shot attempt at scaling. It returns the // ScaleSimple does a simple one-shot attempt at scaling. It returns the
@@ -253,7 +258,7 @@ func (precondition *ScalePrecondition) ValidateReplicaSet(replicaSet *extensions
} }
type ReplicaSetScaler struct { type ReplicaSetScaler struct {
c client.ExtensionsInterface c extensionsclient.ReplicaSetsGetter
} }
// ScaleSimple does a simple one-shot attempt at scaling. It returns the // ScaleSimple does a simple one-shot attempt at scaling. It returns the
@@ -324,7 +329,7 @@ func (precondition *ScalePrecondition) ValidateJob(job *batch.Job) error {
} }
type PetSetScaler struct { type PetSetScaler struct {
c client.AppsInterface c appsclient.PetSetsGetter
} }
// ScaleSimple does a simple one-shot attempt at scaling. It returns the // ScaleSimple does a simple one-shot attempt at scaling. It returns the
@@ -377,7 +382,7 @@ func (scaler *PetSetScaler) Scale(namespace, name string, newSize uint, precondi
} }
type JobScaler struct { type JobScaler struct {
c client.BatchInterface c batchclient.JobsGetter
} }
// ScaleSimple is responsible for updating job's parallelism. It returns the // ScaleSimple is responsible for updating job's parallelism. It returns the
@@ -445,7 +450,7 @@ func (precondition *ScalePrecondition) ValidateDeployment(deployment *extensions
} }
type DeploymentScaler struct { type DeploymentScaler struct {
c client.ExtensionsInterface c extensionsclient.DeploymentsGetter
} }
// ScaleSimple is responsible for updating a deployment's desired replicas // ScaleSimple is responsible for updating a deployment's desired replicas

View File

@@ -24,12 +24,15 @@ import (
kerrors "k8s.io/kubernetes/pkg/api/errors" kerrors "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
"k8s.io/kubernetes/pkg/client/unversioned/testclient" batchclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned"
testcore "k8s.io/kubernetes/pkg/client/testing/core"
) )
type ErrorReplicationControllers struct { type ErrorReplicationControllers struct {
testclient.FakeReplicationControllers coreclient.ReplicationControllerInterface
conflict bool conflict bool
invalid bool invalid bool
} }
@@ -45,26 +48,26 @@ func (c *ErrorReplicationControllers) Update(controller *api.ReplicationControll
} }
type ErrorReplicationControllerClient struct { type ErrorReplicationControllerClient struct {
testclient.Fake *fake.Clientset
conflict bool conflict bool
invalid bool invalid bool
} }
func (c *ErrorReplicationControllerClient) ReplicationControllers(namespace string) client.ReplicationControllerInterface { func (c *ErrorReplicationControllerClient) ReplicationControllers(namespace string) coreclient.ReplicationControllerInterface {
return &ErrorReplicationControllers{ return &ErrorReplicationControllers{
FakeReplicationControllers: testclient.FakeReplicationControllers{Fake: &c.Fake, Namespace: namespace}, ReplicationControllerInterface: c.Clientset.Core().ReplicationControllers(namespace),
conflict: c.conflict, conflict: c.conflict,
invalid: c.invalid, invalid: c.invalid,
} }
} }
func TestReplicationControllerScaleRetry(t *testing.T) { func TestReplicationControllerScaleRetry(t *testing.T) {
fake := &ErrorReplicationControllerClient{Fake: testclient.Fake{}, conflict: true} fake := &ErrorReplicationControllerClient{Clientset: fake.NewSimpleClientset(oldRc(0, 0)), conflict: true}
scaler := ReplicationControllerScaler{fake} scaler := ReplicationControllerScaler{fake}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo-v1"
namespace := "default" namespace := api.NamespaceDefault
scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count, nil) scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count, nil)
pass, err := scaleFunc() pass, err := scaleFunc()
@@ -83,11 +86,11 @@ func TestReplicationControllerScaleRetry(t *testing.T) {
} }
func TestReplicationControllerScaleInvalid(t *testing.T) { func TestReplicationControllerScaleInvalid(t *testing.T) {
fake := &ErrorReplicationControllerClient{Fake: testclient.Fake{}, invalid: true} fake := &ErrorReplicationControllerClient{Clientset: fake.NewSimpleClientset(oldRc(0, 0)), invalid: true}
scaler := ReplicationControllerScaler{fake} scaler := ReplicationControllerScaler{fake}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo-v1"
namespace := "default" namespace := "default"
scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count, nil) scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count, nil)
@@ -102,32 +105,33 @@ func TestReplicationControllerScaleInvalid(t *testing.T) {
} }
func TestReplicationControllerScale(t *testing.T) { func TestReplicationControllerScale(t *testing.T) {
fake := &testclient.Fake{} fake := fake.NewSimpleClientset(oldRc(0, 0))
scaler := ReplicationControllerScaler{fake} scaler := ReplicationControllerScaler{fake.Core()}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo-v1"
scaler.Scale("default", name, count, &preconditions, nil, nil) scaler.Scale("default", name, count, &preconditions, nil, nil)
actions := fake.Actions() actions := fake.Actions()
if len(actions) != 2 { if len(actions) != 2 {
t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions) t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions)
} }
if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "replicationcontrollers" || action.GetName() != name { if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != api.Resource("replicationcontrollers") || action.GetName() != name {
t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name)
} }
if action, ok := actions[1].(testclient.UpdateAction); !ok || action.GetResource() != "replicationcontrollers" || action.GetObject().(*api.ReplicationController).Spec.Replicas != int32(count) { if action, ok := actions[1].(testcore.UpdateAction); !ok || action.GetResource().GroupResource() != api.Resource("replicationcontrollers") || action.GetObject().(*api.ReplicationController).Spec.Replicas != int32(count) {
t.Errorf("unexpected action %v, expected update-replicationController with replicas = %d", actions[1], count) t.Errorf("unexpected action %v, expected update-replicationController with replicas = %d", actions[1], count)
} }
} }
func TestReplicationControllerScaleFailsPreconditions(t *testing.T) { func TestReplicationControllerScaleFailsPreconditions(t *testing.T) {
fake := testclient.NewSimpleFake(&api.ReplicationController{ fake := fake.NewSimpleClientset(&api.ReplicationController{
ObjectMeta: api.ObjectMeta{Namespace: api.NamespaceDefault, Name: "foo"},
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Replicas: 10, Replicas: 10,
}, },
}) })
scaler := ReplicationControllerScaler{fake} scaler := ReplicationControllerScaler{fake.Core()}
preconditions := ScalePrecondition{2, ""} preconditions := ScalePrecondition{2, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo"
@@ -137,7 +141,7 @@ func TestReplicationControllerScaleFailsPreconditions(t *testing.T) {
if len(actions) != 1 { if len(actions) != 1 {
t.Errorf("unexpected actions: %v, expected 1 action (get)", actions) t.Errorf("unexpected actions: %v, expected 1 action (get)", actions)
} }
if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "replicationcontrollers" || action.GetName() != name { if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != api.Resource("replicationcontrollers") || action.GetName() != name {
t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name)
} }
} }
@@ -258,7 +262,7 @@ func TestValidateReplicationController(t *testing.T) {
} }
type ErrorJobs struct { type ErrorJobs struct {
testclient.FakeJobsV1 batchclient.JobInterface
conflict bool conflict bool
invalid bool invalid bool
} }
@@ -283,21 +287,21 @@ func (c *ErrorJobs) Get(name string) (*batch.Job, error) {
} }
type ErrorJobClient struct { type ErrorJobClient struct {
testclient.FakeBatch batchclient.JobsGetter
conflict bool conflict bool
invalid bool invalid bool
} }
func (c *ErrorJobClient) Jobs(namespace string) client.JobInterface { func (c *ErrorJobClient) Jobs(namespace string) batchclient.JobInterface {
return &ErrorJobs{ return &ErrorJobs{
FakeJobsV1: testclient.FakeJobsV1{Fake: &c.FakeBatch, Namespace: namespace}, JobInterface: c.JobsGetter.Jobs(namespace),
conflict: c.conflict, conflict: c.conflict,
invalid: c.invalid, invalid: c.invalid,
} }
} }
func TestJobScaleRetry(t *testing.T) { func TestJobScaleRetry(t *testing.T) {
fake := &ErrorJobClient{FakeBatch: testclient.FakeBatch{}, conflict: true} fake := &ErrorJobClient{JobsGetter: fake.NewSimpleClientset().Batch(), conflict: true}
scaler := JobScaler{fake} scaler := JobScaler{fake}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
@@ -320,28 +324,37 @@ func TestJobScaleRetry(t *testing.T) {
} }
} }
func job() *batch.Job {
return &batch.Job{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
},
}
}
func TestJobScale(t *testing.T) { func TestJobScale(t *testing.T) {
fake := &testclient.FakeBatch{Fake: &testclient.Fake{}} fakeClientset := fake.NewSimpleClientset(job())
scaler := JobScaler{fake} scaler := JobScaler{fakeClientset.Batch()}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo"
scaler.Scale("default", name, count, &preconditions, nil, nil) scaler.Scale("default", name, count, &preconditions, nil, nil)
actions := fake.Actions() actions := fakeClientset.Actions()
if len(actions) != 2 { if len(actions) != 2 {
t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions) t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions)
} }
if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "jobs" || action.GetName() != name { if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != batch.Resource("jobs") || action.GetName() != name {
t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name)
} }
if action, ok := actions[1].(testclient.UpdateAction); !ok || action.GetResource() != "jobs" || *action.GetObject().(*batch.Job).Spec.Parallelism != int32(count) { if action, ok := actions[1].(testcore.UpdateAction); !ok || action.GetResource().GroupResource() != batch.Resource("jobs") || *action.GetObject().(*batch.Job).Spec.Parallelism != int32(count) {
t.Errorf("unexpected action %v, expected update-job with parallelism = %d", actions[1], count) t.Errorf("unexpected action %v, expected update-job with parallelism = %d", actions[1], count)
} }
} }
func TestJobScaleInvalid(t *testing.T) { func TestJobScaleInvalid(t *testing.T) {
fake := &ErrorJobClient{FakeBatch: testclient.FakeBatch{}, invalid: true} fake := &ErrorJobClient{JobsGetter: fake.NewSimpleClientset().Batch(), invalid: true}
scaler := JobScaler{fake} scaler := JobScaler{fake}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
@@ -361,12 +374,16 @@ func TestJobScaleInvalid(t *testing.T) {
func TestJobScaleFailsPreconditions(t *testing.T) { func TestJobScaleFailsPreconditions(t *testing.T) {
ten := int32(10) ten := int32(10)
fake := testclient.NewSimpleFake(&batch.Job{ fake := fake.NewSimpleClientset(&batch.Job{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
},
Spec: batch.JobSpec{ Spec: batch.JobSpec{
Parallelism: &ten, Parallelism: &ten,
}, },
}) })
scaler := JobScaler{&testclient.FakeBatch{Fake: fake}} scaler := JobScaler{fake.Batch()}
preconditions := ScalePrecondition{2, ""} preconditions := ScalePrecondition{2, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo"
@@ -376,7 +393,7 @@ func TestJobScaleFailsPreconditions(t *testing.T) {
if len(actions) != 1 { if len(actions) != 1 {
t.Errorf("unexpected actions: %v, expected 1 actions (get)", actions) t.Errorf("unexpected actions: %v, expected 1 actions (get)", actions)
} }
if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "jobs" || action.GetName() != name { if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != batch.Resource("jobs") || action.GetName() != name {
t.Errorf("unexpected action: %v, expected get-job %s", actions[0], name) t.Errorf("unexpected action: %v, expected get-job %s", actions[0], name)
} }
} }
@@ -508,7 +525,7 @@ func TestValidateJob(t *testing.T) {
} }
type ErrorDeployments struct { type ErrorDeployments struct {
testclient.FakeDeployments extensionsclient.DeploymentInterface
conflict bool conflict bool
invalid bool invalid bool
} }
@@ -532,21 +549,21 @@ func (c *ErrorDeployments) Get(name string) (*extensions.Deployment, error) {
} }
type ErrorDeploymentClient struct { type ErrorDeploymentClient struct {
testclient.FakeExperimental extensionsclient.DeploymentsGetter
conflict bool conflict bool
invalid bool invalid bool
} }
func (c *ErrorDeploymentClient) Deployments(namespace string) client.DeploymentInterface { func (c *ErrorDeploymentClient) Deployments(namespace string) extensionsclient.DeploymentInterface {
return &ErrorDeployments{ return &ErrorDeployments{
FakeDeployments: testclient.FakeDeployments{Fake: &c.FakeExperimental, Namespace: namespace}, DeploymentInterface: c.DeploymentsGetter.Deployments(namespace),
invalid: c.invalid, invalid: c.invalid,
conflict: c.conflict, conflict: c.conflict,
} }
} }
func TestDeploymentScaleRetry(t *testing.T) { func TestDeploymentScaleRetry(t *testing.T) {
fake := &ErrorDeploymentClient{FakeExperimental: testclient.FakeExperimental{}, conflict: true} fake := &ErrorDeploymentClient{DeploymentsGetter: fake.NewSimpleClientset().Extensions(), conflict: true}
scaler := &DeploymentScaler{fake} scaler := &DeploymentScaler{fake}
preconditions := &ScalePrecondition{-1, ""} preconditions := &ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
@@ -569,9 +586,18 @@ func TestDeploymentScaleRetry(t *testing.T) {
} }
} }
func deployment() *extensions.Deployment {
return &extensions.Deployment{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
},
}
}
func TestDeploymentScale(t *testing.T) { func TestDeploymentScale(t *testing.T) {
fake := &testclient.FakeExperimental{Fake: &testclient.Fake{}} fake := fake.NewSimpleClientset(deployment())
scaler := DeploymentScaler{fake} scaler := DeploymentScaler{fake.Extensions()}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo"
@@ -581,16 +607,16 @@ func TestDeploymentScale(t *testing.T) {
if len(actions) != 2 { if len(actions) != 2 {
t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions) t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions)
} }
if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "deployments" || action.GetName() != name { if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != extensions.Resource("deployments") || action.GetName() != name {
t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name)
} }
if action, ok := actions[1].(testclient.UpdateAction); !ok || action.GetResource() != "deployments" || action.GetObject().(*extensions.Deployment).Spec.Replicas != int32(count) { if action, ok := actions[1].(testcore.UpdateAction); !ok || action.GetResource().GroupResource() != extensions.Resource("deployments") || action.GetObject().(*extensions.Deployment).Spec.Replicas != int32(count) {
t.Errorf("unexpected action %v, expected update-deployment with replicas = %d", actions[1], count) t.Errorf("unexpected action %v, expected update-deployment with replicas = %d", actions[1], count)
} }
} }
func TestDeploymentScaleInvalid(t *testing.T) { func TestDeploymentScaleInvalid(t *testing.T) {
fake := &ErrorDeploymentClient{FakeExperimental: testclient.FakeExperimental{}, invalid: true} fake := &ErrorDeploymentClient{DeploymentsGetter: fake.NewSimpleClientset().Extensions(), invalid: true}
scaler := DeploymentScaler{fake} scaler := DeploymentScaler{fake}
preconditions := ScalePrecondition{-1, ""} preconditions := ScalePrecondition{-1, ""}
count := uint(3) count := uint(3)
@@ -609,12 +635,16 @@ func TestDeploymentScaleInvalid(t *testing.T) {
} }
func TestDeploymentScaleFailsPreconditions(t *testing.T) { func TestDeploymentScaleFailsPreconditions(t *testing.T) {
fake := testclient.NewSimpleFake(&extensions.Deployment{ fake := fake.NewSimpleClientset(&extensions.Deployment{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
},
Spec: extensions.DeploymentSpec{ Spec: extensions.DeploymentSpec{
Replicas: 10, Replicas: 10,
}, },
}) })
scaler := DeploymentScaler{&testclient.FakeExperimental{Fake: fake}} scaler := DeploymentScaler{fake.Extensions()}
preconditions := ScalePrecondition{2, ""} preconditions := ScalePrecondition{2, ""}
count := uint(3) count := uint(3)
name := "foo" name := "foo"
@@ -624,7 +654,7 @@ func TestDeploymentScaleFailsPreconditions(t *testing.T) {
if len(actions) != 1 { if len(actions) != 1 {
t.Errorf("unexpected actions: %v, expected 1 actions (get)", actions) t.Errorf("unexpected actions: %v, expected 1 actions (get)", actions)
} }
if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "deployments" || action.GetName() != name { if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != extensions.Resource("deployments") || action.GetName() != name {
t.Errorf("unexpected action: %v, expected get-deployment %s", actions[0], name) t.Errorf("unexpected action: %v, expected get-deployment %s", actions[0], name)
} }
} }

View File

@@ -28,6 +28,11 @@ import (
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
appsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/unversioned"
batchclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
@@ -63,68 +68,71 @@ func IsNoSuchReaperError(err error) bool {
return ok return ok
} }
func ReaperFor(kind unversioned.GroupKind, c client.Interface) (Reaper, error) { func ReaperFor(kind unversioned.GroupKind, c internalclientset.Interface) (Reaper, error) {
switch kind { switch kind {
case api.Kind("ReplicationController"): case api.Kind("ReplicationController"):
return &ReplicationControllerReaper{c, Interval, Timeout}, nil return &ReplicationControllerReaper{c.Core(), Interval, Timeout}, nil
case extensions.Kind("ReplicaSet"): case extensions.Kind("ReplicaSet"):
return &ReplicaSetReaper{c, Interval, Timeout}, nil return &ReplicaSetReaper{c.Extensions(), Interval, Timeout}, nil
case extensions.Kind("DaemonSet"): case extensions.Kind("DaemonSet"):
return &DaemonSetReaper{c, Interval, Timeout}, nil return &DaemonSetReaper{c.Extensions(), Interval, Timeout}, nil
case api.Kind("Pod"): case api.Kind("Pod"):
return &PodReaper{c}, nil return &PodReaper{c.Core()}, nil
case api.Kind("Service"): case api.Kind("Service"):
return &ServiceReaper{c}, nil return &ServiceReaper{c.Core()}, nil
case extensions.Kind("Job"), batch.Kind("Job"): case extensions.Kind("Job"), batch.Kind("Job"):
return &JobReaper{c, Interval, Timeout}, nil return &JobReaper{c.Batch(), c.Core(), Interval, Timeout}, nil
case apps.Kind("PetSet"): case apps.Kind("PetSet"):
return &PetSetReaper{c, Interval, Timeout}, nil return &PetSetReaper{c.Apps(), c.Core(), Interval, Timeout}, nil
case extensions.Kind("Deployment"): case extensions.Kind("Deployment"):
return &DeploymentReaper{c, Interval, Timeout}, nil return &DeploymentReaper{c.Extensions(), c.Extensions(), Interval, Timeout}, nil
} }
return nil, &NoSuchReaperError{kind} return nil, &NoSuchReaperError{kind}
} }
func ReaperForReplicationController(c client.Interface, timeout time.Duration) (Reaper, error) { func ReaperForReplicationController(rcClient coreclient.ReplicationControllersGetter, timeout time.Duration) (Reaper, error) {
return &ReplicationControllerReaper{c, Interval, timeout}, nil return &ReplicationControllerReaper{rcClient, Interval, timeout}, nil
} }
type ReplicationControllerReaper struct { type ReplicationControllerReaper struct {
client.Interface client coreclient.ReplicationControllersGetter
pollInterval, timeout time.Duration pollInterval, timeout time.Duration
} }
type ReplicaSetReaper struct { type ReplicaSetReaper struct {
client.Interface client extensionsclient.ReplicaSetsGetter
pollInterval, timeout time.Duration pollInterval, timeout time.Duration
} }
type DaemonSetReaper struct { type DaemonSetReaper struct {
client.Interface client extensionsclient.DaemonSetsGetter
pollInterval, timeout time.Duration pollInterval, timeout time.Duration
} }
type JobReaper struct { type JobReaper struct {
client.Interface client batchclient.JobsGetter
podClient coreclient.PodsGetter
pollInterval, timeout time.Duration pollInterval, timeout time.Duration
} }
type DeploymentReaper struct { type DeploymentReaper struct {
client.Interface dClient extensionsclient.DeploymentsGetter
rsClient extensionsclient.ReplicaSetsGetter
pollInterval, timeout time.Duration pollInterval, timeout time.Duration
} }
type PodReaper struct { type PodReaper struct {
client.Interface client coreclient.PodsGetter
} }
type ServiceReaper struct { type ServiceReaper struct {
client.Interface client coreclient.ServicesGetter
} }
type PetSetReaper struct { type PetSetReaper struct {
client.Interface client appsclient.PetSetsGetter
podClient coreclient.PodsGetter
pollInterval, timeout time.Duration pollInterval, timeout time.Duration
} }
@@ -134,8 +142,8 @@ type objInterface interface {
} }
// getOverlappingControllers finds rcs that this controller overlaps, as well as rcs overlapping this controller. // getOverlappingControllers finds rcs that this controller overlaps, as well as rcs overlapping this controller.
func getOverlappingControllers(c client.ReplicationControllerInterface, rc *api.ReplicationController) ([]api.ReplicationController, error) { func getOverlappingControllers(rcClient coreclient.ReplicationControllerInterface, rc *api.ReplicationController) ([]api.ReplicationController, error) {
rcs, err := c.List(api.ListOptions{}) rcs, err := rcClient.List(api.ListOptions{})
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting replication controllers: %v", err) return nil, fmt.Errorf("error getting replication controllers: %v", err)
} }
@@ -151,11 +159,8 @@ func getOverlappingControllers(c client.ReplicationControllerInterface, rc *api.
} }
func (reaper *ReplicationControllerReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *ReplicationControllerReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
rc := reaper.ReplicationControllers(namespace) rc := reaper.client.ReplicationControllers(namespace)
scaler, err := ScalerFor(api.Kind("ReplicationController"), *reaper) scaler := &ReplicationControllerScaler{reaper.client}
if err != nil {
return err
}
ctrl, err := rc.Get(name) ctrl, err := rc.Get(name)
if err != nil { if err != nil {
return err return err
@@ -223,11 +228,8 @@ func getOverlappingReplicaSets(c client.ReplicaSetInterface, rs *extensions.Repl
} }
func (reaper *ReplicaSetReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *ReplicaSetReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
rsc := reaper.Extensions().ReplicaSets(namespace) rsc := reaper.client.ReplicaSets(namespace)
scaler, err := ScalerFor(extensions.Kind("ReplicaSet"), *reaper) scaler := &ReplicaSetScaler{reaper.client}
if err != nil {
return err
}
rs, err := rsc.Get(name) rs, err := rsc.Get(name)
if err != nil { if err != nil {
return err return err
@@ -290,7 +292,7 @@ func (reaper *ReplicaSetReaper) Stop(namespace, name string, timeout time.Durati
} }
func (reaper *DaemonSetReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *DaemonSetReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
ds, err := reaper.Extensions().DaemonSets(namespace).Get(name) ds, err := reaper.client.DaemonSets(namespace).Get(name)
if err != nil { if err != nil {
return err return err
} }
@@ -305,13 +307,13 @@ func (reaper *DaemonSetReaper) Stop(namespace, name string, timeout time.Duratio
// force update to avoid version conflict // force update to avoid version conflict
ds.ResourceVersion = "" ds.ResourceVersion = ""
if ds, err = reaper.Extensions().DaemonSets(namespace).Update(ds); err != nil { if ds, err = reaper.client.DaemonSets(namespace).Update(ds); err != nil {
return err return err
} }
// Wait for the daemon set controller to kill all the daemon pods. // Wait for the daemon set controller to kill all the daemon pods.
if err := wait.Poll(reaper.pollInterval, reaper.timeout, func() (bool, error) { if err := wait.Poll(reaper.pollInterval, reaper.timeout, func() (bool, error) {
updatedDS, err := reaper.Extensions().DaemonSets(namespace).Get(name) updatedDS, err := reaper.client.DaemonSets(namespace).Get(name)
if err != nil { if err != nil {
return false, nil return false, nil
} }
@@ -321,15 +323,12 @@ func (reaper *DaemonSetReaper) Stop(namespace, name string, timeout time.Duratio
return err return err
} }
return reaper.Extensions().DaemonSets(namespace).Delete(name) return reaper.client.DaemonSets(namespace).Delete(name, nil)
} }
func (reaper *PetSetReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *PetSetReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
petsets := reaper.Apps().PetSets(namespace) petsets := reaper.client.PetSets(namespace)
scaler, err := ScalerFor(apps.Kind("PetSet"), *reaper) scaler := &PetSetScaler{reaper.client}
if err != nil {
return err
}
ps, err := petsets.Get(name) ps, err := petsets.Get(name)
if err != nil { if err != nil {
return err return err
@@ -346,7 +345,7 @@ func (reaper *PetSetReaper) Stop(namespace, name string, timeout time.Duration,
// TODO: This shouldn't be needed, see corresponding TODO in PetSetHasDesiredPets. // TODO: This shouldn't be needed, see corresponding TODO in PetSetHasDesiredPets.
// PetSet should track generation number. // PetSet should track generation number.
pods := reaper.Pods(namespace) pods := reaper.podClient.Pods(namespace)
selector, _ := unversioned.LabelSelectorAsSelector(ps.Spec.Selector) selector, _ := unversioned.LabelSelectorAsSelector(ps.Spec.Selector)
options := api.ListOptions{LabelSelector: selector} options := api.ListOptions{LabelSelector: selector}
podList, err := pods.List(options) podList, err := pods.List(options)
@@ -372,12 +371,9 @@ func (reaper *PetSetReaper) Stop(namespace, name string, timeout time.Duration,
} }
func (reaper *JobReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *JobReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
jobs := reaper.Batch().Jobs(namespace) jobs := reaper.client.Jobs(namespace)
pods := reaper.Pods(namespace) pods := reaper.podClient.Pods(namespace)
scaler, err := ScalerFor(batch.Kind("Job"), *reaper) scaler := &JobScaler{reaper.client}
if err != nil {
return err
}
job, err := jobs.Get(name) job, err := jobs.Get(name)
if err != nil { if err != nil {
return err return err
@@ -418,9 +414,9 @@ func (reaper *JobReaper) Stop(namespace, name string, timeout time.Duration, gra
} }
func (reaper *DeploymentReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *DeploymentReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
deployments := reaper.Extensions().Deployments(namespace) deployments := reaper.dClient.Deployments(namespace)
replicaSets := reaper.Extensions().ReplicaSets(namespace) replicaSets := reaper.rsClient.ReplicaSets(namespace)
rsReaper, _ := ReaperFor(extensions.Kind("ReplicaSet"), reaper) rsReaper := &ReplicaSetReaper{reaper.rsClient, reaper.pollInterval, reaper.timeout}
deployment, err := reaper.updateDeploymentWithRetries(namespace, name, func(d *extensions.Deployment) { deployment, err := reaper.updateDeploymentWithRetries(namespace, name, func(d *extensions.Deployment) {
// set deployment's history and scale to 0 // set deployment's history and scale to 0
@@ -473,7 +469,7 @@ func (reaper *DeploymentReaper) Stop(namespace, name string, timeout time.Durati
type updateDeploymentFunc func(d *extensions.Deployment) type updateDeploymentFunc func(d *extensions.Deployment)
func (reaper *DeploymentReaper) updateDeploymentWithRetries(namespace, name string, applyUpdate updateDeploymentFunc) (deployment *extensions.Deployment, err error) { func (reaper *DeploymentReaper) updateDeploymentWithRetries(namespace, name string, applyUpdate updateDeploymentFunc) (deployment *extensions.Deployment, err error) {
deployments := reaper.Extensions().Deployments(namespace) deployments := reaper.dClient.Deployments(namespace)
err = wait.Poll(10*time.Millisecond, 1*time.Minute, func() (bool, error) { err = wait.Poll(10*time.Millisecond, 1*time.Minute, func() (bool, error) {
if deployment, err = deployments.Get(name); err != nil { if deployment, err = deployments.Get(name); err != nil {
return false, err return false, err
@@ -493,7 +489,7 @@ func (reaper *DeploymentReaper) updateDeploymentWithRetries(namespace, name stri
} }
func (reaper *PodReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *PodReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
pods := reaper.Pods(namespace) pods := reaper.client.Pods(namespace)
_, err := pods.Get(name) _, err := pods.Get(name)
if err != nil { if err != nil {
return err return err
@@ -502,10 +498,10 @@ func (reaper *PodReaper) Stop(namespace, name string, timeout time.Duration, gra
} }
func (reaper *ServiceReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error { func (reaper *ServiceReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
services := reaper.Services(namespace) services := reaper.client.Services(namespace)
_, err := services.Get(name) _, err := services.Get(name)
if err != nil { if err != nil {
return err return err
} }
return services.Delete(name) return services.Delete(name, nil)
} }

View File

@@ -28,8 +28,9 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
"k8s.io/kubernetes/pkg/client/unversioned/testclient" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
testcore "k8s.io/kubernetes/pkg/client/testing/core"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
@@ -47,15 +48,6 @@ func TestReplicationControllerStop(t *testing.T) {
{ {
Name: "OnlyOneRC", Name: "OnlyOneRC",
Objs: []runtime.Object{ Objs: []runtime.Object{
&api.ReplicationController{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: api.ReplicationControllerSpec{
Replicas: 0,
Selector: map[string]string{"k1": "v1"}},
},
&api.ReplicationControllerList{ // LIST &api.ReplicationControllerList{ // LIST
Items: []api.ReplicationController{ Items: []api.ReplicationController{
{ {
@@ -76,15 +68,6 @@ func TestReplicationControllerStop(t *testing.T) {
{ {
Name: "NoOverlapping", Name: "NoOverlapping",
Objs: []runtime.Object{ Objs: []runtime.Object{
&api.ReplicationController{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: api.ReplicationControllerSpec{
Replicas: 0,
Selector: map[string]string{"k1": "v1"}},
},
&api.ReplicationControllerList{ // LIST &api.ReplicationControllerList{ // LIST
Items: []api.ReplicationController{ Items: []api.ReplicationController{
{ {
@@ -115,15 +98,6 @@ func TestReplicationControllerStop(t *testing.T) {
Name: "OverlappingError", Name: "OverlappingError",
Objs: []runtime.Object{ Objs: []runtime.Object{
&api.ReplicationController{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: api.ReplicationControllerSpec{
Replicas: 0,
Selector: map[string]string{"k1": "v1"}},
},
&api.ReplicationControllerList{ // LIST &api.ReplicationControllerList{ // LIST
Items: []api.ReplicationController{ Items: []api.ReplicationController{
{ {
@@ -155,15 +129,6 @@ func TestReplicationControllerStop(t *testing.T) {
Name: "OverlappingButSafeDelete", Name: "OverlappingButSafeDelete",
Objs: []runtime.Object{ Objs: []runtime.Object{
&api.ReplicationController{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: api.ReplicationControllerSpec{
Replicas: 0,
Selector: map[string]string{"k1": "v1", "k2": "v2"}},
},
&api.ReplicationControllerList{ // LIST &api.ReplicationControllerList{ // LIST
Items: []api.ReplicationController{ Items: []api.ReplicationController{
{ {
@@ -205,15 +170,6 @@ func TestReplicationControllerStop(t *testing.T) {
Name: "TwoExactMatchRCs", Name: "TwoExactMatchRCs",
Objs: []runtime.Object{ Objs: []runtime.Object{
&api.ReplicationController{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: api.ReplicationControllerSpec{
Replicas: 0,
Selector: map[string]string{"k1": "v1"}},
},
&api.ReplicationControllerList{ // LIST &api.ReplicationControllerList{ // LIST
Items: []api.ReplicationController{ Items: []api.ReplicationController{
{ {
@@ -248,15 +204,15 @@ func TestReplicationControllerStop(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("%s unexpected error: %v", test.Name, err) t.Fatalf("%s unexpected error: %v", test.Name, err)
} }
fake := testclient.NewSimpleFake(test.Objs...) fake := fake.NewSimpleClientset(test.Objs...)
fakeWatch := watch.NewFake() fakeWatch := watch.NewFake()
fake.PrependWatchReactor("replicationcontrollers", testclient.DefaultWatchReactor(fakeWatch, nil)) fake.PrependWatchReactor("replicationcontrollers", testcore.DefaultWatchReactor(fakeWatch, nil))
go func() { go func() {
fakeWatch.Add(copiedForWatch) fakeWatch.Add(copiedForWatch)
}() }()
reaper := ReplicationControllerReaper{fake, time.Millisecond, time.Millisecond} reaper := ReplicationControllerReaper{fake.Core(), time.Millisecond, time.Millisecond}
err = reaper.Stop(ns, name, 0, nil) err = reaper.Stop(ns, name, 0, nil)
if !reflect.DeepEqual(err, test.StopError) { if !reflect.DeepEqual(err, test.StopError) {
t.Errorf("%s unexpected error: %v", test.Name, err) t.Errorf("%s unexpected error: %v", test.Name, err)
@@ -269,7 +225,7 @@ func TestReplicationControllerStop(t *testing.T) {
continue continue
} }
for i, verb := range test.ExpectedActions { for i, verb := range test.ExpectedActions {
if actions[i].GetResource() != "replicationcontrollers" { if actions[i].GetResource().GroupResource() != api.Resource("replicationcontrollers") {
t.Errorf("%s unexpected action: %+v, expected %s-replicationController", test.Name, actions[i], verb) t.Errorf("%s unexpected action: %+v, expected %s-replicationController", test.Name, actions[i], verb)
} }
if actions[i].GetVerb() != verb { if actions[i].GetVerb() != verb {
@@ -291,16 +247,6 @@ func TestReplicaSetStop(t *testing.T) {
{ {
Name: "OnlyOneRS", Name: "OnlyOneRS",
Objs: []runtime.Object{ Objs: []runtime.Object{
&extensions.ReplicaSet{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: extensions.ReplicaSetSpec{
Replicas: 0,
Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}},
},
},
&extensions.ReplicaSetList{ // LIST &extensions.ReplicaSetList{ // LIST
Items: []extensions.ReplicaSet{ Items: []extensions.ReplicaSet{
{ {
@@ -322,16 +268,6 @@ func TestReplicaSetStop(t *testing.T) {
{ {
Name: "NoOverlapping", Name: "NoOverlapping",
Objs: []runtime.Object{ Objs: []runtime.Object{
&extensions.ReplicaSet{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: extensions.ReplicaSetSpec{
Replicas: 0,
Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}},
},
},
&extensions.ReplicaSetList{ // LIST &extensions.ReplicaSetList{ // LIST
Items: []extensions.ReplicaSet{ Items: []extensions.ReplicaSet{
{ {
@@ -365,8 +301,8 @@ func TestReplicaSetStop(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
fake := testclient.NewSimpleFake(test.Objs...) fake := fake.NewSimpleClientset(test.Objs...)
reaper := ReplicaSetReaper{fake, time.Millisecond, time.Millisecond} reaper := ReplicaSetReaper{fake.Extensions(), time.Millisecond, time.Millisecond}
err := reaper.Stop(ns, name, 0, nil) err := reaper.Stop(ns, name, 0, nil)
if !reflect.DeepEqual(err, test.StopError) { if !reflect.DeepEqual(err, test.StopError) {
t.Errorf("%s unexpected error: %v", test.Name, err) t.Errorf("%s unexpected error: %v", test.Name, err)
@@ -379,7 +315,7 @@ func TestReplicaSetStop(t *testing.T) {
continue continue
} }
for i, verb := range test.ExpectedActions { for i, verb := range test.ExpectedActions {
if actions[i].GetResource() != "replicasets" { if actions[i].GetResource().GroupResource() != extensions.Resource("replicasets") {
t.Errorf("%s unexpected action: %+v, expected %s-replicaSet", test.Name, actions[i], verb) t.Errorf("%s unexpected action: %+v, expected %s-replicaSet", test.Name, actions[i], verb)
} }
if actions[i].GetVerb() != verb { if actions[i].GetVerb() != verb {
@@ -402,18 +338,6 @@ func TestJobStop(t *testing.T) {
{ {
Name: "OnlyOneJob", Name: "OnlyOneJob",
Objs: []runtime.Object{ Objs: []runtime.Object{
&batch.Job{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: batch.JobSpec{
Parallelism: &zero,
Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"k1": "v1"},
},
},
},
&batch.JobList{ // LIST &batch.JobList{ // LIST
Items: []batch.Job{ Items: []batch.Job{
{ {
@@ -438,18 +362,6 @@ func TestJobStop(t *testing.T) {
{ {
Name: "JobWithDeadPods", Name: "JobWithDeadPods",
Objs: []runtime.Object{ Objs: []runtime.Object{
&batch.Job{ // GET
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
},
Spec: batch.JobSpec{
Parallelism: &zero,
Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"k1": "v1"},
},
},
},
&batch.JobList{ // LIST &batch.JobList{ // LIST
Items: []batch.Job{ Items: []batch.Job{
{ {
@@ -485,8 +397,8 @@ func TestJobStop(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
fake := testclient.NewSimpleFake(test.Objs...) fake := fake.NewSimpleClientset(test.Objs...)
reaper := JobReaper{fake, time.Millisecond, time.Millisecond} reaper := JobReaper{fake.Batch(), fake.Core(), time.Millisecond, time.Millisecond}
err := reaper.Stop(ns, name, 0, nil) err := reaper.Stop(ns, name, 0, nil)
if !reflect.DeepEqual(err, test.StopError) { if !reflect.DeepEqual(err, test.StopError) {
t.Errorf("%s unexpected error: %v", test.Name, err) t.Errorf("%s unexpected error: %v", test.Name, err)
@@ -503,7 +415,7 @@ func TestJobStop(t *testing.T) {
if actions[i].GetVerb() != action[0] { if actions[i].GetVerb() != action[0] {
t.Errorf("%s unexpected verb: %+v, expected %s", test.Name, actions[i], expAction) t.Errorf("%s unexpected verb: %+v, expected %s", test.Name, actions[i], expAction)
} }
if actions[i].GetResource() != action[1] { if actions[i].GetResource().Resource != action[1] {
t.Errorf("%s unexpected resource: %+v, expected %s", test.Name, actions[i], expAction) t.Errorf("%s unexpected resource: %+v, expected %s", test.Name, actions[i], expAction)
} }
} }
@@ -564,6 +476,7 @@ func TestDeploymentStop(t *testing.T) {
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: name, Name: name,
Namespace: ns, Namespace: ns,
Labels: map[string]string{"k1": "v1"},
}, },
Spec: extensions.ReplicaSetSpec{ Spec: extensions.ReplicaSetSpec{
Template: template, Template: template,
@@ -581,8 +494,8 @@ func TestDeploymentStop(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
fake := testclient.NewSimpleFake(test.Objs...) fake := fake.NewSimpleClientset(test.Objs...)
reaper := DeploymentReaper{fake, time.Millisecond, time.Millisecond} reaper := DeploymentReaper{fake.Extensions(), fake.Extensions(), time.Millisecond, time.Millisecond}
err := reaper.Stop(ns, name, 0, nil) err := reaper.Stop(ns, name, 0, nil)
if !reflect.DeepEqual(err, test.StopError) { if !reflect.DeepEqual(err, test.StopError) {
t.Errorf("%s unexpected error: %v", test.Name, err) t.Errorf("%s unexpected error: %v", test.Name, err)
@@ -599,7 +512,7 @@ func TestDeploymentStop(t *testing.T) {
if actions[i].GetVerb() != action[0] { if actions[i].GetVerb() != action[0] {
t.Errorf("%s unexpected verb: %+v, expected %s", test.Name, actions[i], expAction) t.Errorf("%s unexpected verb: %+v, expected %s", test.Name, actions[i], expAction)
} }
if actions[i].GetResource() != action[1] { if actions[i].GetResource().Resource != action[1] {
t.Errorf("%s unexpected resource: %+v, expected %s", test.Name, actions[i], expAction) t.Errorf("%s unexpected resource: %+v, expected %s", test.Name, actions[i], expAction)
} }
if len(action) == 3 && actions[i].GetSubresource() != action[2] { if len(action) == 3 && actions[i].GetSubresource() != action[2] {
@@ -610,7 +523,7 @@ func TestDeploymentStop(t *testing.T) {
} }
type noSuchPod struct { type noSuchPod struct {
*testclient.FakePods coreclient.PodInterface
} }
func (c *noSuchPod) Get(name string) (*api.Pod, error) { func (c *noSuchPod) Get(name string) (*api.Pod, error) {
@@ -618,84 +531,101 @@ func (c *noSuchPod) Get(name string) (*api.Pod, error) {
} }
type noDeleteService struct { type noDeleteService struct {
*testclient.FakeServices coreclient.ServiceInterface
} }
func (c *noDeleteService) Delete(service string) error { func (c *noDeleteService) Delete(service string, o *api.DeleteOptions) error {
return fmt.Errorf("I'm afraid I can't do that, Dave") return fmt.Errorf("I'm afraid I can't do that, Dave")
} }
type reaperFake struct { type reaperFake struct {
*testclient.Fake *fake.Clientset
noSuchPod, noDeleteService bool noSuchPod, noDeleteService bool
} }
func (c *reaperFake) Pods(namespace string) client.PodInterface { func (c *reaperFake) Core() coreclient.CoreInterface {
pods := &testclient.FakePods{Fake: c.Fake, Namespace: namespace} return &reaperCoreFake{c.Clientset.Core(), c.noSuchPod, c.noDeleteService}
}
type reaperCoreFake struct {
coreclient.CoreInterface
noSuchPod, noDeleteService bool
}
func (c *reaperCoreFake) Pods(namespace string) coreclient.PodInterface {
pods := c.CoreInterface.Pods(namespace)
if c.noSuchPod { if c.noSuchPod {
return &noSuchPod{pods} return &noSuchPod{pods}
} }
return pods return pods
} }
func (c *reaperFake) Services(namespace string) client.ServiceInterface { func (c *reaperCoreFake) Services(namespace string) coreclient.ServiceInterface {
services := &testclient.FakeServices{Fake: c.Fake, Namespace: namespace} services := c.CoreInterface.Services(namespace)
if c.noDeleteService { if c.noDeleteService {
return &noDeleteService{services} return &noDeleteService{services}
} }
return services return services
} }
func pod() *api.Pod {
return &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: api.NamespaceDefault, Name: "foo"}}
}
func service() *api.Service {
return &api.Service{ObjectMeta: api.ObjectMeta{Namespace: api.NamespaceDefault, Name: "foo"}}
}
func TestSimpleStop(t *testing.T) { func TestSimpleStop(t *testing.T) {
tests := []struct { tests := []struct {
fake *reaperFake fake *reaperFake
kind unversioned.GroupKind kind unversioned.GroupKind
actions []testclient.Action actions []testcore.Action
expectError bool expectError bool
test string test string
}{ }{
{ {
fake: &reaperFake{ fake: &reaperFake{
Fake: &testclient.Fake{}, Clientset: fake.NewSimpleClientset(pod()),
}, },
kind: api.Kind("Pod"), kind: api.Kind("Pod"),
actions: []testclient.Action{ actions: []testcore.Action{
testclient.NewGetAction("pods", api.NamespaceDefault, "foo"), testcore.NewGetAction(api.Resource("pods").WithVersion(""), api.NamespaceDefault, "foo"),
testclient.NewDeleteAction("pods", api.NamespaceDefault, "foo"), testcore.NewDeleteAction(api.Resource("pods").WithVersion(""), api.NamespaceDefault, "foo"),
}, },
expectError: false, expectError: false,
test: "stop pod succeeds", test: "stop pod succeeds",
}, },
{ {
fake: &reaperFake{ fake: &reaperFake{
Fake: &testclient.Fake{}, Clientset: fake.NewSimpleClientset(service()),
}, },
kind: api.Kind("Service"), kind: api.Kind("Service"),
actions: []testclient.Action{ actions: []testcore.Action{
testclient.NewGetAction("services", api.NamespaceDefault, "foo"), testcore.NewGetAction(api.Resource("services").WithVersion(""), api.NamespaceDefault, "foo"),
testclient.NewDeleteAction("services", api.NamespaceDefault, "foo"), testcore.NewDeleteAction(api.Resource("services").WithVersion(""), api.NamespaceDefault, "foo"),
}, },
expectError: false, expectError: false,
test: "stop service succeeds", test: "stop service succeeds",
}, },
{ {
fake: &reaperFake{ fake: &reaperFake{
Fake: &testclient.Fake{}, Clientset: fake.NewSimpleClientset(),
noSuchPod: true, noSuchPod: true,
}, },
kind: api.Kind("Pod"), kind: api.Kind("Pod"),
actions: []testclient.Action{}, actions: []testcore.Action{},
expectError: true, expectError: true,
test: "stop pod fails, no pod", test: "stop pod fails, no pod",
}, },
{ {
fake: &reaperFake{ fake: &reaperFake{
Fake: &testclient.Fake{}, Clientset: fake.NewSimpleClientset(service()),
noDeleteService: true, noDeleteService: true,
}, },
kind: api.Kind("Service"), kind: api.Kind("Service"),
actions: []testclient.Action{ actions: []testcore.Action{
testclient.NewGetAction("services", api.NamespaceDefault, "foo"), testcore.NewGetAction(api.Resource("services").WithVersion(""), api.NamespaceDefault, "foo"),
}, },
expectError: true, expectError: true,
test: "stop service fails, can't delete", test: "stop service fails, can't delete",
@@ -747,12 +677,9 @@ func TestDeploymentNotFoundError(t *testing.T) {
} }
template := deploymentutil.GetNewReplicaSetTemplate(deployment) template := deploymentutil.GetNewReplicaSetTemplate(deployment)
fake := &testclient.Fake{} fake := fake.NewSimpleClientset(
fake.AddReactor("get", "deployments", func(action testclient.Action) (handled bool, ret runtime.Object, err error) { deployment,
return true, deployment, nil &extensions.ReplicaSetList{Items: []extensions.ReplicaSet{
})
fake.AddReactor("list", "replicasets", func(action testclient.Action) (handled bool, ret runtime.Object, err error) {
list := &extensions.ReplicaSetList{Items: []extensions.ReplicaSet{
{ {
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: name, Name: name,
@@ -762,14 +689,14 @@ func TestDeploymentNotFoundError(t *testing.T) {
Template: template, Template: template,
}, },
}, },
}} },
return true, list, nil },
}) )
fake.AddReactor("get", "replicasets", func(action testclient.Action) (handled bool, ret runtime.Object, err error) { fake.AddReactor("get", "replicasets", func(action testcore.Action) (handled bool, ret runtime.Object, err error) {
return true, nil, ScaleError{ActualError: errors.NewNotFound(api.Resource("replicaset"), "doesn't-matter")} return true, nil, ScaleError{ActualError: errors.NewNotFound(api.Resource("replicaset"), "doesn't-matter")}
}) })
reaper := DeploymentReaper{fake, time.Millisecond, time.Millisecond} reaper := DeploymentReaper{fake.Extensions(), fake.Extensions(), time.Millisecond, time.Millisecond}
if err := reaper.Stop(ns, name, 0, nil); err != nil { if err := reaper.Stop(ns, name, 0, nil); err != nil {
t.Fatalf("unexpected error: %#v", err) t.Fatalf("unexpected error: %#v", err)
} }

View File

@@ -19,22 +19,10 @@ package kubectl
import ( import (
"fmt" "fmt"
"io" "io"
"os"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/version" "k8s.io/kubernetes/pkg/version"
) )
func GetServerVersion(w io.Writer, kubeClient client.Interface) {
serverVersion, err := kubeClient.Discovery().ServerVersion()
if err != nil {
fmt.Printf("Couldn't read server version from server: %v\n", err)
os.Exit(1)
}
fmt.Fprintf(w, "Server Version: %#v\n", *serverVersion)
}
func GetClientVersion(w io.Writer) { func GetClientVersion(w io.Writer) {
fmt.Fprintf(w, "Client Version: %#v\n", version.Get()) fmt.Fprintf(w, "Client Version: %#v\n", version.Get())
} }

View File

@@ -27,6 +27,7 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientsetadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
@@ -128,7 +129,7 @@ var _ = framework.KubeDescribe("V1Job", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
By("scale job up") By("scale job up")
scaler, err := kubectl.ScalerFor(batch.Kind("Job"), f.Client) scaler, err := kubectl.ScalerFor(batch.Kind("Job"), clientsetadapter.FromUnversionedClient(f.Client))
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute) waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute)
waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute) waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute)
@@ -153,7 +154,7 @@ var _ = framework.KubeDescribe("V1Job", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
By("scale job down") By("scale job down")
scaler, err := kubectl.ScalerFor(batch.Kind("Job"), f.Client) scaler, err := kubectl.ScalerFor(batch.Kind("Job"), clientsetadapter.FromUnversionedClient(f.Client))
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute) waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute)
waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute) waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute)
@@ -176,7 +177,7 @@ var _ = framework.KubeDescribe("V1Job", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
By("delete a job") By("delete a job")
reaper, err := kubectl.ReaperFor(batch.Kind("Job"), f.Client) reaper, err := kubectl.ReaperFor(batch.Kind("Job"), clientsetadapter.FromUnversionedClient(f.Client))
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
timeout := 1 * time.Minute timeout := 1 * time.Minute
err = reaper.Stop(f.Namespace.Name, job.Name, timeout, api.NewDeleteOptions(0)) err = reaper.Stop(f.Namespace.Name, job.Name, timeout, api.NewDeleteOptions(0))

View File

@@ -28,6 +28,7 @@ import (
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientsetadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@@ -115,7 +116,7 @@ var _ = framework.KubeDescribe("Daemon set [Serial]", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
defer func() { defer func() {
framework.Logf("Check that reaper kills all daemon pods for %s", dsName) framework.Logf("Check that reaper kills all daemon pods for %s", dsName)
dsReaper, err := kubectl.ReaperFor(extensions.Kind("DaemonSet"), c) dsReaper, err := kubectl.ReaperFor(extensions.Kind("DaemonSet"), clientsetadapter.FromUnversionedClient(c))
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = dsReaper.Stop(ns, dsName, 0, nil) err = dsReaper.Stop(ns, dsName, 0, nil)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())

View File

@@ -195,7 +195,7 @@ func stopDeploymentMaybeOverlap(c *clientset.Clientset, oldC client.Interface, n
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
framework.Logf("Deleting deployment %s", deploymentName) framework.Logf("Deleting deployment %s", deploymentName)
reaper, err := kubectl.ReaperFor(extensions.Kind("Deployment"), oldC) reaper, err := kubectl.ReaperFor(extensions.Kind("Deployment"), c)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
timeout := 1 * time.Minute timeout := 1 * time.Minute
err = reaper.Stop(ns, deployment.Name, timeout, api.NewDeleteOptions(0)) err = reaper.Stop(ns, deployment.Name, timeout, api.NewDeleteOptions(0))
@@ -1114,10 +1114,10 @@ func testScaledRolloutDeployment(f *framework.Framework) {
first, err = c.Extensions().ReplicaSets(first.Namespace).Get(first.Name) first, err = c.Extensions().ReplicaSets(first.Namespace).Get(first.Name)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
firstCond := client.ReplicaSetHasDesiredReplicas(f.Client.Extensions(), first) firstCond := client.ReplicaSetHasDesiredReplicas(c.Extensions(), first)
wait.PollImmediate(10*time.Millisecond, 1*time.Minute, firstCond) wait.PollImmediate(10*time.Millisecond, 1*time.Minute, firstCond)
secondCond := client.ReplicaSetHasDesiredReplicas(f.Client.Extensions(), second) secondCond := client.ReplicaSetHasDesiredReplicas(c.Extensions(), second)
wait.PollImmediate(10*time.Millisecond, 1*time.Minute, secondCond) wait.PollImmediate(10*time.Millisecond, 1*time.Minute, secondCond)
By(fmt.Sprintf("Updating the size (up) and template at the same time for deployment %q", deploymentName)) By(fmt.Sprintf("Updating the size (up) and template at the same time for deployment %q", deploymentName))
@@ -1175,10 +1175,10 @@ func testScaledRolloutDeployment(f *framework.Framework) {
newRs, err := deploymentutil.GetNewReplicaSet(deployment, c) newRs, err := deploymentutil.GetNewReplicaSet(deployment, c)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
oldCond := client.ReplicaSetHasDesiredReplicas(f.Client.Extensions(), oldRs) oldCond := client.ReplicaSetHasDesiredReplicas(c.Extensions(), oldRs)
wait.PollImmediate(10*time.Millisecond, 1*time.Minute, oldCond) wait.PollImmediate(10*time.Millisecond, 1*time.Minute, oldCond)
newCond := client.ReplicaSetHasDesiredReplicas(f.Client.Extensions(), newRs) newCond := client.ReplicaSetHasDesiredReplicas(c.Extensions(), newRs)
wait.PollImmediate(10*time.Millisecond, 1*time.Minute, newCond) wait.PollImmediate(10*time.Millisecond, 1*time.Minute, newCond)
By(fmt.Sprintf("Updating the size (down) and template at the same time for deployment %q", deploymentName)) By(fmt.Sprintf("Updating the size (down) and template at the same time for deployment %q", deploymentName))

View File

@@ -56,6 +56,7 @@ import (
"k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/typed/discovery"
"k8s.io/kubernetes/pkg/client/typed/dynamic" "k8s.io/kubernetes/pkg/client/typed/dynamic"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientsetadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
@@ -3197,7 +3198,7 @@ func RemoveTaintOffNode(c *client.Client, nodeName string, taint api.Taint) {
func ScaleRC(c *client.Client, ns, name string, size uint, wait bool) error { func ScaleRC(c *client.Client, ns, name string, size uint, wait bool) error {
By(fmt.Sprintf("Scaling replication controller %s in namespace %s to %d", name, ns, size)) By(fmt.Sprintf("Scaling replication controller %s in namespace %s to %d", name, ns, size))
scaler, err := kubectl.ScalerFor(api.Kind("ReplicationController"), c) scaler, err := kubectl.ScalerFor(api.Kind("ReplicationController"), clientsetadapter.FromUnversionedClient(c))
if err != nil { if err != nil {
return err return err
} }
@@ -3314,7 +3315,7 @@ func DeleteRCAndPods(c *client.Client, ns, name string) error {
} }
return err return err
} }
reaper, err := kubectl.ReaperForReplicationController(c, 10*time.Minute) reaper, err := kubectl.ReaperForReplicationController(clientsetadapter.FromUnversionedClient(c).Core(), 10*time.Minute)
if err != nil { if err != nil {
if apierrs.IsNotFound(err) { if apierrs.IsNotFound(err) {
Logf("RC %s was already deleted: %v", name, err) Logf("RC %s was already deleted: %v", name, err)
@@ -3462,7 +3463,7 @@ func DeleteReplicaSet(c *client.Client, ns, name string) error {
} }
return err return err
} }
reaper, err := kubectl.ReaperFor(extensions.Kind("ReplicaSet"), c) reaper, err := kubectl.ReaperFor(extensions.Kind("ReplicaSet"), clientsetadapter.FromUnversionedClient(c))
if err != nil { if err != nil {
if apierrs.IsNotFound(err) { if apierrs.IsNotFound(err) {
Logf("ReplicaSet %s was already deleted: %v", name, err) Logf("ReplicaSet %s was already deleted: %v", name, err)

View File

@@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientsetadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
@@ -124,7 +125,7 @@ var _ = framework.KubeDescribe("Job", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
By("scale job up") By("scale job up")
scaler, err := kubectl.ScalerFor(batch.Kind("Job"), f.Client) scaler, err := kubectl.ScalerFor(batch.Kind("Job"), clientsetadapter.FromUnversionedClient(f.Client))
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute) waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute)
waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute) waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute)
@@ -149,7 +150,7 @@ var _ = framework.KubeDescribe("Job", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
By("scale job down") By("scale job down")
scaler, err := kubectl.ScalerFor(batch.Kind("Job"), f.Client) scaler, err := kubectl.ScalerFor(batch.Kind("Job"), clientsetadapter.FromUnversionedClient(f.Client))
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute) waitForScale := kubectl.NewRetryParams(5*time.Second, 1*time.Minute)
waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute) waitForReplicas := kubectl.NewRetryParams(5*time.Second, 5*time.Minute)
@@ -172,7 +173,7 @@ var _ = framework.KubeDescribe("Job", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
By("delete a job") By("delete a job")
reaper, err := kubectl.ReaperFor(batch.Kind("Job"), f.Client) reaper, err := kubectl.ReaperFor(batch.Kind("Job"), clientsetadapter.FromUnversionedClient(f.Client))
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
timeout := 1 * time.Minute timeout := 1 * time.Minute
err = reaper.Stop(f.Namespace.Name, job.Name, timeout, api.NewDeleteOptions(0)) err = reaper.Stop(f.Namespace.Name, job.Name, timeout, api.NewDeleteOptions(0))

View File

@@ -47,6 +47,7 @@ import (
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientsetadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
@@ -420,7 +421,7 @@ var _ = framework.KubeDescribe("Kubectl client", func() {
ExecOrDie() ExecOrDie()
Expect(runOutput).ToNot(ContainSubstring("stdin closed")) Expect(runOutput).ToNot(ContainSubstring("stdin closed"))
f := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) } f := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }
runTestPod, _, err := util.GetFirstPod(c, ns, labels.SelectorFromSet(map[string]string{"run": "run-test-3"}), 1*time.Minute, f) runTestPod, _, err := util.GetFirstPod(clientsetadapter.FromUnversionedClient(c), ns, labels.SelectorFromSet(map[string]string{"run": "run-test-3"}), 1*time.Minute, f)
if err != nil { if err != nil {
os.Exit(1) os.Exit(1)
} }

View File

@@ -42,6 +42,7 @@ import (
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
clientsetadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" replicationcontroller "k8s.io/kubernetes/pkg/controller/replication"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
@@ -290,7 +291,7 @@ func RCFromManifest(fileName string) *api.ReplicationController {
// StopRC stops the rc via kubectl's stop library // StopRC stops the rc via kubectl's stop library
func StopRC(rc *api.ReplicationController, restClient *client.Client) error { func StopRC(rc *api.ReplicationController, restClient *client.Client) error {
reaper, err := kubectl.ReaperFor(api.Kind("ReplicationController"), restClient) reaper, err := kubectl.ReaperFor(api.Kind("ReplicationController"), clientsetadapter.FromUnversionedClient(restClient))
if err != nil || reaper == nil { if err != nil || reaper == nil {
return err return err
} }
@@ -303,7 +304,7 @@ func StopRC(rc *api.ReplicationController, restClient *client.Client) error {
// ScaleRC scales the given rc to the given replicas. // ScaleRC scales the given rc to the given replicas.
func ScaleRC(name, ns string, replicas int32, restClient *client.Client) (*api.ReplicationController, error) { func ScaleRC(name, ns string, replicas int32, restClient *client.Client) (*api.ReplicationController, error) {
scaler, err := kubectl.ScalerFor(api.Kind("ReplicationController"), restClient) scaler, err := kubectl.ScalerFor(api.Kind("ReplicationController"), clientsetadapter.FromUnversionedClient(restClient))
if err != nil { if err != nil {
return nil, err return nil, err
} }