mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-07 04:03:20 +00:00
Move namespace from query param to path part
This commit is contained in:
@@ -41,19 +41,19 @@ type RESTHandler struct {
|
||||
|
||||
// ServeHTTP handles requests to all RESTStorage objects.
|
||||
func (h *RESTHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||
parts := splitPath(req.URL.Path)
|
||||
if len(parts) < 1 {
|
||||
namespace, kind, parts, err := KindAndNamespace(req)
|
||||
if err != nil {
|
||||
notFound(w, req)
|
||||
return
|
||||
}
|
||||
storage := h.storage[parts[0]]
|
||||
storage := h.storage[kind]
|
||||
if storage == nil {
|
||||
httplog.LogOf(req, w).Addf("'%v' has no storage object", parts[0])
|
||||
httplog.LogOf(req, w).Addf("'%v' has no storage object", kind)
|
||||
notFound(w, req)
|
||||
return
|
||||
}
|
||||
|
||||
h.handleRESTStorage(parts, req, w, storage)
|
||||
h.handleRESTStorage(parts, req, w, storage, namespace)
|
||||
}
|
||||
|
||||
// Sets the SelfLink field of the object.
|
||||
@@ -66,12 +66,17 @@ func (h *RESTHandler) setSelfLink(obj runtime.Object, req *http.Request) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO Remove this when namespace is in path
|
||||
|
||||
// we need to add namespace as a query param, if its not in the resource path
|
||||
if len(namespace) > 0 {
|
||||
query := newURL.Query()
|
||||
query.Set("namespace", namespace)
|
||||
newURL.RawQuery = query.Encode()
|
||||
parts := splitPath(req.URL.Path)
|
||||
if parts[0] != "ns" {
|
||||
query := newURL.Query()
|
||||
query.Set("namespace", namespace)
|
||||
newURL.RawQuery = query.Encode()
|
||||
}
|
||||
}
|
||||
|
||||
err = h.selfLinker.SetSelfLink(obj, newURL.String())
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -107,11 +112,14 @@ func (h *RESTHandler) setSelfLinkAddName(obj runtime.Object, req *http.Request)
|
||||
newURL.Path = path.Join(h.canonicalPrefix, req.URL.Path, name)
|
||||
newURL.RawQuery = ""
|
||||
newURL.Fragment = ""
|
||||
// TODO Remove this when namespace is in path
|
||||
// we need to add namespace as a query param, if its not in the resource path
|
||||
if len(namespace) > 0 {
|
||||
query := newURL.Query()
|
||||
query.Set("namespace", namespace)
|
||||
newURL.RawQuery = query.Encode()
|
||||
parts := splitPath(req.URL.Path)
|
||||
if parts[0] != "ns" {
|
||||
query := newURL.Query()
|
||||
query.Set("namespace", namespace)
|
||||
newURL.RawQuery = query.Encode()
|
||||
}
|
||||
}
|
||||
return h.selfLinker.SetSelfLink(obj, newURL.String())
|
||||
}
|
||||
@@ -138,18 +146,10 @@ func curry(f func(runtime.Object, *http.Request) error, req *http.Request) func(
|
||||
// sync=[false|true] Synchronous request (only applies to create, update, delete operations)
|
||||
// timeout=<duration> Timeout for synchronous requests, only applies if sync=true
|
||||
// labels=<label-selector> Used for filtering list operations
|
||||
func (h *RESTHandler) handleRESTStorage(parts []string, req *http.Request, w http.ResponseWriter, storage RESTStorage) {
|
||||
ctx := api.NewContext()
|
||||
func (h *RESTHandler) handleRESTStorage(parts []string, req *http.Request, w http.ResponseWriter, storage RESTStorage, namespace string) {
|
||||
ctx := api.WithNamespace(api.NewContext(), namespace)
|
||||
sync := req.URL.Query().Get("sync") == "true"
|
||||
timeout := parseTimeout(req.URL.Query().Get("timeout"))
|
||||
// TODO for now, we pull namespace from query parameter, but according to spec, it must go in resource path in future PR
|
||||
// if a namespace if specified, it's always used.
|
||||
// for list/watch operations, a namespace is not required if omitted.
|
||||
// for all other operations, if namespace is omitted, we will default to default namespace.
|
||||
namespace := req.URL.Query().Get("namespace")
|
||||
if len(namespace) > 0 {
|
||||
ctx = api.WithNamespace(ctx, namespace)
|
||||
}
|
||||
switch req.Method {
|
||||
case "GET":
|
||||
switch len(parts) {
|
||||
@@ -175,7 +175,7 @@ func (h *RESTHandler) handleRESTStorage(parts []string, req *http.Request, w htt
|
||||
}
|
||||
writeJSON(http.StatusOK, h.codec, list, w)
|
||||
case 2:
|
||||
item, err := storage.Get(api.WithNamespaceDefaultIfNone(ctx), parts[1])
|
||||
item, err := storage.Get(ctx, parts[1])
|
||||
if err != nil {
|
||||
errorJSON(err, h.codec, w)
|
||||
return
|
||||
@@ -205,7 +205,7 @@ func (h *RESTHandler) handleRESTStorage(parts []string, req *http.Request, w htt
|
||||
errorJSON(err, h.codec, w)
|
||||
return
|
||||
}
|
||||
out, err := storage.Create(api.WithNamespaceDefaultIfNone(ctx), obj)
|
||||
out, err := storage.Create(ctx, obj)
|
||||
if err != nil {
|
||||
errorJSON(err, h.codec, w)
|
||||
return
|
||||
@@ -218,7 +218,7 @@ func (h *RESTHandler) handleRESTStorage(parts []string, req *http.Request, w htt
|
||||
notFound(w, req)
|
||||
return
|
||||
}
|
||||
out, err := storage.Delete(api.WithNamespaceDefaultIfNone(ctx), parts[1])
|
||||
out, err := storage.Delete(ctx, parts[1])
|
||||
if err != nil {
|
||||
errorJSON(err, h.codec, w)
|
||||
return
|
||||
@@ -242,7 +242,7 @@ func (h *RESTHandler) handleRESTStorage(parts []string, req *http.Request, w htt
|
||||
errorJSON(err, h.codec, w)
|
||||
return
|
||||
}
|
||||
out, err := storage.Update(api.WithNamespaceDefaultIfNone(ctx), obj)
|
||||
out, err := storage.Update(ctx, obj)
|
||||
if err != nil {
|
||||
errorJSON(err, h.codec, w)
|
||||
return
|
||||
|
Reference in New Issue
Block a user