From ec6c76c0d7cc0d01e0d2a35bbf10c9534a56065b Mon Sep 17 00:00:00 2001 From: SANDEEP KUMAR JAISAWAL Date: Wed, 15 Nov 2023 17:02:39 +0530 Subject: [PATCH] downloadModel implemented for MMES Issue-Id: AIMLFW-64 Change-Id: Idfc7bb796cf1c12438409edfb05f5f053dd7094f Signed-off-by: SANDEEP KUMAR JAISAWAL --- apis/mmes_apis.go | 32 ++++++++++++++++++++++++++++---- core/s3_manager.go | 5 ++++- main.go | 2 ++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/apis/mmes_apis.go b/apis/mmes_apis.go index bb2cc31..3fdf76c 100644 --- a/apis/mmes_apis.go +++ b/apis/mmes_apis.go @@ -41,10 +41,11 @@ func init() { fmt.Println("Starting api server...") router := gin.Default() - router.GET("/getModelInfo", GetModelInfo) router.POST("/registerModel", RegisterModel) + router.GET("/getModelInfo", GetModelInfo) router.MaxMultipartMemory = 8 << 20 //8 Mb router.POST("/uploadModel/:modelName", UploadModel) + router.GET("/downloadModel/:modelName", DownloadModel) router.Run(os.Getenv("MMES_URL")) fmt.Println("Started api server...") } @@ -62,10 +63,11 @@ func RegisterModel(cont *gin.Context) { } fmt.Println(modelInfo.ModelName, modelInfo.RAppId, modelInfo.Metainfo) - //Update Unmarshalled struct as per need, e.g. modelInfo.RAppId = "newRappId-1" + //modelInfo.RAppId = "newRappId-1" Update Unmarshalled struct as per need //Need to convert struct to json to create a io.ReadSeeker instance //to insert in to a bucket as file/body modelInfoBytes, err := json.Marshal(modelInfo) + //modelinfo_reader := bytes.NewReader(modelInfo_json) //bytes.Reader is type of io.ReadSeeker //TODO Create singleton for s3_manager s3_manager := core.NewS3Manager() @@ -104,11 +106,13 @@ func GetModelInfo(cont *gin.Context) { } // API to upload the trained model in zip format +// TODO : Model version as input func UploadModel(cont *gin.Context) { fmt.Println("Uploading model API ...") modelName := cont.Param("modelName") //TODO convert multipart.FileHeader to []byted fileHeader, _ := cont.FormFile("file") + //TODO : Accept only .zip file for trained model file, _ := fileHeader.Open() //TODO: Handle error response defer file.Close() @@ -118,8 +122,28 @@ func UploadModel(cont *gin.Context) { fmt.Println("Recieved file name :", fileHeader.Filename) s3_manager := core.NewS3Manager() - s3_manager.UploadFile(byteFile, fileHeader.Filename, modelName) - cont.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", fileHeader.Filename)) + s3_manager.UploadFile(byteFile, modelName+"_model.zip", modelName) + cont.JSON(http.StatusOK, gin.H{ + "code": http.StatusOK, + "message": string("Model uploaded successfully.."), + }) +} + +/* +API to download the trained model from s3 bucket +Input: model name in path params as "modelName" +*/ +func DownloadModel(cont *gin.Context) { + fmt.Println("Download model API ...") + modelName := cont.Param("modelName") + fileName := modelName + "_model.zip" + s3_manager := core.NewS3Manager() + fileByes := s3_manager.GetBucketObject(fileName, modelName) + + //Return file in api reponse using byte slice + cont.Header("Content-Disposition", "attachment;"+fileName) + cont.Header("Content-Type", "application/octet-stream") + cont.Data(http.StatusOK, "application/octet", fileByes) } func GetModel(cont *gin.Context) { diff --git a/core/s3_manager.go b/core/s3_manager.go index 6e22e3e..206a182 100644 --- a/core/s3_manager.go +++ b/core/s3_manager.go @@ -71,6 +71,9 @@ func (s3manager *S3Manager) CreateBucket(bucketName string) { println("Bucket created : ", bucketName) } +// objectName : Name of file/object under given bucket +// bucketName : Name of s3 bucket +// TODO: Return error func (s3manager *S3Manager) GetBucketObject(objectName string, bucketName string) []byte { var response []byte @@ -120,7 +123,7 @@ func (s3manager *S3Manager) DeleteBucketObject(client *s3.S3, objectName string, return true } -func (s3manager *S3Manager) UploadFile(dataBytes [] byte, file_name string, bucketName string) { +func (s3manager *S3Manager) UploadFile(dataBytes []byte, file_name string, bucketName string) { dataReader := bytes.NewReader(dataBytes) //bytes.Reader is type of io.ReadSeeker params := &s3.PutObjectInput{ diff --git a/main.go b/main.go index f984371..9192876 100644 --- a/main.go +++ b/main.go @@ -19,11 +19,13 @@ package main import ( "fmt" + "example.com/mmes/apis" ) func main() { fmt.Println("Starting api..") mmes := &apis.MMESApis{} + fmt.Println(mmes) } -- 2.16.6