From a99e4515f13d459bf276c69c968f6d2ef1ba9ca9 Mon Sep 17 00:00:00 2001 From: Yuan Tang Date: Thu, 7 Mar 2024 21:17:07 -0500 Subject: [PATCH 01/13] ci: Bump minikube version to work with newer K8s version (#3498) Signed-off-by: Yuan Tang --- .github/actions/minikube-setup/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/minikube-setup/action.yml b/.github/actions/minikube-setup/action.yml index f8ed073551e..2b7ea1adcb8 100644 --- a/.github/actions/minikube-setup/action.yml +++ b/.github/actions/minikube-setup/action.yml @@ -12,7 +12,7 @@ runs: - name: Setup Minikube uses: medyagh/setup-minikube@latest with: - minikube-version: '1.31.1' + minikube-version: '1.32.0' kubernetes-version: 'v1.27.4' driver: 'none' network-plugin: 'cni' From df889a1e211dcf83c28537572e7e3d0046f3cdf3 Mon Sep 17 00:00:00 2001 From: Jooho Lee Date: Sat, 9 Mar 2024 13:27:09 -0500 Subject: [PATCH 02/13] Remove conversion webhook from manifests (#3476) Signed-off-by: jooho --- .../inferenceservice_conversion_webhook.yaml | 20 ------------------- config/default/kustomization.yaml | 11 ---------- 2 files changed, 31 deletions(-) delete mode 100644 config/default/inferenceservice_conversion_webhook.yaml diff --git a/config/default/inferenceservice_conversion_webhook.yaml b/config/default/inferenceservice_conversion_webhook.yaml deleted file mode 100644 index 18be2e28d25..00000000000 --- a/config/default/inferenceservice_conversion_webhook.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.16 or later. -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: inferenceservices.serving.kserve.io -spec: - preserveUnknownFields: false - conversion: - strategy: Webhook - webhook: - conversionReviewVersions: ["v1beta1"] - clientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: $(kserveNamespace) - name: $(webhookServiceName) - path: /convert diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index de4dc92963b..ab38b2b28a2 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -27,11 +27,6 @@ replacements: name: kserve-webhook-server-service version: v1 targets: - - fieldPaths: - - spec.conversion.webhook.clientConfig.service.name - select: - kind: CustomResourceDefinition - name: inferenceservices.serving.kserve.io - fieldPaths: - webhooks.*.clientConfig.service.name select: @@ -78,11 +73,6 @@ replacements: name: kserve-controller-manager version: v1 targets: - - fieldPaths: - - spec.conversion.webhook.clientConfig.service.namespace - select: - kind: CustomResourceDefinition - name: inferenceservices.serving.kserve.io - fieldPaths: - webhooks.*.clientConfig.service.namespace select: @@ -199,5 +189,4 @@ patches: - path: clusterservingruntime_validatingwebhook_cainjection_patch.yaml - path: servingruntime_validationwebhook_cainjection_patch.yaml - path: manager_resources_patch.yaml -- path: inferenceservice_conversion_webhook.yaml - path: cainjection_conversion_webhook.yaml From 3a11f5050bae54c0e2cc160f74230df3e543056e Mon Sep 17 00:00:00 2001 From: Yuan Tang Date: Tue, 12 Mar 2024 04:55:36 -0500 Subject: [PATCH 03/13] fix: Instantiate HuggingfaceModelRepository only when model cannot be loaded. Fixes #3423 (#3424) Signed-off-by: Yuan Tang --- python/huggingfaceserver/huggingfaceserver/__main__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/python/huggingfaceserver/huggingfaceserver/__main__.py b/python/huggingfaceserver/huggingfaceserver/__main__.py index 1fccea2a110..15679bf936f 100644 --- a/python/huggingfaceserver/huggingfaceserver/__main__.py +++ b/python/huggingfaceserver/huggingfaceserver/__main__.py @@ -67,11 +67,9 @@ def list_of_strings(arg): kwargs=vars(args)) try: model.load() + kserve.ModelServer().start([model] if model.ready else []) except ModelMissingError: logging.error(f"fail to locate model file for model {args.model_name} under dir {args.model_dir}," f"trying loading from model repository.") - if not args.model_id: kserve.ModelServer(registered_models=HuggingfaceModelRepository(args.model_dir)).start( [model] if model.ready else []) - else: - kserve.ModelServer().start([model] if model.ready else []) From aeeafc2ee2d1bf27a0f252add44cee760e62bee3 Mon Sep 17 00:00:00 2001 From: tjandy98 <3953059+tjandy98@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:29:12 +0800 Subject: [PATCH 04/13] Fix isADirectoryError in Azure blob download (#3502) * Fix sADirectoryError in Azure blob download Signed-off-by: tjandy98 <3953059+tjandy98@users.noreply.github.com> * Add new test case for direct file download Signed-off-by: tjandy98 <3953059+tjandy98@users.noreply.github.com> --------- Signed-off-by: tjandy98 <3953059+tjandy98@users.noreply.github.com> --- python/kserve/kserve/storage/storage.py | 5 ++++- .../kserve/storage/test/test_azure_storage.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/python/kserve/kserve/storage/storage.py b/python/kserve/kserve/storage/storage.py index 32777962bae..51c88e22220 100644 --- a/python/kserve/kserve/storage/storage.py +++ b/python/kserve/kserve/storage/storage.py @@ -438,7 +438,10 @@ def _download_azure_blob(uri, out_dir: str): # pylint: disable=too-many-locals blobs += container_client.list_blobs(name_starts_with=item.name, include=['snapshots']) for blob in blobs: - dest_path = os.path.join(out_dir, blob.name.replace(prefix, "", 1).lstrip("/")) + file_name = blob.name.replace(prefix, "", 1).lstrip("/") + if not file_name: + file_name = os.path.basename(prefix) + dest_path = os.path.join(out_dir, file_name) Path(os.path.dirname(dest_path)).mkdir(parents=True, exist_ok=True) logging.info("Downloading: %s to %s", blob.name, dest_path) downloader = container_client.download_blob(blob.name) diff --git a/python/kserve/kserve/storage/test/test_azure_storage.py b/python/kserve/kserve/storage/test/test_azure_storage.py index ff837fd4ba2..56730fbf16f 100644 --- a/python/kserve/kserve/storage/test/test_azure_storage.py +++ b/python/kserve/kserve/storage/test/test_azure_storage.py @@ -105,6 +105,25 @@ def test_blob(mock_storage, mock_makedirs): # pylint: disable=unused-argument credential=None) +@mock.patch(STORAGE_MODULE + '.os.makedirs') +@mock.patch(STORAGE_MODULE + '.BlobServiceClient') +def test_blob_file_direct(mock_storage, mock_makedirs): # pylint: disable=unused-argument + + # given + blob_path = 'https://accountname.blob.core.windows.net/container/somefile.text' + paths = ['somefile.text'] + mock_blob, mock_container = create_mock_blob(mock_storage, paths) + + # when + Storage._download_azure_blob(blob_path, "dest_path") + + # then + arg_list = get_call_args(mock_container.download_blob.call_args_list) + assert arg_list == [('somefile.text',)] + mock_storage.assert_called_with('https://accountname.blob.core.windows.net', + credential=None) + + @mock.patch(STORAGE_MODULE + '.os.makedirs') @mock.patch(STORAGE_MODULE + '.Storage._get_azure_storage_token') @mock.patch(STORAGE_MODULE + '.BlobServiceClient') From ba100b407600555ae98e47c33c0e6e8d5916fc7d Mon Sep 17 00:00:00 2001 From: Sivanantham <90966311+sivanantha321@users.noreply.github.com> Date: Wed, 13 Mar 2024 06:26:12 +0530 Subject: [PATCH 05/13] Remove cluster level list/watch for configmaps, serviceaccounts, secrets (#3469) * Remove cluster level list/watch for configmaps, serviceaccounts, secrets Signed-off-by: Sivanantham Chinnaiyan * Resolve comments Signed-off-by: Sivanantham Chinnaiyan --------- Signed-off-by: Sivanantham Chinnaiyan --- .../templates/clusterrole.yaml | 6 -- cmd/manager/main.go | 61 +++++++------ config/rbac/role.yaml | 6 -- pkg/apis/serving/v1beta1/configmap.go | 34 ++++---- pkg/apis/serving/v1beta1/configmap_test.go | 22 +++-- .../v1beta1/inference_service_defaults.go | 21 +++-- .../v1alpha1/inferencegraph/controller.go | 28 +++--- .../v1alpha1/inferencegraph/raw_ig.go | 18 ++-- .../v1alpha1/inferencegraph/suite_test.go | 32 ++++--- .../v1alpha1/trainedmodel/controller.go | 21 +++-- .../modelconfig/modelconfig_reconciler.go | 31 ++++--- .../v1alpha1/trainedmodel/suite_test.go | 31 ++++--- .../inferenceservice/components/explainer.go | 24 +++--- .../inferenceservice/components/predictor.go | 28 +++--- .../components/transformer.go | 26 +++--- .../v1beta1/inferenceservice/controller.go | 49 ++++++----- .../cabundle_configmap_reconciler.go | 38 ++++----- .../modelconfig/modelconfig_reconciler.go | 33 +++---- .../reconcilers/raw/raw_kube_reconciler.go | 19 +++-- .../v1beta1/inferenceservice/suite_test.go | 34 +++++--- pkg/credentials/credentials_suite_test.go | 9 +- .../service_account_credentials.go | 35 ++++---- .../service_account_credentials_test.go | 18 ++-- .../admission/pod/agent_injector_test.go | 5 +- .../admission/pod/batcher_injector_test.go | 8 +- pkg/webhook/admission/pod/mutator.go | 20 +++-- pkg/webhook/admission/pod/mutator_test.go | 2 +- .../pod/storage_initializer_injector_test.go | 85 ++++++++++--------- pkg/webhook/admission/pod/suite_test.go | 13 ++- 29 files changed, 411 insertions(+), 346 deletions(-) diff --git a/charts/kserve-resources/templates/clusterrole.yaml b/charts/kserve-resources/templates/clusterrole.yaml index 46f82a08840..b55328a8277 100644 --- a/charts/kserve-resources/templates/clusterrole.yaml +++ b/charts/kserve-resources/templates/clusterrole.yaml @@ -63,9 +63,7 @@ rules: verbs: - create - get - - list - update - - watch - apiGroups: - "" resources: @@ -102,18 +100,14 @@ rules: - create - delete - get - - list - patch - update - - watch - apiGroups: - "" resources: - serviceaccounts verbs: - get - - list - - watch - apiGroups: - "" resources: diff --git a/cmd/manager/main.go b/cmd/manager/main.go index f425d694e95..8382bbe85e1 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -23,15 +23,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - graphcontroller "github.com/kserve/kserve/pkg/controller/v1alpha1/inferencegraph" - trainedmodelcontroller "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel" - "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig" - v1beta1controller "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice" - "github.com/kserve/kserve/pkg/webhook/admission/pod" - "github.com/kserve/kserve/pkg/webhook/admission/servingruntime" istio_networking "istio.io/api/networking/v1beta1" istioclientv1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1" v1 "k8s.io/api/core/v1" @@ -42,13 +33,22 @@ import ( "k8s.io/client-go/tools/record" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/log/zap" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/manager/signals" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" "sigs.k8s.io/controller-runtime/pkg/webhook" + + "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + graphcontroller "github.com/kserve/kserve/pkg/controller/v1alpha1/inferencegraph" + trainedmodelcontroller "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel" + "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig" + v1beta1controller "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice" + "github.com/kserve/kserve/pkg/webhook/admission/pod" + "github.com/kserve/kserve/pkg/webhook/admission/servingruntime" ) var ( @@ -112,6 +112,13 @@ func main() { os.Exit(1) } + // Setup clientset to directly talk to the api server + clientSet, err := kubernetes.NewForConfig(cfg) + if err != nil { + setupLog.Error(err, "unable to create clientSet") + os.Exit(1) + } + // Create a new Cmd to provide shared dependencies and start components setupLog.Info("Setting up manager") mgr, err := manager.New(cfg, manager.Options{ @@ -142,17 +149,12 @@ func main() { os.Exit(1) } - kubeClient, err := client.New(mgr.GetConfig(), client.Options{Scheme: mgr.GetScheme()}) - if err != nil { - setupLog.Error(err, "unable to create new client.") - } - - deployConfig, err := v1beta1.NewDeployConfig(kubeClient) + deployConfig, err := v1beta1.NewDeployConfig(clientSet) if err != nil { setupLog.Error(err, "unable to get deploy config.") os.Exit(1) } - ingressConfig, err := v1beta1.NewIngressConfig(kubeClient) + ingressConfig, err := v1beta1.NewIngressConfig(clientSet) if err != nil { setupLog.Error(err, "unable to get ingress config.") os.Exit(1) @@ -181,16 +183,12 @@ func main() { // Setup all Controllers setupLog.Info("Setting up v1beta1 controller") eventBroadcaster := record.NewBroadcaster() - clientSet, err := kubernetes.NewForConfig(mgr.GetConfig()) - if err != nil { - setupLog.Error(err, "unable to create clientSet") - os.Exit(1) - } eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: clientSet.CoreV1().Events("")}) if err = (&v1beta1controller.InferenceServiceReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("v1beta1Controllers").WithName("InferenceService"), - Scheme: mgr.GetScheme(), + Client: mgr.GetClient(), + Clientset: clientSet, + Log: ctrl.Log.WithName("v1beta1Controllers").WithName("InferenceService"), + Scheme: mgr.GetScheme(), Recorder: eventBroadcaster.NewRecorder( mgr.GetScheme(), v1.EventSource{Component: "v1beta1Controllers"}), }).SetupWithManager(mgr, deployConfig, ingressConfig); err != nil { @@ -207,7 +205,7 @@ func main() { Log: ctrl.Log.WithName("v1beta1Controllers").WithName("TrainedModel"), Scheme: mgr.GetScheme(), Recorder: eventBroadcaster.NewRecorder(mgr.GetScheme(), v1.EventSource{Component: "v1beta1Controllers"}), - ModelConfigReconciler: modelconfig.NewModelConfigReconciler(mgr.GetClient(), mgr.GetScheme()), + ModelConfigReconciler: modelconfig.NewModelConfigReconciler(mgr.GetClient(), clientSet, mgr.GetScheme()), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "v1beta1Controllers", "TrainedModel") os.Exit(1) @@ -218,10 +216,11 @@ func main() { setupLog.Info("Setting up InferenceGraph controller") inferenceGraphEventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: clientSet.CoreV1().Events("")}) if err = (&graphcontroller.InferenceGraphReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("v1alpha1Controllers").WithName("InferenceGraph"), - Scheme: mgr.GetScheme(), - Recorder: eventBroadcaster.NewRecorder(mgr.GetScheme(), v1.EventSource{Component: "InferenceGraphController"}), + Client: mgr.GetClient(), + Clientset: clientSet, + Log: ctrl.Log.WithName("v1alpha1Controllers").WithName("InferenceGraph"), + Scheme: mgr.GetScheme(), + Recorder: eventBroadcaster.NewRecorder(mgr.GetScheme(), v1.EventSource{Component: "InferenceGraphController"}), }).SetupWithManager(mgr, deployConfig); err != nil { setupLog.Error(err, "unable to create controller", "v1alpha1Controllers", "InferenceGraph") os.Exit(1) @@ -232,7 +231,7 @@ func main() { setupLog.Info("registering webhooks to the webhook server") hookServer.Register("/mutate-pods", &webhook.Admission{ - Handler: &pod.Mutator{Client: mgr.GetClient(), Decoder: admission.NewDecoder(mgr.GetScheme())}, + Handler: &pod.Mutator{Client: mgr.GetClient(), Clientset: clientSet, Decoder: admission.NewDecoder(mgr.GetScheme())}, }) setupLog.Info("registering cluster serving runtime validator webhook to the webhook server") diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 9e2c6226146..1974fe1278f 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -48,9 +48,7 @@ rules: verbs: - create - get - - list - update - - watch - apiGroups: - "" resources: @@ -87,18 +85,14 @@ rules: - create - delete - get - - list - patch - update - - watch - apiGroups: - "" resources: - serviceaccounts verbs: - get - - list - - watch - apiGroups: - "" resources: diff --git a/pkg/apis/serving/v1beta1/configmap.go b/pkg/apis/serving/v1beta1/configmap.go index 557a7f8a6cc..71182f53ee6 100644 --- a/pkg/apis/serving/v1beta1/configmap.go +++ b/pkg/apis/serving/v1beta1/configmap.go @@ -22,10 +22,11 @@ import ( "fmt" "text/template" - "github.com/kserve/kserve/pkg/constants" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + + "github.com/kserve/kserve/pkg/constants" ) // ConfigMap Keys @@ -83,9 +84,8 @@ type DeployConfig struct { DefaultDeploymentMode string `json:"defaultDeploymentMode,omitempty"` } -func NewInferenceServicesConfig(cli client.Client) (*InferenceServicesConfig, error) { - configMap := &v1.ConfigMap{} - err := cli.Get(context.TODO(), types.NamespacedName{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, configMap) +func NewInferenceServicesConfig(clientset kubernetes.Interface) (*InferenceServicesConfig, error) { + configMap, err := clientset.CoreV1().ConfigMaps(constants.KServeNamespace).Get(context.TODO(), constants.InferenceServiceConfigMapName, metav1.GetOptions{}) if err != nil { return nil, err } @@ -100,9 +100,8 @@ func NewInferenceServicesConfig(cli client.Client) (*InferenceServicesConfig, er return icfg, nil } -func NewIngressConfig(cli client.Client) (*IngressConfig, error) { - configMap := &v1.ConfigMap{} - err := cli.Get(context.TODO(), types.NamespacedName{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, configMap) +func NewIngressConfig(clientset kubernetes.Interface) (*IngressConfig, error) { + configMap, err := clientset.CoreV1().ConfigMaps(constants.KServeNamespace).Get(context.TODO(), constants.InferenceServiceConfigMapName, metav1.GetOptions{}) if err != nil { return nil, err } @@ -123,10 +122,10 @@ func NewIngressConfig(cli client.Client) (*IngressConfig, error) { // For now simply check that this is a valid template. _, err := template.New("path-template").Parse(ingressConfig.PathTemplate) if err != nil { - return nil, fmt.Errorf("Invalid ingress config, unable to parse pathTemplate: %w", err) + return nil, fmt.Errorf("invalid ingress config, unable to parse pathTemplate: %w", err) } if ingressConfig.IngressDomain == "" { - return nil, fmt.Errorf("Invalid ingress config - igressDomain is required if pathTemplate is given") + return nil, fmt.Errorf("invalid ingress config - ingressDomain is required if pathTemplate is given") } } } @@ -150,15 +149,14 @@ func getComponentConfig(key string, configMap *v1.ConfigMap, componentConfig int if data, ok := configMap.Data[key]; ok { err := json.Unmarshal([]byte(data), componentConfig) if err != nil { - return fmt.Errorf("Unable to unmarshall %v json string due to %w ", key, err) + return fmt.Errorf("unable to unmarshall %v json string due to %w ", key, err) } } return nil } -func NewDeployConfig(cli client.Client) (*DeployConfig, error) { - configMap := &v1.ConfigMap{} - err := cli.Get(context.TODO(), types.NamespacedName{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, configMap) +func NewDeployConfig(clientset kubernetes.Interface) (*DeployConfig, error) { + configMap, err := clientset.CoreV1().ConfigMaps(constants.KServeNamespace).Get(context.TODO(), constants.InferenceServiceConfigMapName, metav1.GetOptions{}) if err != nil { return nil, err } @@ -166,17 +164,17 @@ func NewDeployConfig(cli client.Client) (*DeployConfig, error) { if deploy, ok := configMap.Data[DeployConfigName]; ok { err := json.Unmarshal([]byte(deploy), &deployConfig) if err != nil { - return nil, fmt.Errorf("Unable to parse deploy config json: %w", err) + return nil, fmt.Errorf("unable to parse deploy config json: %w", err) } if deployConfig.DefaultDeploymentMode == "" { - return nil, fmt.Errorf("Invalid deploy config, defaultDeploymentMode is required.") + return nil, fmt.Errorf("invalid deploy config, defaultDeploymentMode is required") } if deployConfig.DefaultDeploymentMode != string(constants.Serverless) && deployConfig.DefaultDeploymentMode != string(constants.RawDeployment) && deployConfig.DefaultDeploymentMode != string(constants.ModelMeshDeployment) { - return nil, fmt.Errorf("Invalid deployment mode. Supported modes are Serverless," + + return nil, fmt.Errorf("invalid deployment mode. Supported modes are Serverless," + " RawDeployment and ModelMesh") } } diff --git a/pkg/apis/serving/v1beta1/configmap_test.go b/pkg/apis/serving/v1beta1/configmap_test.go index e0e7e1ac248..1410eeee8ff 100644 --- a/pkg/apis/serving/v1beta1/configmap_test.go +++ b/pkg/apis/serving/v1beta1/configmap_test.go @@ -25,6 +25,7 @@ import ( "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + fakeclientset "k8s.io/client-go/kubernetes/fake" "sigs.k8s.io/controller-runtime/pkg/client" fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake" ) @@ -78,27 +79,30 @@ func createFakeClient() client.WithWatch { func TestNewInferenceServiceConfig(t *testing.T) { g := gomega.NewGomegaWithT(t) - fakeClient := createFakeClient() - - isvcConfig, err := NewInferenceServicesConfig(fakeClient) + clientset := fakeclientset.NewSimpleClientset(&v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, + }) + isvcConfig, err := NewInferenceServicesConfig(clientset) g.Expect(err).Should(gomega.BeNil()) g.Expect(isvcConfig).ShouldNot(gomega.BeNil()) } func TestNewIngressConfig(t *testing.T) { g := gomega.NewGomegaWithT(t) - fakeClient := createFakeClient() - - ingressCfg, err := NewIngressConfig(fakeClient) + clientset := fakeclientset.NewSimpleClientset(&v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, + }) + ingressCfg, err := NewIngressConfig(clientset) g.Expect(err).Should(gomega.BeNil()) g.Expect(ingressCfg).ShouldNot(gomega.BeNil()) } func TestNewDeployConfig(t *testing.T) { g := gomega.NewGomegaWithT(t) - fakeClient := createFakeClient() - - deployConfig, err := NewDeployConfig(fakeClient) + clientset := fakeclientset.NewSimpleClientset(&v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, + }) + deployConfig, err := NewDeployConfig(clientset) g.Expect(err).Should(gomega.BeNil()) g.Expect(deployConfig).ShouldNot(gomega.BeNil()) } diff --git a/pkg/apis/serving/v1beta1/inference_service_defaults.go b/pkg/apis/serving/v1beta1/inference_service_defaults.go index 25cd18395aa..5193eb51cb2 100644 --- a/pkg/apis/serving/v1beta1/inference_service_defaults.go +++ b/pkg/apis/serving/v1beta1/inference_service_defaults.go @@ -21,14 +21,15 @@ import ( "reflect" "strconv" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/utils" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" - "sigs.k8s.io/controller-runtime/pkg/client" + "k8s.io/client-go/kubernetes" "sigs.k8s.io/controller-runtime/pkg/client/config" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook" + + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/utils" ) var ( @@ -65,15 +66,21 @@ func setResourceRequirementDefaults(requirements *v1.ResourceRequirements) { func (isvc *InferenceService) Default() { mutatorLogger.Info("Defaulting InferenceService", "namespace", isvc.Namespace, "isvc", isvc.Spec.Predictor) - cli, err := client.New(config.GetConfigOrDie(), client.Options{}) + cfg, err := config.GetConfig() if err != nil { - panic("Failed to create client in defaulter") + mutatorLogger.Error(err, "unable to set up client config") + panic(err) + } + clientSet, err := kubernetes.NewForConfig(cfg) + if err != nil { + mutatorLogger.Error(err, "unable to create clientSet") + panic(err) } - configMap, err := NewInferenceServicesConfig(cli) + configMap, err := NewInferenceServicesConfig(clientSet) if err != nil { panic(err) } - deployConfig, err := NewDeployConfig(cli) + deployConfig, err := NewDeployConfig(clientSet) if err != nil { panic(err) } diff --git a/pkg/controller/v1alpha1/inferencegraph/controller.go b/pkg/controller/v1alpha1/inferencegraph/controller.go index a84e43c7e9b..987621a1232 100644 --- a/pkg/controller/v1alpha1/inferencegraph/controller.go +++ b/pkg/controller/v1alpha1/inferencegraph/controller.go @@ -25,20 +25,18 @@ import ( "context" "encoding/json" "fmt" + "github.com/go-logr/logr" - v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" apierr "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" "knative.dev/pkg/apis" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" @@ -46,14 +44,21 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" + + v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" ) // InferenceGraphReconciler reconciles a InferenceGraph object type InferenceGraphReconciler struct { client.Client - Log logr.Logger - Scheme *runtime.Scheme - Recorder record.EventRecorder + Clientset kubernetes.Interface + Log logr.Logger + Scheme *runtime.Scheme + Recorder record.EventRecorder } // InferenceGraphState describes the Readiness of the InferenceGraph @@ -126,8 +131,7 @@ func (r *InferenceGraphReconciler) Reconcile(ctx context.Context, req ctrl.Reque } r.Log.Info("Reconciling inference graph", "apiVersion", graph.APIVersion, "graph", graph.Name) - configMap := &v1.ConfigMap{} - err := r.Client.Get(ctx, types.NamespacedName{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, configMap) + configMap, err := r.Clientset.CoreV1().ConfigMaps(constants.KServeNamespace).Get(context.TODO(), constants.InferenceServiceConfigMapName, metav1.GetOptions{}) if err != nil { r.Log.Error(err, "Failed to find config map", "name", constants.InferenceServiceConfigMapName) return reconcile.Result{}, err @@ -160,7 +164,7 @@ func (r *InferenceGraphReconciler) Reconcile(ctx context.Context, req ctrl.Reque } } } - deployConfig, err := v1beta1api.NewDeployConfig(r.Client) + deployConfig, err := v1beta1api.NewDeployConfig(r.Clientset) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "fails to create DeployConfig") } @@ -169,7 +173,7 @@ func (r *InferenceGraphReconciler) Reconcile(ctx context.Context, req ctrl.Reque r.Log.Info("Inference graph deployment ", "deployment mode ", deploymentMode) if deploymentMode == constants.RawDeployment { //Create inference graph resources such as deployment, service, hpa in raw deployment mode - deployment, url, err := handleInferenceGraphRawDeployment(r.Client, r.Scheme, graph, routerConfig) + deployment, url, err := handleInferenceGraphRawDeployment(r.Client, r.Clientset, r.Scheme, graph, routerConfig) if err != nil { return ctrl.Result{}, errors.Wrapf(err, "fails to reconcile inference graph raw deployment") diff --git a/pkg/controller/v1alpha1/inferencegraph/raw_ig.go b/pkg/controller/v1alpha1/inferencegraph/raw_ig.go index 32014bd9585..cfb93ae4507 100644 --- a/pkg/controller/v1alpha1/inferencegraph/raw_ig.go +++ b/pkg/controller/v1alpha1/inferencegraph/raw_ig.go @@ -18,21 +18,24 @@ package inferencegraph import ( "encoding/json" - v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" + "strings" + "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes" "knative.dev/pkg/apis" knapis "knative.dev/pkg/apis" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" logf "sigs.k8s.io/controller-runtime/pkg/log" - "strings" + + v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" ) var logger = logf.Log.WithName("InferenceGraphRawDeployer") @@ -124,14 +127,15 @@ Handles bulk of raw deployment logic for Inference graph controller 4. Set controller referneces 5. Finally reconcile */ -func handleInferenceGraphRawDeployment(cl client.Client, scheme *runtime.Scheme, graph *v1alpha1api.InferenceGraph, routerConfig *RouterConfig) (*appsv1.Deployment, *knapis.URL, error) { +func handleInferenceGraphRawDeployment(cl client.Client, clientset kubernetes.Interface, scheme *runtime.Scheme, + graph *v1alpha1api.InferenceGraph, routerConfig *RouterConfig) (*appsv1.Deployment, *knapis.URL, error) { // create desired service object. desiredSvc := createInferenceGraphPodSpec(graph, routerConfig) objectMeta, componentExtSpec := constructForRawDeployment(graph) //create the reconciler - reconciler, err := raw.NewRawKubeReconciler(cl, scheme, objectMeta, &componentExtSpec, desiredSvc) + reconciler, err := raw.NewRawKubeReconciler(cl, clientset, scheme, objectMeta, &componentExtSpec, desiredSvc) if err != nil { return nil, reconciler.URL, errors.Wrapf(err, "fails to create NewRawKubeReconciler for inference graph") diff --git a/pkg/controller/v1alpha1/inferencegraph/suite_test.go b/pkg/controller/v1alpha1/inferencegraph/suite_test.go index 7a920d380df..30f0a941806 100644 --- a/pkg/controller/v1alpha1/inferencegraph/suite_test.go +++ b/pkg/controller/v1alpha1/inferencegraph/suite_test.go @@ -18,26 +18,28 @@ package inferencegraph import ( "context" - kfservingv1alpha1 "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - pkgtest "github.com/kserve/kserve/pkg/testing" + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" netv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" - "testing" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "sigs.k8s.io/controller-runtime/pkg/client" + kfservingv1alpha1 "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + pkgtest "github.com/kserve/kserve/pkg/testing" ) // These tests use Ginkgo (BDD-style Go testing framework). Refer to @@ -49,6 +51,7 @@ var ( testEnv *envtest.Environment cancel context.CancelFunc ctx context.Context + clientset kubernetes.Interface ) func TestAPIs(t *testing.T) { @@ -78,6 +81,10 @@ var _ = BeforeSuite(func() { Expect(err).ToNot(HaveOccurred()) Expect(k8sClient).ToNot(BeNil()) + clientset, err = kubernetes.NewForConfig(cfg) + Expect(err).ToNot(HaveOccurred()) + Expect(clientset).ToNot(BeNil()) + //Create namespace kfservingNamespaceObj := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ @@ -97,10 +104,11 @@ var _ = BeforeSuite(func() { deployConfig := &v1beta1.DeployConfig{DefaultDeploymentMode: "Serverless"} err = (&InferenceGraphReconciler{ - Client: k8sClient, - Scheme: k8sClient.Scheme(), - Log: ctrl.Log.WithName("V1alpha1InferenceGraphController"), - Recorder: k8sManager.GetEventRecorderFor("V1alpha1InferenceGraphController"), + Client: k8sClient, + Clientset: clientset, + Scheme: k8sClient.Scheme(), + Log: ctrl.Log.WithName("V1alpha1InferenceGraphController"), + Recorder: k8sManager.GetEventRecorderFor("V1alpha1InferenceGraphController"), }).SetupWithManager(k8sManager, deployConfig) Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/controller/v1alpha1/trainedmodel/controller.go b/pkg/controller/v1alpha1/trainedmodel/controller.go index f9430a8a3fb..86ccc8743ea 100644 --- a/pkg/controller/v1alpha1/trainedmodel/controller.go +++ b/pkg/controller/v1alpha1/trainedmodel/controller.go @@ -18,9 +18,9 @@ limitations under the License. // +kubebuilder:rbac:groups=serving.kserve.io,resources=trainedmodels/status,verbs=get;update;patch // +kubebuilder:rbac:groups=serving.knative.dev,resources=services,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=serving.knative.dev,resources=services/status,verbs=get;update;patch -// +kubebuilder:rbac:groups=core,resources=serviceaccounts,verbs=get;list;watch -// +kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch;update -// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=core,resources=serviceaccounts,verbs=get +// +kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;update +// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;create;update;patch;delete // +kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch // +kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete package trainedmodel @@ -30,17 +30,12 @@ import ( "fmt" "github.com/go-logr/logr" - v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig" - v1beta1utils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" - "github.com/kserve/kserve/pkg/utils" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" "knative.dev/pkg/apis" duckv1 "knative.dev/pkg/apis/duck/v1" @@ -48,6 +43,13 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" + + v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig" + v1beta1utils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" + "github.com/kserve/kserve/pkg/utils" ) const ( @@ -62,6 +64,7 @@ var log = logf.Log.WithName("TrainedModel controller") // TrainedModelReconciler reconciles a TrainedModel object type TrainedModelReconciler struct { client.Client + Clientset kubernetes.Interface Log logr.Logger Scheme *runtime.Scheme Recorder record.EventRecorder diff --git a/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig/modelconfig_reconciler.go b/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig/modelconfig_reconciler.go index 372448d391d..231119f19bd 100644 --- a/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig/modelconfig_reconciler.go +++ b/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig/modelconfig_reconciler.go @@ -20,29 +20,32 @@ import ( "context" "fmt" - v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/sharding/memory" - "github.com/kserve/kserve/pkg/modelconfig" - corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" + + v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/sharding/memory" + "github.com/kserve/kserve/pkg/modelconfig" ) var log = logf.Log.WithName("Reconciler") type ModelConfigReconciler struct { - client client.Client - scheme *runtime.Scheme + client client.Client + clientset kubernetes.Interface + scheme *runtime.Scheme } -func NewModelConfigReconciler(client client.Client, scheme *runtime.Scheme) *ModelConfigReconciler { +func NewModelConfigReconciler(client client.Client, clientset kubernetes.Interface, scheme *runtime.Scheme) *ModelConfigReconciler { return &ModelConfigReconciler{ - client: client, - scheme: scheme, + client: client, + clientset: clientset, + scheme: scheme, } } @@ -52,9 +55,9 @@ func (c *ModelConfigReconciler) Reconcile(req ctrl.Request, tm *v1alpha1api.Trai shardId := shardStrategy.GetOrAssignShard(tm) // Use tm's parent InferenceService field to get the model modelConfig modelConfigName := constants.ModelConfigName(tm.Spec.InferenceService, shardId) - desiredModelConfig := &corev1.ConfigMap{} - log.Info("Reconciling modelConfig", "modelConfigName", modelConfigName) - if err := c.client.Get(context.TODO(), types.NamespacedName{Name: modelConfigName, Namespace: req.Namespace}, desiredModelConfig); err != nil { + log.Info("Reconciling modelConfig", "modelConfigName", modelConfigName, "namespace", req.Namespace) + desiredModelConfig, err := c.clientset.CoreV1().ConfigMaps(req.Namespace).Get(context.TODO(), modelConfigName, metav1.GetOptions{}) + if err != nil { log.Error(err, "Failed to find model ConfigMap to reconcile for InferenceService", "name", tm.Spec.Model, "namespace", req.Namespace) // Error reading the object - requeue the request. return err diff --git a/pkg/controller/v1alpha1/trainedmodel/suite_test.go b/pkg/controller/v1alpha1/trainedmodel/suite_test.go index 5f7fb259328..5f44b0f43f7 100644 --- a/pkg/controller/v1alpha1/trainedmodel/suite_test.go +++ b/pkg/controller/v1alpha1/trainedmodel/suite_test.go @@ -20,28 +20,27 @@ import ( "context" "testing" - pkgtest "github.com/kserve/kserve/pkg/testing" - "k8s.io/client-go/tools/record" - - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - ctrl "sigs.k8s.io/controller-runtime" - - kfservingv1alpha1 "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - kfservingv1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" + "k8s.io/client-go/tools/record" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + + kfservingv1alpha1 "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + kfservingv1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/reconcilers/modelconfig" + pkgtest "github.com/kserve/kserve/pkg/testing" // +kubebuilder:scaffold:imports ) @@ -54,6 +53,7 @@ var ( testEnv *envtest.Environment cancel context.CancelFunc ctx context.Context + clientset kubernetes.Interface ) func TestAPIs(t *testing.T) { @@ -84,6 +84,10 @@ var _ = BeforeSuite(func() { Expect(err).ToNot(HaveOccurred()) Expect(k8sClient).ToNot(BeNil()) + clientset, err = kubernetes.NewForConfig(cfg) + Expect(err).ToNot(HaveOccurred()) + Expect(clientset).ToNot(BeNil()) + //Create namespace kfservingNamespaceObj := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ @@ -101,10 +105,11 @@ var _ = BeforeSuite(func() { Expect(err).ToNot(HaveOccurred()) err = (&TrainedModelReconciler{ Client: k8sManager.GetClient(), + Clientset: clientset, Scheme: scheme.Scheme, Log: ctrl.Log.WithName("v1beta1TrainedModelController"), Recorder: record.NewBroadcaster().NewRecorder(scheme.Scheme, v1.EventSource{Component: "v1betaController"}), - ModelConfigReconciler: modelconfig.NewModelConfigReconciler(k8sManager.GetClient(), scheme.Scheme), + ModelConfigReconciler: modelconfig.NewModelConfigReconciler(k8sManager.GetClient(), clientset, scheme.Scheme), }).SetupWithManager(k8sManager) Expect(err).ToNot(HaveOccurred()) defer GinkgoRecover() diff --git a/pkg/controller/v1beta1/inferenceservice/components/explainer.go b/pkg/controller/v1beta1/inferenceservice/components/explainer.go index 4996718ddc3..f000010f5f6 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/explainer.go +++ b/pkg/controller/v1beta1/inferenceservice/components/explainer.go @@ -21,22 +21,24 @@ import ( "fmt" "github.com/go-logr/logr" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/knative" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" - isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" - "github.com/kserve/kserve/pkg/credentials" - "github.com/kserve/kserve/pkg/utils" "github.com/pkg/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/knative" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" + isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" + "github.com/kserve/kserve/pkg/credentials" + "github.com/kserve/kserve/pkg/utils" + "github.com/kserve/kserve/pkg/apis/serving/v1beta1" ) @@ -45,6 +47,7 @@ var _ Component = &Explainer{} // Explainer reconciles resources for this component. type Explainer struct { client client.Client + clientset kubernetes.Interface scheme *runtime.Scheme inferenceServiceConfig *v1beta1.InferenceServicesConfig credentialBuilder *credentials.CredentialBuilder //nolint: unused @@ -52,10 +55,11 @@ type Explainer struct { Log logr.Logger } -func NewExplainer(client client.Client, scheme *runtime.Scheme, inferenceServiceConfig *v1beta1.InferenceServicesConfig, - deploymentMode constants.DeploymentModeType) Component { +func NewExplainer(client client.Client, clientset kubernetes.Interface, scheme *runtime.Scheme, + inferenceServiceConfig *v1beta1.InferenceServicesConfig, deploymentMode constants.DeploymentModeType) Component { return &Explainer{ client: client, + clientset: clientset, scheme: scheme, inferenceServiceConfig: inferenceServiceConfig, deploymentMode: deploymentMode, @@ -137,8 +141,8 @@ func (e *Explainer) Reconcile(isvc *v1beta1.InferenceService) (ctrl.Result, erro // Here we allow switch between knative and vanilla deployment if e.deploymentMode == constants.RawDeployment { - r, err := raw.NewRawKubeReconciler(e.client, e.scheme, objectMeta, &isvc.Spec.Explainer.ComponentExtensionSpec, - &podSpec) + r, err := raw.NewRawKubeReconciler(e.client, e.clientset, e.scheme, objectMeta, + &isvc.Spec.Explainer.ComponentExtensionSpec, &podSpec) if err != nil { return ctrl.Result{}, errors.Wrapf(err, "fails to create NewRawKubeReconciler for explainer") } diff --git a/pkg/controller/v1beta1/inferenceservice/components/predictor.go b/pkg/controller/v1beta1/inferenceservice/components/predictor.go index c1abccd4293..57df0991439 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/predictor.go +++ b/pkg/controller/v1beta1/inferenceservice/components/predictor.go @@ -17,23 +17,16 @@ limitations under the License. package components import ( - "fmt" - "context" + "fmt" "github.com/go-logr/logr" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/knative" - modelconfig "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig" - raw "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" - isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" - "github.com/kserve/kserve/pkg/credentials" - "github.com/kserve/kserve/pkg/utils" "github.com/pkg/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -41,6 +34,13 @@ import ( "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/knative" + modelconfig "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" + isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" + "github.com/kserve/kserve/pkg/credentials" + "github.com/kserve/kserve/pkg/utils" ) var _ Component = &Predictor{} @@ -48,6 +48,7 @@ var _ Component = &Predictor{} // Predictor reconciles resources for this component. type Predictor struct { client client.Client + clientset kubernetes.Interface scheme *runtime.Scheme inferenceServiceConfig *v1beta1.InferenceServicesConfig credentialBuilder *credentials.CredentialBuilder //nolint: unused @@ -55,10 +56,11 @@ type Predictor struct { Log logr.Logger } -func NewPredictor(client client.Client, scheme *runtime.Scheme, inferenceServiceConfig *v1beta1.InferenceServicesConfig, - deploymentMode constants.DeploymentModeType) Component { +func NewPredictor(client client.Client, clientset kubernetes.Interface, scheme *runtime.Scheme, + inferenceServiceConfig *v1beta1.InferenceServicesConfig, deploymentMode constants.DeploymentModeType) Component { return &Predictor{ client: client, + clientset: clientset, scheme: scheme, inferenceServiceConfig: inferenceServiceConfig, deploymentMode: deploymentMode, @@ -85,7 +87,7 @@ func (p *Predictor) Reconcile(isvc *v1beta1.InferenceService) (ctrl.Result, erro addAgentAnnotations(isvc, annotations) // Reconcile modelConfig - configMapReconciler := modelconfig.NewModelConfigReconciler(p.client, p.scheme) + configMapReconciler := modelconfig.NewModelConfigReconciler(p.client, p.clientset, p.scheme) if err := configMapReconciler.Reconcile(isvc); err != nil { return ctrl.Result{}, err } @@ -305,7 +307,7 @@ func (p *Predictor) Reconcile(isvc *v1beta1.InferenceService) (ctrl.Result, erro if p.deploymentMode == constants.RawDeployment { rawDeployment = true podLabelKey = constants.RawDeploymentAppLabel - r, err := raw.NewRawKubeReconciler(p.client, p.scheme, objectMeta, &isvc.Spec.Predictor.ComponentExtensionSpec, + r, err := raw.NewRawKubeReconciler(p.client, p.clientset, p.scheme, objectMeta, &isvc.Spec.Predictor.ComponentExtensionSpec, &podSpec) if err != nil { return ctrl.Result{}, errors.Wrapf(err, "fails to create NewRawKubeReconciler for predictor") diff --git a/pkg/controller/v1beta1/inferenceservice/components/transformer.go b/pkg/controller/v1beta1/inferenceservice/components/transformer.go index 586744fab1f..f0a5b25c2be 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/transformer.go +++ b/pkg/controller/v1beta1/inferenceservice/components/transformer.go @@ -17,30 +17,30 @@ limitations under the License. package components import ( + "context" "fmt" "net/url" "time" - "context" - "github.com/go-logr/logr" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/knative" - raw "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" - isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" - "github.com/kserve/kserve/pkg/credentials" - "github.com/kserve/kserve/pkg/utils" "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/knative" + raw "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/raw" + isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" + "github.com/kserve/kserve/pkg/credentials" + "github.com/kserve/kserve/pkg/utils" ) var _ Component = &Transformer{} @@ -48,6 +48,7 @@ var _ Component = &Transformer{} // Transformer reconciles resources for this component. type Transformer struct { client client.Client + clientset kubernetes.Interface scheme *runtime.Scheme inferenceServiceConfig *v1beta1.InferenceServicesConfig credentialBuilder *credentials.CredentialBuilder //nolint: unused @@ -55,10 +56,11 @@ type Transformer struct { Log logr.Logger } -func NewTransformer(client client.Client, scheme *runtime.Scheme, inferenceServiceConfig *v1beta1.InferenceServicesConfig, - deploymentMode constants.DeploymentModeType) Component { +func NewTransformer(client client.Client, clientset kubernetes.Interface, scheme *runtime.Scheme, + inferenceServiceConfig *v1beta1.InferenceServicesConfig, deploymentMode constants.DeploymentModeType) Component { return &Transformer{ client: client, + clientset: clientset, scheme: scheme, inferenceServiceConfig: inferenceServiceConfig, deploymentMode: deploymentMode, @@ -167,8 +169,8 @@ func (p *Transformer) Reconcile(isvc *v1beta1.InferenceService) (ctrl.Result, er // Here we allow switch between knative and vanilla deployment if p.deploymentMode == constants.RawDeployment { - r, err := raw.NewRawKubeReconciler(p.client, p.scheme, objectMeta, &isvc.Spec.Transformer.ComponentExtensionSpec, - &podSpec) + r, err := raw.NewRawKubeReconciler(p.client, p.clientset, p.scheme, objectMeta, + &isvc.Spec.Transformer.ComponentExtensionSpec, &podSpec) if err != nil { return ctrl.Result{}, errors.Wrapf(err, "fails to create NewRawKubeReconciler for transformer") } diff --git a/pkg/controller/v1beta1/inferenceservice/controller.go b/pkg/controller/v1beta1/inferenceservice/controller.go index 6f3ab5b37b2..3c78f38fa13 100644 --- a/pkg/controller/v1beta1/inferenceservice/controller.go +++ b/pkg/controller/v1beta1/inferenceservice/controller.go @@ -22,15 +22,6 @@ import ( "reflect" "github.com/go-logr/logr" - v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/components" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/cabundleconfigmap" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress" - modelconfig "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig" - isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" - "github.com/kserve/kserve/pkg/utils" "github.com/pkg/errors" istioclientv1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1" appsv1 "k8s.io/api/apps/v1" @@ -40,12 +31,23 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" "knative.dev/pkg/apis" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" + + v1alpha1api "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/components" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/cabundleconfigmap" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress" + modelconfig "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig" + isvcutils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" + "github.com/kserve/kserve/pkg/utils" ) // +kubebuilder:rbac:groups=serving.kserve.io,resources=inferenceservices;inferenceservices/finalizers,verbs=get;list;watch;create;update;patch;delete @@ -66,9 +68,9 @@ import ( // +kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=mutatingwebhookconfigurations;validatingwebhookconfigurations,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=autoscaling,resources=horizontalpodautoscalers,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=core,resources=serviceaccounts,verbs=get;list;watch -// +kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch;create -// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=core,resources=serviceaccounts,verbs=get +// +kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;create +// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;create;update;patch;delete // +kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch // +kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch @@ -85,9 +87,10 @@ const ( // InferenceServiceReconciler reconciles a InferenceService object type InferenceServiceReconciler struct { client.Client - Log logr.Logger - Scheme *runtime.Scheme - Recorder record.EventRecorder + Clientset kubernetes.Interface + Log logr.Logger + Scheme *runtime.Scheme + Recorder record.EventRecorder } func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { @@ -108,7 +111,7 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req return !utils.Includes(constants.ServiceAnnotationDisallowedList, key) }) - deployConfig, err := v1beta1api.NewDeployConfig(r.Client) + deployConfig, err := v1beta1api.NewDeployConfig(r.Clientset) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "fails to create DeployConfig") } @@ -163,26 +166,26 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req } r.Log.Info("Reconciling inference service", "apiVersion", isvc.APIVersion, "isvc", isvc.Name) - isvcConfig, err := v1beta1api.NewInferenceServicesConfig(r.Client) + isvcConfig, err := v1beta1api.NewInferenceServicesConfig(r.Clientset) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "fails to create InferenceServicesConfig") } // Reconcile cabundleConfigMap - caBundleConfigMapReconciler := cabundleconfigmap.NewCaBundleConfigMapReconciler(r.Client, r.Scheme) + caBundleConfigMapReconciler := cabundleconfigmap.NewCaBundleConfigMapReconciler(r.Client, r.Clientset, r.Scheme) if err := caBundleConfigMapReconciler.Reconcile(isvc); err != nil { return reconcile.Result{}, err } reconcilers := []components.Component{} if deploymentMode != constants.ModelMeshDeployment { - reconcilers = append(reconcilers, components.NewPredictor(r.Client, r.Scheme, isvcConfig, deploymentMode)) + reconcilers = append(reconcilers, components.NewPredictor(r.Client, r.Clientset, r.Scheme, isvcConfig, deploymentMode)) } if isvc.Spec.Transformer != nil { - reconcilers = append(reconcilers, components.NewTransformer(r.Client, r.Scheme, isvcConfig, deploymentMode)) + reconcilers = append(reconcilers, components.NewTransformer(r.Client, r.Clientset, r.Scheme, isvcConfig, deploymentMode)) } if isvc.Spec.Explainer != nil { - reconcilers = append(reconcilers, components.NewExplainer(r.Client, r.Scheme, isvcConfig, deploymentMode)) + reconcilers = append(reconcilers, components.NewExplainer(r.Client, r.Clientset, r.Scheme, isvcConfig, deploymentMode)) } for _, reconciler := range reconcilers { result, err := reconciler.Reconcile(isvc) @@ -212,7 +215,7 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req isvc.Status.PropagateCrossComponentStatus(componentList, v1beta1api.LatestDeploymentReady) } //Reconcile ingress - ingressConfig, err := v1beta1api.NewIngressConfig(r.Client) + ingressConfig, err := v1beta1api.NewIngressConfig(r.Clientset) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "fails to create IngressConfig") } @@ -235,7 +238,7 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req } // Reconcile modelConfig - configMapReconciler := modelconfig.NewModelConfigReconciler(r.Client, r.Scheme) + configMapReconciler := modelconfig.NewModelConfigReconciler(r.Client, r.Clientset, r.Scheme) if err := configMapReconciler.Reconcile(isvc); err != nil { return reconcile.Result{}, err } diff --git a/pkg/controller/v1beta1/inferenceservice/reconcilers/cabundleconfigmap/cabundle_configmap_reconciler.go b/pkg/controller/v1beta1/inferenceservice/reconcilers/cabundleconfigmap/cabundle_configmap_reconciler.go index 4f32de2c72b..a39526aca3e 100644 --- a/pkg/controller/v1beta1/inferenceservice/reconcilers/cabundleconfigmap/cabundle_configmap_reconciler.go +++ b/pkg/controller/v1beta1/inferenceservice/reconcilers/cabundleconfigmap/cabundle_configmap_reconciler.go @@ -21,41 +21,41 @@ import ( "encoding/json" "fmt" - kservev1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/webhook/admission/pod" - + "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/api/equality" apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes" "knative.dev/pkg/kmp" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" + + kservev1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/webhook/admission/pod" ) var log = logf.Log.WithName("CaBundleConfigMapReconciler") type CaBundleConfigMapReconciler struct { - client client.Client - scheme *runtime.Scheme + client client.Client + clientset kubernetes.Interface + scheme *runtime.Scheme } -func NewCaBundleConfigMapReconciler(client client.Client, scheme *runtime.Scheme) *CaBundleConfigMapReconciler { +func NewCaBundleConfigMapReconciler(client client.Client, clientset kubernetes.Interface, scheme *runtime.Scheme) *CaBundleConfigMapReconciler { return &CaBundleConfigMapReconciler{ - client: client, - scheme: scheme, + client: client, + clientset: clientset, + scheme: scheme, } } func (c *CaBundleConfigMapReconciler) Reconcile(isvc *kservev1beta1.InferenceService) error { log.Info("Reconciling CaBundleConfigMap", "namespace", isvc.Namespace) - - isvcConfigMap := &corev1.ConfigMap{} - err := c.client.Get(context.TODO(), types.NamespacedName{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, isvcConfigMap) + isvcConfigMap, err := c.clientset.CoreV1().ConfigMaps(constants.KServeNamespace).Get(context.TODO(), constants.InferenceServiceConfigMapName, metav1.GetOptions{}) if err != nil { log.Error(err, "failed to find config map", "name", constants.InferenceServiceConfigMapName) return err @@ -91,10 +91,9 @@ func (c *CaBundleConfigMapReconciler) getCabundleConfigMapForUserNS(caBundleName // Check if cabundle configmap exist & the cabundle.crt exist in the data in controller namespace // If it does not exist, return error - caBundleConfigMap := &corev1.ConfigMap{} - if err := c.client.Get(context.TODO(), - types.NamespacedName{Name: caBundleNameInConfig, Namespace: kserveNamespace}, caBundleConfigMap); err == nil { + caBundleConfigMap, err := c.clientset.CoreV1().ConfigMaps(kserveNamespace).Get(context.TODO(), caBundleNameInConfig, metav1.GetOptions{}) + if err == nil { if caBundleConfigMapData := caBundleConfigMap.Data[constants.DefaultCaBundleFileName]; caBundleConfigMapData == "" { return nil, fmt.Errorf("specified cabundle file %s not found in cabundle configmap %s", constants.DefaultCaBundleFileName, caBundleNameInConfig) @@ -105,7 +104,7 @@ func (c *CaBundleConfigMapReconciler) getCabundleConfigMapForUserNS(caBundleName newCaBundleConfigMap = getDesiredCaBundleConfigMapForUserNS(constants.DefaultGlobalCaBundleConfigMapName, isvcNamespace, configData) } } else { - return nil, fmt.Errorf("can't read cabundle configmap %s: %w", constants.DefaultCaBundleFileName, err) + return nil, errors.Wrapf(err, "failed to get configmap %s from the cluster", caBundleNameInConfig) } return newCaBundleConfigMap, nil @@ -127,8 +126,7 @@ func getDesiredCaBundleConfigMapForUserNS(configmapName string, namespace string func (c *CaBundleConfigMapReconciler) ReconcileCaBundleConfigMap(desiredConfigMap *corev1.ConfigMap) error { // Create ConfigMap if does not exist - existingConfigMap := &corev1.ConfigMap{} - err := c.client.Get(context.TODO(), types.NamespacedName{Name: desiredConfigMap.Name, Namespace: desiredConfigMap.Namespace}, existingConfigMap) + existingConfigMap, err := c.clientset.CoreV1().ConfigMaps(desiredConfigMap.Namespace).Get(context.TODO(), desiredConfigMap.Name, metav1.GetOptions{}) if err != nil { if apierr.IsNotFound(err) { log.Info("Creating cabundle configmap", "namespace", desiredConfigMap.Namespace, "name", desiredConfigMap.Name) diff --git a/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig/modelconfig_reconciler.go b/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig/modelconfig_reconciler.go index 455d328ccb7..1a2a66a79bd 100644 --- a/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig/modelconfig_reconciler.go +++ b/pkg/controller/v1beta1/inferenceservice/reconcilers/modelconfig/modelconfig_reconciler.go @@ -19,31 +19,34 @@ package multimodelconfig import ( "context" - v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/sharding/memory" - v1beta1utils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" - "github.com/kserve/kserve/pkg/modelconfig" - corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" logf "sigs.k8s.io/controller-runtime/pkg/log" + + v1beta1api "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/controller/v1alpha1/trainedmodel/sharding/memory" + v1beta1utils "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/utils" + "github.com/kserve/kserve/pkg/modelconfig" ) var log = logf.Log.WithName("Reconciler") type ModelConfigReconciler struct { - client client.Client - scheme *runtime.Scheme + client client.Client + clientset kubernetes.Interface + scheme *runtime.Scheme } -func NewModelConfigReconciler(client client.Client, scheme *runtime.Scheme) *ModelConfigReconciler { +func NewModelConfigReconciler(client client.Client, clientset kubernetes.Interface, scheme *runtime.Scheme) *ModelConfigReconciler { return &ModelConfigReconciler{ - client: client, - scheme: scheme, + client: client, + clientset: clientset, + scheme: scheme, } } @@ -54,9 +57,9 @@ func (c *ModelConfigReconciler) Reconcile(isvc *v1beta1api.InferenceService) err // An InferenceService with storageUri is considered as multi-model InferenceService with only one model, a modelConfig configmap should be created as well shardStrategy := memory.MemoryStrategy{} for _, id := range shardStrategy.GetShard(isvc) { - modelConfig := corev1.ConfigMap{} - modelConfigName := types.NamespacedName{Name: constants.ModelConfigName(isvc.Name, id), Namespace: isvc.Namespace} - if err := c.client.Get(context.TODO(), modelConfigName, &modelConfig); err != nil { + modelConfigName := constants.ModelConfigName(isvc.Name, id) + _, err := c.clientset.CoreV1().ConfigMaps(isvc.Namespace).Get(context.TODO(), modelConfigName, metav1.GetOptions{}) + if err != nil { if errors.IsNotFound(err) { // If the modelConfig does not exist for an InferenceService without storageUri, create an empty modelConfig log.Info("Creating modelConfig", "configmap", modelConfigName, "inferenceservice", isvc.Name, "namespace", isvc.Namespace) diff --git a/pkg/controller/v1beta1/inferenceservice/reconcilers/raw/raw_kube_reconciler.go b/pkg/controller/v1beta1/inferenceservice/reconcilers/raw/raw_kube_reconciler.go index a0ae5e3cdc3..45c9d220511 100644 --- a/pkg/controller/v1beta1/inferenceservice/reconcilers/raw/raw_kube_reconciler.go +++ b/pkg/controller/v1beta1/inferenceservice/reconcilers/raw/raw_kube_reconciler.go @@ -19,17 +19,19 @@ package raw import ( "fmt" - "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - autoscaler "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/autoscaler" - deployment "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/deployment" - "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress" - service "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/service" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes" knapis "knative.dev/pkg/apis" "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + autoscaler "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/autoscaler" + deployment "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/deployment" + "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress" + service "github.com/kserve/kserve/pkg/controller/v1beta1/inferenceservice/reconcilers/service" ) // RawKubeReconciler reconciles the Native K8S Resources @@ -44,6 +46,7 @@ type RawKubeReconciler struct { // NewRawKubeReconciler creates raw kubernetes resource reconciler. func NewRawKubeReconciler(client client.Client, + clientset kubernetes.Interface, scheme *runtime.Scheme, componentMeta metav1.ObjectMeta, componentExt *v1beta1.ComponentExtensionSpec, @@ -53,7 +56,7 @@ func NewRawKubeReconciler(client client.Client, return nil, err } - url, err := createRawURL(client, componentMeta) + url, err := createRawURL(clientset, componentMeta) if err != nil { return nil, err } @@ -68,8 +71,8 @@ func NewRawKubeReconciler(client client.Client, }, nil } -func createRawURL(client client.Client, metadata metav1.ObjectMeta) (*knapis.URL, error) { - ingressConfig, err := v1beta1.NewIngressConfig(client) +func createRawURL(clientset kubernetes.Interface, metadata metav1.ObjectMeta) (*knapis.URL, error) { + ingressConfig, err := v1beta1.NewIngressConfig(clientset) if err != nil { return nil, err } diff --git a/pkg/controller/v1beta1/inferenceservice/suite_test.go b/pkg/controller/v1beta1/inferenceservice/suite_test.go index 96014c82ad1..1bb29c5427e 100644 --- a/pkg/controller/v1beta1/inferenceservice/suite_test.go +++ b/pkg/controller/v1beta1/inferenceservice/suite_test.go @@ -20,26 +20,26 @@ import ( "context" "testing" - netv1 "k8s.io/api/networking/v1" - - kfservingv1alpha1 "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - "github.com/kserve/kserve/pkg/constants" - pkgtest "github.com/kserve/kserve/pkg/testing" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - ctrl "sigs.k8s.io/controller-runtime" - - "github.com/kserve/kserve/pkg/apis/serving/v1beta1" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + v1 "k8s.io/api/core/v1" + netv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" knservingv1 "knative.dev/serving/pkg/apis/serving/v1" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + + kfservingv1alpha1 "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kserve/kserve/pkg/constants" + pkgtest "github.com/kserve/kserve/pkg/testing" ) // These tests use Ginkgo (BDD-style Go testing framework). Refer to @@ -51,6 +51,7 @@ var ( testEnv *envtest.Environment cancel context.CancelFunc ctx context.Context + clientset kubernetes.Interface ) func TestV1beta1APIs(t *testing.T) { @@ -81,6 +82,10 @@ var _ = BeforeSuite(func() { Expect(err).ToNot(HaveOccurred()) Expect(k8sClient).ToNot(BeNil()) + clientset, err = kubernetes.NewForConfig(cfg) + Expect(err).ToNot(HaveOccurred()) + Expect(clientset).ToNot(BeNil()) + //Create namespace kfservingNamespaceObj := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ @@ -106,10 +111,11 @@ var _ = BeforeSuite(func() { DisableIstioVirtualHost: false, } err = (&InferenceServiceReconciler{ - Client: k8sClient, - Scheme: k8sClient.Scheme(), - Log: ctrl.Log.WithName("V1beta1InferenceServiceController"), - Recorder: k8sManager.GetEventRecorderFor("V1beta1InferenceServiceController"), + Client: k8sClient, + Clientset: clientset, + Scheme: k8sClient.Scheme(), + Log: ctrl.Log.WithName("V1beta1InferenceServiceController"), + Recorder: k8sManager.GetEventRecorderFor("V1beta1InferenceServiceController"), }).SetupWithManager(k8sManager, deployConfig, ingressConfig) Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/credentials/credentials_suite_test.go b/pkg/credentials/credentials_suite_test.go index ae7125d16a0..2bd5228e2e8 100644 --- a/pkg/credentials/credentials_suite_test.go +++ b/pkg/credentials/credentials_suite_test.go @@ -20,14 +20,17 @@ import ( "os" "testing" - pkgtest "github.com/kserve/kserve/pkg/testing" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" + + pkgtest "github.com/kserve/kserve/pkg/testing" ) var cfg *rest.Config var c client.Client +var clientset kubernetes.Interface func TestMain(m *testing.M) { t := pkgtest.SetupEnvTest() @@ -39,6 +42,10 @@ func TestMain(m *testing.M) { if c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil { log.Error(err, "Failed to start client") } + if clientset, err = kubernetes.NewForConfig(cfg); err != nil { + log.Error(err, "Failed to create clientset") + } + code := m.Run() t.Stop() os.Exit(code) diff --git a/pkg/credentials/service_account_credentials.go b/pkg/credentials/service_account_credentials.go index 13f9eecd2ef..086d6a75524 100644 --- a/pkg/credentials/service_account_credentials.go +++ b/pkg/credentials/service_account_credentials.go @@ -23,19 +23,18 @@ import ( "fmt" "strings" - "github.com/kserve/kserve/pkg/constants" - - "github.com/kserve/kserve/pkg/credentials/https" - v1 "k8s.io/api/core/v1" apierr "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" + "github.com/kserve/kserve/pkg/constants" "github.com/kserve/kserve/pkg/credentials/azure" "github.com/kserve/kserve/pkg/credentials/gcs" "github.com/kserve/kserve/pkg/credentials/hdfs" + "github.com/kserve/kserve/pkg/credentials/https" "github.com/kserve/kserve/pkg/credentials/s3" "github.com/kserve/kserve/pkg/utils" ) @@ -64,13 +63,14 @@ type CredentialConfig struct { } type CredentialBuilder struct { - client client.Client - config CredentialConfig + client client.Client + clientset kubernetes.Interface + config CredentialConfig } var log = logf.Log.WithName("CredentialBuilder") -func NewCredentialBuilder(client client.Client, config *v1.ConfigMap) *CredentialBuilder { +func NewCredentialBuilder(client client.Client, clientset kubernetes.Interface, config *v1.ConfigMap) *CredentialBuilder { credentialConfig := CredentialConfig{} if credential, ok := config.Data[CredentialConfigKeyName]; ok { err := json.Unmarshal([]byte(credential), &credentialConfig) @@ -80,8 +80,9 @@ func NewCredentialBuilder(client client.Client, config *v1.ConfigMap) *Credentia } return &CredentialBuilder{ - client: client, - config: credentialConfig, + client: client, + clientset: clientset, + config: credentialConfig, } } @@ -101,11 +102,10 @@ func (c *CredentialBuilder) CreateStorageSpecSecretEnvs(namespace string, annota storageSecretName = secretName } } + secret, err := c.clientset.CoreV1().Secrets(namespace).Get(context.TODO(), storageSecretName, metav1.GetOptions{}) - secret := &v1.Secret{} var storageData []byte - if err := c.client.Get(context.TODO(), - types.NamespacedName{Name: storageSecretName, Namespace: namespace}, secret); err == nil { + if err == nil { if storageKey != "" { if storageData = secret.Data[storageKey]; storageData == nil { return fmt.Errorf("specified storage key %s not found in storage secret %s", @@ -199,10 +199,7 @@ func (c *CredentialBuilder) CreateSecretVolumeAndEnv(namespace string, annotatio if serviceAccountName == "" { serviceAccountName = "default" } - - serviceAccount := &v1.ServiceAccount{} - err := c.client.Get(context.TODO(), types.NamespacedName{Name: serviceAccountName, - Namespace: namespace}, serviceAccount) + serviceAccount, err := c.clientset.CoreV1().ServiceAccounts(namespace).Get(context.TODO(), serviceAccountName, metav1.GetOptions{}) if err != nil { log.Error(err, "Failed to find service account", "ServiceAccountName", serviceAccountName, "Namespace", namespace) @@ -243,9 +240,7 @@ func (c *CredentialBuilder) CreateSecretVolumeAndEnv(namespace string, annotatio func (c *CredentialBuilder) mountSecretCredential(secretName string, namespace string, container *v1.Container, volumes *[]v1.Volume) error { - secret := &v1.Secret{} - err := c.client.Get(context.TODO(), types.NamespacedName{Name: secretName, - Namespace: namespace}, secret) + secret, err := c.clientset.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, metav1.GetOptions{}) if err != nil { log.Error(err, "Failed to find secret", "SecretName", secretName) return err diff --git a/pkg/credentials/service_account_credentials_test.go b/pkg/credentials/service_account_credentials_test.go index 866ef8a831a..e305b7920df 100644 --- a/pkg/credentials/service_account_credentials_test.go +++ b/pkg/credentials/service_account_credentials_test.go @@ -165,7 +165,7 @@ func TestS3CredentialBuilder(t *testing.T) { }, } - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { g.Expect(c.Create(context.TODO(), existingServiceAccount)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), existingS3Secret)).NotTo(gomega.HaveOccurred()) @@ -295,7 +295,7 @@ func TestS3CredentialBuilderWithStorageSecret(t *testing.T) { }, } - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { g.Expect(c.Create(context.TODO(), existingServiceAccount)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), existingS3Secret)).NotTo(gomega.HaveOccurred()) @@ -399,7 +399,7 @@ func TestS3ServiceAccountCredentialBuilder(t *testing.T) { }, } - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { g.Expect(c.Create(context.TODO(), existingServiceAccount)).NotTo(gomega.HaveOccurred()) @@ -509,7 +509,7 @@ func TestGCSCredentialBuilder(t *testing.T) { }, } - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { g.Expect(c.Create(context.TODO(), existingServiceAccount)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), existingGCSSecret)).NotTo(gomega.HaveOccurred()) @@ -651,7 +651,7 @@ func TestLegacyAzureCredentialBuilder(t *testing.T) { g.Expect(c.Create(context.TODO(), customAzureSecret)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), customOnlyServiceAccount)).NotTo(gomega.HaveOccurred()) - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { err := builder.CreateSecretVolumeAndEnv(scenario.serviceAccount.Namespace, nil, scenario.serviceAccount.Name, @@ -762,7 +762,7 @@ func TestHdfsCredentialBuilder(t *testing.T) { g.Expect(c.Create(context.TODO(), customHdfsSecret)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), customOnlyServiceAccount)).NotTo(gomega.HaveOccurred()) - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { err := builder.CreateSecretVolumeAndEnv(scenario.serviceAccount.Namespace, nil, scenario.serviceAccount.Name, @@ -902,7 +902,7 @@ func TestAzureCredentialBuilder(t *testing.T) { g.Expect(c.Create(context.TODO(), customAzureSecret)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), customOnlyServiceAccount)).NotTo(gomega.HaveOccurred()) - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { err := builder.CreateSecretVolumeAndEnv(scenario.serviceAccount.Namespace, nil, scenario.serviceAccount.Name, @@ -1006,7 +1006,7 @@ func TestAzureStorageAccessKeyCredentialBuilder(t *testing.T) { g.Expect(c.Create(context.TODO(), customAzureSecret)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), customOnlyServiceAccount)).NotTo(gomega.HaveOccurred()) - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { err := builder.CreateSecretVolumeAndEnv(scenario.serviceAccount.Namespace, nil, scenario.serviceAccount.Name, @@ -1034,7 +1034,7 @@ func TestAzureStorageAccessKeyCredentialBuilder(t *testing.T) { func TestCredentialBuilder_CreateStorageSpecSecretEnvs(t *testing.T) { g := gomega.NewGomegaWithT(t) namespace := "default" - builder := NewCredentialBuilder(c, configMap) + builder := NewCredentialBuilder(c, clientset, configMap) scenarios := map[string]struct { secret *v1.Secret diff --git a/pkg/webhook/admission/pod/agent_injector_test.go b/pkg/webhook/admission/pod/agent_injector_test.go index cd8e4e0d2f5..83fd529a87e 100644 --- a/pkg/webhook/admission/pod/agent_injector_test.go +++ b/pkg/webhook/admission/pod/agent_injector_test.go @@ -17,6 +17,7 @@ limitations under the License. package pod import ( + fakeclientset "k8s.io/client-go/kubernetes/fake" "testing" "github.com/kserve/kserve/pkg/apis/serving/v1beta1" @@ -1100,8 +1101,8 @@ func TestAgentInjector(t *testing.T) { }, }, } - - credentialBuilder := credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + clientset := fakeclientset.NewSimpleClientset() + credentialBuilder := credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }) diff --git a/pkg/webhook/admission/pod/batcher_injector_test.go b/pkg/webhook/admission/pod/batcher_injector_test.go index a6c986c9c18..3b3f97ca6e5 100644 --- a/pkg/webhook/admission/pod/batcher_injector_test.go +++ b/pkg/webhook/admission/pod/batcher_injector_test.go @@ -19,14 +19,14 @@ package pod import ( "testing" - "k8s.io/apimachinery/pkg/api/resource" - "knative.dev/pkg/kmp" - - "github.com/kserve/kserve/pkg/constants" "github.com/onsi/gomega" "github.com/onsi/gomega/types" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "knative.dev/pkg/kmp" + + "github.com/kserve/kserve/pkg/constants" ) const ( diff --git a/pkg/webhook/admission/pod/mutator.go b/pkg/webhook/admission/pod/mutator.go index 35b49433372..3bfaf798412 100644 --- a/pkg/webhook/admission/pod/mutator.go +++ b/pkg/webhook/admission/pod/mutator.go @@ -21,13 +21,14 @@ import ( "net/http" v1 "k8s.io/api/core/v1" - k8types "k8s.io/apimachinery/pkg/types" - - "github.com/kserve/kserve/pkg/constants" - "github.com/kserve/kserve/pkg/credentials" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + + "github.com/kserve/kserve/pkg/constants" + "github.com/kserve/kserve/pkg/credentials" ) // +kubebuilder:webhook:path=/mutate-pods,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=create,versions=v1,name=inferenceservice.kserve-webhook-server.pod-mutator,reinvocationPolicy=IfNeeded @@ -35,8 +36,9 @@ var log = logf.Log.WithName(constants.PodMutatorWebhookName) // Mutator is a webhook that injects incoming pods type Mutator struct { - Client client.Client - Decoder *admission.Decoder + Client client.Client + Clientset kubernetes.Interface + Decoder *admission.Decoder } // Handle decodes the incoming Pod and executes mutation logic. @@ -52,8 +54,8 @@ func (mutator *Mutator) Handle(ctx context.Context, req admission.Request) admis return admission.ValidationResponse(true, "") } - configMap := &v1.ConfigMap{} - err := mutator.Client.Get(context.TODO(), k8types.NamespacedName{Name: constants.InferenceServiceConfigMapName, Namespace: constants.KServeNamespace}, configMap) + configMap, err := mutator.Clientset.CoreV1().ConfigMaps(constants.KServeNamespace).Get(context.TODO(), + constants.InferenceServiceConfigMapName, metav1.GetOptions{}) if err != nil { log.Error(err, "Failed to find config map", "name", constants.InferenceServiceConfigMapName) return admission.Errored(http.StatusInternalServerError, err) @@ -77,7 +79,7 @@ func (mutator *Mutator) Handle(ctx context.Context, req admission.Request) admis } func (mutator *Mutator) mutate(pod *v1.Pod, configMap *v1.ConfigMap) error { - credentialBuilder := credentials.NewCredentialBuilder(mutator.Client, configMap) + credentialBuilder := credentials.NewCredentialBuilder(mutator.Client, mutator.Clientset, configMap) storageInitializerConfig, err := getStorageInitializerConfigs(configMap) if err != nil { diff --git a/pkg/webhook/admission/pod/mutator_test.go b/pkg/webhook/admission/pod/mutator_test.go index ba552af80c7..4d7084f7698 100644 --- a/pkg/webhook/admission/pod/mutator_test.go +++ b/pkg/webhook/admission/pod/mutator_test.go @@ -52,7 +52,7 @@ func TestMutator_Handle(t *testing.T) { if err := c.Create(context.TODO(), &kserveNamespace); err != nil { t.Errorf("failed to create namespace: %v", err) } - mutator := Mutator{Client: c, Decoder: admission.NewDecoder(c.Scheme())} + mutator := Mutator{Client: c, Clientset: clientset, Decoder: admission.NewDecoder(c.Scheme())} cases := map[string]struct { configMap v1.ConfigMap diff --git a/pkg/webhook/admission/pod/storage_initializer_injector_test.go b/pkg/webhook/admission/pod/storage_initializer_injector_test.go index 8113871369c..df2db9e973a 100644 --- a/pkg/webhook/admission/pod/storage_initializer_injector_test.go +++ b/pkg/webhook/admission/pod/storage_initializer_injector_test.go @@ -21,22 +21,20 @@ import ( "strings" "testing" + "github.com/onsi/gomega" + "github.com/onsi/gomega/types" + "github.com/stretchr/testify/assert" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/runtime" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/pkg/kmp" "knative.dev/pkg/ptr" - "sigs.k8s.io/controller-runtime/pkg/client/fake" "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" "github.com/kserve/kserve/pkg/constants" "github.com/kserve/kserve/pkg/credentials" "github.com/kserve/kserve/pkg/credentials/gcs" "github.com/kserve/kserve/pkg/credentials/s3" - "github.com/onsi/gomega" - "github.com/onsi/gomega/types" - "github.com/stretchr/testify/assert" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) const ( @@ -357,7 +355,7 @@ func TestStorageInitializerInjector(t *testing.T) { for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: storageInitializerConfig, @@ -398,7 +396,7 @@ func TestStorageInitializerFailureCases(t *testing.T) { for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: storageInitializerConfig, @@ -498,7 +496,7 @@ func TestCustomSpecStorageUriInjection(t *testing.T) { for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: storageInitializerConfig, @@ -946,7 +944,7 @@ func TestCredentialInjection(t *testing.T) { }, } - builder := credentials.NewCredentialBuilder(c, configMap) + builder := credentials.NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { g.Expect(c.Create(context.TODO(), scenario.sa)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), scenario.secret)).NotTo(gomega.HaveOccurred()) @@ -1037,7 +1035,7 @@ func TestStorageInitializerConfigmap(t *testing.T) { for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: &StorageInitializerConfig{ @@ -1874,7 +1872,7 @@ func TestCaBundleConfigMapVolumeMountInStorageInitializer(t *testing.T) { }, } - builder := credentials.NewCredentialBuilder(c, configMap) + builder := credentials.NewCredentialBuilder(c, clientset, configMap) for name, scenario := range scenarios { g.Expect(c.Create(context.TODO(), scenario.sa)).NotTo(gomega.HaveOccurred()) g.Expect(c.Create(context.TODO(), scenario.secret)).NotTo(gomega.HaveOccurred()) @@ -2004,7 +2002,7 @@ func TestDirectVolumeMountForPvc(t *testing.T) { for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: &StorageInitializerConfig{ @@ -2309,7 +2307,7 @@ func TestTransformerCollocation(t *testing.T) { for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: scenario.storageConfig, @@ -2344,7 +2342,7 @@ func TestGetStorageContainerSpec(t *testing.T) { } s3AzureSpec := v1alpha1.ClusterStorageContainer{ ObjectMeta: metav1.ObjectMeta{ - Name: "s3Azure", + Name: "s3-azure", }, Spec: v1alpha1.StorageContainerSpec{ Container: v1.Container{ @@ -2358,16 +2356,21 @@ func TestGetStorageContainerSpec(t *testing.T) { SupportedUriFormats: []v1alpha1.SupportedUriFormat{{Prefix: "s3://"}, {Regex: "https://(.+?).blob.core.windows.net/(.+)"}}, }, } - storageContainerSpecs := &v1alpha1.ClusterStorageContainerList{ - Items: []v1alpha1.ClusterStorageContainer{customSpec, s3AzureSpec}, - } - s := runtime.NewScheme() - err := v1alpha1.AddToScheme(s) - if err != nil { - t.Errorf("unable to add scheme : %v", err) + if err := c.Create(context.TODO(), &s3AzureSpec); err != nil { + t.Fatalf("unable to create cluster storage container: %v", err) + } + if err := c.Create(context.TODO(), &customSpec); err != nil { + t.Fatalf("unable to create cluster storage container: %v", err) } - mockClient := fake.NewClientBuilder().WithLists(storageContainerSpecs).WithScheme(s).Build() + defer func() { + if err := c.Delete(context.TODO(), &s3AzureSpec); err != nil { + t.Errorf("unable to delete cluster storage container: %v", err) + } + if err := c.Delete(context.TODO(), &customSpec); err != nil { + t.Errorf("unable to delete cluster storage container: %v", err) + } + }() scenarios := map[string]struct { storageUri string expectedSpec *v1.Container @@ -2387,8 +2390,9 @@ func TestGetStorageContainerSpec(t *testing.T) { } for name, scenario := range scenarios { var container *v1.Container + var err error - if container, err = GetContainerSpecForStorageUri(scenario.storageUri, mockClient); err != nil { + if container, err = GetContainerSpecForStorageUri(scenario.storageUri, c); err != nil { t.Errorf("Test %q unexpected result: %s", name, err) } g.Expect(container).To(gomega.Equal(scenario.expectedSpec)) @@ -2414,7 +2418,7 @@ func TestStorageContainerCRDInjection(t *testing.T) { } s3AzureSpec := v1alpha1.ClusterStorageContainer{ ObjectMeta: metav1.ObjectMeta{ - Name: "s3Azure", + Name: "s3-azure", }, Spec: v1alpha1.StorageContainerSpec{ Container: v1.Container{ @@ -2431,16 +2435,21 @@ func TestStorageContainerCRDInjection(t *testing.T) { SupportedUriFormats: []v1alpha1.SupportedUriFormat{{Prefix: "s3://"}, {Regex: "https://(.+?).blob.core.windows.net/(.+)"}}, }, } - storageContainerSpecs := &v1alpha1.ClusterStorageContainerList{ - Items: []v1alpha1.ClusterStorageContainer{customSpec, s3AzureSpec}, + if err := c.Create(context.TODO(), &s3AzureSpec); err != nil { + t.Fatalf("unable to create cluster storage container: %v", err) } - - s := runtime.NewScheme() - err := v1alpha1.AddToScheme(s) - if err != nil { - t.Errorf("unable to add scheme : %v", err) + if err := c.Create(context.TODO(), &customSpec); err != nil { + t.Fatalf("unable to create cluster storage container: %v", err) } - mockClient := fake.NewClientBuilder().WithLists(storageContainerSpecs).WithScheme(s).Build() + defer func() { + if err := c.Delete(context.TODO(), &s3AzureSpec); err != nil { + t.Errorf("unable to delete cluster storage container: %v", err) + } + if err := c.Delete(context.TODO(), &customSpec); err != nil { + t.Errorf("unable to delete cluster storage container: %v", err) + } + }() + scenarios := map[string]struct { original *v1.Pod expected *v1.Pod @@ -2580,14 +2589,14 @@ func TestStorageContainerCRDInjection(t *testing.T) { } for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(mockClient, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: storageInitializerConfig, - client: mockClient, + client: c, } - if err = injector.InjectStorageInitializer(scenario.original); err != nil { + if err := injector.InjectStorageInitializer(scenario.original); err != nil { t.Errorf("Test %q unexpected result: %s", name, err) } if diff, _ := kmp.SafeDiff(scenario.expected.Spec, scenario.original.Spec); diff != "" { @@ -3629,7 +3638,7 @@ func TestStorageInitializerUIDForIstioCNI(t *testing.T) { for name, scenario := range scenarios { injector := &StorageInitializerInjector{ - credentialBuilder: credentials.NewCredentialBuilder(c, &v1.ConfigMap{ + credentialBuilder: credentials.NewCredentialBuilder(c, clientset, &v1.ConfigMap{ Data: map[string]string{}, }), config: storageInitializerConfig, diff --git a/pkg/webhook/admission/pod/suite_test.go b/pkg/webhook/admission/pod/suite_test.go index 12804546910..81ee1fe0464 100644 --- a/pkg/webhook/admission/pod/suite_test.go +++ b/pkg/webhook/admission/pod/suite_test.go @@ -20,17 +20,19 @@ import ( "os" "testing" - "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - pkgtest "github.com/kserve/kserve/pkg/testing" - + "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "k8s.io/klog" "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" + pkgtest "github.com/kserve/kserve/pkg/testing" ) var cfg *rest.Config var c client.Client +var clientset kubernetes.Interface func TestMain(m *testing.M) { t := pkgtest.SetupEnvTest() @@ -47,6 +49,11 @@ func TestMain(m *testing.M) { if c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil { klog.Error(err, "Failed to start client") } + + if clientset, err = kubernetes.NewForConfig(cfg); err != nil { + klog.Error(err, "Failed to create clientset") + } + code := m.Run() t.Stop() os.Exit(code) From 2cccc9e1d6168a6925780aef923e14e5d8ef872c Mon Sep 17 00:00:00 2001 From: Andrews Arokiam <87992092+andyi2it@users.noreply.github.com> Date: Sun, 17 Mar 2024 18:35:16 +0530 Subject: [PATCH 06/13] CVE-2024-28110 security upgrade (#3509) Signed-off-by: Andrews Arokiam --- go.mod | 6 +++--- go.sum | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c0924dc4d94..beb96248709 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,13 @@ go 1.21 require ( cloud.google.com/go/storage v1.35.1 github.com/aws/aws-sdk-go v1.48.0 - github.com/cloudevents/sdk-go/v2 v2.14.0 + github.com/cloudevents/sdk-go/v2 v2.15.2 github.com/fsnotify/fsnotify v1.7.0 github.com/getkin/kin-openapi v0.120.0 github.com/go-logr/logr v1.3.0 github.com/gofrs/uuid/v5 v5.0.0 github.com/google/go-cmp v0.6.0 - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.6.0 github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 github.com/json-iterator/go v1.1.12 github.com/kelseyhightower/envconfig v1.4.0 @@ -22,7 +22,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.17.0 - go.uber.org/zap v1.26.0 + go.uber.org/zap v1.27.0 gomodules.xyz/jsonpatch/v2 v2.4.0 google.golang.org/api v0.151.0 google.golang.org/protobuf v1.32.0 diff --git a/go.sum b/go.sum index afcc4d6bd51..45cf9d3c617 100644 --- a/go.sum +++ b/go.sum @@ -76,6 +76,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go/v2 v2.14.0 h1:Nrob4FwVgi5L4tV9lhjzZcjYqFVyJzsA56CwPaPfv6s= github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= +github.com/cloudevents/sdk-go/v2 v2.15.2 h1:54+I5xQEnI73RBhWHxbI1XJcqOFOVJN85vb41+8mHUc= +github.com/cloudevents/sdk-go/v2 v2.15.2/go.mod h1:lL7kSWAE/V8VI4Wh0jbL2v/jvqsm6tjmaQBSvxcv4uE= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -211,6 +213,8 @@ github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -397,6 +401,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= From aa1aa24060af2f45df97086c45b8efae2d99b0c8 Mon Sep 17 00:00:00 2001 From: Gavrish Prabhu Date: Mon, 18 Mar 2024 00:05:16 +0530 Subject: [PATCH 07/13] Fix: Support model parallelism in HF transformer (#3459) * Support model parallelism in HF transformer Signed-off-by: Gavrish Prabhu * Support models that dont supoort slipt Signed-off-by: Gavrish Prabhu * fix padding Signed-off-by: Gavrish Prabhu * fix defauults Signed-off-by: Gavrish Prabhu * set cuda as default Signed-off-by: Gavrish Prabhu * set cuda as default Signed-off-by: Gavrish Prabhu * fix lint Signed-off-by: Gavrish Prabhu * update automodel Signed-off-by: Gavrish Prabhu * fix review comment Signed-off-by: Gavrish Prabhu * update review comment Signed-off-by: Gavrish Prabhu * update comment Signed-off-by: Gavrish Prabhu --------- Signed-off-by: Gavrish Prabhu --- .../huggingfaceserver/model.py | 40 +++++++++++++------ python/huggingfaceserver/poetry.lock | 32 ++++++++++++++- python/huggingfaceserver/pyproject.toml | 1 + 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/python/huggingfaceserver/huggingfaceserver/model.py b/python/huggingfaceserver/huggingfaceserver/model.py index ea6a18e022c..b70cac0e30c 100644 --- a/python/huggingfaceserver/huggingfaceserver/model.py +++ b/python/huggingfaceserver/huggingfaceserver/model.py @@ -32,6 +32,7 @@ from kserve.utils.utils import get_predict_response, get_predict_input, from_np_dtype from kserve import Model import torch +from accelerate import init_empty_weights try: from vllm.sampling_params import SamplingParams @@ -42,7 +43,7 @@ _vllm = False from transformers import AutoModelForCausalLM, AutoModelForSeq2SeqLM, AutoTokenizer, \ - AutoConfig, \ + AutoConfig, AutoModel, \ AutoModelForSequenceClassification, AutoModelForTokenClassification, AutoModelForQuestionAnswering, \ AutoModelForMaskedLM, BatchEncoding, TensorType @@ -59,6 +60,7 @@ def __init__(self, model_name: str, kwargs, self.device = torch.device( "cuda" if torch.cuda.is_available() else "cpu" ) + self.device_map = "cuda" if torch.cuda.is_available() else "cpu" self.model_id = kwargs.get('model_id', None) self.model_dir = kwargs.get('model_dir', None) if not self.model_id and not self.model_dir: @@ -78,8 +80,7 @@ def __init__(self, model_name: str, kwargs, self.ready = False @staticmethod - def infer_task_from_model_architecture(model_config_path: str): - model_config = AutoConfig.from_pretrained(model_config_path) + def infer_task_from_model_architecture(model_config: str): architecture = model_config.architectures[0] task = None for arch_options in ARCHITECTURES_2_TASK: @@ -110,31 +111,46 @@ def load(self) -> bool: self.ready = True return self.ready + model_config = AutoConfig.from_pretrained(model_id_or_path) + if not self.task: - self.task = self.infer_task_from_model_architecture(model_id_or_path) + self.task = self.infer_task_from_model_architecture(model_config) + + # device_map = "auto" enables model parallelism but all model architcture dont support it. + # For pre-check we initialize the model class without weights to check the `_no_split_modules` + # device_map = "auto" for models that support this else set to either cuda/cpu + with init_empty_weights(): + self.model = AutoModel.from_config(model_config) + + if self.model._no_split_modules: + self.device_map = "auto" # load huggingface tokenizer self.tokenizer = AutoTokenizer.from_pretrained( - model_id_or_path, do_lower_case=self.do_lower_case) + model_id_or_path, do_lower_case=self.do_lower_case, device_map=self.device_map) + if not self.tokenizer.pad_token: + self.tokenizer.add_special_tokens({'pad_token': '[PAD]'}) logger.info(f"successfully loaded tokenizer for task: {self.task}") + # load huggingface model using from_pretrained for inference mode if not self.predictor_host: if self.task == MLTask.sequence_classification.value: self.model = AutoModelForSequenceClassification.from_pretrained( - model_id_or_path) + model_id_or_path, device_map=self.device_map) elif self.task == MLTask.question_answering.value: - self.model = AutoModelForQuestionAnswering.from_pretrained(model_id_or_path) + self.model = AutoModelForQuestionAnswering.from_pretrained( + model_id_or_path, device_map=self.device_map) elif self.task == MLTask.token_classification.value: - self.model = AutoModelForTokenClassification.from_pretrained(model_id_or_path) + self.model = AutoModelForTokenClassification.from_pretrained( + model_id_or_path, device_map=self.device_map) elif self.task == MLTask.fill_mask.value: - self.model = AutoModelForMaskedLM.from_pretrained(model_id_or_path) + self.model = AutoModelForMaskedLM.from_pretrained(model_id_or_path, device_map=self.device_map) elif self.task == MLTask.text_generation.value: - self.model = AutoModelForCausalLM.from_pretrained(model_id_or_path) + self.model = AutoModelForCausalLM.from_pretrained(model_id_or_path, device_map=self.device_map) elif self.task == MLTask.text2text_generation.value: - self.model = AutoModelForSeq2SeqLM.from_pretrained(model_id_or_path) + self.model = AutoModelForSeq2SeqLM.from_pretrained(model_id_or_path, device_map=self.device_map) else: raise ValueError(f"Unsupported task {self.task}. Please check the supported `task` option.") self.model.eval() - self.model.to(self.device) logger.info(f"successfully loaded huggingface model from path {model_id_or_path}") self.ready = True return self.ready diff --git a/python/huggingfaceserver/poetry.lock b/python/huggingfaceserver/poetry.lock index fa118102457..7eb52446438 100644 --- a/python/huggingfaceserver/poetry.lock +++ b/python/huggingfaceserver/poetry.lock @@ -1,5 +1,35 @@ # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +[[package]] +name = "accelerate" +version = "0.27.2" +description = "Accelerate" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "accelerate-0.27.2-py3-none-any.whl", hash = "sha256:a818dd27b9ba24e9eb5030d1b285cf4cdd1b41bbfa675fb4eb2477ddfc097074"}, + {file = "accelerate-0.27.2.tar.gz", hash = "sha256:cc715fe9a8bc7a286259bfb6d65fb78363badd3371e7cbda4e4a4ef34a0010aa"}, +] + +[package.dependencies] +huggingface-hub = "*" +numpy = ">=1.17" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = ">=0.3.1" +torch = ">=1.10.0" + +[package.extras] +dev = ["bitsandbytes", "black (>=23.1,<24.0)", "datasets", "deepspeed (<0.13.0)", "evaluate", "hf-doc-builder (>=0.3.0)", "parameterized", "pytest", "pytest-subtests", "pytest-xdist", "rich", "ruff (>=0.1.15,<0.2.0)", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +quality = ["black (>=23.1,<24.0)", "hf-doc-builder (>=0.3.0)", "ruff (>=0.1.15,<0.2.0)"] +rich = ["rich"] +sagemaker = ["sagemaker"] +test-dev = ["bitsandbytes", "datasets", "deepspeed (<0.13.0)", "evaluate", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +test-prod = ["parameterized", "pytest", "pytest-subtests", "pytest-xdist"] +test-trackers = ["comet-ml", "dvclive", "tensorboard", "wandb"] +testing = ["bitsandbytes", "datasets", "deepspeed (<0.13.0)", "evaluate", "parameterized", "pytest", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] + [[package]] name = "aiohttp" version = "3.9.3" @@ -4274,4 +4304,4 @@ vllm = ["vllm"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "d707cb9cfa8bdc420eaa108304bcd1bee96d6771f63db8b4dedda56ffdc13e0f" +content-hash = "1f579b720a6ddda1c26a3790267156c6c040bc039aca7484883def6035318cfc" diff --git a/python/huggingfaceserver/pyproject.toml b/python/huggingfaceserver/pyproject.toml index 99dc1f97f91..b3df54454e0 100644 --- a/python/huggingfaceserver/pyproject.toml +++ b/python/huggingfaceserver/pyproject.toml @@ -13,6 +13,7 @@ packages = [ python = ">=3.9,<3.12" kserve = { path = "../kserve", extras = ["storage"], develop = true } transformers = "~4.37.0" +accelerate = "~0.27.2" torch = "~2.1.2" vllm = { version = "^0.2.7", optional = true } From 124d36f22ecb634f77b53e286f80e384a043ca1e Mon Sep 17 00:00:00 2001 From: Manjunath Kumatagi Date: Mon, 18 Mar 2024 00:48:15 +0530 Subject: [PATCH 08/13] Remove GOARCH (#3523) Signed-off-by: Manjunath Kumatagi --- tools/tf2openapi/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tf2openapi/Dockerfile b/tools/tf2openapi/Dockerfile index e070eada3cb..2202d798f93 100644 --- a/tools/tf2openapi/Dockerfile +++ b/tools/tf2openapi/Dockerfile @@ -9,7 +9,7 @@ COPY go.mod go.mod COPY go.sum go.sum # Build -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o tf2openapi ./tools/tf2openapi/cmd +RUN CGO_ENABLED=0 GOOS=linux go build -a -o tf2openapi ./tools/tf2openapi/cmd # Copy tf2openapi into a thin image FROM gcr.io/distroless/static:nonroot From 488012ea79f0addcd1d132b5ddd9cae026600f2f Mon Sep 17 00:00:00 2001 From: Andrews Arokiam <87992092+andyi2it@users.noreply.github.com> Date: Mon, 18 Mar 2024 02:57:39 +0530 Subject: [PATCH 09/13] upgrade knative to 1.13 (#3457) * upgrade knative Signed-off-by: Andrews Arokiam updrage version Signed-off-by: Andrews Arokiam upgrade version Signed-off-by: Andrews Arokiam * Update kn cli --------- Signed-off-by: Andrews Arokiam Signed-off-by: Dan Sun Co-authored-by: Dan Sun --- hack/quick_install.sh | 4 ++-- test/overlays/knative/knative-serving-istio.yaml | 4 ++-- test/overlays/knative/knative-serving-kourier.yaml | 4 ++-- test/scripts/gh-actions/install-knative-operator.sh | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hack/quick_install.sh b/hack/quick_install.sh index d787ce2a147..9a768507cbb 100755 --- a/hack/quick_install.sh +++ b/hack/quick_install.sh @@ -32,8 +32,8 @@ done export ISTIO_VERSION=1.19.4 export ISTIO_DIR=istio-${ISTIO_VERSION} -export KNATIVE_SERVING_VERSION=knative-v1.10.1 -export KNATIVE_ISTIO_VERSION=knative-v1.10.0 +export KNATIVE_SERVING_VERSION=knative-v1.13.1 +export KNATIVE_ISTIO_VERSION=knative-v1.13.1 export KSERVE_VERSION=v0.12.0 export CERT_MANAGER_VERSION=v1.9.0 export SCRIPT_DIR="$( dirname -- "${BASH_SOURCE[0]}" )" diff --git a/test/overlays/knative/knative-serving-istio.yaml b/test/overlays/knative/knative-serving-istio.yaml index f1bcc747bf3..8dc6d08802d 100644 --- a/test/overlays/knative/knative-serving-istio.yaml +++ b/test/overlays/knative/knative-serving-istio.yaml @@ -9,7 +9,7 @@ metadata: name: knative-serving namespace: knative-serving spec: - version: "1.10.2" + version: "1.13.1" config: deployment: # Skip tag resolution for certain domains @@ -89,4 +89,4 @@ spec: memory: 32Mi limits: cpu: 100m - memory: 128Mi \ No newline at end of file + memory: 128Mi diff --git a/test/overlays/knative/knative-serving-kourier.yaml b/test/overlays/knative/knative-serving-kourier.yaml index 8535ea0b01c..97268aba452 100644 --- a/test/overlays/knative/knative-serving-kourier.yaml +++ b/test/overlays/knative/knative-serving-kourier.yaml @@ -9,7 +9,7 @@ metadata: name: knative-serving namespace: knative-serving spec: - version: "1.10.2" + version: "1.13.1" ingress: kourier: enabled: true @@ -94,4 +94,4 @@ spec: memory: 32Mi limits: cpu: 100m - memory: 128Mi \ No newline at end of file + memory: 128Mi diff --git a/test/scripts/gh-actions/install-knative-operator.sh b/test/scripts/gh-actions/install-knative-operator.sh index e2440e97d7b..ab866f3ab9e 100755 --- a/test/scripts/gh-actions/install-knative-operator.sh +++ b/test/scripts/gh-actions/install-knative-operator.sh @@ -20,9 +20,9 @@ set -o errexit set -o nounset set -o pipefail -KNATIVE_OPERATOR_PLUGIN_VERSION="knative-v1.11.0" -KNATIVE_OPERATOR_VERSION="1.11.2" -KNATIVE_CLI_VERSION="knative-v1.11.0" +KNATIVE_OPERATOR_PLUGIN_VERSION="knative-v1.13.0" +KNATIVE_OPERATOR_VERSION="1.13.1" +KNATIVE_CLI_VERSION="knative-v1.13.0" echo "Installing Knative cli ..." wget https://github.com/knative/client/releases/download/"${KNATIVE_CLI_VERSION}"/kn-linux-amd64 -O /usr/local/bin/kn && chmod +x /usr/local/bin/kn From 20cf546179f92c1638540e2a07637993c20acf75 Mon Sep 17 00:00:00 2001 From: Dan Sun Date: Sun, 17 Mar 2024 20:46:14 -0400 Subject: [PATCH 10/13] Update KServe project description (#3524) Update README for generative AI model support Signed-off-by: Dan Sun --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ef63813c260..36074d62164 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![LICENSE](https://img.shields.io/github/license/kserve/kserve.svg)](https://github.com/kserve/kserve/blob/master/LICENSE) [![Slack Status](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://github.com/kserve/community/blob/main/README.md#questions-and-issues) -KServe provides a Kubernetes [Custom Resource Definition](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) for serving machine learning (ML) models on arbitrary frameworks. It aims to solve production model serving use cases by providing performant, high abstraction interfaces for common ML frameworks like Tensorflow, XGBoost, ScikitLearn, PyTorch, and ONNX. +KServe provides a Kubernetes [Custom Resource Definition](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) for serving predictive and generative machine learning (ML) models. It aims to solve production model serving use cases by providing high abstraction interfaces for Tensorflow, XGBoost, ScikitLearn, PyTorch, Huggingface Transformer/LLM models using standardized data plane protocols. It encapsulates the complexity of autoscaling, networking, health checking, and server configuration to bring cutting edge serving features like GPU Autoscaling, Scale to Zero, and Canary Rollouts to your ML deployments. It enables a simple, pluggable, and complete story for Production ML Serving including prediction, pre-processing, post-processing and explainability. KServe is being [used across various organizations.](https://kserve.github.io/website/master/community/adopters/) @@ -15,12 +15,11 @@ For more details, visit the [KServe website](https://kserve.github.io/website/). ![KServe](/docs/diagrams/kserve.png) -_Since 0.7 [KFServing is rebranded to KServe](https://blog.kubeflow.org/release/official/2021/09/27/kfserving-transition.html), we still support the RTS release -[0.6.x](https://github.com/kserve/kserve/tree/release-0.6), please refer to corresponding release branch for docs_. +_Since 0.7 [KFServing is rebranded to KServe](https://blog.kubeflow.org/release/official/2021/09/27/kfserving-transition.html). ### Why KServe? -- KServe is a standard, cloud agnostic **Model Inference Platform** on Kubernetes, built for highly scalable use cases. -- Provides performant, **standardized inference protocol** across ML frameworks. +- KServe is a standard, cloud agnostic **Model Inference Platform** for serving predictive and generative AI models on Kubernetes, built for highly scalable use cases. +- Provides performant, **standardized inference protocol** across ML frameworks including OpenAI specification for generative models. - Support modern **serverless inference workload** with **request based autoscaling including scale-to-zero** on **CPU and GPU**. - Provides **high scalability, density packing and intelligent routing** using **ModelMesh**. - **Simple and pluggable production serving** for **inference**, **pre/post processing**, **monitoring** and **explainability**. From a652036c0bee49be19c8de447c604fd0cdd204bb Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 18 Mar 2024 18:36:19 -0400 Subject: [PATCH 11/13] Upgrade istio to 1.20 works for the Github Actions (#3529) Signed-off-by: Vincent Hou --- hack/quick_install.sh | 2 +- test/scripts/gh-actions/setup-deps.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/quick_install.sh b/hack/quick_install.sh index 9a768507cbb..54728e73833 100755 --- a/hack/quick_install.sh +++ b/hack/quick_install.sh @@ -30,7 +30,7 @@ while getopts ":hsr" option; do esac done -export ISTIO_VERSION=1.19.4 +export ISTIO_VERSION=1.20.4 export ISTIO_DIR=istio-${ISTIO_VERSION} export KNATIVE_SERVING_VERSION=knative-v1.13.1 export KNATIVE_ISTIO_VERSION=knative-v1.13.1 diff --git a/test/scripts/gh-actions/setup-deps.sh b/test/scripts/gh-actions/setup-deps.sh index 5acd8cbd75f..fbf5e018d48 100755 --- a/test/scripts/gh-actions/setup-deps.sh +++ b/test/scripts/gh-actions/setup-deps.sh @@ -24,7 +24,7 @@ set -o pipefail SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; DEPLOYMENT_MODE="${1:-'serverless'}" -ISTIO_VERSION="1.19.4" +ISTIO_VERSION="1.20.4" CERT_MANAGER_VERSION="v1.5.0" YQ_VERSION="v4.28.1" From 62ce7de29899fd1713536e70083cd1a49524187c Mon Sep 17 00:00:00 2001 From: Dan Sun Date: Mon, 18 Mar 2024 23:52:16 -0400 Subject: [PATCH 12/13] Update kserve cake diagram (#3530) Signed-off-by: Dan Sun --- README.md | 2 +- docs/diagrams/kserve_new.png | Bin 0 -> 92528 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/diagrams/kserve_new.png diff --git a/README.md b/README.md index 36074d62164..a373de4bb8a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ It encapsulates the complexity of autoscaling, networking, health checking, and For more details, visit the [KServe website](https://kserve.github.io/website/). -![KServe](/docs/diagrams/kserve.png) +![KServe](/docs/diagrams/kserve_new.png) _Since 0.7 [KFServing is rebranded to KServe](https://blog.kubeflow.org/release/official/2021/09/27/kfserving-transition.html). diff --git a/docs/diagrams/kserve_new.png b/docs/diagrams/kserve_new.png new file mode 100644 index 0000000000000000000000000000000000000000..64cd7aae3c3021878a1062a51bafe97bafae3082 GIT binary patch literal 92528 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 Date: Tue, 19 Mar 2024 02:47:54 -0400 Subject: [PATCH 13/13] Remove white background for the kserve diagram (#3531) * Update kserve diagram Signed-off-by: Dan Sun * Remove white background Signed-off-by: Dan Sun --------- Signed-off-by: Dan Sun --- docs/diagrams/kserve_new.png | Bin 92528 -> 101325 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/diagrams/kserve_new.png b/docs/diagrams/kserve_new.png index 64cd7aae3c3021878a1062a51bafe97bafae3082..49a05f64b1dbdcf6aa4361fd954f0971d491cbc2 100644 GIT binary patch literal 101325 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