mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 21:17:23 +00:00
Always set ?namespace in query if specified
Revise our code to only call Request.Namespace() if a namespace *should* be present. For root scoped resources, namespace should be ignored. For namespaced resources, it is an error to have Namespace=="".
This commit is contained in:
parent
9175082a1c
commit
3e2e4714a2
@ -279,18 +279,19 @@ func runReplicationControllerTest(c *client.Client) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glog.Infof("Creating replication controllers")
|
glog.Infof("Creating replication controllers")
|
||||||
if _, err := c.ReplicationControllers(api.NamespaceDefault).Create(&controller); err != nil {
|
updated, err := c.ReplicationControllers(api.NamespaceDefault).Create(&controller)
|
||||||
|
if err != nil {
|
||||||
glog.Fatalf("Unexpected error: %v", err)
|
glog.Fatalf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
glog.Infof("Done creating replication controllers")
|
glog.Infof("Done creating replication controllers")
|
||||||
|
|
||||||
// Give the controllers some time to actually create the pods
|
// Give the controllers some time to actually create the pods
|
||||||
if err := wait.Poll(time.Second, time.Second*30, client.ControllerHasDesiredReplicas(c, &controller)); err != nil {
|
if err := wait.Poll(time.Second, time.Second*30, client.ControllerHasDesiredReplicas(c, updated)); err != nil {
|
||||||
glog.Fatalf("FAILED: pods never created %v", err)
|
glog.Fatalf("FAILED: pods never created %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait for minions to indicate they have info about the desired pods
|
// wait for minions to indicate they have info about the desired pods
|
||||||
pods, err := c.Pods(api.NamespaceDefault).List(labels.Set(controller.Spec.Selector).AsSelector())
|
pods, err := c.Pods(api.NamespaceDefault).List(labels.Set(updated.Spec.Selector).AsSelector())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("FAILED: unable to get pods to list: %v", err)
|
glog.Fatalf("FAILED: unable to get pods to list: %v", err)
|
||||||
}
|
}
|
||||||
@ -523,7 +524,7 @@ func runMasterServiceTest(client *client.Client) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func runServiceTest(client *client.Client) {
|
func runServiceTest(client *client.Client) {
|
||||||
pod := api.Pod{
|
pod := &api.Pod{
|
||||||
ObjectMeta: api.ObjectMeta{
|
ObjectMeta: api.ObjectMeta{
|
||||||
Name: "foo",
|
Name: "foo",
|
||||||
Labels: map[string]string{
|
Labels: map[string]string{
|
||||||
@ -548,14 +549,14 @@ func runServiceTest(client *client.Client) {
|
|||||||
PodIP: "1.2.3.4",
|
PodIP: "1.2.3.4",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
_, err := client.Pods(api.NamespaceDefault).Create(&pod)
|
pod, err := client.Pods(api.NamespaceDefault).Create(pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Failed to create pod: %v, %v", pod, err)
|
glog.Fatalf("Failed to create pod: %v, %v", pod, err)
|
||||||
}
|
}
|
||||||
if err := wait.Poll(time.Second, time.Second*20, podExists(client, pod.Namespace, pod.Name)); err != nil {
|
if err := wait.Poll(time.Second, time.Second*20, podExists(client, pod.Namespace, pod.Name)); err != nil {
|
||||||
glog.Fatalf("FAILED: pod never started running %v", err)
|
glog.Fatalf("FAILED: pod never started running %v", err)
|
||||||
}
|
}
|
||||||
svc1 := api.Service{
|
svc1 := &api.Service{
|
||||||
ObjectMeta: api.ObjectMeta{Name: "service1"},
|
ObjectMeta: api.ObjectMeta{Name: "service1"},
|
||||||
Spec: api.ServiceSpec{
|
Spec: api.ServiceSpec{
|
||||||
Selector: map[string]string{
|
Selector: map[string]string{
|
||||||
@ -566,7 +567,7 @@ func runServiceTest(client *client.Client) {
|
|||||||
SessionAffinity: "None",
|
SessionAffinity: "None",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
_, err = client.Services(api.NamespaceDefault).Create(&svc1)
|
svc1, err = client.Services(api.NamespaceDefault).Create(svc1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Failed to create service: %v, %v", svc1, err)
|
glog.Fatalf("Failed to create service: %v, %v", svc1, err)
|
||||||
}
|
}
|
||||||
@ -574,7 +575,7 @@ func runServiceTest(client *client.Client) {
|
|||||||
glog.Fatalf("FAILED: unexpected endpoints: %v", err)
|
glog.Fatalf("FAILED: unexpected endpoints: %v", err)
|
||||||
}
|
}
|
||||||
// A second service with the same port.
|
// A second service with the same port.
|
||||||
svc2 := api.Service{
|
svc2 := &api.Service{
|
||||||
ObjectMeta: api.ObjectMeta{Name: "service2"},
|
ObjectMeta: api.ObjectMeta{Name: "service2"},
|
||||||
Spec: api.ServiceSpec{
|
Spec: api.ServiceSpec{
|
||||||
Selector: map[string]string{
|
Selector: map[string]string{
|
||||||
@ -585,7 +586,7 @@ func runServiceTest(client *client.Client) {
|
|||||||
SessionAffinity: "None",
|
SessionAffinity: "None",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
_, err = client.Services(api.NamespaceDefault).Create(&svc2)
|
svc2, err = client.Services(api.NamespaceDefault).Create(svc2)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Failed to create service: %v, %v", svc2, err)
|
glog.Fatalf("Failed to create service: %v, %v", svc2, err)
|
||||||
}
|
}
|
||||||
|
4
pkg/client/cache/listwatch_test.go
vendored
4
pkg/client/cache/listwatch_test.go
vendored
@ -42,7 +42,7 @@ func buildResourcePath(prefix, namespace, resource string) string {
|
|||||||
base := path.Join("/api", testapi.Version(), prefix)
|
base := path.Join("/api", testapi.Version(), prefix)
|
||||||
if len(namespace) > 0 {
|
if len(namespace) > 0 {
|
||||||
if !(testapi.Version() == "v1beta1" || testapi.Version() == "v1beta2") {
|
if !(testapi.Version() == "v1beta1" || testapi.Version() == "v1beta2") {
|
||||||
base = path.Join(base, "ns", namespace)
|
base = path.Join(base, "namespaces", namespace)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return path.Join(base, resource)
|
return path.Join(base, resource)
|
||||||
@ -58,11 +58,9 @@ func buildQueryValues(namespace string, query url.Values) url.Values {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(namespace) > 0 {
|
|
||||||
if testapi.Version() == "v1beta1" || testapi.Version() == "v1beta2" {
|
if testapi.Version() == "v1beta1" || testapi.Version() == "v1beta2" {
|
||||||
v.Set("namespace", namespace)
|
v.Set("namespace", namespace)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ func (e *events) Create(event *api.Event) (*api.Event, error) {
|
|||||||
}
|
}
|
||||||
result := &api.Event{}
|
result := &api.Event{}
|
||||||
err := e.client.Post().
|
err := e.client.Post().
|
||||||
Namespace(event.Namespace).
|
NamespaceIfScoped(event.Namespace, len(event.Namespace) > 0).
|
||||||
Resource("events").
|
Resource("events").
|
||||||
Body(event).
|
Body(event).
|
||||||
Do().
|
Do().
|
||||||
@ -85,7 +85,7 @@ func (e *events) Update(event *api.Event) (*api.Event, error) {
|
|||||||
}
|
}
|
||||||
result := &api.Event{}
|
result := &api.Event{}
|
||||||
err := e.client.Put().
|
err := e.client.Put().
|
||||||
Namespace(event.Namespace).
|
NamespaceIfScoped(event.Namespace, len(event.Namespace) > 0).
|
||||||
Resource("events").
|
Resource("events").
|
||||||
Name(event.Name).
|
Name(event.Name).
|
||||||
Body(event).
|
Body(event).
|
||||||
@ -98,7 +98,7 @@ func (e *events) Update(event *api.Event) (*api.Event, error) {
|
|||||||
func (e *events) List(label, field labels.Selector) (*api.EventList, error) {
|
func (e *events) List(label, field labels.Selector) (*api.EventList, error) {
|
||||||
result := &api.EventList{}
|
result := &api.EventList{}
|
||||||
err := e.client.Get().
|
err := e.client.Get().
|
||||||
Namespace(e.namespace).
|
NamespaceIfScoped(e.namespace, len(e.namespace) > 0).
|
||||||
Resource("events").
|
Resource("events").
|
||||||
SelectorParam("labels", label).
|
SelectorParam("labels", label).
|
||||||
SelectorParam("fields", field).
|
SelectorParam("fields", field).
|
||||||
@ -115,7 +115,7 @@ func (e *events) Get(name string) (*api.Event, error) {
|
|||||||
|
|
||||||
result := &api.Event{}
|
result := &api.Event{}
|
||||||
err := e.client.Get().
|
err := e.client.Get().
|
||||||
Namespace(e.namespace).
|
NamespaceIfScoped(e.namespace, len(e.namespace) > 0).
|
||||||
Resource("events").
|
Resource("events").
|
||||||
Name(name).
|
Name(name).
|
||||||
Do().
|
Do().
|
||||||
@ -127,7 +127,7 @@ func (e *events) Get(name string) (*api.Event, error) {
|
|||||||
func (e *events) Watch(label, field labels.Selector, resourceVersion string) (watch.Interface, error) {
|
func (e *events) Watch(label, field labels.Selector, resourceVersion string) (watch.Interface, error) {
|
||||||
return e.client.Get().
|
return e.client.Get().
|
||||||
Prefix("watch").
|
Prefix("watch").
|
||||||
Namespace(e.namespace).
|
NamespaceIfScoped(e.namespace, len(e.namespace) > 0).
|
||||||
Resource("events").
|
Resource("events").
|
||||||
Param("resourceVersion", resourceVersion).
|
Param("resourceVersion", resourceVersion).
|
||||||
SelectorParam("labels", label).
|
SelectorParam("labels", label).
|
||||||
|
@ -62,7 +62,9 @@ func TestEventCreate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
timeStamp := util.Now()
|
timeStamp := util.Now()
|
||||||
event := &api.Event{
|
event := &api.Event{
|
||||||
//namespace: namespace{"default"},
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Namespace: api.NamespaceDefault,
|
||||||
|
},
|
||||||
InvolvedObject: *objReference,
|
InvolvedObject: *objReference,
|
||||||
FirstTimestamp: timeStamp,
|
FirstTimestamp: timeStamp,
|
||||||
LastTimestamp: timeStamp,
|
LastTimestamp: timeStamp,
|
||||||
@ -80,7 +82,7 @@ func TestEventCreate(t *testing.T) {
|
|||||||
response, err := c.Setup().Events("").Create(event)
|
response, err := c.Setup().Events("").Create(event)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("%#v should be nil.", err)
|
t.Fatalf("%v should be nil.", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if e, a := *objReference, response.InvolvedObject; !reflect.DeepEqual(e, a) {
|
if e, a := *objReference, response.InvolvedObject; !reflect.DeepEqual(e, a) {
|
||||||
@ -99,6 +101,9 @@ func TestEventGet(t *testing.T) {
|
|||||||
}
|
}
|
||||||
timeStamp := util.Now()
|
timeStamp := util.Now()
|
||||||
event := &api.Event{
|
event := &api.Event{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Namespace: "other",
|
||||||
|
},
|
||||||
InvolvedObject: *objReference,
|
InvolvedObject: *objReference,
|
||||||
FirstTimestamp: timeStamp,
|
FirstTimestamp: timeStamp,
|
||||||
LastTimestamp: timeStamp,
|
LastTimestamp: timeStamp,
|
||||||
@ -116,7 +121,7 @@ func TestEventGet(t *testing.T) {
|
|||||||
response, err := c.Setup().Events("").Get("1")
|
response, err := c.Setup().Events("").Get("1")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("%#v should be nil.", err)
|
t.Fatalf("%v should be nil.", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if e, r := event.InvolvedObject, response.InvolvedObject; !reflect.DeepEqual(e, r) {
|
if e, r := event.InvolvedObject, response.InvolvedObject; !reflect.DeepEqual(e, r) {
|
||||||
|
@ -181,6 +181,14 @@ func (r *Request) Namespace(namespace string) *Request {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NamespaceIfScoped is a convenience function to set a namespace if scoped is true
|
||||||
|
func (r *Request) NamespaceIfScoped(namespace string, scoped bool) *Request {
|
||||||
|
if scoped {
|
||||||
|
return r.Namespace(namespace)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
// AbsPath overwrites an existing path with the segments provided. Trailing slashes are preserved
|
// AbsPath overwrites an existing path with the segments provided. Trailing slashes are preserved
|
||||||
// when a single segment is passed.
|
// when a single segment is passed.
|
||||||
func (r *Request) AbsPath(segments ...string) *Request {
|
func (r *Request) AbsPath(segments ...string) *Request {
|
||||||
@ -320,7 +328,7 @@ func (r *Request) finalURL() string {
|
|||||||
query.Add(key, value)
|
query.Add(key, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.namespaceSet && r.namespaceInQuery && len(r.namespace) > 0 {
|
if r.namespaceSet && r.namespaceInQuery {
|
||||||
query.Add("namespace", r.namespace)
|
query.Add("namespace", r.namespace)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,6 +435,14 @@ func (r *Request) Do() Result {
|
|||||||
return Result{err: &RequestConstructionError{r.err}}
|
return Result{err: &RequestConstructionError{r.err}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: added to catch programmer errors (invoking operations with an object with an empty namespace)
|
||||||
|
if (r.verb == "GET" || r.verb == "PUT" || r.verb == "DELETE") && r.namespaceSet && len(r.resourceName) > 0 && len(r.namespace) == 0 {
|
||||||
|
return Result{err: &RequestConstructionError{fmt.Errorf("an empty namespace may not be set when a resource name is provided")}}
|
||||||
|
}
|
||||||
|
if (r.verb == "POST") && r.namespaceSet && len(r.namespace) == 0 {
|
||||||
|
return Result{err: &RequestConstructionError{fmt.Errorf("an empty namespace may not be set during creation")}}
|
||||||
|
}
|
||||||
|
|
||||||
req, err := http.NewRequest(r.verb, r.finalURL(), r.body)
|
req, err := http.NewRequest(r.verb, r.finalURL(), r.body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Result{err: &RequestConstructionError{err}}
|
return Result{err: &RequestConstructionError{err}}
|
||||||
|
@ -56,17 +56,15 @@ func TestCreateObjects(t *testing.T) {
|
|||||||
items := []runtime.Object{}
|
items := []runtime.Object{}
|
||||||
|
|
||||||
items = append(items, &api.Pod{
|
items = append(items, &api.Pod{
|
||||||
TypeMeta: api.TypeMeta{APIVersion: "v1beta1", Kind: "Pod"},
|
ObjectMeta: api.ObjectMeta{Name: "test-pod", Namespace: "default"},
|
||||||
ObjectMeta: api.ObjectMeta{Name: "test-pod"},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
items = append(items, &api.Service{
|
items = append(items, &api.Service{
|
||||||
TypeMeta: api.TypeMeta{APIVersion: "v1beta1", Kind: "Service"},
|
ObjectMeta: api.ObjectMeta{Name: "test-service", Namespace: "default"},
|
||||||
ObjectMeta: api.ObjectMeta{Name: "test-service"},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
typer, mapper := getTyperAndMapper()
|
typer, mapper := getTyperAndMapper()
|
||||||
client, s := getFakeClient(t, []string{"/api/v1beta1/pods", "/api/v1beta1/services"})
|
client, s := getFakeClient(t, []string{"/api/v1beta1/pods?namespace=default", "/api/v1beta1/services?namespace=default"})
|
||||||
|
|
||||||
errs := CreateObjects(typer, mapper, client, items)
|
errs := CreateObjects(typer, mapper, client, items)
|
||||||
s.Close()
|
s.Close()
|
||||||
|
@ -35,6 +35,8 @@ type Helper struct {
|
|||||||
// An interface for reading or writing the resource version of this
|
// An interface for reading or writing the resource version of this
|
||||||
// type.
|
// type.
|
||||||
Versioner runtime.ResourceVersioner
|
Versioner runtime.ResourceVersioner
|
||||||
|
// True if the resource type is scoped to namespaces
|
||||||
|
NamespaceScoped bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHelper creates a Helper from a ResourceMapping
|
// NewHelper creates a Helper from a ResourceMapping
|
||||||
@ -44,12 +46,14 @@ func NewHelper(client RESTClient, mapping *meta.RESTMapping) *Helper {
|
|||||||
Resource: mapping.Resource,
|
Resource: mapping.Resource,
|
||||||
Codec: mapping.Codec,
|
Codec: mapping.Codec,
|
||||||
Versioner: mapping.MetadataAccessor,
|
Versioner: mapping.MetadataAccessor,
|
||||||
|
|
||||||
|
NamespaceScoped: mapping.Scope.Name() == meta.RESTScopeNameNamespace,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Helper) Get(namespace, name string) (runtime.Object, error) {
|
func (m *Helper) Get(namespace, name string) (runtime.Object, error) {
|
||||||
return m.RESTClient.Get().
|
return m.RESTClient.Get().
|
||||||
Namespace(namespace).
|
NamespaceIfScoped(namespace, m.NamespaceScoped).
|
||||||
Resource(m.Resource).
|
Resource(m.Resource).
|
||||||
Name(name).
|
Name(name).
|
||||||
Do().
|
Do().
|
||||||
@ -58,7 +62,7 @@ func (m *Helper) Get(namespace, name string) (runtime.Object, error) {
|
|||||||
|
|
||||||
func (m *Helper) List(namespace string, selector labels.Selector) (runtime.Object, error) {
|
func (m *Helper) List(namespace string, selector labels.Selector) (runtime.Object, error) {
|
||||||
return m.RESTClient.Get().
|
return m.RESTClient.Get().
|
||||||
Namespace(namespace).
|
NamespaceIfScoped(namespace, m.NamespaceScoped).
|
||||||
Resource(m.Resource).
|
Resource(m.Resource).
|
||||||
SelectorParam("labels", selector).
|
SelectorParam("labels", selector).
|
||||||
Do().
|
Do().
|
||||||
@ -68,7 +72,7 @@ func (m *Helper) List(namespace string, selector labels.Selector) (runtime.Objec
|
|||||||
func (m *Helper) Watch(namespace, resourceVersion string, labelSelector, fieldSelector labels.Selector) (watch.Interface, error) {
|
func (m *Helper) Watch(namespace, resourceVersion string, labelSelector, fieldSelector labels.Selector) (watch.Interface, error) {
|
||||||
return m.RESTClient.Get().
|
return m.RESTClient.Get().
|
||||||
Prefix("watch").
|
Prefix("watch").
|
||||||
Namespace(namespace).
|
NamespaceIfScoped(namespace, m.NamespaceScoped).
|
||||||
Resource(m.Resource).
|
Resource(m.Resource).
|
||||||
Param("resourceVersion", resourceVersion).
|
Param("resourceVersion", resourceVersion).
|
||||||
SelectorParam("labels", labelSelector).
|
SelectorParam("labels", labelSelector).
|
||||||
@ -79,7 +83,7 @@ func (m *Helper) Watch(namespace, resourceVersion string, labelSelector, fieldSe
|
|||||||
func (m *Helper) WatchSingle(namespace, name, resourceVersion string) (watch.Interface, error) {
|
func (m *Helper) WatchSingle(namespace, name, resourceVersion string) (watch.Interface, error) {
|
||||||
return m.RESTClient.Get().
|
return m.RESTClient.Get().
|
||||||
Prefix("watch").
|
Prefix("watch").
|
||||||
Namespace(namespace).
|
NamespaceIfScoped(namespace, m.NamespaceScoped).
|
||||||
Resource(m.Resource).
|
Resource(m.Resource).
|
||||||
Name(name).
|
Name(name).
|
||||||
Param("resourceVersion", resourceVersion).
|
Param("resourceVersion", resourceVersion).
|
||||||
@ -88,7 +92,7 @@ func (m *Helper) WatchSingle(namespace, name, resourceVersion string) (watch.Int
|
|||||||
|
|
||||||
func (m *Helper) Delete(namespace, name string) error {
|
func (m *Helper) Delete(namespace, name string) error {
|
||||||
return m.RESTClient.Delete().
|
return m.RESTClient.Delete().
|
||||||
Namespace(namespace).
|
NamespaceIfScoped(namespace, m.NamespaceScoped).
|
||||||
Resource(m.Resource).
|
Resource(m.Resource).
|
||||||
Name(name).
|
Name(name).
|
||||||
Do().
|
Do().
|
||||||
@ -100,14 +104,14 @@ func (m *Helper) Create(namespace string, modify bool, data []byte) (runtime.Obj
|
|||||||
obj, err := m.Codec.Decode(data)
|
obj, err := m.Codec.Decode(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// We don't know how to check a version on this object, but create it anyway
|
// We don't know how to check a version on this object, but create it anyway
|
||||||
return createResource(m.RESTClient, m.Resource, namespace, data)
|
return m.createResource(m.RESTClient, m.Resource, namespace, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to version the object based on client logic.
|
// Attempt to version the object based on client logic.
|
||||||
version, err := m.Versioner.ResourceVersion(obj)
|
version, err := m.Versioner.ResourceVersion(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// We don't know how to clear the version on this object, so send it to the server as is
|
// We don't know how to clear the version on this object, so send it to the server as is
|
||||||
return createResource(m.RESTClient, m.Resource, namespace, data)
|
return m.createResource(m.RESTClient, m.Resource, namespace, data)
|
||||||
}
|
}
|
||||||
if version != "" {
|
if version != "" {
|
||||||
if err := m.Versioner.SetResourceVersion(obj, ""); err != nil {
|
if err := m.Versioner.SetResourceVersion(obj, ""); err != nil {
|
||||||
@ -121,11 +125,11 @@ func (m *Helper) Create(namespace string, modify bool, data []byte) (runtime.Obj
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return createResource(m.RESTClient, m.Resource, namespace, data)
|
return m.createResource(m.RESTClient, m.Resource, namespace, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createResource(c RESTClient, resource, namespace string, data []byte) (runtime.Object, error) {
|
func (m *Helper) createResource(c RESTClient, resource, namespace string, data []byte) (runtime.Object, error) {
|
||||||
return c.Post().Namespace(namespace).Resource(resource).Body(data).Do().Get()
|
return c.Post().NamespaceIfScoped(namespace, m.NamespaceScoped).Resource(resource).Body(data).Do().Get()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Helper) Update(namespace, name string, overwrite bool, data []byte) (runtime.Object, error) {
|
func (m *Helper) Update(namespace, name string, overwrite bool, data []byte) (runtime.Object, error) {
|
||||||
@ -134,21 +138,21 @@ func (m *Helper) Update(namespace, name string, overwrite bool, data []byte) (ru
|
|||||||
obj, err := m.Codec.Decode(data)
|
obj, err := m.Codec.Decode(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// We don't know how to handle this object, but update it anyway
|
// We don't know how to handle this object, but update it anyway
|
||||||
return updateResource(c, m.Resource, namespace, name, data)
|
return m.updateResource(c, m.Resource, namespace, name, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to version the object based on client logic.
|
// Attempt to version the object based on client logic.
|
||||||
version, err := m.Versioner.ResourceVersion(obj)
|
version, err := m.Versioner.ResourceVersion(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// We don't know how to version this object, so send it to the server as is
|
// We don't know how to version this object, so send it to the server as is
|
||||||
return updateResource(c, m.Resource, namespace, name, data)
|
return m.updateResource(c, m.Resource, namespace, name, data)
|
||||||
}
|
}
|
||||||
if version == "" && overwrite {
|
if version == "" && overwrite {
|
||||||
// Retrieve the current version of the object to overwrite the server object
|
// Retrieve the current version of the object to overwrite the server object
|
||||||
serverObj, err := c.Get().Namespace(namespace).Resource(m.Resource).Name(name).Do().Get()
|
serverObj, err := c.Get().Namespace(namespace).Resource(m.Resource).Name(name).Do().Get()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// The object does not exist, but we want it to be created
|
// The object does not exist, but we want it to be created
|
||||||
return updateResource(c, m.Resource, namespace, name, data)
|
return m.updateResource(c, m.Resource, namespace, name, data)
|
||||||
}
|
}
|
||||||
serverVersion, err := m.Versioner.ResourceVersion(serverObj)
|
serverVersion, err := m.Versioner.ResourceVersion(serverObj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -164,9 +168,9 @@ func (m *Helper) Update(namespace, name string, overwrite bool, data []byte) (ru
|
|||||||
data = newData
|
data = newData
|
||||||
}
|
}
|
||||||
|
|
||||||
return updateResource(c, m.Resource, namespace, name, data)
|
return m.updateResource(c, m.Resource, namespace, name, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateResource(c RESTClient, resource, namespace, name string, data []byte) (runtime.Object, error) {
|
func (m *Helper) updateResource(c RESTClient, resource, namespace, name string, data []byte) (runtime.Object, error) {
|
||||||
return c.Put().Namespace(namespace).Resource(resource).Name(name).Body(data).Do().Get()
|
return c.Put().NamespaceIfScoped(namespace, m.NamespaceScoped).Resource(resource).Name(name).Body(data).Do().Get()
|
||||||
}
|
}
|
||||||
|
@ -75,6 +75,10 @@ func TestHelperDelete(t *testing.T) {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
parts := splitPath(req.URL.Path)
|
parts := splitPath(req.URL.Path)
|
||||||
|
if len(parts) < 3 {
|
||||||
|
t.Errorf("expected URL path to have 3 parts: %s", req.URL.Path)
|
||||||
|
return false
|
||||||
|
}
|
||||||
if parts[1] != "bar" {
|
if parts[1] != "bar" {
|
||||||
t.Errorf("url doesn't contain namespace: %#v", req)
|
t.Errorf("url doesn't contain namespace: %#v", req)
|
||||||
return false
|
return false
|
||||||
@ -95,6 +99,7 @@ func TestHelperDelete(t *testing.T) {
|
|||||||
}
|
}
|
||||||
modifier := &Helper{
|
modifier := &Helper{
|
||||||
RESTClient: client,
|
RESTClient: client,
|
||||||
|
NamespaceScoped: true,
|
||||||
}
|
}
|
||||||
err := modifier.Delete("bar", "foo")
|
err := modifier.Delete("bar", "foo")
|
||||||
if (err != nil) != test.Err {
|
if (err != nil) != test.Err {
|
||||||
@ -188,6 +193,7 @@ func TestHelperCreate(t *testing.T) {
|
|||||||
RESTClient: client,
|
RESTClient: client,
|
||||||
Codec: testapi.Codec(),
|
Codec: testapi.Codec(),
|
||||||
Versioner: testapi.MetadataAccessor(),
|
Versioner: testapi.MetadataAccessor(),
|
||||||
|
NamespaceScoped: true,
|
||||||
}
|
}
|
||||||
data := []byte{}
|
data := []byte{}
|
||||||
if test.Object != nil {
|
if test.Object != nil {
|
||||||
@ -268,6 +274,7 @@ func TestHelperGet(t *testing.T) {
|
|||||||
}
|
}
|
||||||
modifier := &Helper{
|
modifier := &Helper{
|
||||||
RESTClient: client,
|
RESTClient: client,
|
||||||
|
NamespaceScoped: true,
|
||||||
}
|
}
|
||||||
obj, err := modifier.Get("bar", "foo")
|
obj, err := modifier.Get("bar", "foo")
|
||||||
if (err != nil) != test.Err {
|
if (err != nil) != test.Err {
|
||||||
@ -338,6 +345,7 @@ func TestHelperList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
modifier := &Helper{
|
modifier := &Helper{
|
||||||
RESTClient: client,
|
RESTClient: client,
|
||||||
|
NamespaceScoped: true,
|
||||||
}
|
}
|
||||||
obj, err := modifier.List("bar", labels.SelectorFromSet(labels.Set{"foo": "baz"}))
|
obj, err := modifier.List("bar", labels.SelectorFromSet(labels.Set{"foo": "baz"}))
|
||||||
if (err != nil) != test.Err {
|
if (err != nil) != test.Err {
|
||||||
@ -443,6 +451,7 @@ func TestHelperUpdate(t *testing.T) {
|
|||||||
RESTClient: client,
|
RESTClient: client,
|
||||||
Codec: testapi.Codec(),
|
Codec: testapi.Codec(),
|
||||||
Versioner: testapi.MetadataAccessor(),
|
Versioner: testapi.MetadataAccessor(),
|
||||||
|
NamespaceScoped: true,
|
||||||
}
|
}
|
||||||
data := []byte{}
|
data := []byte{}
|
||||||
if test.Object != nil {
|
if test.Object != nil {
|
||||||
|
@ -260,7 +260,7 @@ func TestSyncEndpointsItemsEmptySelectorSelectsAll(t *testing.T) {
|
|||||||
serviceList := api.ServiceList{
|
serviceList := api.ServiceList{
|
||||||
Items: []api.Service{
|
Items: []api.Service{
|
||||||
{
|
{
|
||||||
ObjectMeta: api.ObjectMeta{Name: "foo"},
|
ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "other"},
|
||||||
Spec: api.ServiceSpec{
|
Spec: api.ServiceSpec{
|
||||||
Selector: map[string]string{},
|
Selector: map[string]string{},
|
||||||
},
|
},
|
||||||
@ -290,14 +290,14 @@ func TestSyncEndpointsItemsEmptySelectorSelectsAll(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Endpoints: []string{"1.2.3.4:8080"},
|
Endpoints: []string{"1.2.3.4:8080"},
|
||||||
})
|
})
|
||||||
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints/foo", "PUT", &data)
|
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints/foo?namespace=other", "PUT", &data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSyncEndpointsItemsPreexisting(t *testing.T) {
|
func TestSyncEndpointsItemsPreexisting(t *testing.T) {
|
||||||
serviceList := api.ServiceList{
|
serviceList := api.ServiceList{
|
||||||
Items: []api.Service{
|
Items: []api.Service{
|
||||||
{
|
{
|
||||||
ObjectMeta: api.ObjectMeta{Name: "foo"},
|
ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"},
|
||||||
Spec: api.ServiceSpec{
|
Spec: api.ServiceSpec{
|
||||||
Selector: map[string]string{
|
Selector: map[string]string{
|
||||||
"foo": "bar",
|
"foo": "bar",
|
||||||
@ -329,14 +329,14 @@ func TestSyncEndpointsItemsPreexisting(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Endpoints: []string{"1.2.3.4:8080"},
|
Endpoints: []string{"1.2.3.4:8080"},
|
||||||
})
|
})
|
||||||
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints/foo", "PUT", &data)
|
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints/foo?namespace=bar", "PUT", &data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSyncEndpointsItemsPreexistingIdentical(t *testing.T) {
|
func TestSyncEndpointsItemsPreexistingIdentical(t *testing.T) {
|
||||||
serviceList := api.ServiceList{
|
serviceList := api.ServiceList{
|
||||||
Items: []api.Service{
|
Items: []api.Service{
|
||||||
{
|
{
|
||||||
ObjectMeta: api.ObjectMeta{Name: "foo"},
|
ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: api.NamespaceDefault},
|
||||||
Spec: api.ServiceSpec{
|
Spec: api.ServiceSpec{
|
||||||
Selector: map[string]string{
|
Selector: map[string]string{
|
||||||
"foo": "bar",
|
"foo": "bar",
|
||||||
@ -360,14 +360,14 @@ func TestSyncEndpointsItemsPreexistingIdentical(t *testing.T) {
|
|||||||
if err := endpoints.SyncServiceEndpoints(); err != nil {
|
if err := endpoints.SyncServiceEndpoints(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints/foo", "GET", nil)
|
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints/foo?namespace=default", "GET", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSyncEndpointsItems(t *testing.T) {
|
func TestSyncEndpointsItems(t *testing.T) {
|
||||||
serviceList := api.ServiceList{
|
serviceList := api.ServiceList{
|
||||||
Items: []api.Service{
|
Items: []api.Service{
|
||||||
{
|
{
|
||||||
ObjectMeta: api.ObjectMeta{Name: "foo"},
|
ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "other"},
|
||||||
Spec: api.ServiceSpec{
|
Spec: api.ServiceSpec{
|
||||||
Selector: map[string]string{
|
Selector: map[string]string{
|
||||||
"foo": "bar",
|
"foo": "bar",
|
||||||
@ -392,7 +392,7 @@ func TestSyncEndpointsItems(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Endpoints: []string{"1.2.3.4:8080"},
|
Endpoints: []string{"1.2.3.4:8080"},
|
||||||
})
|
})
|
||||||
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints", "POST", &data)
|
endpointsHandler.ValidateRequest(t, "/api/"+testapi.Version()+"/endpoints?namespace=other", "POST", &data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSyncEndpointsPodError(t *testing.T) {
|
func TestSyncEndpointsPodError(t *testing.T) {
|
||||||
|
@ -277,7 +277,13 @@ func TestBind(t *testing.T) {
|
|||||||
table := []struct {
|
table := []struct {
|
||||||
binding *api.Binding
|
binding *api.Binding
|
||||||
}{
|
}{
|
||||||
{binding: &api.Binding{PodID: "foo", Host: "foohost.kubernetes.mydomain.com"}},
|
{binding: &api.Binding{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Namespace: api.NamespaceDefault,
|
||||||
|
},
|
||||||
|
PodID: "foo",
|
||||||
|
Host: "foohost.kubernetes.mydomain.com",
|
||||||
|
}},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, item := range table {
|
for _, item := range table {
|
||||||
@ -296,7 +302,7 @@ func TestBind(t *testing.T) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
expectedBody := runtime.EncodeOrDie(testapi.Codec(), item.binding)
|
expectedBody := runtime.EncodeOrDie(testapi.Codec(), item.binding)
|
||||||
handler.ValidateRequest(t, "/api/"+testapi.Version()+"/bindings", "POST", &expectedBody)
|
handler.ValidateRequest(t, "/api/"+testapi.Version()+"/bindings?namespace=default", "POST", &expectedBody)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user