Implementation of reivision feature 08/11208/1
authorYouhwan Seol <yh.seol@samsung.com>
Wed, 22 Feb 2023 05:44:10 +0000 (14:44 +0900)
committerYouhwan Seol <yh.seol@samsung.com>
Wed, 24 May 2023 11:25:40 +0000 (20:25 +0900)
Change-Id: I6da9d7ff0dc4e871977dd6066f3c54c44c0a348f
Signed-off-by: Youhwan Seol <yh.seol@samsung.com>
pkg/api/rest_server.go
pkg/api/v1/revision/revision.go [new file with mode: 0644]
pkg/client/kserve/client.go
pkg/client/kserve/utils.go
pkg/commons/types/values.go
pkg/controller/v1/adapter/controller.go

index 781824c..97f86f9 100644 (file)
@@ -25,17 +25,20 @@ import (
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/api/commons/url"
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/api/v1/deployment"
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/api/v1/healthcheck"
+       "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/api/v1/revision"
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/commons/logger"
 )
 
 var (
        deploymentExecutor  deployment.Command
        healthcheckExecutor healthcheck.Command
+       reivisonExecutor    revision.Command
 )
 
 func init() {
        deploymentExecutor = deployment.Executor{}
        healthcheckExecutor = healthcheck.Executor{}
+       reivisonExecutor = revision.Executor{}
 }
 
 func setupRouter() (router *gin.Engine) {
@@ -56,7 +59,9 @@ func setupRouter() (router *gin.Engine) {
                }
 
                revision := v1.Group(url.IPS() + url.Revision())
-               // revision.GET()
+               {
+                       revision.GET("", reivisonExecutor.Get)
+               }
 
                status := v1.Group(url.IPS() + url.Status())
                // status.GET()
diff --git a/pkg/api/v1/revision/revision.go b/pkg/api/v1/revision/revision.go
new file mode 100644 (file)
index 0000000..8a51ec8
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+==================================================================================
+
+Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+==================================================================================
+*/
+
+package revision
+
+import (
+       "encoding/json"
+       "net/http"
+
+       "github.com/gin-gonic/gin"
+
+       "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/api/commons/utils"
+       "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/commons/logger"
+       "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/controller/v1/adapter"
+)
+
+type Command interface {
+       Get(c *gin.Context)
+}
+
+type Executor struct {
+       Command
+}
+
+var ipsAdapter adapter.Command
+
+func init() {
+       ipsAdapter = adapter.Executor{}
+}
+
+func (Executor) Get(c *gin.Context) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       name := c.Query("name")
+
+       reivision, err := ipsAdapter.Revision(name)
+       if err != nil {
+               utils.WriteError(c.Writer, err)
+               return
+       }
+
+       data, err := json.Marshal(reivision)
+       if err != nil {
+               utils.WriteError(c.Writer, err)
+               return
+       }
+
+       utils.WriteSuccess(c.Writer, http.StatusAccepted, data)
+}
index 3af41f4..bb5934a 100644 (file)
@@ -44,6 +44,7 @@ type Command interface {
        Delete(name string) error
        Get(name string) (*api_v1beta1.InferenceService, error)
        Update(values types.Values) (string, error)
+       Revision(name string) (revisionList types.Revision, err error)
 }
 
 type Client struct {
@@ -150,5 +151,46 @@ func (c *Client) Update(values types.Values) (revision string, err error) {
                logger.Logging(logger.ERROR, err.Error())
                err = errors.NotFoundIPS{Message: err.Error()}
        }
+
+       return
+}
+
+func (c *Client) Revision(name string) (revisionList types.Revision, err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       revisionList.Revision = make(map[string]types.RevisionItem)
+
+       if name == "" {
+               ifsvList, e := c.api.List(v1.ListOptions{})
+               if e != nil {
+                       err = errors.InternalServerError{Message: e.Error()}
+                       return
+               }
+
+               for _, ifsv := range ifsvList.Items {
+                       revision, e := makeRevision(ifsv)
+                       if e != nil {
+                               err = e
+                               return
+                       }
+                       revisionList.Revision[ifsv.Name] = revision
+               }
+
+       } else {
+               ifsv, e := c.Get(name)
+               if e != nil {
+                       err = e
+                       return
+               }
+
+               revision, e := makeRevision(*ifsv)
+               if e != nil {
+                       err = e
+                       return
+               }
+               revisionList.Revision[ifsv.Name] = revision
+       }
+
        return
 }
index 81fcd93..c755eb8 100644 (file)
@@ -20,12 +20,14 @@ limitations under the License.
 package kserve
 
 import (
+       "encoding/json"
        "strconv"
 
        api_v1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1"
        core_v1 "k8s.io/api/core/v1"
        v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
+       "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"
        "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/commons/types"
 )
@@ -118,3 +120,20 @@ func convertValuesToInferenceService(values types.Values) (ifsv api_v1beta1.Infe
 
        return
 }
+
+func makeRevision(ifsv api_v1beta1.InferenceService) (revision types.RevisionItem, err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       revisionInfo, exist := ifsv.Status.Components[api_v1beta1.PredictorComponent]
+       if !exist {
+               err = errors.InternalServerError{
+                       Message: "PredictorComponent does not have revision information.",
+               }
+               return
+       }
+
+       data, _ := json.Marshal(revisionInfo)
+       json.Unmarshal(data, &revision)
+       return
+}
index f8a9614..d5704d4 100644 (file)
@@ -34,3 +34,14 @@ type Values struct {
        ResourceVersion       string
        CanaryTrafficPercent  int64
 }
+
+type RevisionItem struct {
+       LatestReadyRevision       string `json:"latestReadyRevision,omitempty" example:"{revision}" format:"string"`
+       LatestCreatedRevision     string `json:"latestCreatedRevision,omitempty" example:"{revision}" format:"string"`
+       PreviousRolledoutRevision string `json:"previousRolledoutRevision,omitempty" example:"{revision}" format:"string"`
+       LatestRolledoutRevision   string `json:"latestRolledoutRevision,omitempty" example:"{revision}" format:"string"`
+}
+
+type Revision struct {
+       Revision map[string]RevisionItem `json:"revision"`
+}
index 53283b3..5107713 100644 (file)
@@ -26,6 +26,7 @@ import (
        "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"
+       "gerrit.o-ran-sc.org/r/aiml-fw/aihp/ips/kserve-adapter/pkg/commons/types"
 )
 
 //go:generate mockgen -source=controller.go -destination=./mock/mock_controller.go -package=mock
@@ -33,6 +34,7 @@ type Command interface {
        Deploy(name string, version string) (string, error)
        Delete(name string) error
        Update(name string, version string, canaryTrafficRatio string) (string, error)
+       Revision(name string) (revisionList types.Revision, err error)
 }
 
 type Executor struct {
@@ -133,3 +135,11 @@ func (Executor) Update(name string, version string, canaryTrafficRatio string) (
        }
        return
 }
+
+func (Executor) Revision(name string) (result types.Revision, err error) {
+       logger.Logging(logger.DEBUG, "IN")
+       defer logger.Logging(logger.DEBUG, "OUT")
+
+       result, err = kserveClient.Revision(name)
+       return
+}