X-Git-Url: https://gerrit.akraino.org/r/gitweb?a=blobdiff_plain;f=cmd%2Fbpa-restapi-agent%2Fapi%2Fimagehandler.go;h=5fbf8306895510de8dd004f7509487b89ef7604c;hb=de3d22a9939db1f5d9042743100b65a5f15fa671;hp=0d7b787a99cc291bc45f07ac0c0aeb9d68a26b76;hpb=837b726a76403197c248244623bfa7bfe73153eb;p=icn.git diff --git a/cmd/bpa-restapi-agent/api/imagehandler.go b/cmd/bpa-restapi-agent/api/imagehandler.go index 0d7b787..5fbf830 100644 --- a/cmd/bpa-restapi-agent/api/imagehandler.go +++ b/cmd/bpa-restapi-agent/api/imagehandler.go @@ -2,19 +2,17 @@ package api import ( "bytes" - "encoding/base64" "encoding/json" "fmt" "io" "io/ioutil" "net/http" "os" - "os/user" "log" - "path" "strconv" image "bpa-restapi-agent/internal/app" + minioc "bpa-restapi-agent/internal/storage" "github.com/gorilla/mux" ) @@ -26,6 +24,8 @@ type imageHandler struct { // We will set this variable with a mock interface for testing client image.ImageManager dirPath string + minioI minioc.MinIOInfo + storeName string // as minio client bucketname } // CreateHandler handles creation of the image entry in the database @@ -72,12 +72,6 @@ func (h imageHandler) createHandler(w http.ResponseWriter, r *http.Request) { return } - //Create file directory - dir, err := createFileDir(v.Type) - if err != nil { - log.Fatal("Error creating file server directory", err) - } - //Read the file section and ignore the header file, _, err := r.FormFile("file") if err != nil { @@ -87,31 +81,12 @@ func (h imageHandler) createHandler(w http.ResponseWriter, r *http.Request) { defer file.Close() - //Convert the file content to base64 for storage - content, err := ioutil.ReadAll(file) - if err != nil { - http.Error(w, "Unable to read file", http.StatusUnprocessableEntity) - return - } - - v.Config = base64.StdEncoding.EncodeToString(content) ret, err := h.client.Create(v) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - h.dirPath = dir - filePath := path.Join(h.dirPath, v.ImageName) - file1, err := os.Create(filePath) - if err != nil { - e := "Error creating file in filesystem" - log.Printf("%s %s\n", e, err) - w.WriteHeader(http.StatusInternalServerError) - return - } - - defer file1.Close() w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) @@ -122,30 +97,10 @@ func (h imageHandler) createHandler(w http.ResponseWriter, r *http.Request) { } } -// Create file - -func createFileDir(dirName string) (string, error) { - u, err := user.Current() - if err != nil { - log.Println("Error while fetching user home directory", err) - return "", err - } - home := u.HomeDir - dirPath := path.Join(home, "images", dirName) - err = os.MkdirAll(dirPath, 0744) - if err != nil { - log.Println("Error while creating file server directory", err) - return "", err - } - return dirPath, nil -} - // getHandler handles GET operations on a particular name // Returns an Image func (h imageHandler) getHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - // ownerName := vars["owner"] - // clusterName := vars["clustername"] imageName := vars["imgname"] ret, err := h.client.Get(imageName) @@ -166,8 +121,6 @@ func (h imageHandler) getHandler(w http.ResponseWriter, r *http.Request) { // deleteHandler handles DELETE operations on a particular record func (h imageHandler) deleteHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - // ownerName := vars["owner"] - // clusterName := vars["clustername"] imageName := vars["imgname"] err := h.client.Delete(imageName) @@ -176,6 +129,8 @@ func (h imageHandler) deleteHandler(w http.ResponseWriter, r *http.Request) { return } + h.minioI.DeleteImage(h.storeName, imageName) + w.WriteHeader(http.StatusNoContent) } @@ -223,15 +178,6 @@ func (h imageHandler) updateHandler(w http.ResponseWriter, r *http.Request) { defer file.Close() - //Convert the file content to base64 for storage - content, err := ioutil.ReadAll(file) - if err != nil { - http.Error(w, "Unable to read file", http.StatusUnprocessableEntity) - return - } - - v.Config = base64.StdEncoding.EncodeToString(content) - ret, err := h.client.Update(imageName, v) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) @@ -262,6 +208,7 @@ func (h imageHandler) patchHandler(w http.ResponseWriter, r *http.Request) { e := "Upload already completed" w.WriteHeader(http.StatusUnprocessableEntity) w.Write([]byte(e)) + log.Println("Upload already completed") return } off, err := strconv.Atoi(r.Header.Get("Upload-Offset")) @@ -272,9 +219,10 @@ func (h imageHandler) patchHandler(w http.ResponseWriter, r *http.Request) { } log.Printf("Upload offset %d\n", off) if *file.ImageOffset != off { - e := fmt.Sprintf("Expected Offset %d got offset %d", *file.ImageOffset, off) + e := fmt.Sprintf("Expected Offset %d, actual offset %d", *file.ImageOffset, off) w.WriteHeader(http.StatusConflict) w.Write([]byte(e)) + log.Printf("Expected Offset:%d doesn't match got offset:%d\n", *file.ImageOffset, off) return } @@ -301,16 +249,13 @@ func (h imageHandler) patchHandler(w http.ResponseWriter, r *http.Request) { log.Println("Size of received file ", len(body)) } - u, err := user.Current() + fp, _, err := h.client.GetDirPath(imageName) if err != nil { - log.Println("Error while fetching user home directory", err) - return + log.Printf("unable to get file path %s\n", err) + w.WriteHeader(http.StatusInternalServerError) + return } - home := u.HomeDir - dir := path.Join(home, "images", file.Type) - h.dirPath = dir - fp := fmt.Sprintf("%s/%s", h.dirPath, imageName) - f, err := os.OpenFile(fp, os.O_APPEND|os.O_WRONLY, 0644) + f, err := os.OpenFile(fp, os.O_WRONLY, 0644) if err != nil { log.Printf("unable to open file %s\n", err) w.WriteHeader(http.StatusInternalServerError) @@ -324,6 +269,16 @@ func (h imageHandler) patchHandler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) return } + + log.Printf("Start to Patch image, bucket: %s, image: %s, dirpath: %s, offset: %d, n: %d\n", + h.storeName, imageName, fp, *file.ImageOffset, n) + uploadbytes, err := h.minioI.PatchImage(h.storeName, imageName, fp, int64(*file.ImageOffset), int64(n)) + if err != nil || uploadbytes == 0 { + log.Printf("MinIO upload with offset %d failed: %s", *file.ImageOffset, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + log.Println("number of bytes written ", n) no := *file.ImageOffset + n file.ImageOffset = &no @@ -335,12 +290,12 @@ func (h imageHandler) patchHandler(w http.ResponseWriter, r *http.Request) { *file.UploadComplete = true } - // err = h.updateFile(file) - // if err != nil { - // log.Println("Error while updating file", err) - // w.WriteHeader(http.StatusInternalServerError) - // return - // } + _, err = h.client.Update(imageName, file) + if err != nil { + log.Println("Error while updating file", err) + w.WriteHeader(http.StatusInternalServerError) + return + } w.WriteHeader(http.StatusNoContent) return