"io"
"net/http"
"os"
+ "strings"
"gerrit.o-ran-sc.org/r/aiml-fw/awmf/modelmgmtservice/core"
"gerrit.o-ran-sc.org/r/aiml-fw/awmf/modelmgmtservice/db"
logging.INFO("Get model info by name API ...")
modelName := cont.Param("modelName")
- bucketObj := m.dbmgr.GetBucketObject(modelName+os.Getenv("INFO_FILE_POSTFIX"), modelName)
+ bucketObj, err := m.dbmgr.GetBucketObject(modelName+os.Getenv("INFO_FILE_POSTFIX"), modelName)
+ if err != nil {
+ logging.ERROR("Unable to GetModelInfoByName: Error ", err)
+ cont.JSON(http.StatusInternalServerError, gin.H{
+ "code": http.StatusInternalServerError,
+ "message": err.Error(),
+ })
+ }
modelInfoListResp := models.ModelInfoResponse{
Name: modelName,
Data: string(bucketObj),
}
// API to upload the trained model in zip format
-// TODO : Model version as input
-
func (m *MmeApiHandler) UploadModel(cont *gin.Context) {
logging.INFO("Uploading model API ...")
modelName := cont.Param("modelName")
+ modelVersion := cont.Param("modelVersion")
+ artifactVersion := cont.Param("artifactVersion")
+
+ modelKey := fmt.Sprintf("%s_%s_%s", modelName, modelVersion, artifactVersion)
+ exportBucket := strings.ToLower(modelName)
//TODO convert multipart.FileHeader to []byted
fileHeader, _ := cont.FormFile("file")
//TODO : Accept only .zip file for trained model
defer file.Close()
byteFile, _ := io.ReadAll((file))
- logging.INFO("Uploading model : " + modelName)
- if err := m.dbmgr.UploadFile(byteFile, modelName+os.Getenv("MODEL_FILE_POSTFIX"), modelName); err != nil {
+ logging.INFO("Uploading model : " + modelKey)
+ if err := m.dbmgr.UploadFile(byteFile, modelKey+os.Getenv("MODEL_FILE_POSTFIX"), exportBucket); err != nil {
logging.ERROR("Failed to Upload Model : ", err)
cont.JSON(http.StatusInternalServerError, gin.H{
"code": http.StatusInternalServerError,
func (m *MmeApiHandler) DownloadModel(cont *gin.Context) {
logging.INFO("Download model API ...")
modelName := cont.Param("modelName")
- fileName := modelName + os.Getenv("MODEL_FILE_POSTFIX")
- fileByes := m.dbmgr.GetBucketObject(fileName, modelName)
+ modelVersion := cont.Param("modelVersion")
+ artifactVersion := cont.Param("artifactVersion")
+ modelKey := fmt.Sprintf("%s_%s_%s", modelName, modelVersion, artifactVersion)
+ exportBucket := strings.ToLower(modelName)
+
+ fileName := modelKey + os.Getenv("MODEL_FILE_POSTFIX")
+ fileByes, err := m.dbmgr.GetBucketObject(fileName, exportBucket)
+ if err != nil {
+ cont.JSON(http.StatusInternalServerError, gin.H{
+ "code": http.StatusInternalServerError,
+ "message": err.Error(),
+ })
+ return
+ }
//Return file in api reponse using byte slice
cont.Header("Content-Disposition", "attachment;"+fileName)
cont.Header("Content-Type", "application/zip")
type DBMgr interface {
CreateBucket(bucketName string) (err error)
- GetBucketObject(objectName string, bucketName string) BucketObject
+ GetBucketObject(objectName string, bucketName string) (BucketObject, error)
DeleteBucket(client *s3.S3, objectName string, bucketName string)
DeleteBucketObject(client *s3.S3, objectName string, bucketName string) bool
UploadFile(dataBytes []byte, file_name string, bucketName string) error
// objectName : Name of file/object under given bucket
// bucketName : Name of s3 bucket
// TODO: Return error
-func (s3manager *S3Manager) GetBucketObject(objectName string, bucketName string) BucketObject {
+func (s3manager *S3Manager) GetBucketObject(objectName string, bucketName string) (BucketObject, error) {
var response []byte
getInputs := &s3.GetObjectInput{
result, err := s3manager.S3Client.GetObject(getInputs)
if err != nil {
logging.ERROR("Error, can't get fetch object..")
- return response
+ return response, err
}
defer result.Body.Close()
logging.INFO("Successfully retrieved object...")
response, err = io.ReadAll(result.Body)
if err != nil {
logging.ERROR("Recived error while reading body:", err)
+ return nil, err
}
- return response
+ return response, nil
}
func (s3manager *S3Manager) DeleteBucket(client *s3.S3, objectName string, bucketName string) {
continue
}
- bucketObject := s3manager.GetBucketObject(*bucket.Name+bucketObjPostfix, *bucket.Name)
+ bucketObject, err := s3manager.GetBucketObject(*bucket.Name+bucketObjPostfix, *bucket.Name)
+ if err != nil {
+ logging.ERROR("Unable to list bucketname ", *bucket.Name, ": Error : ", err.Error())
+ continue
+ }
if len(bucketObject) == 0 {
continue
}
r.Use(gin.Logger())
r.Use(gin.Recovery())
api := r.Group("/ai-ml-model-registration/v1")
- {
- api.POST("/model-registrations", handler.RegisterModel)
- api.POST("/model-registrations/updateArtifact/:modelname/:modelversion/:artifactversion", handler.UpdateArtifact)
- api.GET("/model-registrations/:modelRegistrationId", handler.GetModelInfoById)
- api.PUT("/model-registrations/:modelRegistrationId", handler.UpdateModel)
- api.DELETE("/model-registrations/:modelRegistrationId", handler.DeleteModel)
- api.GET("/getModelInfo/:modelName", handler.GetModelInfoByName)
- api.POST("/uploadModel/:modelName", handler.UploadModel)
- api.GET("/downloadModel/:modelName/model.zip", handler.DownloadModel)
- }
+ {
+ api.POST("/model-registrations", handler.RegisterModel)
+ api.POST("/model-registrations/updateArtifact/:modelname/:modelversion/:artifactversion", handler.UpdateArtifact)
+ api.GET("/model-registrations/:modelRegistrationId", handler.GetModelInfoById)
+ api.PUT("/model-registrations/:modelRegistrationId", handler.UpdateModel)
+ api.DELETE("/model-registrations/:modelRegistrationId", handler.DeleteModel)
+ api.GET("/getModelInfo/:modelName", handler.GetModelInfoByName)
+ api.POST("/uploadModel/:modelName/:modelVersion/:artifactVersion", handler.UploadModel)
+ api.GET("/downloadModel/:modelName/:modelVersion/:artifactVersion/model.zip", handler.DownloadModel)
+ }
// As per R1-AP v6
- modelDiscovery:= r.Group("/ai-ml-model-discovery/v1")
- {
- modelDiscovery.GET("/models", handler.GetModelInfo)
- }
+ modelDiscovery := r.Group("/ai-ml-model-discovery/v1")
+ {
+ modelDiscovery.GET("/models", handler.GetModelInfo)
+ }
return r
}