Update golang version in bpa-restapi-agent
[icn.git] / cmd / bpa-restapi-agent / api / imagehandler.go
index 0d7b787..5fbf830 100644 (file)
@@ -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