func handleAppAnnotation(w http.ResponseWriter, r *http.Request, pm *schema.PodManifest, im *schema.ImageManifest) { defer r.Body.Close() n := mux.Vars(r)["name"] k, err := types.NewACIdentifier(n) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "App annotation name %q is not a valid AC Identifier", n) return } n = mux.Vars(r)["app"] an, err := types.NewACName(n) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "App name %q is not a valid AC Name", n) return } merged := mergeAppAnnotations(im, pm, an) v, ok := merged.Get(k.String()) if !ok { w.WriteHeader(http.StatusNotFound) fmt.Fprintf(w, "App annotation %q not found", k) return } w.Header().Add("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) w.Write([]byte(v)) }
func handleRegisterApp(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() uuid, err := types.NewUUID(mux.Vars(r)["uuid"]) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "UUID is missing or malformed: %v", err) return } an := mux.Vars(r)["app"] if an == "" { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, "app missing") return } im := &schema.ImageManifest{} if err := json.NewDecoder(r.Body).Decode(im); err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "JSON-decoding failed: %v", err) return } err = pods.addApp(uuid, an, im) if err != nil { w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, "Pod with given UUID not found") return } w.WriteHeader(http.StatusOK) }
func appGet(h func(http.ResponseWriter, *http.Request, *schema.PodManifest, *schema.ImageManifest)) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { token := mux.Vars(r)["token"] an := mux.Vars(r)["app"] if an == "" { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, "app missing") return } pm, im, err := pods.getManifests(token, an) switch { case err == nil: h(w, r, pm, im) case err == errPodNotFound: w.WriteHeader(http.StatusUnauthorized) fmt.Fprintln(w, err) default: w.WriteHeader(http.StatusNotFound) fmt.Fprintln(w, err) } } }
func handlePodSign(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() token := mux.Vars(r)["token"] uuid, err := pods.getUUID(token) if err != nil { w.WriteHeader(http.StatusUnauthorized) fmt.Fprintln(w, err) return } content := r.FormValue("content") if content == "" { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "content form value not found") return } // HMAC(UID:content) h := hmac.New(sha512.New, hmacKey[:]) h.Write((*uuid)[:]) h.Write([]byte(content)) // Send back HMAC as the signature w.Header().Add("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) enc := base64.NewEncoder(base64.StdEncoding, w) enc.Write(h.Sum(nil)) enc.Close() }
func handleRegisterPod(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() uuid, err := types.NewUUID(mux.Vars(r)["uuid"]) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "UUID is missing or malformed: %v", err) return } token := queryValue(r.URL, "token") if token == "" { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, "token missing") return } pm := &schema.PodManifest{} if err := json.NewDecoder(r.Body).Decode(pm); err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "JSON-decoding failed: %v", err) return } pods.addPod(uuid, token, pm) w.WriteHeader(http.StatusOK) }
func podGet(h func(http.ResponseWriter, *http.Request, *schema.PodManifest)) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { token := mux.Vars(r)["token"] pm, err := pods.getPodManifest(token) if err != nil { w.WriteHeader(http.StatusUnauthorized) fmt.Fprintln(w, err) return } h(w, r, pm) } }
func handlePodUUID(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() token := mux.Vars(r)["token"] uuid, err := pods.getUUID(token) if err != nil { w.WriteHeader(http.StatusUnauthorized) fmt.Fprintln(w, err) return } w.Header().Add("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) w.Write([]byte(uuid.String())) }
func handleAppAnnotations(w http.ResponseWriter, r *http.Request, pm *schema.PodManifest, im *schema.ImageManifest) { defer r.Body.Close() n := mux.Vars(r)["app"] an, err := types.NewACName(n) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "App name %q is not a valid AC Name", n) return } w.Header().Add("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) for _, annot := range mergeAppAnnotations(im, pm, an) { fmt.Fprintln(w, string(annot.Name)) } }
func handleUnregisterPod(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() uuid, err := types.NewUUID(mux.Vars(r)["uuid"]) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "UUID is missing or malformed: %v", err) return } if err := pods.remove(uuid); err != nil { w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, err) return } w.WriteHeader(http.StatusOK) }
func handleAppID(w http.ResponseWriter, r *http.Request, pm *schema.PodManifest, im *schema.ImageManifest) { defer r.Body.Close() n := mux.Vars(r)["app"] an, err := types.NewACName(n) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "App name %q is not a valid AC Name", n) return } w.Header().Add("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) app := pm.Apps.Get(*an) if app == nil { // This is impossiple as we have already checked that // the image manifest is not nil in the parent function. panic("could not find app in manifest!") } w.Write([]byte(app.Image.ID.String())) }
func appGet(h func(http.ResponseWriter, *http.Request, *schema.PodManifest, *schema.ImageManifest)) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ip := strings.Split(r.RemoteAddr, ":")[0] an := mux.Vars(r)["app"] if an == "" { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, "app missing") return } pm, im, err := pods.getManifests(ip, an) if err != nil { w.WriteHeader(http.StatusNotFound) fmt.Fprintln(w, err) return } h(w, r, pm, im) } }
func handlePodAnnotation(w http.ResponseWriter, r *http.Request, pm *schema.PodManifest) { defer r.Body.Close() k, err := types.NewACName(mux.Vars(r)["name"]) if err != nil { w.WriteHeader(http.StatusNotFound) fmt.Fprintf(w, "Pod annotation is not a valid AC Name") return } v, ok := pm.Annotations.Get(k.String()) if !ok { w.WriteHeader(http.StatusNotFound) fmt.Fprintf(w, "Pod annotation (%v) not found", k) return } w.Header().Add("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) w.Write([]byte(v)) }