diff --git a/conformance/conformance.go b/conformance/conformance.go index 656af7c53..ba2b96270 100644 --- a/conformance/conformance.go +++ b/conformance/conformance.go @@ -62,6 +62,7 @@ import ( // _ "sigs.k8s.io/gateway-api-inference-extension/conformance/tests/model_routing" // Import the Inference Extension API types + inferencev1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" inferencev1alpha2 "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" inferenceconfig "sigs.k8s.io/gateway-api-inference-extension/conformance/utils/config" ) @@ -132,6 +133,8 @@ func DefaultOptions(t *testing.T) confsuite.ConformanceOptions { // Register Inference Extension API types t.Logf("Attempting to install inferencev1alpha2 types into scheme from package: %s", inferencev1alpha2.GroupName) require.NoError(t, inferencev1alpha2.Install(scheme), "failed to install inferencev1alpha2 types into scheme") + t.Logf("Attempting to install inferencev1 types into scheme from package: %s", inferencev1.GroupName) + require.NoError(t, inferencev1.Install(scheme), "failed to install inferencev1 types into scheme") clientOptions := client.Options{Scheme: scheme} c, err := client.New(cfg, clientOptions) diff --git a/conformance/resources/manifests/manifests.yaml b/conformance/resources/manifests/manifests.yaml index 7c7d466d5..697530743 100644 --- a/conformance/resources/manifests/manifests.yaml +++ b/conformance/resources/manifests/manifests.yaml @@ -146,7 +146,7 @@ spec: fieldPath: status.podIP --- # --- Primary InferencePool Definition --- -apiVersion: inference.networking.x-k8s.io/v1alpha2 +apiVersion: inference.networking.k8s.io/v1 kind: InferencePool metadata: name: primary-inference-pool @@ -239,7 +239,7 @@ spec: name: plugins-config --- # --- Secondary InferencePool Definition --- -apiVersion: inference.networking.x-k8s.io/v1alpha2 +apiVersion: inference.networking.k8s.io/v1 kind: InferencePool metadata: name: secondary-inference-pool @@ -363,6 +363,9 @@ rules: - apiGroups: ["inference.networking.x-k8s.io"] resources: ["inferencemodels", "inferencepools"] verbs: ["get", "list", "watch"] +- apiGroups: ["inference.networking.k8s.io"] + resources: ["inferencepools"] + verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] diff --git a/conformance/tests/basic/epp_unavailable_fail_open.yaml b/conformance/tests/basic/epp_unavailable_fail_open.yaml index cd681cb74..5884daef4 100644 --- a/conformance/tests/basic/epp_unavailable_fail_open.yaml +++ b/conformance/tests/basic/epp_unavailable_fail_open.yaml @@ -27,7 +27,7 @@ spec: - "secondary.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: secondary-inference-pool # Use secondary-inferencePool because it has failureMode set to failOpen matches: diff --git a/conformance/tests/basic/gateway_following_epp_routing.yaml b/conformance/tests/basic/gateway_following_epp_routing.yaml index d290b7541..64bc9e538 100644 --- a/conformance/tests/basic/gateway_following_epp_routing.yaml +++ b/conformance/tests/basic/gateway_following_epp_routing.yaml @@ -28,7 +28,7 @@ spec: - "primary.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: primary-inference-pool matches: diff --git a/conformance/tests/basic/httproute_invalid_inferencepool_ref.yaml b/conformance/tests/basic/httproute_invalid_inferencepool_ref.yaml index 227aeef1f..ebc76db03 100644 --- a/conformance/tests/basic/httproute_invalid_inferencepool_ref.yaml +++ b/conformance/tests/basic/httproute_invalid_inferencepool_ref.yaml @@ -21,7 +21,7 @@ spec: sectionName: http rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: non-existent-inference-pool # Intentionally Non-Existing matches: diff --git a/conformance/tests/basic/httproute_multiple_gateways_different_pools.yaml b/conformance/tests/basic/httproute_multiple_gateways_different_pools.yaml index b8ec2d114..a899a157f 100644 --- a/conformance/tests/basic/httproute_multiple_gateways_different_pools.yaml +++ b/conformance/tests/basic/httproute_multiple_gateways_different_pools.yaml @@ -13,7 +13,7 @@ spec: - "primary.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: primary-inference-pool matches: @@ -35,7 +35,7 @@ spec: - "secondary.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: secondary-inference-pool matches: diff --git a/conformance/tests/basic/inferencepool_accepted.yaml b/conformance/tests/basic/inferencepool_accepted.yaml index 838150013..de1584780 100644 --- a/conformance/tests/basic/inferencepool_accepted.yaml +++ b/conformance/tests/basic/inferencepool_accepted.yaml @@ -13,7 +13,7 @@ spec: sectionName: http rules: - backendRefs: - - group: inference.networking.x-k8s.io # InferencePool API group + - group: inference.networking.k8s.io # InferencePool API group kind: InferencePool name: primary-inference-pool # Name of the InferencePool this route points to # namespace: gateway-conformance-app-backend - is omitted since it is in the same namespace as HTTPRoute diff --git a/conformance/tests/basic/inferencepool_httproute_port_validation.yaml b/conformance/tests/basic/inferencepool_httproute_port_validation.yaml index 62e243a14..e71777226 100644 --- a/conformance/tests/basic/inferencepool_httproute_port_validation.yaml +++ b/conformance/tests/basic/inferencepool_httproute_port_validation.yaml @@ -16,7 +16,7 @@ spec: - "port-unspecified.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: primary-inference-pool # Port is intentionally unspecified here @@ -42,7 +42,7 @@ spec: - "port-matching.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: primary-inference-pool port: 3000 # Port matches InferencePool's targetPortNumber @@ -68,7 +68,7 @@ spec: - "port-non-matching.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: primary-inference-pool port: 8888 # Port does NOT match InferencePool's targetPortNumber diff --git a/conformance/tests/basic/inferencepool_invalid_epp_service.go b/conformance/tests/basic/inferencepool_invalid_epp_service.go index 602443f34..e2a52d559 100644 --- a/conformance/tests/basic/inferencepool_invalid_epp_service.go +++ b/conformance/tests/basic/inferencepool_invalid_epp_service.go @@ -21,7 +21,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - inferenceapi "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + inferenceapi "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" "sigs.k8s.io/gateway-api/conformance/utils/kubernetes" "sigs.k8s.io/gateway-api/conformance/utils/suite" diff --git a/conformance/tests/basic/inferencepool_invalid_epp_service.yaml b/conformance/tests/basic/inferencepool_invalid_epp_service.yaml index 7d9295fe2..20f325b3d 100644 --- a/conformance/tests/basic/inferencepool_invalid_epp_service.yaml +++ b/conformance/tests/basic/inferencepool_invalid_epp_service.yaml @@ -1,4 +1,4 @@ -apiVersion: inference.networking.x-k8s.io/v1alpha2 +apiVersion: inference.networking.k8s.io/v1 kind: InferencePool metadata: name: pool-with-invalid-epp @@ -23,7 +23,7 @@ spec: - backendRefs: - name: pool-with-invalid-epp kind: InferencePool - group: inference.networking.x-k8s.io + group: inference.networking.k8s.io matches: - path: type: PathPrefix diff --git a/conformance/tests/basic/inferencepool_multiple_rules_different_pools.yaml b/conformance/tests/basic/inferencepool_multiple_rules_different_pools.yaml index 7ef7ced0b..dff78c8c1 100644 --- a/conformance/tests/basic/inferencepool_multiple_rules_different_pools.yaml +++ b/conformance/tests/basic/inferencepool_multiple_rules_different_pools.yaml @@ -16,7 +16,7 @@ spec: backendRefs: - name: primary-inference-pool kind: InferencePool - group: inference.networking.x-k8s.io + group: inference.networking.k8s.io - matches: - path: type: PathPrefix @@ -24,4 +24,4 @@ spec: backendRefs: - name: secondary-inference-pool kind: InferencePool - group: inference.networking.x-k8s.io + group: inference.networking.k8s.io diff --git a/conformance/tests/basic/inferencepool_resolvedrefs_condition.yaml b/conformance/tests/basic/inferencepool_resolvedrefs_condition.yaml index 416352e30..3d6456107 100644 --- a/conformance/tests/basic/inferencepool_resolvedrefs_condition.yaml +++ b/conformance/tests/basic/inferencepool_resolvedrefs_condition.yaml @@ -20,7 +20,7 @@ spec: - "primary.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: primary-inference-pool matches: @@ -45,7 +45,7 @@ spec: - "secondary.example.com" rules: - backendRefs: - - group: inference.networking.x-k8s.io + - group: inference.networking.k8s.io kind: InferencePool name: primary-inference-pool matches: diff --git a/conformance/utils/kubernetes/helpers.go b/conformance/utils/kubernetes/helpers.go index 0c7d5ecc0..93866bfd5 100644 --- a/conformance/utils/kubernetes/helpers.go +++ b/conformance/utils/kubernetes/helpers.go @@ -34,7 +34,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "sigs.k8s.io/controller-runtime/pkg/client" - inferenceapi "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + inferenceapi "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/conformance/utils/config" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" gatewayapiconfig "sigs.k8s.io/gateway-api/conformance/utils/config" diff --git a/pkg/epp/backend/metrics/logger.go b/pkg/epp/backend/metrics/logger.go index d6e95059f..259d6f182 100644 --- a/pkg/epp/backend/metrics/logger.go +++ b/pkg/epp/backend/metrics/logger.go @@ -23,7 +23,7 @@ import ( "github.com/go-logr/logr" "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/metrics" logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging" ) @@ -36,7 +36,7 @@ const ( ) type Datastore interface { - PoolGet() (*v1alpha2.InferencePool, error) + PoolGet() (*v1.InferencePool, error) // PodMetrics operations // PodGetAll returns all pods and metrics, including fresh and stale. PodGetAll() []PodMetrics diff --git a/pkg/epp/backend/metrics/pod_metrics_test.go b/pkg/epp/backend/metrics/pod_metrics_test.go index 4a4bafc6c..74aa7ce0e 100644 --- a/pkg/epp/backend/metrics/pod_metrics_test.go +++ b/pkg/epp/backend/metrics/pod_metrics_test.go @@ -26,7 +26,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" ) var ( @@ -86,8 +86,8 @@ func TestMetricsRefresh(t *testing.T) { type fakeDataStore struct{} -func (f *fakeDataStore) PoolGet() (*v1alpha2.InferencePool, error) { - return &v1alpha2.InferencePool{Spec: v1alpha2.InferencePoolSpec{TargetPortNumber: 8000}}, nil +func (f *fakeDataStore) PoolGet() (*v1.InferencePool, error) { + return &v1.InferencePool{Spec: v1.InferencePoolSpec{TargetPortNumber: 8000}}, nil } func (f *fakeDataStore) PodGetAll() []PodMetrics { // Not implemented. diff --git a/pkg/epp/controller/inferencemodel_reconciler_test.go b/pkg/epp/controller/inferencemodel_reconciler_test.go index bbea0ef17..e826fa1f1 100644 --- a/pkg/epp/controller/inferencemodel_reconciler_test.go +++ b/pkg/epp/controller/inferencemodel_reconciler_test.go @@ -30,6 +30,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore" @@ -181,6 +182,7 @@ func TestInferenceModelReconciler(t *testing.T) { scheme := runtime.NewScheme() _ = clientgoscheme.AddToScheme(scheme) _ = v1alpha2.Install(scheme) + _ = v1.Install(scheme) initObjs := []client.Object{} if test.model != nil { initObjs = append(initObjs, test.model) diff --git a/pkg/epp/controller/inferencepool_reconciler.go b/pkg/epp/controller/inferencepool_reconciler.go index 9bf5d8aea..c983e5e03 100644 --- a/pkg/epp/controller/inferencepool_reconciler.go +++ b/pkg/epp/controller/inferencepool_reconciler.go @@ -24,7 +24,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore" logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging" ) @@ -44,7 +44,7 @@ func (c *InferencePoolReconciler) Reconcile(ctx context.Context, req ctrl.Reques logger.Info("Reconciling InferencePool") - infPool := &v1alpha2.InferencePool{} + infPool := &v1.InferencePool{} if err := c.Get(ctx, req.NamespacedName, infPool); err != nil { if errors.IsNotFound(err) { @@ -70,6 +70,6 @@ func (c *InferencePoolReconciler) Reconcile(ctx context.Context, req ctrl.Reques func (c *InferencePoolReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). - For(&v1alpha2.InferencePool{}). + For(&v1.InferencePool{}). Complete(c) } diff --git a/pkg/epp/controller/inferencepool_reconciler_test.go b/pkg/epp/controller/inferencepool_reconciler_test.go index 4e0c0f1bf..eb5fa785b 100644 --- a/pkg/epp/controller/inferencepool_reconciler_test.go +++ b/pkg/epp/controller/inferencepool_reconciler_test.go @@ -30,6 +30,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore" @@ -78,6 +79,7 @@ func TestInferencePoolReconciler(t *testing.T) { scheme := runtime.NewScheme() _ = clientgoscheme.AddToScheme(scheme) _ = v1alpha2.Install(scheme) + _ = v1.Install(scheme) // Create a fake client with the pool and the pods. initialObjects := []client.Object{pool1, pool2} @@ -106,11 +108,11 @@ func TestInferencePoolReconciler(t *testing.T) { t.Errorf("Unexpected diff (+got/-want): %s", diff) } - newPool1 := &v1alpha2.InferencePool{} + newPool1 := &v1.InferencePool{} if err := fakeClient.Get(ctx, req.NamespacedName, newPool1); err != nil { t.Errorf("Unexpected pool get error: %v", err) } - newPool1.Spec.Selector = map[v1alpha2.LabelKey]v1alpha2.LabelValue{"app": "vllm_v2"} + newPool1.Spec.Selector = map[v1.LabelKey]v1.LabelValue{"app": "vllm_v2"} if err := fakeClient.Update(ctx, newPool1, &client.UpdateOptions{}); err != nil { t.Errorf("Unexpected pool update error: %v", err) } @@ -153,7 +155,7 @@ func TestInferencePoolReconciler(t *testing.T) { } type diffStoreParams struct { - wantPool *v1alpha2.InferencePool + wantPool *v1.InferencePool wantPods []string wantModels []*v1alpha2.InferenceModel } diff --git a/pkg/epp/controller/pod_reconciler_test.go b/pkg/epp/controller/pod_reconciler_test.go index 898731a8d..f078675c1 100644 --- a/pkg/epp/controller/pod_reconciler_test.go +++ b/pkg/epp/controller/pod_reconciler_test.go @@ -31,7 +31,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" - "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore" utiltest "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/testing" @@ -49,7 +49,7 @@ var ( func TestPodReconciler(t *testing.T) { tests := []struct { name string - pool *v1alpha2.InferencePool + pool *v1.InferencePool existingPods []*corev1.Pod incomingPod *corev1.Pod wantPods []*corev1.Pod @@ -58,10 +58,10 @@ func TestPodReconciler(t *testing.T) { { name: "Add new pod", existingPods: []*corev1.Pod{basePod1, basePod2}, - pool: &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + pool: &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "some-key": "some-val", }, }, @@ -74,10 +74,10 @@ func TestPodReconciler(t *testing.T) { { name: "Update pod1 address", existingPods: []*corev1.Pod{basePod1, basePod2}, - pool: &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + pool: &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "some-key": "some-val", }, }, @@ -90,10 +90,10 @@ func TestPodReconciler(t *testing.T) { { name: "Delete pod with DeletionTimestamp", existingPods: []*corev1.Pod{basePod1, basePod2}, - pool: &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + pool: &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "some-key": "some-val", }, }, @@ -107,10 +107,10 @@ func TestPodReconciler(t *testing.T) { { name: "Delete notfound pod", existingPods: []*corev1.Pod{basePod1, basePod2}, - pool: &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + pool: &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "some-key": "some-val", }, }, @@ -121,10 +121,10 @@ func TestPodReconciler(t *testing.T) { { name: "New pod, not ready, valid selector", existingPods: []*corev1.Pod{basePod1, basePod2}, - pool: &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + pool: &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "some-key": "some-val", }, }, @@ -136,10 +136,10 @@ func TestPodReconciler(t *testing.T) { { name: "Remove pod that does not match selector", existingPods: []*corev1.Pod{basePod1, basePod2}, - pool: &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + pool: &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "some-key": "some-val", }, }, @@ -152,10 +152,10 @@ func TestPodReconciler(t *testing.T) { { name: "Remove pod that is not ready", existingPods: []*corev1.Pod{basePod1, basePod2}, - pool: &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + pool: &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "some-key": "some-val", }, }, diff --git a/pkg/epp/datastore/datastore.go b/pkg/epp/datastore/datastore.go index f19f26ca6..c67647587 100644 --- a/pkg/epp/datastore/datastore.go +++ b/pkg/epp/datastore/datastore.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging" @@ -48,8 +49,8 @@ type Datastore interface { // PoolSet sets the given pool in datastore. If the given pool has different label selector than the previous pool // that was stored, the function triggers a resync of the pods to keep the datastore updated. If the given pool // is nil, this call triggers the datastore.Clear() function. - PoolSet(ctx context.Context, reader client.Reader, pool *v1alpha2.InferencePool) error - PoolGet() (*v1alpha2.InferencePool, error) + PoolSet(ctx context.Context, reader client.Reader, pool *v1.InferencePool) error + PoolGet() (*v1.InferencePool, error) PoolHasSynced() bool PoolLabelsMatch(podLabels map[string]string) bool @@ -88,7 +89,7 @@ type datastore struct { parentCtx context.Context // poolAndModelsMu is used to synchronize access to pool and the models map. poolAndModelsMu sync.RWMutex - pool *v1alpha2.InferencePool + pool *v1.InferencePool // key: InferenceModel.Spec.ModelName, value: *InferenceModel models map[string]*v1alpha2.InferenceModel // key: types.NamespacedName, value: backendmetrics.PodMetrics @@ -110,7 +111,7 @@ func (ds *datastore) Clear() { } // /// InferencePool APIs /// -func (ds *datastore) PoolSet(ctx context.Context, reader client.Reader, pool *v1alpha2.InferencePool) error { +func (ds *datastore) PoolSet(ctx context.Context, reader client.Reader, pool *v1.InferencePool) error { if pool == nil { ds.Clear() return nil @@ -137,7 +138,7 @@ func (ds *datastore) PoolSet(ctx context.Context, reader client.Reader, pool *v1 return nil } -func (ds *datastore) PoolGet() (*v1alpha2.InferencePool, error) { +func (ds *datastore) PoolGet() (*v1.InferencePool, error) { ds.poolAndModelsMu.RLock() defer ds.poolAndModelsMu.RUnlock() if !ds.PoolHasSynced() { @@ -325,11 +326,11 @@ func (ds *datastore) podResyncAll(ctx context.Context, reader client.Reader) err return nil } -func selectorFromInferencePoolSelector(selector map[v1alpha2.LabelKey]v1alpha2.LabelValue) labels.Selector { +func selectorFromInferencePoolSelector(selector map[v1.LabelKey]v1.LabelValue) labels.Selector { return labels.SelectorFromSet(stripLabelKeyAliasFromLabelMap(selector)) } -func stripLabelKeyAliasFromLabelMap(labels map[v1alpha2.LabelKey]v1alpha2.LabelValue) map[string]string { +func stripLabelKeyAliasFromLabelMap(labels map[v1.LabelKey]v1.LabelValue) map[string]string { outMap := make(map[string]string) for k, v := range labels { outMap[string(k)] = string(v) diff --git a/pkg/epp/datastore/datastore_test.go b/pkg/epp/datastore/datastore_test.go index 1780ff2c9..fdb1a5afc 100644 --- a/pkg/epp/datastore/datastore_test.go +++ b/pkg/epp/datastore/datastore_test.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/types" clientgoscheme "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" testutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/testing" @@ -43,10 +44,10 @@ func TestPool(t *testing.T) { Selector(pool1Selector).ObjRef() tests := []struct { name string - inferencePool *v1alpha2.InferencePool + inferencePool *v1.InferencePool labels map[string]string wantSynced bool - wantPool *v1alpha2.InferencePool + wantPool *v1.InferencePool wantErr error wantLabelsMatch bool }{ @@ -264,8 +265,8 @@ var ( } pod1NamespacedName = types.NamespacedName{Name: pod1.Name, Namespace: pod1.Namespace} pod2NamespacedName = types.NamespacedName{Name: pod2.Name, Namespace: pod2.Namespace} - inferencePool = &v1alpha2.InferencePool{ - Spec: v1alpha2.InferencePoolSpec{ + inferencePool = &v1.InferencePool{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: 8000, }, } diff --git a/pkg/epp/handlers/server.go b/pkg/epp/handlers/server.go index 077dd55df..d4a5ade0a 100644 --- a/pkg/epp/handlers/server.go +++ b/pkg/epp/handlers/server.go @@ -29,7 +29,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/metrics" schedulingtypes "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/types" @@ -59,7 +59,7 @@ type Director interface { } type Datastore interface { - PoolGet() (*v1alpha2.InferencePool, error) + PoolGet() (*v1.InferencePool, error) } // Server implements the Envoy external processing server. diff --git a/pkg/epp/metrics/collectors/inference_pool_test.go b/pkg/epp/metrics/collectors/inference_pool_test.go index 9b584a883..e5befd0f4 100644 --- a/pkg/epp/metrics/collectors/inference_pool_test.go +++ b/pkg/epp/metrics/collectors/inference_pool_test.go @@ -28,7 +28,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/component-base/metrics/testutil" "sigs.k8s.io/controller-runtime/pkg/client/fake" - "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore" ) @@ -74,11 +74,11 @@ func TestMetricsCollected(t *testing.T) { WithScheme(scheme). Build() - inferencePool := &v1alpha2.InferencePool{ + inferencePool := &v1.InferencePool{ ObjectMeta: metav1.ObjectMeta{ Name: "test-pool", }, - Spec: v1alpha2.InferencePoolSpec{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: 8000, }, } diff --git a/pkg/epp/requestcontrol/director_test.go b/pkg/epp/requestcontrol/director_test.go index b384069e9..205049112 100644 --- a/pkg/epp/requestcontrol/director_test.go +++ b/pkg/epp/requestcontrol/director_test.go @@ -32,6 +32,7 @@ import ( k8stypes "k8s.io/apimachinery/pkg/types" clientgoscheme "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" @@ -97,11 +98,11 @@ func TestDirector_HandleRequest(t *testing.T) { ds.ModelSetIfOlder(imFoodReviewResolve) ds.ModelSetIfOlder(imFoodReviewSheddable) - pool := &v1alpha2.InferencePool{ + pool := &v1.InferencePool{ ObjectMeta: metav1.ObjectMeta{Name: "test-pool", Namespace: "default"}, - Spec: v1alpha2.InferencePoolSpec{ + Spec: v1.InferencePoolSpec{ TargetPortNumber: int32(8000), - Selector: map[v1alpha2.LabelKey]v1alpha2.LabelValue{ + Selector: map[v1.LabelKey]v1.LabelValue{ "app": "inference", }, }, diff --git a/pkg/epp/server/controller_manager.go b/pkg/epp/server/controller_manager.go index 4a56adccc..969c09839 100644 --- a/pkg/epp/server/controller_manager.go +++ b/pkg/epp/server/controller_manager.go @@ -31,6 +31,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/manager" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" ) @@ -39,6 +40,7 @@ var scheme = runtime.NewScheme() func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(v1alpha2.Install(scheme)) + utilruntime.Must(v1.Install(scheme)) } // defaultManagerOptions returns the default options used to create the manager. @@ -52,7 +54,7 @@ func defaultManagerOptions(namespacedName types.NamespacedName, metricsServerOpt namespacedName.Namespace: {}, }, }, - &v1alpha2.InferencePool{}: { + &v1.InferencePool{}: { Namespaces: map[string]cache.Config{ namespacedName.Namespace: { FieldSelector: fields.SelectorFromSet(fields.Set{ diff --git a/pkg/epp/util/testing/wrappers.go b/pkg/epp/util/testing/wrappers.go index 4dfe36a55..3992916a9 100644 --- a/pkg/epp/util/testing/wrappers.go +++ b/pkg/epp/util/testing/wrappers.go @@ -19,6 +19,7 @@ package testing import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" ) @@ -169,17 +170,17 @@ func (m *InferenceModelWrapper) CreationTimestamp(t metav1.Time) *InferenceModel // InferencePoolWrapper wraps an InferencePool. type InferencePoolWrapper struct { - v1alpha2.InferencePool + v1.InferencePool } // MakeInferencePool creates a wrapper for a InferencePool. func MakeInferencePool(name string) *InferencePoolWrapper { return &InferencePoolWrapper{ - v1alpha2.InferencePool{ + v1.InferencePool{ ObjectMeta: metav1.ObjectMeta{ Name: name, }, - Spec: v1alpha2.InferencePoolSpec{}, + Spec: v1.InferencePoolSpec{}, }, } } @@ -190,9 +191,9 @@ func (m *InferencePoolWrapper) Namespace(ns string) *InferencePoolWrapper { } func (m *InferencePoolWrapper) Selector(selector map[string]string) *InferencePoolWrapper { - s := make(map[v1alpha2.LabelKey]v1alpha2.LabelValue) + s := make(map[v1.LabelKey]v1.LabelValue) for k, v := range selector { - s[v1alpha2.LabelKey(k)] = v1alpha2.LabelValue(v) + s[v1.LabelKey(k)] = v1.LabelValue(v) } m.Spec.Selector = s return m @@ -204,11 +205,11 @@ func (m *InferencePoolWrapper) TargetPortNumber(p int32) *InferencePoolWrapper { } func (m *InferencePoolWrapper) ExtensionRef(name string) *InferencePoolWrapper { - m.Spec.ExtensionRef = &v1alpha2.Extension{ExtensionReference: v1alpha2.ExtensionReference{Name: v1alpha2.ObjectName(name)}} + m.Spec.ExtensionRef = &v1.Extension{ExtensionReference: v1.ExtensionReference{Name: v1.ObjectName(name)}} return m } // Obj returns the wrapped InferencePool. -func (m *InferencePoolWrapper) ObjRef() *v1alpha2.InferencePool { +func (m *InferencePoolWrapper) ObjRef() *v1.InferencePool { return &m.InferencePool } diff --git a/test/e2e/epp/e2e_suite_test.go b/test/e2e/epp/e2e_suite_test.go index 4cac4f4dc..d0da4ac34 100644 --- a/test/e2e/epp/e2e_suite_test.go +++ b/test/e2e/epp/e2e_suite_test.go @@ -40,6 +40,7 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" + infextv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" infextv1a2 "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" testutils "sigs.k8s.io/gateway-api-inference-extension/test/utils" ) @@ -77,10 +78,12 @@ const ( clientManifest = "../../testdata/client.yaml" // modelServerSecretManifest is the manifest for the model server secret resource. modelServerSecretManifest = "../../testdata/model-secret.yaml" - // inferPoolManifest is the manifest for the inference pool CRD. - inferPoolManifest = "../../../config/crd/bases/inference.networking.x-k8s.io_inferencepools.yaml" - // inferModelManifest is the manifest for the inference model CRD. - inferModelManifest = "../../../config/crd/bases/inference.networking.x-k8s.io_inferencemodels.yaml" + // xInferPoolManifest is the manifest for the inference pool CRD with 'inference.networking.x-k8s.io' group. + xInferPoolManifest = "../../../config/crd/bases/inference.networking.x-k8s.io_inferencepools.yaml" + // xInferModelManifest is the manifest for the inference model CRD with 'inference.networking.x-k8s.io' group. + xInferModelManifest = "../../../config/crd/bases/inference.networking.x-k8s.io_inferencemodels.yaml" + // inferPoolManifest is the manifest for the inference pool CRD with 'inference.networking.k8s.io' group. + inferPoolManifest = "../../../config/crd/bases/inference.networking.k8s.io_inferencepools.yaml" // inferExtManifest is the manifest for the inference extension test resources. inferExtManifest = "../../testdata/inferencepool-e2e.yaml" // envoyManifest is the manifest for the envoy proxy test resources. @@ -136,8 +139,9 @@ func setupInfra() { createHfSecret(cli, modelServerSecretManifest) } crds := map[string]string{ - "inferencepools.inference.networking.x-k8s.io": inferPoolManifest, - "inferencemodels.inference.networking.x-k8s.io": inferModelManifest, + "inferencepools.inference.networking.x-k8s.io": xInferPoolManifest, + "inferencemodels.inference.networking.x-k8s.io": xInferModelManifest, + "inferencepools.inference.networking.k8s.io": inferPoolManifest, } createCRDs(cli, crds) @@ -169,6 +173,9 @@ func setupSuite() { err = infextv1a2.Install(scheme) gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred()) + err = infextv1.Install(scheme) + gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred()) + cli, err = client.New(cfg, client.Options{Scheme: scheme}) gomega.Expect(err).NotTo(gomega.HaveOccurred()) gomega.Expect(cli).NotTo(gomega.BeNil()) diff --git a/test/e2e/epp/e2e_test.go b/test/e2e/epp/e2e_test.go index f3d7a3254..91aa74ecf 100644 --- a/test/e2e/epp/e2e_test.go +++ b/test/e2e/epp/e2e_test.go @@ -32,8 +32,8 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" - client "sigs.k8s.io/controller-runtime/pkg/client" - v1alpha2 "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" testutils "sigs.k8s.io/gateway-api-inference-extension/test/utils" ) diff --git a/test/integration/epp/hermetic_test.go b/test/integration/epp/hermetic_test.go index 7cffab35e..cfbc7343c 100644 --- a/test/integration/epp/hermetic_test.go +++ b/test/integration/epp/hermetic_test.go @@ -57,6 +57,7 @@ import ( metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" "sigs.k8s.io/yaml" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend" backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" @@ -992,6 +993,7 @@ func BeforeSuite() func() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(v1alpha2.Install(scheme)) + utilruntime.Must(v1.Install(scheme)) k8sClient, err = k8sclient.New(cfg, k8sclient.Options{Scheme: scheme}) if err != nil { @@ -1109,7 +1111,7 @@ func BeforeSuite() func() { return func() { _ = testEnv.Stop() - _ = k8sClient.DeleteAllOf(context.Background(), &v1alpha2.InferencePool{}) + _ = k8sClient.DeleteAllOf(context.Background(), &v1.InferencePool{}) _ = k8sClient.DeleteAllOf(context.Background(), &v1alpha2.InferenceModel{}) } } @@ -1149,7 +1151,7 @@ func managerTestOptions(namespace, name string, metricsServerOptions metricsserv namespace: {}, }, }, - &v1alpha2.InferencePool{}: { + &v1.InferencePool{}: { Namespaces: map[string]cache.Config{ namespace: { FieldSelector: fields.SelectorFromSet(fields.Set{ diff --git a/test/testdata/inferencepool-e2e.yaml b/test/testdata/inferencepool-e2e.yaml index 9e7fd6a0f..ac0bb00dc 100644 --- a/test/testdata/inferencepool-e2e.yaml +++ b/test/testdata/inferencepool-e2e.yaml @@ -1,4 +1,4 @@ -apiVersion: inference.networking.x-k8s.io/v1alpha2 +apiVersion: inference.networking.k8s.io/v1 kind: InferencePool metadata: labels: @@ -182,6 +182,9 @@ rules: - apiGroups: ["inference.networking.x-k8s.io"] resources: ["inferencemodels"] verbs: ["get", "watch", "list"] +- apiGroups: ["inference.networking.k8s.io"] + resources: ["inferencepools"] + verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] diff --git a/test/testdata/inferencepool-with-model-hermetic.yaml b/test/testdata/inferencepool-with-model-hermetic.yaml index 0c1e518ff..037393158 100644 --- a/test/testdata/inferencepool-with-model-hermetic.yaml +++ b/test/testdata/inferencepool-with-model-hermetic.yaml @@ -1,4 +1,4 @@ -apiVersion: inference.networking.x-k8s.io/v1alpha2 +apiVersion: inference.networking.k8s.io/v1 kind: InferencePool metadata: name: vllm-llama3-8b-instruct-pool diff --git a/test/utils/server.go b/test/utils/server.go index 22b28f831..090d2bc5a 100644 --- a/test/utils/server.go +++ b/test/utils/server.go @@ -27,11 +27,12 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics" "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore" @@ -42,7 +43,7 @@ const bufSize = 1024 * 1024 var testListener *bufconn.Listener -func PrepareForTestStreamingServer(models []*v1alpha2.InferenceModel, pods []*v1.Pod, poolName string, namespace string, +func PrepareForTestStreamingServer(models []*v1alpha2.InferenceModel, pods []*corev1.Pod, poolName string, namespace string, poolPort int32) (context.Context, context.CancelFunc, datastore.Datastore, *metrics.FakePodMetricsClient) { ctx, cancel := context.WithCancel(context.Background()) @@ -63,6 +64,7 @@ func PrepareForTestStreamingServer(models []*v1alpha2.InferenceModel, pods []*v1 scheme := runtime.NewScheme() _ = clientgoscheme.AddToScheme(scheme) _ = v1alpha2.Install(scheme) + _ = v1.Install(scheme) fakeClient := fake.NewClientBuilder(). WithScheme(scheme). WithObjects(initObjs...). diff --git a/test/utils/utils.go b/test/utils/utils.go index a3d12e198..e814a31ed 100644 --- a/test/utils/utils.go +++ b/test/utils/utils.go @@ -36,6 +36,7 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/tools/remotecommand" "sigs.k8s.io/controller-runtime/pkg/client" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" ) @@ -128,7 +129,7 @@ func DeleteNamespacedResources(ctx context.Context, cli client.Client, ns string if err != nil && !apierrors.IsNotFound(err) { return err } - err = cli.DeleteAllOf(ctx, &v1alpha2.InferencePool{}, client.InNamespace(ns), client.PropagationPolicy(metav1.DeletePropagationForeground)) + err = cli.DeleteAllOf(ctx, &v1.InferencePool{}, client.InNamespace(ns), client.PropagationPolicy(metav1.DeletePropagationForeground)) if err != nil && !apierrors.IsNotFound(err) { return err } diff --git a/test/utils/wrappers.go b/test/utils/wrappers.go index 0039e0a6c..0ad385d93 100644 --- a/test/utils/wrappers.go +++ b/test/utils/wrappers.go @@ -19,6 +19,7 @@ package utils import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2" ) @@ -59,7 +60,7 @@ func (m *InferenceModelWrapper) SetCriticality(level v1alpha2.Criticality) *Infe // for group/kind and name as the PoolObjectReference name. func (m *InferenceModelWrapper) SetPoolRef(name string) *InferenceModelWrapper { ref := v1alpha2.PoolObjectReference{ - Group: v1alpha2.Group(v1alpha2.GroupVersion.Group), + Group: v1alpha2.Group(v1.GroupVersion.Group), Kind: "inferencepools", Name: v1alpha2.ObjectName(name), }