From 5fb50cc1b68bc09d4d84822c1dba267366ce6737 Mon Sep 17 00:00:00 2001 From: nikhiljindal Date: Mon, 31 Aug 2015 17:39:31 -0700 Subject: [PATCH] Adding support for deployments to unversioned client --- pkg/client/unversioned/deployment.go | 106 +++++++++++++++ pkg/client/unversioned/deployment_test.go | 152 ++++++++++++++++++++++ pkg/client/unversioned/experimental.go | 5 + 3 files changed, 263 insertions(+) create mode 100644 pkg/client/unversioned/deployment.go create mode 100644 pkg/client/unversioned/deployment_test.go diff --git a/pkg/client/unversioned/deployment.go b/pkg/client/unversioned/deployment.go new file mode 100644 index 0000000000..71b81b73c8 --- /dev/null +++ b/pkg/client/unversioned/deployment.go @@ -0,0 +1,106 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +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 ( + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/expapi" + "k8s.io/kubernetes/pkg/fields" + "k8s.io/kubernetes/pkg/labels" + "k8s.io/kubernetes/pkg/watch" +) + +// DeploymentsNamespacer has methods to work with Deployment resources in a namespace +type DeploymentsNamespacer interface { + Deployments(namespace string) DeploymentInterface +} + +// DeploymentInterface has methods to work with Deployment resources. +type DeploymentInterface interface { + List(label labels.Selector, field fields.Selector) (*expapi.DeploymentList, error) + Get(name string) (*expapi.Deployment, error) + Delete(name string, options *api.DeleteOptions) error + Create(Deployment *expapi.Deployment) (*expapi.Deployment, error) + Update(Deployment *expapi.Deployment) (*expapi.Deployment, error) + Watch(label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) +} + +// deployments implements DeploymentInterface +type deployments struct { + client *ExperimentalClient + ns string +} + +// newDeployments returns a Deployments +func newDeployments(c *ExperimentalClient, namespace string) *deployments { + return &deployments{ + client: c, + ns: namespace, + } +} + +// List takes label and field selectors, and returns the list of Deployments that match those selectors. +func (c *deployments) List(label labels.Selector, field fields.Selector) (result *expapi.DeploymentList, err error) { + result = &expapi.DeploymentList{} + err = c.client.Get().Namespace(c.ns).Resource("deployments").LabelsSelectorParam(label).FieldsSelectorParam(field).Do().Into(result) + return +} + +// Get takes name of the deployment, and returns the corresponding deployment object, and an error if there is any. +func (c *deployments) Get(name string) (result *expapi.Deployment, err error) { + result = &expapi.Deployment{} + err = c.client.Get().Namespace(c.ns).Resource("deployments").Name(name).Do().Into(result) + return +} + +// Delete takes name of the deployment and deletes it. Returns an error if one occurs. +func (c *deployments) Delete(name string, options *api.DeleteOptions) error { + if options == nil { + return c.client.Delete().Namespace(c.ns).Resource("deployments").Name(name).Do().Error() + } + body, err := api.Scheme.EncodeToVersion(options, c.client.APIVersion()) + if err != nil { + return err + } + return c.client.Delete().Namespace(c.ns).Resource("deployments").Name(name).Body(body).Do().Error() +} + +// Create takes the representation of a deployment and creates it. Returns the server's representation of the deployment, and an error, if there is any. +func (c *deployments) Create(deployment *expapi.Deployment) (result *expapi.Deployment, err error) { + result = &expapi.Deployment{} + err = c.client.Post().Namespace(c.ns).Resource("deployments").Body(deployment).Do().Into(result) + return +} + +// Update takes the representation of a deployment and updates it. Returns the server's representation of the deployment, and an error, if there is any. +func (c *deployments) Update(deployment *expapi.Deployment) (result *expapi.Deployment, err error) { + result = &expapi.Deployment{} + err = c.client.Put().Namespace(c.ns).Resource("deployments").Name(deployment.Name).Body(deployment).Do().Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested deployments. +func (c *deployments) Watch(label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { + return c.client.Get(). + Prefix("watch"). + Namespace(c.ns). + Resource("deployments"). + Param("resourceVersion", resourceVersion). + LabelsSelectorParam(label). + FieldsSelectorParam(field). + Watch() +} diff --git a/pkg/client/unversioned/deployment_test.go b/pkg/client/unversioned/deployment_test.go new file mode 100644 index 0000000000..3c5330e554 --- /dev/null +++ b/pkg/client/unversioned/deployment_test.go @@ -0,0 +1,152 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +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 ( + "net/url" + "testing" + + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/expapi" + "k8s.io/kubernetes/pkg/expapi/testapi" + "k8s.io/kubernetes/pkg/fields" + "k8s.io/kubernetes/pkg/labels" +) + +func getDeploymentsResoureName() string { + return "deployments" +} + +func TestDeploymentCreate(t *testing.T) { + ns := api.NamespaceDefault + deployment := expapi.Deployment{ + ObjectMeta: api.ObjectMeta{ + Name: "abc", + Namespace: ns, + }, + } + c := &testClient{ + Request: testRequest{ + Method: "POST", + Path: testapi.ResourcePath(getDeploymentsResoureName(), ns, ""), + Query: buildQueryValues(nil), + Body: &deployment, + }, + Response: Response{StatusCode: 200, Body: &deployment}, + } + + response, err := c.Setup().Deployments(ns).Create(&deployment) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + c.Validate(t, response, err) +} + +func TestDeploymentGet(t *testing.T) { + ns := api.NamespaceDefault + deployment := &expapi.Deployment{ + ObjectMeta: api.ObjectMeta{ + Name: "abc", + Namespace: ns, + }, + } + c := &testClient{ + Request: testRequest{ + Method: "GET", + Path: testapi.ResourcePath(getDeploymentsResoureName(), ns, "abc"), + Query: buildQueryValues(nil), + Body: nil, + }, + Response: Response{StatusCode: 200, Body: deployment}, + } + + response, err := c.Setup().Deployments(ns).Get("abc") + c.Validate(t, response, err) +} + +func TestDeploymentList(t *testing.T) { + ns := api.NamespaceDefault + deploymentList := &expapi.DeploymentList{ + Items: []expapi.Deployment{ + { + ObjectMeta: api.ObjectMeta{ + Name: "foo", + Namespace: ns, + }, + }, + }, + } + c := &testClient{ + Request: testRequest{ + Method: "GET", + Path: testapi.ResourcePath(getDeploymentsResoureName(), ns, ""), + Query: buildQueryValues(nil), + Body: nil, + }, + Response: Response{StatusCode: 200, Body: deploymentList}, + } + response, err := c.Setup().Deployments(ns).List(labels.Everything(), fields.Everything()) + c.Validate(t, response, err) +} + +func TestDeploymentUpdate(t *testing.T) { + ns := api.NamespaceDefault + deployment := &expapi.Deployment{ + ObjectMeta: api.ObjectMeta{ + Name: "abc", + Namespace: ns, + ResourceVersion: "1", + }, + } + c := &testClient{ + Request: testRequest{ + Method: "PUT", + Path: testapi.ResourcePath(getDeploymentsResoureName(), ns, "abc"), + Query: buildQueryValues(nil), + }, + Response: Response{StatusCode: 200, Body: deployment}, + } + response, err := c.Setup().Deployments(ns).Update(deployment) + c.Validate(t, response, err) +} + +func TestDeploymentDelete(t *testing.T) { + ns := api.NamespaceDefault + c := &testClient{ + Request: testRequest{ + Method: "DELETE", + Path: testapi.ResourcePath(getDeploymentsResoureName(), ns, "foo"), + Query: buildQueryValues(nil), + }, + Response: Response{StatusCode: 200}, + } + err := c.Setup().Deployments(ns).Delete("foo", nil) + c.Validate(t, nil, err) +} + +func TestDeploymentWatch(t *testing.T) { + c := &testClient{ + Request: testRequest{ + Method: "GET", + Path: testapi.ResourcePathWithPrefix("watch", getDeploymentsResoureName(), "", ""), + Query: url.Values{"resourceVersion": []string{}}, + }, + Response: Response{StatusCode: 200}, + } + _, err := c.Setup().Deployments(api.NamespaceAll).Watch(labels.Everything(), fields.Everything(), "") + c.Validate(t, nil, err) +} diff --git a/pkg/client/unversioned/experimental.go b/pkg/client/unversioned/experimental.go index d993e62925..d2fff69f98 100644 --- a/pkg/client/unversioned/experimental.go +++ b/pkg/client/unversioned/experimental.go @@ -35,6 +35,7 @@ type ExperimentalInterface interface { HorizontalPodAutoscalersNamespacer ScaleNamespacer DaemonsNamespacer + DeploymentsNamespacer } // ExperimentalClient is used to interact with experimental Kubernetes features. @@ -85,6 +86,10 @@ func (c *ExperimentalClient) Daemons(namespace string) DaemonInterface { return newDaemons(c, namespace) } +func (c *ExperimentalClient) Deployments(namespace string) DeploymentInterface { + return newDeployments(c, namespace) +} + // NewExperimental creates a new ExperimentalClient for the given config. This client // provides access to experimental Kubernetes features. // Experimental features are not supported and may be changed or removed in