fix: route isolation, 404 on invoke/delete nonexistent (v0.6.8)
- Bug#1: namespace-prefix routes to avoid cross-user collision
Route format: /{ns-last-12-chars}/{fn-name}
- Bug#2: INVOKE nonexistent function -> HTTP 404 (was 200)
- Bug#3: DELETE nonexistent function -> HTTP 404 (was 200)
This commit is contained in:
+25
-4
@@ -314,7 +314,12 @@ func (s *server) handleCreateFunction(w http.ResponseWriter, r *http.Request) {
|
|||||||
req.Entrypoint = defaultEntrypoint(req.Language)
|
req.Entrypoint = defaultEntrypoint(req.Language)
|
||||||
}
|
}
|
||||||
if req.Route == "" {
|
if req.Route == "" {
|
||||||
req.Route = "/" + req.Name
|
// namespace-prefix route to avoid collisions between users
|
||||||
|
nsShort := s.userNS(r)
|
||||||
|
if len(nsShort) > 12 {
|
||||||
|
nsShort = nsShort[len(nsShort)-12:]
|
||||||
|
}
|
||||||
|
req.Route = "/" + nsShort + "/" + req.Name
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(req.Route, "/") {
|
if !strings.HasPrefix(req.Route, "/") {
|
||||||
req.Route = "/" + req.Route
|
req.Route = "/" + req.Route
|
||||||
@@ -885,6 +890,16 @@ func (s *server) handleInvokeFunction(w http.ResponseWriter, r *http.Request, na
|
|||||||
ctx, cancel := context.WithTimeout(r.Context(), invokeTimeout)
|
ctx, cancel := context.WithTimeout(r.Context(), invokeTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
|
// check function exists in k8s before invoke
|
||||||
|
if _, err2 := s.dyn.Resource(functionGVR).Namespace(s.userNS(r)).Get(ctx, name, metav1.GetOptions{}); err2 != nil {
|
||||||
|
if apierrors.IsNotFound(err2) {
|
||||||
|
writeJSONError(w, http.StatusNotFound, fmt.Sprintf("function %q not found", name))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
writeJSONError(w, http.StatusBadGateway, fmt.Sprintf("get function %q: %v", name, err2))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
invokeURL := fmt.Sprintf("%s/fission-function/v2/functions/%s", s.routerURL, name)
|
invokeURL := fmt.Sprintf("%s/fission-function/v2/functions/%s", s.routerURL, name)
|
||||||
invokeMethod := http.MethodPost
|
invokeMethod := http.MethodPost
|
||||||
triggers, err := s.dyn.Resource(httpTrigGVR).Namespace(s.userNS(r)).List(ctx, metav1.ListOptions{})
|
triggers, err := s.dyn.Resource(httpTrigGVR).Namespace(s.userNS(r)).List(ctx, metav1.ListOptions{})
|
||||||
@@ -1322,10 +1337,16 @@ func (s *server) handleDeleteFunction(w http.ResponseWriter, r *http.Request, na
|
|||||||
|
|
||||||
var pkgName, envName string
|
var pkgName, envName string
|
||||||
fn, err := s.dyn.Resource(functionGVR).Namespace(s.userNS(r)).Get(ctx, name, metav1.GetOptions{})
|
fn, err := s.dyn.Resource(functionGVR).Namespace(s.userNS(r)).Get(ctx, name, metav1.GetOptions{})
|
||||||
if err == nil {
|
if err != nil {
|
||||||
pkgName, _, _ = unstructured.NestedString(fn.Object, "spec", "package", "packageref", "name")
|
if apierrors.IsNotFound(err) {
|
||||||
envName, _, _ = unstructured.NestedString(fn.Object, "spec", "environment", "name")
|
writeJSONError(w, http.StatusNotFound, fmt.Sprintf("function %q not found", name))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
writeJSONError(w, http.StatusBadGateway, fmt.Sprintf("get function %q: %v", name, err))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
pkgName, _, _ = unstructured.NestedString(fn.Object, "spec", "package", "packageref", "name")
|
||||||
|
envName, _, _ = unstructured.NestedString(fn.Object, "spec", "environment", "name")
|
||||||
|
|
||||||
triggers, err := s.dyn.Resource(httpTrigGVR).Namespace(s.userNS(r)).List(ctx, metav1.ListOptions{})
|
triggers, err := s.dyn.Resource(httpTrigGVR).Namespace(s.userNS(r)).List(ctx, metav1.ListOptions{})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user