Implementation of IPS delete/update flow 01/11201/1
authorYouhwan Seol <yh.seol@samsung.com>
Tue, 21 Feb 2023 05:01:05 +0000 (14:01 +0900)
committerYouhwan Seol <yh.seol@samsung.com>
Wed, 24 May 2023 09:23:08 +0000 (18:23 +0900)
Change-Id: Ifbebb860c12ad9a77a33b2b3302c7f652c0d1abe
Signed-off-by: Youhwan Seol <yh.seol@samsung.com>
pkg/api/rest_server.go
pkg/api/v1/deployment/deployment.go
pkg/client/kserve/client.go
pkg/controller/v1/adapter/controller.go

index 51b6de1..6810d9d 100644 (file)
@@ -41,8 +41,8 @@ func setupRouter() (router *gin.Engine) {
                deployment := v1.Group(url.IPS())
                {
                        deployment.POST("", deploymentExecutor.Deploy)
-                       // deployment.PUT
-                       // deployment.DELETE
+                       deployment.DELETE("", deploymentExecutor.Delete)
+                       deployment.PUT("", deploymentExecutor.Update)
                }
 
                healthcheck := v1.Group(url.Healthcheck())
index 68ff9a2..94d9ac2 100644 (file)
@@ -32,6 +32,8 @@ import (
 
 type Command interface {
        Deploy(c *gin.Context)
+       Delete(c *gin.Context)
+       Update(c *gin.Context)
 }
 
 type Executor struct {
@@ -67,3 +69,47 @@ func (Executor) Deploy(c *gin.Context) {
        }
        utils.WriteSuccess(c.Writer, http.StatusCreated, nil)
 }
+
+func (Executor) Delete(c *gin.Context) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       name := c.Query("name")
+       if name == "" {
+               utils.WriteError(c.Writer, errors.InvalidIPSName{Message: "Empty Query"})
+               return
+       }
+
+       err := ipsAdapter.Delete(name)
+       if err != nil {
+               utils.WriteError(c.Writer, err)
+               return
+       }
+
+       utils.WriteSuccess(c.Writer, http.StatusNoContent, nil)
+}
+
+func (Executor) Update(c *gin.Context) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       name := c.Query("name")
+       if name == "" {
+               utils.WriteError(c.Writer, errors.InvalidIPSName{Message: "Empty Query"})
+               return
+       }
+
+       version := c.Query("version")
+       if version == "" {
+               utils.WriteError(c.Writer, errors.InvalidIPSName{Message: "Empty Query"})
+               return
+       }
+
+       _, err := ipsAdapter.Update(name, version)
+       if err != nil {
+               utils.WriteError(c.Writer, err)
+               return
+       }
+
+       utils.WriteSuccess(c.Writer, http.StatusCreated, nil)
+}
index 4d52d9f..c485fa1 100644 (file)
@@ -23,6 +23,7 @@ import (
        api_v1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1"
        "github.com/kserve/kserve/pkg/client/clientset/versioned"
        client_v1beta1 "github.com/kserve/kserve/pkg/client/clientset/versioned/typed/serving/v1beta1"
+       v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/client-go/tools/clientcmd"
 
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/commons/errors"
@@ -39,6 +40,9 @@ var ifsvGetter func(string) (client_v1beta1.InferenceServiceInterface, error)
 type Command interface {
        Init(kubeconfigPath string) error
        Create(values types.Values) (string, error)
+       Delete(name string) error
+       Get(name string) (*api_v1beta1.InferenceService, error)
+       Update(values types.Values) (string, error)
 }
 
 type Client struct {
@@ -102,3 +106,48 @@ func (c *Client) Create(values types.Values) (revision string, err error) {
        }
        return
 }
+
+func (c *Client) Delete(name string) (err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       err = c.api.Delete(name, &v1.DeleteOptions{})
+       if err != nil {
+               logger.Logging(logger.ERROR, err.Error())
+               err = errors.NotFoundIPS{
+                       Message: err.Error(),
+               }
+               return
+       }
+       return
+}
+
+func (c *Client) Get(name string) (ifsv *api_v1beta1.InferenceService, err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       ifsv, err = c.api.Get(name, v1.GetOptions{})
+       if err != nil {
+               logger.Logging(logger.ERROR, err.Error())
+               err = errors.NotFoundIPS{Message: err.Error()}
+               return
+       }
+       return
+}
+
+func (c *Client) Update(values types.Values) (revision string, err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       info := convertValuesToInferenceService(values)
+       if err != nil {
+               return
+       }
+
+       _, err = c.api.Update(&info)
+       if err != nil {
+               logger.Logging(logger.ERROR, err.Error())
+               err = errors.NotFoundIPS{Message: err.Error()}
+       }
+       return
+}
index 1918763..0587c8a 100644 (file)
@@ -24,11 +24,14 @@ import (
 
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/client/kserve"
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/client/onboard"
+       "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/commons/errors"
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/commons/logger"
 )
 
 type Command interface {
        Deploy(name string, version string) (string, error)
+       Delete(name string) error
+       Update(name string, version string) (string, error)
 }
 
 type Executor struct {
@@ -79,3 +82,51 @@ func (Executor) Deploy(name string, version string) (revision string, err error)
        }
        return
 }
+
+func (Executor) Delete(name string) (err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       err = onboardClient.Get(name)
+       if err != nil {
+               err = errors.InvalidIPSName{
+                       Message: err.Error(),
+               }
+               return
+       }
+
+       err = kserveClient.Delete(name)
+       if err != nil {
+               return
+       }
+       return
+}
+
+func (Executor) Update(name string, version string) (revision string, err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       path, err := onboardClient.Download(name, version)
+       if err != nil {
+               return
+       }
+       defer removeFunc(path)
+
+       values, err := valueParse(path)
+       if err != nil {
+               logger.Logging(logger.ERROR, err.Error())
+               return
+       }
+
+       ifsv, err := kserveClient.Get(name)
+       if err != nil {
+               return
+       }
+       values.ResourceVersion = ifsv.ResourceVersion
+
+       revision, err = kserveClient.Update(values)
+       if err != nil {
+               return
+       }
+       return
+}