"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) {
}
revision := v1.Group(url.IPS() + url.Revision())
- // revision.GET()
+ {
+ revision.GET("", reivisonExecutor.Get)
+ }
status := v1.Group(url.IPS() + url.Status())
// status.GET()
--- /dev/null
+/*
+==================================================================================
+
+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)
+}
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 {
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
}
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"
)
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
+}
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"`
+}
"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
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 {
}
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
+}