From: Youhwan Seol Date: Wed, 22 Feb 2023 05:44:10 +0000 (+0900) Subject: Implementation of reivision feature X-Git-Tag: 1.0.0~15 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F08%2F11208%2F1;p=aiml-fw%2Faihp%2Fips%2Fkserve-adapter.git Implementation of reivision feature Change-Id: I6da9d7ff0dc4e871977dd6066f3c54c44c0a348f Signed-off-by: Youhwan Seol --- diff --git a/pkg/api/rest_server.go b/pkg/api/rest_server.go index 781824c..97f86f9 100644 --- a/pkg/api/rest_server.go +++ b/pkg/api/rest_server.go @@ -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 index 0000000..8a51ec8 --- /dev/null +++ b/pkg/api/v1/revision/revision.go @@ -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) +} diff --git a/pkg/client/kserve/client.go b/pkg/client/kserve/client.go index 3af41f4..bb5934a 100644 --- a/pkg/client/kserve/client.go +++ b/pkg/client/kserve/client.go @@ -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 } diff --git a/pkg/client/kserve/utils.go b/pkg/client/kserve/utils.go index 81fcd93..c755eb8 100644 --- a/pkg/client/kserve/utils.go +++ b/pkg/client/kserve/utils.go @@ -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 +} diff --git a/pkg/commons/types/values.go b/pkg/commons/types/values.go index f8a9614..d5704d4 100644 --- a/pkg/commons/types/values.go +++ b/pkg/commons/types/values.go @@ -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"` +} diff --git a/pkg/controller/v1/adapter/controller.go b/pkg/controller/v1/adapter/controller.go index 53283b3..5107713 100644 --- a/pkg/controller/v1/adapter/controller.go +++ b/pkg/controller/v1/adapter/controller.go @@ -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 +}