Repository: kubernetes-sigs/kueue

Issue:
Expose contextualized FairSharing Weights for ClusterQueues as metrics
<!-- Please only use this template for submitting enhancement requests -->

**What would you like to be added**:

Expose "precise" fair sharing weights for ClusterQueus and Cohorts as metrics.

**Why is this needed**:

To improve observability as discussed in https://github.com/kubernetes-sigs/kueue/issues/6938



Discussion:
@mimowo: cc @amy @gabesaba @tenzen-y @mwysokin @amy: Adding some notes. The specific context that matters here is which CQ + DRS values are grouped in the same tournament / decision. @mimowo: cc @PBundyra who is also looking into debuggability of fair sharing@j-skiba: /assign

Solution patch:
diff --git a/.golangci.yaml b/.golangci.yaml
index e43fff907..16c9f0296 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -90,6 +90,12 @@ linters:
       - linters:
           - staticcheck
         text: 'SA1019: j.Status.RayClusterStatus.State is deprecated: the State field is replaced by the Conditions field.'
+      - linters:
+          - staticcheck
+        text: 'SA1019: kueue.LocalQueueFlavorStatus is deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.'
+      - linters:
+        - staticcheck
+        text: 'SA1019: stats.Flavors is deprecated: Flavors is deprecated and marked for removal in v1beta2.'
       - linters:
           - fatcontext
         path: ^test/*
diff --git a/Makefile-test.mk b/Makefile-test.mk
index b058cba23..d2ec63586 100644
--- a/Makefile-test.mk
+++ b/Makefile-test.mk
@@ -170,6 +170,7 @@ run-test-tas-e2e-%:
 		APPWRAPPER_VERSION=$(APPWRAPPER_VERSION) \
 		LEADERWORKERSET_VERSION=$(LEADERWORKERSET_VERSION) \
 		KUBERAY_VERSION=$(KUBERAY_VERSION) RAY_VERSION=$(RAY_VERSION) RAYMINI_VERSION=$(RAYMINI_VERSION) USE_RAY_FOR_TESTS=$(USE_RAY_FOR_TESTS) \
+		KUBEFLOW_TRAINER_VERSION=$(KUBEFLOW_TRAINER_VERSION) \
 		KIND_CLUSTER_FILE="tas-kind-cluster.yaml" E2E_TARGET_FOLDER="tas" \
 		TEST_LOG_LEVEL=$(TEST_LOG_LEVEL) \
 		E2E_RUN_ONLY_ENV=$(E2E_RUN_ONLY_ENV) \
diff --git a/apis/config/v1beta1/doc.go b/apis/config/v1beta1/doc.go
new file mode 100644
index 000000000..c419411d8
--- /dev/null
+++ b/apis/config/v1beta1/doc.go
@@ -0,0 +1,21 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// +kubebuilder:object:generate=true
+// +groupName=config.kueue.x-k8s.io
+// +k8s:conversion-gen=sigs.k8s.io/kueue/apis/config/v1beta2
+
+package v1beta1
diff --git a/apis/config/v1beta1/zz_generated.conversion.go b/apis/config/v1beta1/zz_generated.conversion.go
new file mode 100644
index 000000000..3e4c8f2e6
--- /dev/null
+++ b/apis/config/v1beta1/zz_generated.conversion.go
@@ -0,0 +1,855 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	time "time"
+	unsafe "unsafe"
+
+	v1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	v1alpha1 "k8s.io/component-base/config/v1alpha1"
+	v1beta2 "sigs.k8s.io/kueue/apis/config/v1beta2"
+)
+
+func init() {
+	localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(s *runtime.Scheme) error {
+	if err := s.AddGeneratedConversionFunc((*AdmissionFairSharing)(nil), (*v1beta2.AdmissionFairSharing)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_AdmissionFairSharing_To_v1beta2_AdmissionFairSharing(a.(*AdmissionFairSharing), b.(*v1beta2.AdmissionFairSharing), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.AdmissionFairSharing)(nil), (*AdmissionFairSharing)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_AdmissionFairSharing_To_v1beta1_AdmissionFairSharing(a.(*v1beta2.AdmissionFairSharing), b.(*AdmissionFairSharing), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ClientConnection)(nil), (*v1beta2.ClientConnection)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ClientConnection_To_v1beta2_ClientConnection(a.(*ClientConnection), b.(*v1beta2.ClientConnection), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ClientConnection)(nil), (*ClientConnection)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ClientConnection_To_v1beta1_ClientConnection(a.(*v1beta2.ClientConnection), b.(*ClientConnection), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ClusterQueueVisibility)(nil), (*v1beta2.ClusterQueueVisibility)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ClusterQueueVisibility_To_v1beta2_ClusterQueueVisibility(a.(*ClusterQueueVisibility), b.(*v1beta2.ClusterQueueVisibility), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterQueueVisibility)(nil), (*ClusterQueueVisibility)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ClusterQueueVisibility_To_v1beta1_ClusterQueueVisibility(a.(*v1beta2.ClusterQueueVisibility), b.(*ClusterQueueVisibility), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*Configuration)(nil), (*v1beta2.Configuration)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Configuration_To_v1beta2_Configuration(a.(*Configuration), b.(*v1beta2.Configuration), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.Configuration)(nil), (*Configuration)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_Configuration_To_v1beta1_Configuration(a.(*v1beta2.Configuration), b.(*Configuration), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ControllerConfigurationSpec)(nil), (*v1beta2.ControllerConfigurationSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ControllerConfigurationSpec_To_v1beta2_ControllerConfigurationSpec(a.(*ControllerConfigurationSpec), b.(*v1beta2.ControllerConfigurationSpec), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ControllerConfigurationSpec)(nil), (*ControllerConfigurationSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ControllerConfigurationSpec_To_v1beta1_ControllerConfigurationSpec(a.(*v1beta2.ControllerConfigurationSpec), b.(*ControllerConfigurationSpec), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ControllerHealth)(nil), (*v1beta2.ControllerHealth)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ControllerHealth_To_v1beta2_ControllerHealth(a.(*ControllerHealth), b.(*v1beta2.ControllerHealth), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ControllerHealth)(nil), (*ControllerHealth)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ControllerHealth_To_v1beta1_ControllerHealth(a.(*v1beta2.ControllerHealth), b.(*ControllerHealth), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ControllerManager)(nil), (*v1beta2.ControllerManager)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ControllerManager_To_v1beta2_ControllerManager(a.(*ControllerManager), b.(*v1beta2.ControllerManager), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ControllerManager)(nil), (*ControllerManager)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ControllerManager_To_v1beta1_ControllerManager(a.(*v1beta2.ControllerManager), b.(*ControllerManager), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ControllerMetrics)(nil), (*v1beta2.ControllerMetrics)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ControllerMetrics_To_v1beta2_ControllerMetrics(a.(*ControllerMetrics), b.(*v1beta2.ControllerMetrics), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ControllerMetrics)(nil), (*ControllerMetrics)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ControllerMetrics_To_v1beta1_ControllerMetrics(a.(*v1beta2.ControllerMetrics), b.(*ControllerMetrics), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ControllerWebhook)(nil), (*v1beta2.ControllerWebhook)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ControllerWebhook_To_v1beta2_ControllerWebhook(a.(*ControllerWebhook), b.(*v1beta2.ControllerWebhook), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ControllerWebhook)(nil), (*ControllerWebhook)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ControllerWebhook_To_v1beta1_ControllerWebhook(a.(*v1beta2.ControllerWebhook), b.(*ControllerWebhook), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*DeviceClassMapping)(nil), (*v1beta2.DeviceClassMapping)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_DeviceClassMapping_To_v1beta2_DeviceClassMapping(a.(*DeviceClassMapping), b.(*v1beta2.DeviceClassMapping), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.DeviceClassMapping)(nil), (*DeviceClassMapping)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_DeviceClassMapping_To_v1beta1_DeviceClassMapping(a.(*v1beta2.DeviceClassMapping), b.(*DeviceClassMapping), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*FairSharing)(nil), (*v1beta2.FairSharing)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_FairSharing_To_v1beta2_FairSharing(a.(*FairSharing), b.(*v1beta2.FairSharing), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.FairSharing)(nil), (*FairSharing)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_FairSharing_To_v1beta1_FairSharing(a.(*v1beta2.FairSharing), b.(*FairSharing), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*Integrations)(nil), (*v1beta2.Integrations)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Integrations_To_v1beta2_Integrations(a.(*Integrations), b.(*v1beta2.Integrations), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.Integrations)(nil), (*Integrations)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_Integrations_To_v1beta1_Integrations(a.(*v1beta2.Integrations), b.(*Integrations), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*InternalCertManagement)(nil), (*v1beta2.InternalCertManagement)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_InternalCertManagement_To_v1beta2_InternalCertManagement(a.(*InternalCertManagement), b.(*v1beta2.InternalCertManagement), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.InternalCertManagement)(nil), (*InternalCertManagement)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_InternalCertManagement_To_v1beta1_InternalCertManagement(a.(*v1beta2.InternalCertManagement), b.(*InternalCertManagement), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*MultiKueue)(nil), (*v1beta2.MultiKueue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_MultiKueue_To_v1beta2_MultiKueue(a.(*MultiKueue), b.(*v1beta2.MultiKueue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.MultiKueue)(nil), (*MultiKueue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_MultiKueue_To_v1beta1_MultiKueue(a.(*v1beta2.MultiKueue), b.(*MultiKueue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*MultiKueueExternalFramework)(nil), (*v1beta2.MultiKueueExternalFramework)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_MultiKueueExternalFramework_To_v1beta2_MultiKueueExternalFramework(a.(*MultiKueueExternalFramework), b.(*v1beta2.MultiKueueExternalFramework), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.MultiKueueExternalFramework)(nil), (*MultiKueueExternalFramework)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_MultiKueueExternalFramework_To_v1beta1_MultiKueueExternalFramework(a.(*v1beta2.MultiKueueExternalFramework), b.(*MultiKueueExternalFramework), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ObjectRetentionPolicies)(nil), (*v1beta2.ObjectRetentionPolicies)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ObjectRetentionPolicies_To_v1beta2_ObjectRetentionPolicies(a.(*ObjectRetentionPolicies), b.(*v1beta2.ObjectRetentionPolicies), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ObjectRetentionPolicies)(nil), (*ObjectRetentionPolicies)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ObjectRetentionPolicies_To_v1beta1_ObjectRetentionPolicies(a.(*v1beta2.ObjectRetentionPolicies), b.(*ObjectRetentionPolicies), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PodIntegrationOptions)(nil), (*v1beta2.PodIntegrationOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PodIntegrationOptions_To_v1beta2_PodIntegrationOptions(a.(*PodIntegrationOptions), b.(*v1beta2.PodIntegrationOptions), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.PodIntegrationOptions)(nil), (*PodIntegrationOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_PodIntegrationOptions_To_v1beta1_PodIntegrationOptions(a.(*v1beta2.PodIntegrationOptions), b.(*PodIntegrationOptions), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*QueueVisibility)(nil), (*v1beta2.QueueVisibility)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_QueueVisibility_To_v1beta2_QueueVisibility(a.(*QueueVisibility), b.(*v1beta2.QueueVisibility), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.QueueVisibility)(nil), (*QueueVisibility)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_QueueVisibility_To_v1beta1_QueueVisibility(a.(*v1beta2.QueueVisibility), b.(*QueueVisibility), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*RequeuingStrategy)(nil), (*v1beta2.RequeuingStrategy)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_RequeuingStrategy_To_v1beta2_RequeuingStrategy(a.(*RequeuingStrategy), b.(*v1beta2.RequeuingStrategy), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.RequeuingStrategy)(nil), (*RequeuingStrategy)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_RequeuingStrategy_To_v1beta1_RequeuingStrategy(a.(*v1beta2.RequeuingStrategy), b.(*RequeuingStrategy), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ResourceTransformation)(nil), (*v1beta2.ResourceTransformation)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ResourceTransformation_To_v1beta2_ResourceTransformation(a.(*ResourceTransformation), b.(*v1beta2.ResourceTransformation), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ResourceTransformation)(nil), (*ResourceTransformation)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ResourceTransformation_To_v1beta1_ResourceTransformation(a.(*v1beta2.ResourceTransformation), b.(*ResourceTransformation), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*Resources)(nil), (*v1beta2.Resources)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Resources_To_v1beta2_Resources(a.(*Resources), b.(*v1beta2.Resources), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.Resources)(nil), (*Resources)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_Resources_To_v1beta1_Resources(a.(*v1beta2.Resources), b.(*Resources), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*WaitForPodsReady)(nil), (*v1beta2.WaitForPodsReady)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_WaitForPodsReady_To_v1beta2_WaitForPodsReady(a.(*WaitForPodsReady), b.(*v1beta2.WaitForPodsReady), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.WaitForPodsReady)(nil), (*WaitForPodsReady)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_WaitForPodsReady_To_v1beta1_WaitForPodsReady(a.(*v1beta2.WaitForPodsReady), b.(*WaitForPodsReady), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*WorkloadRetentionPolicy)(nil), (*v1beta2.WorkloadRetentionPolicy)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_WorkloadRetentionPolicy_To_v1beta2_WorkloadRetentionPolicy(a.(*WorkloadRetentionPolicy), b.(*v1beta2.WorkloadRetentionPolicy), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.WorkloadRetentionPolicy)(nil), (*WorkloadRetentionPolicy)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_WorkloadRetentionPolicy_To_v1beta1_WorkloadRetentionPolicy(a.(*v1beta2.WorkloadRetentionPolicy), b.(*WorkloadRetentionPolicy), scope)
+	}); err != nil {
+		return err
+	}
+	return nil
+}
+
+func autoConvert_v1beta1_AdmissionFairSharing_To_v1beta2_AdmissionFairSharing(in *AdmissionFairSharing, out *v1beta2.AdmissionFairSharing, s conversion.Scope) error {
+	out.UsageHalfLifeTime = in.UsageHalfLifeTime
+	out.UsageSamplingInterval = in.UsageSamplingInterval
+	out.ResourceWeights = *(*map[v1.ResourceName]float64)(unsafe.Pointer(&in.ResourceWeights))
+	return nil
+}
+
+// Convert_v1beta1_AdmissionFairSharing_To_v1beta2_AdmissionFairSharing is an autogenerated conversion function.
+func Convert_v1beta1_AdmissionFairSharing_To_v1beta2_AdmissionFairSharing(in *AdmissionFairSharing, out *v1beta2.AdmissionFairSharing, s conversion.Scope) error {
+	return autoConvert_v1beta1_AdmissionFairSharing_To_v1beta2_AdmissionFairSharing(in, out, s)
+}
+
+func autoConvert_v1beta2_AdmissionFairSharing_To_v1beta1_AdmissionFairSharing(in *v1beta2.AdmissionFairSharing, out *AdmissionFairSharing, s conversion.Scope) error {
+	out.UsageHalfLifeTime = in.UsageHalfLifeTime
+	out.UsageSamplingInterval = in.UsageSamplingInterval
+	out.ResourceWeights = *(*map[v1.ResourceName]float64)(unsafe.Pointer(&in.ResourceWeights))
+	return nil
+}
+
+// Convert_v1beta2_AdmissionFairSharing_To_v1beta1_AdmissionFairSharing is an autogenerated conversion function.
+func Convert_v1beta2_AdmissionFairSharing_To_v1beta1_AdmissionFairSharing(in *v1beta2.AdmissionFairSharing, out *AdmissionFairSharing, s conversion.Scope) error {
+	return autoConvert_v1beta2_AdmissionFairSharing_To_v1beta1_AdmissionFairSharing(in, out, s)
+}
+
+func autoConvert_v1beta1_ClientConnection_To_v1beta2_ClientConnection(in *ClientConnection, out *v1beta2.ClientConnection, s conversion.Scope) error {
+	out.QPS = (*float32)(unsafe.Pointer(in.QPS))
+	out.Burst = (*int32)(unsafe.Pointer(in.Burst))
+	return nil
+}
+
+// Convert_v1beta1_ClientConnection_To_v1beta2_ClientConnection is an autogenerated conversion function.
+func Convert_v1beta1_ClientConnection_To_v1beta2_ClientConnection(in *ClientConnection, out *v1beta2.ClientConnection, s conversion.Scope) error {
+	return autoConvert_v1beta1_ClientConnection_To_v1beta2_ClientConnection(in, out, s)
+}
+
+func autoConvert_v1beta2_ClientConnection_To_v1beta1_ClientConnection(in *v1beta2.ClientConnection, out *ClientConnection, s conversion.Scope) error {
+	out.QPS = (*float32)(unsafe.Pointer(in.QPS))
+	out.Burst = (*int32)(unsafe.Pointer(in.Burst))
+	return nil
+}
+
+// Convert_v1beta2_ClientConnection_To_v1beta1_ClientConnection is an autogenerated conversion function.
+func Convert_v1beta2_ClientConnection_To_v1beta1_ClientConnection(in *v1beta2.ClientConnection, out *ClientConnection, s conversion.Scope) error {
+	return autoConvert_v1beta2_ClientConnection_To_v1beta1_ClientConnection(in, out, s)
+}
+
+func autoConvert_v1beta1_ClusterQueueVisibility_To_v1beta2_ClusterQueueVisibility(in *ClusterQueueVisibility, out *v1beta2.ClusterQueueVisibility, s conversion.Scope) error {
+	out.MaxCount = in.MaxCount
+	return nil
+}
+
+// Convert_v1beta1_ClusterQueueVisibility_To_v1beta2_ClusterQueueVisibility is an autogenerated conversion function.
+func Convert_v1beta1_ClusterQueueVisibility_To_v1beta2_ClusterQueueVisibility(in *ClusterQueueVisibility, out *v1beta2.ClusterQueueVisibility, s conversion.Scope) error {
+	return autoConvert_v1beta1_ClusterQueueVisibility_To_v1beta2_ClusterQueueVisibility(in, out, s)
+}
+
+func autoConvert_v1beta2_ClusterQueueVisibility_To_v1beta1_ClusterQueueVisibility(in *v1beta2.ClusterQueueVisibility, out *ClusterQueueVisibility, s conversion.Scope) error {
+	out.MaxCount = in.MaxCount
+	return nil
+}
+
+// Convert_v1beta2_ClusterQueueVisibility_To_v1beta1_ClusterQueueVisibility is an autogenerated conversion function.
+func Convert_v1beta2_ClusterQueueVisibility_To_v1beta1_ClusterQueueVisibility(in *v1beta2.ClusterQueueVisibility, out *ClusterQueueVisibility, s conversion.Scope) error {
+	return autoConvert_v1beta2_ClusterQueueVisibility_To_v1beta1_ClusterQueueVisibility(in, out, s)
+}
+
+func autoConvert_v1beta1_Configuration_To_v1beta2_Configuration(in *Configuration, out *v1beta2.Configuration, s conversion.Scope) error {
+	out.Namespace = (*string)(unsafe.Pointer(in.Namespace))
+	if err := Convert_v1beta1_ControllerManager_To_v1beta2_ControllerManager(&in.ControllerManager, &out.ControllerManager, s); err != nil {
+		return err
+	}
+	out.ManageJobsWithoutQueueName = in.ManageJobsWithoutQueueName
+	out.ManagedJobsNamespaceSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.ManagedJobsNamespaceSelector))
+	out.InternalCertManagement = (*v1beta2.InternalCertManagement)(unsafe.Pointer(in.InternalCertManagement))
+	out.WaitForPodsReady = (*v1beta2.WaitForPodsReady)(unsafe.Pointer(in.WaitForPodsReady))
+	out.ClientConnection = (*v1beta2.ClientConnection)(unsafe.Pointer(in.ClientConnection))
+	out.Integrations = (*v1beta2.Integrations)(unsafe.Pointer(in.Integrations))
+	out.QueueVisibility = (*v1beta2.QueueVisibility)(unsafe.Pointer(in.QueueVisibility))
+	out.MultiKueue = (*v1beta2.MultiKueue)(unsafe.Pointer(in.MultiKueue))
+	out.FairSharing = (*v1beta2.FairSharing)(unsafe.Pointer(in.FairSharing))
+	out.AdmissionFairSharing = (*v1beta2.AdmissionFairSharing)(unsafe.Pointer(in.AdmissionFairSharing))
+	out.Resources = (*v1beta2.Resources)(unsafe.Pointer(in.Resources))
+	out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates))
+	out.ObjectRetentionPolicies = (*v1beta2.ObjectRetentionPolicies)(unsafe.Pointer(in.ObjectRetentionPolicies))
+	return nil
+}
+
+// Convert_v1beta1_Configuration_To_v1beta2_Configuration is an autogenerated conversion function.
+func Convert_v1beta1_Configuration_To_v1beta2_Configuration(in *Configuration, out *v1beta2.Configuration, s conversion.Scope) error {
+	return autoConvert_v1beta1_Configuration_To_v1beta2_Configuration(in, out, s)
+}
+
+func autoConvert_v1beta2_Configuration_To_v1beta1_Configuration(in *v1beta2.Configuration, out *Configuration, s conversion.Scope) error {
+	out.Namespace = (*string)(unsafe.Pointer(in.Namespace))
+	if err := Convert_v1beta2_ControllerManager_To_v1beta1_ControllerManager(&in.ControllerManager, &out.ControllerManager, s); err != nil {
+		return err
+	}
+	out.ManageJobsWithoutQueueName = in.ManageJobsWithoutQueueName
+	out.ManagedJobsNamespaceSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.ManagedJobsNamespaceSelector))
+	out.InternalCertManagement = (*InternalCertManagement)(unsafe.Pointer(in.InternalCertManagement))
+	out.WaitForPodsReady = (*WaitForPodsReady)(unsafe.Pointer(in.WaitForPodsReady))
+	out.ClientConnection = (*ClientConnection)(unsafe.Pointer(in.ClientConnection))
+	out.Integrations = (*Integrations)(unsafe.Pointer(in.Integrations))
+	out.QueueVisibility = (*QueueVisibility)(unsafe.Pointer(in.QueueVisibility))
+	out.MultiKueue = (*MultiKueue)(unsafe.Pointer(in.MultiKueue))
+	out.FairSharing = (*FairSharing)(unsafe.Pointer(in.FairSharing))
+	out.AdmissionFairSharing = (*AdmissionFairSharing)(unsafe.Pointer(in.AdmissionFairSharing))
+	out.Resources = (*Resources)(unsafe.Pointer(in.Resources))
+	out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates))
+	out.ObjectRetentionPolicies = (*ObjectRetentionPolicies)(unsafe.Pointer(in.ObjectRetentionPolicies))
+	return nil
+}
+
+// Convert_v1beta2_Configuration_To_v1beta1_Configuration is an autogenerated conversion function.
+func Convert_v1beta2_Configuration_To_v1beta1_Configuration(in *v1beta2.Configuration, out *Configuration, s conversion.Scope) error {
+	return autoConvert_v1beta2_Configuration_To_v1beta1_Configuration(in, out, s)
+}
+
+func autoConvert_v1beta1_ControllerConfigurationSpec_To_v1beta2_ControllerConfigurationSpec(in *ControllerConfigurationSpec, out *v1beta2.ControllerConfigurationSpec, s conversion.Scope) error {
+	out.GroupKindConcurrency = *(*map[string]int)(unsafe.Pointer(&in.GroupKindConcurrency))
+	out.CacheSyncTimeout = (*time.Duration)(unsafe.Pointer(in.CacheSyncTimeout))
+	return nil
+}
+
+// Convert_v1beta1_ControllerConfigurationSpec_To_v1beta2_ControllerConfigurationSpec is an autogenerated conversion function.
+func Convert_v1beta1_ControllerConfigurationSpec_To_v1beta2_ControllerConfigurationSpec(in *ControllerConfigurationSpec, out *v1beta2.ControllerConfigurationSpec, s conversion.Scope) error {
+	return autoConvert_v1beta1_ControllerConfigurationSpec_To_v1beta2_ControllerConfigurationSpec(in, out, s)
+}
+
+func autoConvert_v1beta2_ControllerConfigurationSpec_To_v1beta1_ControllerConfigurationSpec(in *v1beta2.ControllerConfigurationSpec, out *ControllerConfigurationSpec, s conversion.Scope) error {
+	out.GroupKindConcurrency = *(*map[string]int)(unsafe.Pointer(&in.GroupKindConcurrency))
+	out.CacheSyncTimeout = (*time.Duration)(unsafe.Pointer(in.CacheSyncTimeout))
+	return nil
+}
+
+// Convert_v1beta2_ControllerConfigurationSpec_To_v1beta1_ControllerConfigurationSpec is an autogenerated conversion function.
+func Convert_v1beta2_ControllerConfigurationSpec_To_v1beta1_ControllerConfigurationSpec(in *v1beta2.ControllerConfigurationSpec, out *ControllerConfigurationSpec, s conversion.Scope) error {
+	return autoConvert_v1beta2_ControllerConfigurationSpec_To_v1beta1_ControllerConfigurationSpec(in, out, s)
+}
+
+func autoConvert_v1beta1_ControllerHealth_To_v1beta2_ControllerHealth(in *ControllerHealth, out *v1beta2.ControllerHealth, s conversion.Scope) error {
+	out.HealthProbeBindAddress = in.HealthProbeBindAddress
+	out.ReadinessEndpointName = in.ReadinessEndpointName
+	out.LivenessEndpointName = in.LivenessEndpointName
+	return nil
+}
+
+// Convert_v1beta1_ControllerHealth_To_v1beta2_ControllerHealth is an autogenerated conversion function.
+func Convert_v1beta1_ControllerHealth_To_v1beta2_ControllerHealth(in *ControllerHealth, out *v1beta2.ControllerHealth, s conversion.Scope) error {
+	return autoConvert_v1beta1_ControllerHealth_To_v1beta2_ControllerHealth(in, out, s)
+}
+
+func autoConvert_v1beta2_ControllerHealth_To_v1beta1_ControllerHealth(in *v1beta2.ControllerHealth, out *ControllerHealth, s conversion.Scope) error {
+	out.HealthProbeBindAddress = in.HealthProbeBindAddress
+	out.ReadinessEndpointName = in.ReadinessEndpointName
+	out.LivenessEndpointName = in.LivenessEndpointName
+	return nil
+}
+
+// Convert_v1beta2_ControllerHealth_To_v1beta1_ControllerHealth is an autogenerated conversion function.
+func Convert_v1beta2_ControllerHealth_To_v1beta1_ControllerHealth(in *v1beta2.ControllerHealth, out *ControllerHealth, s conversion.Scope) error {
+	return autoConvert_v1beta2_ControllerHealth_To_v1beta1_ControllerHealth(in, out, s)
+}
+
+func autoConvert_v1beta1_ControllerManager_To_v1beta2_ControllerManager(in *ControllerManager, out *v1beta2.ControllerManager, s conversion.Scope) error {
+	if err := Convert_v1beta1_ControllerWebhook_To_v1beta2_ControllerWebhook(&in.Webhook, &out.Webhook, s); err != nil {
+		return err
+	}
+	out.LeaderElection = (*v1alpha1.LeaderElectionConfiguration)(unsafe.Pointer(in.LeaderElection))
+	if err := Convert_v1beta1_ControllerMetrics_To_v1beta2_ControllerMetrics(&in.Metrics, &out.Metrics, s); err != nil {
+		return err
+	}
+	if err := Convert_v1beta1_ControllerHealth_To_v1beta2_ControllerHealth(&in.Health, &out.Health, s); err != nil {
+		return err
+	}
+	out.PprofBindAddress = in.PprofBindAddress
+	out.Controller = (*v1beta2.ControllerConfigurationSpec)(unsafe.Pointer(in.Controller))
+	return nil
+}
+
+// Convert_v1beta1_ControllerManager_To_v1beta2_ControllerManager is an autogenerated conversion function.
+func Convert_v1beta1_ControllerManager_To_v1beta2_ControllerManager(in *ControllerManager, out *v1beta2.ControllerManager, s conversion.Scope) error {
+	return autoConvert_v1beta1_ControllerManager_To_v1beta2_ControllerManager(in, out, s)
+}
+
+func autoConvert_v1beta2_ControllerManager_To_v1beta1_ControllerManager(in *v1beta2.ControllerManager, out *ControllerManager, s conversion.Scope) error {
+	if err := Convert_v1beta2_ControllerWebhook_To_v1beta1_ControllerWebhook(&in.Webhook, &out.Webhook, s); err != nil {
+		return err
+	}
+	out.LeaderElection = (*v1alpha1.LeaderElectionConfiguration)(unsafe.Pointer(in.LeaderElection))
+	if err := Convert_v1beta2_ControllerMetrics_To_v1beta1_ControllerMetrics(&in.Metrics, &out.Metrics, s); err != nil {
+		return err
+	}
+	if err := Convert_v1beta2_ControllerHealth_To_v1beta1_ControllerHealth(&in.Health, &out.Health, s); err != nil {
+		return err
+	}
+	out.PprofBindAddress = in.PprofBindAddress
+	out.Controller = (*ControllerConfigurationSpec)(unsafe.Pointer(in.Controller))
+	return nil
+}
+
+// Convert_v1beta2_ControllerManager_To_v1beta1_ControllerManager is an autogenerated conversion function.
+func Convert_v1beta2_ControllerManager_To_v1beta1_ControllerManager(in *v1beta2.ControllerManager, out *ControllerManager, s conversion.Scope) error {
+	return autoConvert_v1beta2_ControllerManager_To_v1beta1_ControllerManager(in, out, s)
+}
+
+func autoConvert_v1beta1_ControllerMetrics_To_v1beta2_ControllerMetrics(in *ControllerMetrics, out *v1beta2.ControllerMetrics, s conversion.Scope) error {
+	out.BindAddress = in.BindAddress
+	out.EnableClusterQueueResources = in.EnableClusterQueueResources
+	return nil
+}
+
+// Convert_v1beta1_ControllerMetrics_To_v1beta2_ControllerMetrics is an autogenerated conversion function.
+func Convert_v1beta1_ControllerMetrics_To_v1beta2_ControllerMetrics(in *ControllerMetrics, out *v1beta2.ControllerMetrics, s conversion.Scope) error {
+	return autoConvert_v1beta1_ControllerMetrics_To_v1beta2_ControllerMetrics(in, out, s)
+}
+
+func autoConvert_v1beta2_ControllerMetrics_To_v1beta1_ControllerMetrics(in *v1beta2.ControllerMetrics, out *ControllerMetrics, s conversion.Scope) error {
+	out.BindAddress = in.BindAddress
+	out.EnableClusterQueueResources = in.EnableClusterQueueResources
+	return nil
+}
+
+// Convert_v1beta2_ControllerMetrics_To_v1beta1_ControllerMetrics is an autogenerated conversion function.
+func Convert_v1beta2_ControllerMetrics_To_v1beta1_ControllerMetrics(in *v1beta2.ControllerMetrics, out *ControllerMetrics, s conversion.Scope) error {
+	return autoConvert_v1beta2_ControllerMetrics_To_v1beta1_ControllerMetrics(in, out, s)
+}
+
+func autoConvert_v1beta1_ControllerWebhook_To_v1beta2_ControllerWebhook(in *ControllerWebhook, out *v1beta2.ControllerWebhook, s conversion.Scope) error {
+	out.Port = (*int)(unsafe.Pointer(in.Port))
+	out.Host = in.Host
+	out.CertDir = in.CertDir
+	return nil
+}
+
+// Convert_v1beta1_ControllerWebhook_To_v1beta2_ControllerWebhook is an autogenerated conversion function.
+func Convert_v1beta1_ControllerWebhook_To_v1beta2_ControllerWebhook(in *ControllerWebhook, out *v1beta2.ControllerWebhook, s conversion.Scope) error {
+	return autoConvert_v1beta1_ControllerWebhook_To_v1beta2_ControllerWebhook(in, out, s)
+}
+
+func autoConvert_v1beta2_ControllerWebhook_To_v1beta1_ControllerWebhook(in *v1beta2.ControllerWebhook, out *ControllerWebhook, s conversion.Scope) error {
+	out.Port = (*int)(unsafe.Pointer(in.Port))
+	out.Host = in.Host
+	out.CertDir = in.CertDir
+	return nil
+}
+
+// Convert_v1beta2_ControllerWebhook_To_v1beta1_ControllerWebhook is an autogenerated conversion function.
+func Convert_v1beta2_ControllerWebhook_To_v1beta1_ControllerWebhook(in *v1beta2.ControllerWebhook, out *ControllerWebhook, s conversion.Scope) error {
+	return autoConvert_v1beta2_ControllerWebhook_To_v1beta1_ControllerWebhook(in, out, s)
+}
+
+func autoConvert_v1beta1_DeviceClassMapping_To_v1beta2_DeviceClassMapping(in *DeviceClassMapping, out *v1beta2.DeviceClassMapping, s conversion.Scope) error {
+	out.Name = v1.ResourceName(in.Name)
+	out.DeviceClassNames = *(*[]v1.ResourceName)(unsafe.Pointer(&in.DeviceClassNames))
+	return nil
+}
+
+// Convert_v1beta1_DeviceClassMapping_To_v1beta2_DeviceClassMapping is an autogenerated conversion function.
+func Convert_v1beta1_DeviceClassMapping_To_v1beta2_DeviceClassMapping(in *DeviceClassMapping, out *v1beta2.DeviceClassMapping, s conversion.Scope) error {
+	return autoConvert_v1beta1_DeviceClassMapping_To_v1beta2_DeviceClassMapping(in, out, s)
+}
+
+func autoConvert_v1beta2_DeviceClassMapping_To_v1beta1_DeviceClassMapping(in *v1beta2.DeviceClassMapping, out *DeviceClassMapping, s conversion.Scope) error {
+	out.Name = v1.ResourceName(in.Name)
+	out.DeviceClassNames = *(*[]v1.ResourceName)(unsafe.Pointer(&in.DeviceClassNames))
+	return nil
+}
+
+// Convert_v1beta2_DeviceClassMapping_To_v1beta1_DeviceClassMapping is an autogenerated conversion function.
+func Convert_v1beta2_DeviceClassMapping_To_v1beta1_DeviceClassMapping(in *v1beta2.DeviceClassMapping, out *DeviceClassMapping, s conversion.Scope) error {
+	return autoConvert_v1beta2_DeviceClassMapping_To_v1beta1_DeviceClassMapping(in, out, s)
+}
+
+func autoConvert_v1beta1_FairSharing_To_v1beta2_FairSharing(in *FairSharing, out *v1beta2.FairSharing, s conversion.Scope) error {
+	out.Enable = in.Enable
+	out.PreemptionStrategies = *(*[]v1beta2.PreemptionStrategy)(unsafe.Pointer(&in.PreemptionStrategies))
+	return nil
+}
+
+// Convert_v1beta1_FairSharing_To_v1beta2_FairSharing is an autogenerated conversion function.
+func Convert_v1beta1_FairSharing_To_v1beta2_FairSharing(in *FairSharing, out *v1beta2.FairSharing, s conversion.Scope) error {
+	return autoConvert_v1beta1_FairSharing_To_v1beta2_FairSharing(in, out, s)
+}
+
+func autoConvert_v1beta2_FairSharing_To_v1beta1_FairSharing(in *v1beta2.FairSharing, out *FairSharing, s conversion.Scope) error {
+	out.Enable = in.Enable
+	out.PreemptionStrategies = *(*[]PreemptionStrategy)(unsafe.Pointer(&in.PreemptionStrategies))
+	return nil
+}
+
+// Convert_v1beta2_FairSharing_To_v1beta1_FairSharing is an autogenerated conversion function.
+func Convert_v1beta2_FairSharing_To_v1beta1_FairSharing(in *v1beta2.FairSharing, out *FairSharing, s conversion.Scope) error {
+	return autoConvert_v1beta2_FairSharing_To_v1beta1_FairSharing(in, out, s)
+}
+
+func autoConvert_v1beta1_Integrations_To_v1beta2_Integrations(in *Integrations, out *v1beta2.Integrations, s conversion.Scope) error {
+	out.Frameworks = *(*[]string)(unsafe.Pointer(&in.Frameworks))
+	out.ExternalFrameworks = *(*[]string)(unsafe.Pointer(&in.ExternalFrameworks))
+	out.PodOptions = (*v1beta2.PodIntegrationOptions)(unsafe.Pointer(in.PodOptions))
+	out.LabelKeysToCopy = *(*[]string)(unsafe.Pointer(&in.LabelKeysToCopy))
+	return nil
+}
+
+// Convert_v1beta1_Integrations_To_v1beta2_Integrations is an autogenerated conversion function.
+func Convert_v1beta1_Integrations_To_v1beta2_Integrations(in *Integrations, out *v1beta2.Integrations, s conversion.Scope) error {
+	return autoConvert_v1beta1_Integrations_To_v1beta2_Integrations(in, out, s)
+}
+
+func autoConvert_v1beta2_Integrations_To_v1beta1_Integrations(in *v1beta2.Integrations, out *Integrations, s conversion.Scope) error {
+	out.Frameworks = *(*[]string)(unsafe.Pointer(&in.Frameworks))
+	out.ExternalFrameworks = *(*[]string)(unsafe.Pointer(&in.ExternalFrameworks))
+	out.PodOptions = (*PodIntegrationOptions)(unsafe.Pointer(in.PodOptions))
+	out.LabelKeysToCopy = *(*[]string)(unsafe.Pointer(&in.LabelKeysToCopy))
+	return nil
+}
+
+// Convert_v1beta2_Integrations_To_v1beta1_Integrations is an autogenerated conversion function.
+func Convert_v1beta2_Integrations_To_v1beta1_Integrations(in *v1beta2.Integrations, out *Integrations, s conversion.Scope) error {
+	return autoConvert_v1beta2_Integrations_To_v1beta1_Integrations(in, out, s)
+}
+
+func autoConvert_v1beta1_InternalCertManagement_To_v1beta2_InternalCertManagement(in *InternalCertManagement, out *v1beta2.InternalCertManagement, s conversion.Scope) error {
+	out.Enable = (*bool)(unsafe.Pointer(in.Enable))
+	out.WebhookServiceName = (*string)(unsafe.Pointer(in.WebhookServiceName))
+	out.WebhookSecretName = (*string)(unsafe.Pointer(in.WebhookSecretName))
+	return nil
+}
+
+// Convert_v1beta1_InternalCertManagement_To_v1beta2_InternalCertManagement is an autogenerated conversion function.
+func Convert_v1beta1_InternalCertManagement_To_v1beta2_InternalCertManagement(in *InternalCertManagement, out *v1beta2.InternalCertManagement, s conversion.Scope) error {
+	return autoConvert_v1beta1_InternalCertManagement_To_v1beta2_InternalCertManagement(in, out, s)
+}
+
+func autoConvert_v1beta2_InternalCertManagement_To_v1beta1_InternalCertManagement(in *v1beta2.InternalCertManagement, out *InternalCertManagement, s conversion.Scope) error {
+	out.Enable = (*bool)(unsafe.Pointer(in.Enable))
+	out.WebhookServiceName = (*string)(unsafe.Pointer(in.WebhookServiceName))
+	out.WebhookSecretName = (*string)(unsafe.Pointer(in.WebhookSecretName))
+	return nil
+}
+
+// Convert_v1beta2_InternalCertManagement_To_v1beta1_InternalCertManagement is an autogenerated conversion function.
+func Convert_v1beta2_InternalCertManagement_To_v1beta1_InternalCertManagement(in *v1beta2.InternalCertManagement, out *InternalCertManagement, s conversion.Scope) error {
+	return autoConvert_v1beta2_InternalCertManagement_To_v1beta1_InternalCertManagement(in, out, s)
+}
+
+func autoConvert_v1beta1_MultiKueue_To_v1beta2_MultiKueue(in *MultiKueue, out *v1beta2.MultiKueue, s conversion.Scope) error {
+	out.GCInterval = (*metav1.Duration)(unsafe.Pointer(in.GCInterval))
+	out.Origin = (*string)(unsafe.Pointer(in.Origin))
+	out.WorkerLostTimeout = (*metav1.Duration)(unsafe.Pointer(in.WorkerLostTimeout))
+	out.DispatcherName = (*string)(unsafe.Pointer(in.DispatcherName))
+	out.ExternalFrameworks = *(*[]v1beta2.MultiKueueExternalFramework)(unsafe.Pointer(&in.ExternalFrameworks))
+	return nil
+}
+
+// Convert_v1beta1_MultiKueue_To_v1beta2_MultiKueue is an autogenerated conversion function.
+func Convert_v1beta1_MultiKueue_To_v1beta2_MultiKueue(in *MultiKueue, out *v1beta2.MultiKueue, s conversion.Scope) error {
+	return autoConvert_v1beta1_MultiKueue_To_v1beta2_MultiKueue(in, out, s)
+}
+
+func autoConvert_v1beta2_MultiKueue_To_v1beta1_MultiKueue(in *v1beta2.MultiKueue, out *MultiKueue, s conversion.Scope) error {
+	out.GCInterval = (*metav1.Duration)(unsafe.Pointer(in.GCInterval))
+	out.Origin = (*string)(unsafe.Pointer(in.Origin))
+	out.WorkerLostTimeout = (*metav1.Duration)(unsafe.Pointer(in.WorkerLostTimeout))
+	out.DispatcherName = (*string)(unsafe.Pointer(in.DispatcherName))
+	out.ExternalFrameworks = *(*[]MultiKueueExternalFramework)(unsafe.Pointer(&in.ExternalFrameworks))
+	return nil
+}
+
+// Convert_v1beta2_MultiKueue_To_v1beta1_MultiKueue is an autogenerated conversion function.
+func Convert_v1beta2_MultiKueue_To_v1beta1_MultiKueue(in *v1beta2.MultiKueue, out *MultiKueue, s conversion.Scope) error {
+	return autoConvert_v1beta2_MultiKueue_To_v1beta1_MultiKueue(in, out, s)
+}
+
+func autoConvert_v1beta1_MultiKueueExternalFramework_To_v1beta2_MultiKueueExternalFramework(in *MultiKueueExternalFramework, out *v1beta2.MultiKueueExternalFramework, s conversion.Scope) error {
+	out.Name = in.Name
+	return nil
+}
+
+// Convert_v1beta1_MultiKueueExternalFramework_To_v1beta2_MultiKueueExternalFramework is an autogenerated conversion function.
+func Convert_v1beta1_MultiKueueExternalFramework_To_v1beta2_MultiKueueExternalFramework(in *MultiKueueExternalFramework, out *v1beta2.MultiKueueExternalFramework, s conversion.Scope) error {
+	return autoConvert_v1beta1_MultiKueueExternalFramework_To_v1beta2_MultiKueueExternalFramework(in, out, s)
+}
+
+func autoConvert_v1beta2_MultiKueueExternalFramework_To_v1beta1_MultiKueueExternalFramework(in *v1beta2.MultiKueueExternalFramework, out *MultiKueueExternalFramework, s conversion.Scope) error {
+	out.Name = in.Name
+	return nil
+}
+
+// Convert_v1beta2_MultiKueueExternalFramework_To_v1beta1_MultiKueueExternalFramework is an autogenerated conversion function.
+func Convert_v1beta2_MultiKueueExternalFramework_To_v1beta1_MultiKueueExternalFramework(in *v1beta2.MultiKueueExternalFramework, out *MultiKueueExternalFramework, s conversion.Scope) error {
+	return autoConvert_v1beta2_MultiKueueExternalFramework_To_v1beta1_MultiKueueExternalFramework(in, out, s)
+}
+
+func autoConvert_v1beta1_ObjectRetentionPolicies_To_v1beta2_ObjectRetentionPolicies(in *ObjectRetentionPolicies, out *v1beta2.ObjectRetentionPolicies, s conversion.Scope) error {
+	out.Workloads = (*v1beta2.WorkloadRetentionPolicy)(unsafe.Pointer(in.Workloads))
+	return nil
+}
+
+// Convert_v1beta1_ObjectRetentionPolicies_To_v1beta2_ObjectRetentionPolicies is an autogenerated conversion function.
+func Convert_v1beta1_ObjectRetentionPolicies_To_v1beta2_ObjectRetentionPolicies(in *ObjectRetentionPolicies, out *v1beta2.ObjectRetentionPolicies, s conversion.Scope) error {
+	return autoConvert_v1beta1_ObjectRetentionPolicies_To_v1beta2_ObjectRetentionPolicies(in, out, s)
+}
+
+func autoConvert_v1beta2_ObjectRetentionPolicies_To_v1beta1_ObjectRetentionPolicies(in *v1beta2.ObjectRetentionPolicies, out *ObjectRetentionPolicies, s conversion.Scope) error {
+	out.Workloads = (*WorkloadRetentionPolicy)(unsafe.Pointer(in.Workloads))
+	return nil
+}
+
+// Convert_v1beta2_ObjectRetentionPolicies_To_v1beta1_ObjectRetentionPolicies is an autogenerated conversion function.
+func Convert_v1beta2_ObjectRetentionPolicies_To_v1beta1_ObjectRetentionPolicies(in *v1beta2.ObjectRetentionPolicies, out *ObjectRetentionPolicies, s conversion.Scope) error {
+	return autoConvert_v1beta2_ObjectRetentionPolicies_To_v1beta1_ObjectRetentionPolicies(in, out, s)
+}
+
+func autoConvert_v1beta1_PodIntegrationOptions_To_v1beta2_PodIntegrationOptions(in *PodIntegrationOptions, out *v1beta2.PodIntegrationOptions, s conversion.Scope) error {
+	out.NamespaceSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.NamespaceSelector))
+	out.PodSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.PodSelector))
+	return nil
+}
+
+// Convert_v1beta1_PodIntegrationOptions_To_v1beta2_PodIntegrationOptions is an autogenerated conversion function.
+func Convert_v1beta1_PodIntegrationOptions_To_v1beta2_PodIntegrationOptions(in *PodIntegrationOptions, out *v1beta2.PodIntegrationOptions, s conversion.Scope) error {
+	return autoConvert_v1beta1_PodIntegrationOptions_To_v1beta2_PodIntegrationOptions(in, out, s)
+}
+
+func autoConvert_v1beta2_PodIntegrationOptions_To_v1beta1_PodIntegrationOptions(in *v1beta2.PodIntegrationOptions, out *PodIntegrationOptions, s conversion.Scope) error {
+	out.NamespaceSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.NamespaceSelector))
+	out.PodSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.PodSelector))
+	return nil
+}
+
+// Convert_v1beta2_PodIntegrationOptions_To_v1beta1_PodIntegrationOptions is an autogenerated conversion function.
+func Convert_v1beta2_PodIntegrationOptions_To_v1beta1_PodIntegrationOptions(in *v1beta2.PodIntegrationOptions, out *PodIntegrationOptions, s conversion.Scope) error {
+	return autoConvert_v1beta2_PodIntegrationOptions_To_v1beta1_PodIntegrationOptions(in, out, s)
+}
+
+func autoConvert_v1beta1_QueueVisibility_To_v1beta2_QueueVisibility(in *QueueVisibility, out *v1beta2.QueueVisibility, s conversion.Scope) error {
+	out.ClusterQueues = (*v1beta2.ClusterQueueVisibility)(unsafe.Pointer(in.ClusterQueues))
+	out.UpdateIntervalSeconds = in.UpdateIntervalSeconds
+	return nil
+}
+
+// Convert_v1beta1_QueueVisibility_To_v1beta2_QueueVisibility is an autogenerated conversion function.
+func Convert_v1beta1_QueueVisibility_To_v1beta2_QueueVisibility(in *QueueVisibility, out *v1beta2.QueueVisibility, s conversion.Scope) error {
+	return autoConvert_v1beta1_QueueVisibility_To_v1beta2_QueueVisibility(in, out, s)
+}
+
+func autoConvert_v1beta2_QueueVisibility_To_v1beta1_QueueVisibility(in *v1beta2.QueueVisibility, out *QueueVisibility, s conversion.Scope) error {
+	out.ClusterQueues = (*ClusterQueueVisibility)(unsafe.Pointer(in.ClusterQueues))
+	out.UpdateIntervalSeconds = in.UpdateIntervalSeconds
+	return nil
+}
+
+// Convert_v1beta2_QueueVisibility_To_v1beta1_QueueVisibility is an autogenerated conversion function.
+func Convert_v1beta2_QueueVisibility_To_v1beta1_QueueVisibility(in *v1beta2.QueueVisibility, out *QueueVisibility, s conversion.Scope) error {
+	return autoConvert_v1beta2_QueueVisibility_To_v1beta1_QueueVisibility(in, out, s)
+}
+
+func autoConvert_v1beta1_RequeuingStrategy_To_v1beta2_RequeuingStrategy(in *RequeuingStrategy, out *v1beta2.RequeuingStrategy, s conversion.Scope) error {
+	out.Timestamp = (*v1beta2.RequeuingTimestamp)(unsafe.Pointer(in.Timestamp))
+	out.BackoffLimitCount = (*int32)(unsafe.Pointer(in.BackoffLimitCount))
+	out.BackoffBaseSeconds = (*int32)(unsafe.Pointer(in.BackoffBaseSeconds))
+	out.BackoffMaxSeconds = (*int32)(unsafe.Pointer(in.BackoffMaxSeconds))
+	return nil
+}
+
+// Convert_v1beta1_RequeuingStrategy_To_v1beta2_RequeuingStrategy is an autogenerated conversion function.
+func Convert_v1beta1_RequeuingStrategy_To_v1beta2_RequeuingStrategy(in *RequeuingStrategy, out *v1beta2.RequeuingStrategy, s conversion.Scope) error {
+	return autoConvert_v1beta1_RequeuingStrategy_To_v1beta2_RequeuingStrategy(in, out, s)
+}
+
+func autoConvert_v1beta2_RequeuingStrategy_To_v1beta1_RequeuingStrategy(in *v1beta2.RequeuingStrategy, out *RequeuingStrategy, s conversion.Scope) error {
+	out.Timestamp = (*RequeuingTimestamp)(unsafe.Pointer(in.Timestamp))
+	out.BackoffLimitCount = (*int32)(unsafe.Pointer(in.BackoffLimitCount))
+	out.BackoffBaseSeconds = (*int32)(unsafe.Pointer(in.BackoffBaseSeconds))
+	out.BackoffMaxSeconds = (*int32)(unsafe.Pointer(in.BackoffMaxSeconds))
+	return nil
+}
+
+// Convert_v1beta2_RequeuingStrategy_To_v1beta1_RequeuingStrategy is an autogenerated conversion function.
+func Convert_v1beta2_RequeuingStrategy_To_v1beta1_RequeuingStrategy(in *v1beta2.RequeuingStrategy, out *RequeuingStrategy, s conversion.Scope) error {
+	return autoConvert_v1beta2_RequeuingStrategy_To_v1beta1_RequeuingStrategy(in, out, s)
+}
+
+func autoConvert_v1beta1_ResourceTransformation_To_v1beta2_ResourceTransformation(in *ResourceTransformation, out *v1beta2.ResourceTransformation, s conversion.Scope) error {
+	out.Input = v1.ResourceName(in.Input)
+	out.Strategy = (*v1beta2.ResourceTransformationStrategy)(unsafe.Pointer(in.Strategy))
+	out.Outputs = *(*v1.ResourceList)(unsafe.Pointer(&in.Outputs))
+	return nil
+}
+
+// Convert_v1beta1_ResourceTransformation_To_v1beta2_ResourceTransformation is an autogenerated conversion function.
+func Convert_v1beta1_ResourceTransformation_To_v1beta2_ResourceTransformation(in *ResourceTransformation, out *v1beta2.ResourceTransformation, s conversion.Scope) error {
+	return autoConvert_v1beta1_ResourceTransformation_To_v1beta2_ResourceTransformation(in, out, s)
+}
+
+func autoConvert_v1beta2_ResourceTransformation_To_v1beta1_ResourceTransformation(in *v1beta2.ResourceTransformation, out *ResourceTransformation, s conversion.Scope) error {
+	out.Input = v1.ResourceName(in.Input)
+	out.Strategy = (*ResourceTransformationStrategy)(unsafe.Pointer(in.Strategy))
+	out.Outputs = *(*v1.ResourceList)(unsafe.Pointer(&in.Outputs))
+	return nil
+}
+
+// Convert_v1beta2_ResourceTransformation_To_v1beta1_ResourceTransformation is an autogenerated conversion function.
+func Convert_v1beta2_ResourceTransformation_To_v1beta1_ResourceTransformation(in *v1beta2.ResourceTransformation, out *ResourceTransformation, s conversion.Scope) error {
+	return autoConvert_v1beta2_ResourceTransformation_To_v1beta1_ResourceTransformation(in, out, s)
+}
+
+func autoConvert_v1beta1_Resources_To_v1beta2_Resources(in *Resources, out *v1beta2.Resources, s conversion.Scope) error {
+	out.ExcludeResourcePrefixes = *(*[]string)(unsafe.Pointer(&in.ExcludeResourcePrefixes))
+	out.Transformations = *(*[]v1beta2.ResourceTransformation)(unsafe.Pointer(&in.Transformations))
+	out.DeviceClassMappings = *(*[]v1beta2.DeviceClassMapping)(unsafe.Pointer(&in.DeviceClassMappings))
+	return nil
+}
+
+// Convert_v1beta1_Resources_To_v1beta2_Resources is an autogenerated conversion function.
+func Convert_v1beta1_Resources_To_v1beta2_Resources(in *Resources, out *v1beta2.Resources, s conversion.Scope) error {
+	return autoConvert_v1beta1_Resources_To_v1beta2_Resources(in, out, s)
+}
+
+func autoConvert_v1beta2_Resources_To_v1beta1_Resources(in *v1beta2.Resources, out *Resources, s conversion.Scope) error {
+	out.ExcludeResourcePrefixes = *(*[]string)(unsafe.Pointer(&in.ExcludeResourcePrefixes))
+	out.Transformations = *(*[]ResourceTransformation)(unsafe.Pointer(&in.Transformations))
+	out.DeviceClassMappings = *(*[]DeviceClassMapping)(unsafe.Pointer(&in.DeviceClassMappings))
+	return nil
+}
+
+// Convert_v1beta2_Resources_To_v1beta1_Resources is an autogenerated conversion function.
+func Convert_v1beta2_Resources_To_v1beta1_Resources(in *v1beta2.Resources, out *Resources, s conversion.Scope) error {
+	return autoConvert_v1beta2_Resources_To_v1beta1_Resources(in, out, s)
+}
+
+func autoConvert_v1beta1_WaitForPodsReady_To_v1beta2_WaitForPodsReady(in *WaitForPodsReady, out *v1beta2.WaitForPodsReady, s conversion.Scope) error {
+	out.Enable = in.Enable
+	out.Timeout = (*metav1.Duration)(unsafe.Pointer(in.Timeout))
+	out.BlockAdmission = (*bool)(unsafe.Pointer(in.BlockAdmission))
+	out.RequeuingStrategy = (*v1beta2.RequeuingStrategy)(unsafe.Pointer(in.RequeuingStrategy))
+	out.RecoveryTimeout = (*metav1.Duration)(unsafe.Pointer(in.RecoveryTimeout))
+	return nil
+}
+
+// Convert_v1beta1_WaitForPodsReady_To_v1beta2_WaitForPodsReady is an autogenerated conversion function.
+func Convert_v1beta1_WaitForPodsReady_To_v1beta2_WaitForPodsReady(in *WaitForPodsReady, out *v1beta2.WaitForPodsReady, s conversion.Scope) error {
+	return autoConvert_v1beta1_WaitForPodsReady_To_v1beta2_WaitForPodsReady(in, out, s)
+}
+
+func autoConvert_v1beta2_WaitForPodsReady_To_v1beta1_WaitForPodsReady(in *v1beta2.WaitForPodsReady, out *WaitForPodsReady, s conversion.Scope) error {
+	out.Enable = in.Enable
+	out.Timeout = (*metav1.Duration)(unsafe.Pointer(in.Timeout))
+	out.BlockAdmission = (*bool)(unsafe.Pointer(in.BlockAdmission))
+	out.RequeuingStrategy = (*RequeuingStrategy)(unsafe.Pointer(in.RequeuingStrategy))
+	out.RecoveryTimeout = (*metav1.Duration)(unsafe.Pointer(in.RecoveryTimeout))
+	return nil
+}
+
+// Convert_v1beta2_WaitForPodsReady_To_v1beta1_WaitForPodsReady is an autogenerated conversion function.
+func Convert_v1beta2_WaitForPodsReady_To_v1beta1_WaitForPodsReady(in *v1beta2.WaitForPodsReady, out *WaitForPodsReady, s conversion.Scope) error {
+	return autoConvert_v1beta2_WaitForPodsReady_To_v1beta1_WaitForPodsReady(in, out, s)
+}
+
+func autoConvert_v1beta1_WorkloadRetentionPolicy_To_v1beta2_WorkloadRetentionPolicy(in *WorkloadRetentionPolicy, out *v1beta2.WorkloadRetentionPolicy, s conversion.Scope) error {
+	out.AfterFinished = (*metav1.Duration)(unsafe.Pointer(in.AfterFinished))
+	out.AfterDeactivatedByKueue = (*metav1.Duration)(unsafe.Pointer(in.AfterDeactivatedByKueue))
+	return nil
+}
+
+// Convert_v1beta1_WorkloadRetentionPolicy_To_v1beta2_WorkloadRetentionPolicy is an autogenerated conversion function.
+func Convert_v1beta1_WorkloadRetentionPolicy_To_v1beta2_WorkloadRetentionPolicy(in *WorkloadRetentionPolicy, out *v1beta2.WorkloadRetentionPolicy, s conversion.Scope) error {
+	return autoConvert_v1beta1_WorkloadRetentionPolicy_To_v1beta2_WorkloadRetentionPolicy(in, out, s)
+}
+
+func autoConvert_v1beta2_WorkloadRetentionPolicy_To_v1beta1_WorkloadRetentionPolicy(in *v1beta2.WorkloadRetentionPolicy, out *WorkloadRetentionPolicy, s conversion.Scope) error {
+	out.AfterFinished = (*metav1.Duration)(unsafe.Pointer(in.AfterFinished))
+	out.AfterDeactivatedByKueue = (*metav1.Duration)(unsafe.Pointer(in.AfterDeactivatedByKueue))
+	return nil
+}
+
+// Convert_v1beta2_WorkloadRetentionPolicy_To_v1beta1_WorkloadRetentionPolicy is an autogenerated conversion function.
+func Convert_v1beta2_WorkloadRetentionPolicy_To_v1beta1_WorkloadRetentionPolicy(in *v1beta2.WorkloadRetentionPolicy, out *WorkloadRetentionPolicy, s conversion.Scope) error {
+	return autoConvert_v1beta2_WorkloadRetentionPolicy_To_v1beta1_WorkloadRetentionPolicy(in, out, s)
+}
diff --git a/apis/config/v1beta2/configuration_types.go b/apis/config/v1beta2/configuration_types.go
new file mode 100644
index 000000000..bad262162
--- /dev/null
+++ b/apis/config/v1beta2/configuration_types.go
@@ -0,0 +1,590 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta2
+
+import (
+	"time"
+
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	configv1alpha1 "k8s.io/component-base/config/v1alpha1"
+)
+
+// +k8s:defaulter-gen=true
+// +kubebuilder:object:root=true
+
+// Configuration is the Schema for the kueueconfigurations API
+type Configuration struct {
+	metav1.TypeMeta `json:",inline"`
+
+	// Namespace is the namespace in which kueue is deployed. It is used as part of DNSName of the webhook Service.
+	// If not set, the value is set from the file /var/run/secrets/kubernetes.io/serviceaccount/namespace
+	// If the file doesn't exist, default value is kueue-system.
+	Namespace *string `json:"namespace,omitempty"`
+
+	// ControllerManager returns the configurations for controllers
+	ControllerManager `json:",inline"`
+
+	// ManageJobsWithoutQueueName controls whether or not Kueue reconciles
+	// jobs that don't set the label kueue.x-k8s.io/queue-name.
+	// If set to true, then those jobs will be suspended and never started unless
+	// they are assigned a queue and eventually admitted. This also applies to
+	// jobs created before starting the kueue controller.
+	// Defaults to false; therefore, those jobs are not managed and if they are created
+	// unsuspended, they will start immediately.
+	ManageJobsWithoutQueueName bool `json:"manageJobsWithoutQueueName"`
+
+	// ManagedJobsNamespaceSelector provides a namespace-based mechanism to exempt jobs
+	// from management by Kueue.
+	//
+	// It provides a strong exemption for the Pod-based integrations (pod, deployment, statefulset, etc.),
+	// For Pod-based integrations, only jobs whose namespaces match ManagedJobsNamespaceSelector are
+	// eligible to be managed by Kueue.  Pods, deployments, etc. in non-matching namespaces will
+	// never be managed by Kueue, even if they have a kueue.x-k8s.io/queue-name label.
+	// This strong exemption ensures that Kueue will not interfere with the basic operation
+	// of system namespace.
+	//
+	// For all other integrations, ManagedJobsNamespaceSelector provides a weaker exemption
+	// by only modulating the effects of ManageJobsWithoutQueueName.  For these integrations,
+	// a job that has a kueue.x-k8s.io/queue-name label will always be managed by Kueue. Jobs without
+	// a kueue.x-k8s.io/queue-name label will be managed by Kueue only when ManageJobsWithoutQueueName is
+	// true and the job's namespace matches ManagedJobsNamespaceSelector.
+	ManagedJobsNamespaceSelector *metav1.LabelSelector `json:"managedJobsNamespaceSelector,omitempty"`
+
+	// InternalCertManagement is configuration for internalCertManagement
+	InternalCertManagement *InternalCertManagement `json:"internalCertManagement,omitempty"`
+
+	// WaitForPodsReady is configuration to provide a time-based all-or-nothing
+	// scheduling semantics for Jobs, by ensuring all pods are ready (running
+	// and passing the readiness probe) within the specified time. If the timeout
+	// is exceeded, then the workload is evicted.
+	WaitForPodsReady *WaitForPodsReady `json:"waitForPodsReady,omitempty"`
+
+	// ClientConnection provides additional configuration options for Kubernetes
+	// API server client.
+	ClientConnection *ClientConnection `json:"clientConnection,omitempty"`
+
+	// Integrations provide configuration options for AI/ML/Batch frameworks
+	// integrations (including K8S job).
+	Integrations *Integrations `json:"integrations,omitempty"`
+
+	// QueueVisibility is configuration to expose the information about the top
+	// pending workloads.
+	// Deprecated: This field will be removed on v1beta2, use VisibilityOnDemand
+	// (https://kueue.sigs.k8s.io/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand/)
+	// instead.
+	QueueVisibility *QueueVisibility `json:"queueVisibility,omitempty"`
+
+	// MultiKueue controls the behaviour of the MultiKueue AdmissionCheck Controller.
+	MultiKueue *MultiKueue `json:"multiKueue,omitempty"`
+
+	// FairSharing controls the Fair Sharing semantics across the cluster.
+	FairSharing *FairSharing `json:"fairSharing,omitempty"`
+
+	// admissionFairSharing indicates configuration of FairSharing with the `AdmissionTime` mode on
+	AdmissionFairSharing *AdmissionFairSharing `json:"admissionFairSharing,omitempty"`
+
+	// Resources provides additional configuration options for handling the resources.
+	Resources *Resources `json:"resources,omitempty"`
+
+	// FeatureGates is a map of feature names to bools that allows to override the
+	// default enablement status of a feature. The map cannot be used in conjunction
+	// with passing the list of features via the command line argument "--feature-gates"
+	// for the Kueue Deployment.
+	FeatureGates map[string]bool `json:"featureGates,omitempty"`
+
+	// ObjectRetentionPolicies provides configuration options for automatic deletion
+	// of Kueue-managed objects. A nil value disables all automatic deletions.
+	// +optional
+	ObjectRetentionPolicies *ObjectRetentionPolicies `json:"objectRetentionPolicies,omitempty"`
+}
+
+type ControllerManager struct {
+	// Webhook contains the controllers webhook configuration
+	// +optional
+	Webhook ControllerWebhook `json:"webhook,omitempty"`
+
+	// LeaderElection is the LeaderElection config to be used when configuring
+	// the manager.Manager leader election
+	// +optional
+	LeaderElection *configv1alpha1.LeaderElectionConfiguration `json:"leaderElection,omitempty"`
+
+	// Metrics contains the controller metrics configuration
+	// +optional
+	Metrics ControllerMetrics `json:"metrics,omitempty"`
+
+	// Health contains the controller health configuration
+	// +optional
+	Health ControllerHealth `json:"health,omitempty"`
+
+	// PprofBindAddress is the TCP address that the controller should bind to
+	// for serving pprof.
+	// It can be set to "" or "0" to disable the pprof serving.
+	// Since pprof may contain sensitive information, make sure to protect it
+	// before exposing it to public.
+	// +optional
+	PprofBindAddress string `json:"pprofBindAddress,omitempty"`
+
+	// Controller contains global configuration options for controllers
+	// registered within this manager.
+	// +optional
+	Controller *ControllerConfigurationSpec `json:"controller,omitempty"`
+}
+
+// ControllerWebhook defines the webhook server for the controller.
+type ControllerWebhook struct {
+	// Port is the port that the webhook server serves at.
+	// It is used to set webhook.Server.Port.
+	// +optional
+	Port *int `json:"port,omitempty"`
+
+	// Host is the hostname that the webhook server binds to.
+	// It is used to set webhook.Server.Host.
+	// +optional
+	Host string `json:"host,omitempty"`
+
+	// CertDir is the directory that contains the server key and certificate.
+	// if not set, webhook server would look up the server key and certificate in
+	// {TempDir}/k8s-webhook-server/serving-certs. The server key and certificate
+	// must be named tls.key and tls.crt, respectively.
+	// +optional
+	CertDir string `json:"certDir,omitempty"`
+}
+
+// ControllerMetrics defines the metrics configs.
+type ControllerMetrics struct {
+	// BindAddress is the TCP address that the controller should bind to
+	// for serving prometheus metrics.
+	// It can be set to "0" to disable the metrics serving.
+	// +optional
+	BindAddress string `json:"bindAddress,omitempty"`
+
+	// EnableClusterQueueResources, if true the cluster queue resource usage and quotas
+	// metrics will be reported.
+	// +optional
+	EnableClusterQueueResources bool `json:"enableClusterQueueResources,omitempty"`
+}
+
+// ControllerHealth defines the health configs.
+type ControllerHealth struct {
+	// HealthProbeBindAddress is the TCP address that the controller should bind to
+	// for serving health probes
+	// It can be set to "0" or "" to disable serving the health probe.
+	// +optional
+	HealthProbeBindAddress string `json:"healthProbeBindAddress,omitempty"`
+
+	// ReadinessEndpointName, defaults to "readyz"
+	// +optional
+	ReadinessEndpointName string `json:"readinessEndpointName,omitempty"`
+
+	// LivenessEndpointName, defaults to "healthz"
+	// +optional
+	LivenessEndpointName string `json:"livenessEndpointName,omitempty"`
+}
+
+// ControllerConfigurationSpec defines the global configuration for
+// controllers registered with the manager.
+type ControllerConfigurationSpec struct {
+	// GroupKindConcurrency is a map from a Kind to the number of concurrent reconciliation
+	// allowed for that controller.
+	//
+	// When a controller is registered within this manager using the builder utilities,
+	// users have to specify the type the controller reconciles in the For(...) call.
+	// If the object's kind passed matches one of the keys in this map, the concurrency
+	// for that controller is set to the number specified.
+	//
+	// The key is expected to be consistent in form with GroupKind.String(),
+	// e.g. ReplicaSet in apps group (regardless of version) would be `ReplicaSet.apps`.
+	//
+	// +optional
+	GroupKindConcurrency map[string]int `json:"groupKindConcurrency,omitempty"`
+
+	// CacheSyncTimeout refers to the time limit set to wait for syncing caches.
+	// Defaults to 2 minutes if not set.
+	// +optional
+	CacheSyncTimeout *time.Duration `json:"cacheSyncTimeout,omitempty"`
+}
+
+// WaitForPodsReady defines configuration for the Wait For Pods Ready feature,
+// which is used to ensure that all Pods are ready within the specified time.
+type WaitForPodsReady struct {
+	// Enable indicates whether to enable wait for pods ready feature.
+	// Defaults to false.
+	Enable bool `json:"enable,omitempty"`
+
+	// Timeout defines the time for an admitted workload to reach the
+	// PodsReady=true condition. When the timeout is exceeded, the workload
+	// evicted and requeued in the same cluster queue.
+	// Defaults to 5min.
+	// +optional
+	Timeout *metav1.Duration `json:"timeout,omitempty"`
+
+	// BlockAdmission when true, cluster queue will block admissions for all
+	// subsequent jobs until the jobs reach the PodsReady=true condition.
+	// This setting is only honored when `Enable` is set to true.
+	BlockAdmission *bool `json:"blockAdmission,omitempty"`
+
+	// RequeuingStrategy defines the strategy for requeuing a Workload.
+	// +optional
+	RequeuingStrategy *RequeuingStrategy `json:"requeuingStrategy,omitempty"`
+
+	// RecoveryTimeout defines an opt-in timeout, measured since the
+	// last transition to the PodsReady=false condition after a Workload is Admitted and running.
+	// Such a transition may happen when a Pod failed and the replacement Pod
+	// is awaited to be scheduled.
+	// After exceeding the timeout the corresponding job gets suspended again
+	// and requeued after the backoff delay. The timeout is enforced only if waitForPodsReady.enable=true.
+	// If not set, there is no timeout.
+	// +optional
+	RecoveryTimeout *metav1.Duration `json:"recoveryTimeout,omitempty"`
+}
+
+type MultiKueue struct {
+	// GCInterval defines the time interval between two consecutive garbage collection runs.
+	// Defaults to 1min. If 0, the garbage collection is disabled.
+	// +optional
+	GCInterval *metav1.Duration `json:"gcInterval"`
+
+	// Origin defines a label value used to track the creator of workloads in the worker
+	// clusters.
+	// This is used by multikueue in components like its garbage collector to identify
+	// remote objects that ware created by this multikueue manager cluster and delete
+	// them if their local counterpart no longer exists.
+	// +optional
+	Origin *string `json:"origin,omitempty"`
+
+	// WorkerLostTimeout defines the time a local workload's multikueue admission check state is kept Ready
+	// if the connection with its reserving worker cluster is lost.
+	//
+	// Defaults to 15 minutes.
+	// +optional
+	WorkerLostTimeout *metav1.Duration `json:"workerLostTimeout,omitempty"`
+
+	// DispatcherName defines the dispatcher responsible for selecting worker clusters to handle the workload.
+	// - If specified, the workload will be handled by the named dispatcher.
+	// - If not specified, the workload will be handled by the default ("kueue.x-k8s.io/multikueue-dispatcher-all-at-once") dispatcher.
+	// +optional
+	DispatcherName *string `json:"dispatcherName,omitempty"`
+
+	// ExternalFrameworks defines a list of external frameworks that should be supported
+	// by the generic MultiKueue adapter. Each entry defines how to handle a specific
+	// GroupVersionKind (GVK) for MultiKueue operations.
+	// +optional
+	ExternalFrameworks []MultiKueueExternalFramework `json:"externalFrameworks,omitempty"`
+}
+
+// MultiKueueExternalFramework defines a framework that is not built-in.
+type MultiKueueExternalFramework struct {
+	// Name is the GVK of the resource that are
+	// managed by external controllers
+	// the expected format is `kind.version.group`.
+	Name string `json:"name"`
+}
+
+const (
+	// MultiKueueDispatcherModeAllAtOnce is the name of dispatcher mode where all worker clusters are considered at once
+	// and the first one accepting the workload is selected.
+	MultiKueueDispatcherModeAllAtOnce = "kueue.x-k8s.io/multikueue-dispatcher-all-at-once"
+
+	// MultiKueueDispatcherModeIncremental is the name of dispatcher mode where worker clusters are incrementally added to the pool of nominated clusters.
+	// The process begins with up to 3 initial clusters and expands the pool by up to 3 clusters at a time (if fewer remain, all are added).
+	MultiKueueDispatcherModeIncremental = "kueue.x-k8s.io/multikueue-dispatcher-incremental"
+)
+
+type RequeuingStrategy struct {
+	// Timestamp defines the timestamp used for re-queuing a Workload
+	// that was evicted due to Pod readiness. The possible values are:
+	//
+	// - `Eviction` (default) indicates from Workload `Evicted` condition with `PodsReadyTimeout` reason.
+	// - `Creation` indicates from Workload .metadata.creationTimestamp.
+	//
+	// +optional
+	Timestamp *RequeuingTimestamp `json:"timestamp,omitempty"`
+
+	// BackoffLimitCount defines the maximum number of re-queuing retries.
+	// Once the number is reached, the workload is deactivated (`.spec.activate`=`false`).
+	// When it is null, the workloads will repeatedly and endless re-queueing.
+	//
+	// Every backoff duration is about "b*2^(n-1)+Rand" where:
+	// - "b" represents the base set by "BackoffBaseSeconds" parameter,
+	// - "n" represents the "workloadStatus.requeueState.count",
+	// - "Rand" represents the random jitter.
+	// During this time, the workload is taken as an inadmissible and
+	// other workloads will have a chance to be admitted.
+	// By default, the consecutive requeue delays are around: (60s, 120s, 240s, ...).
+	//
+	// Defaults to null.
+	// +optional
+	BackoffLimitCount *int32 `json:"backoffLimitCount,omitempty"`
+
+	// BackoffBaseSeconds defines the base for the exponential backoff for
+	// re-queuing an evicted workload.
+	//
+	// Defaults to 60.
+	// +optional
+	BackoffBaseSeconds *int32 `json:"backoffBaseSeconds,omitempty"`
+
+	// BackoffMaxSeconds defines the maximum backoff time to re-queue an evicted workload.
+	//
+	// Defaults to 3600.
+	// +optional
+	BackoffMaxSeconds *int32 `json:"backoffMaxSeconds,omitempty"`
+}
+
+type RequeuingTimestamp string
+
+const (
+	// CreationTimestamp timestamp (from Workload .metadata.creationTimestamp).
+	CreationTimestamp RequeuingTimestamp = "Creation"
+
+	// EvictionTimestamp timestamp (from Workload .status.conditions).
+	EvictionTimestamp RequeuingTimestamp = "Eviction"
+)
+
+type InternalCertManagement struct {
+	// Enable controls the use of internal cert management for the webhook,
+	// metrics and visibility endpoints.
+	// When enabled Kueue is using libraries to generate and
+	// self-sign the certificates.
+	// When disabled, you need to provide the certificates for
+	// the webhooks, metrics and visibility through a third party certificate
+	// This secret is mounted to the kueue controller manager pod. The mount
+	// path for webhooks is /tmp/k8s-webhook-server/serving-certs, for
+	// metrics endpoint the expected path is `/etc/kueue/metrics/certs` and for
+	// visibility endpoint the expected path is `/visibility`.
+	// The keys and certs are named tls.key and tls.crt.
+	Enable *bool `json:"enable,omitempty"`
+
+	// WebhookServiceName is the name of the Service used as part of the DNSName.
+	// Defaults to kueue-webhook-service.
+	WebhookServiceName *string `json:"webhookServiceName,omitempty"`
+
+	// WebhookSecretName is the name of the Secret used to store CA and server certs.
+	// Defaults to kueue-webhook-server-cert.
+	WebhookSecretName *string `json:"webhookSecretName,omitempty"`
+}
+
+type ClientConnection struct {
+	// QPS controls the number of queries per second allowed for K8S api server
+	// connection.
+	//
+	// Setting this to a negative value will disable client-side ratelimiting.
+	QPS *float32 `json:"qps,omitempty"`
+
+	// Burst allows extra queries to accumulate when a client is exceeding its rate.
+	Burst *int32 `json:"burst,omitempty"`
+}
+
+type Integrations struct {
+	// List of framework names to be enabled.
+	// Possible options:
+	//  - "batch/job"
+	//  - "kubeflow.org/mpijob"
+	//  - "ray.io/rayjob"
+	//  - "ray.io/raycluster"
+	//  - "jobset.x-k8s.io/jobset"
+	//  - "kubeflow.org/paddlejob"
+	//  - "kubeflow.org/pytorchjob"
+	//  - "kubeflow.org/tfjob"
+	//  - "kubeflow.org/xgboostjob"
+	//  - "kubeflow.org/jaxjob"
+	//  - "trainer.kubeflow.org/trainjob"
+	//  - "workload.codeflare.dev/appwrapper"
+	//  - "pod"
+	//  - "deployment" (requires enabling pod integration)
+	//  - "statefulset" (requires enabling pod integration)
+	//  - "leaderworkerset.x-k8s.io/leaderworkerset" (requires enabling pod integration)
+	Frameworks []string `json:"frameworks,omitempty"`
+	// List of GroupVersionKinds that are managed for Kueue by external controllers;
+	// the expected format is `Kind.version.group.com`.
+	ExternalFrameworks []string `json:"externalFrameworks,omitempty"`
+	// PodOptions defines kueue controller behaviour for pod objects
+	// Deprecated: This field will be removed on v1beta2, use ManagedJobsNamespaceSelector
+	// (https://kueue.sigs.k8s.io/docs/tasks/run/plain_pods/)
+	// instead.
+	PodOptions *PodIntegrationOptions `json:"podOptions,omitempty"`
+
+	// labelKeysToCopy is a list of label keys that should be copied from the job into the
+	// workload object. It is not required for the job to have all the labels from this
+	// list. If a job does not have some label with the given key from this list, the
+	// constructed workload object will be created without this label. In the case
+	// of creating a workload from a composable job (pod group), if multiple objects
+	// have labels with some key from the list, the values of these labels must
+	// match or otherwise the workload creation would fail. The labels are copied only
+	// during the workload creation and are not updated even if the labels of the
+	// underlying job are changed.
+	LabelKeysToCopy []string `json:"labelKeysToCopy,omitempty"`
+}
+
+type PodIntegrationOptions struct {
+	// NamespaceSelector can be used to omit some namespaces from pod reconciliation
+	NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty"`
+	// PodSelector can be used to choose what pods to reconcile
+	PodSelector *metav1.LabelSelector `json:"podSelector,omitempty"`
+}
+
+type QueueVisibility struct {
+	// ClusterQueues is configuration to expose the information
+	// about the top pending workloads in the cluster queue.
+	ClusterQueues *ClusterQueueVisibility `json:"clusterQueues,omitempty"`
+
+	// UpdateIntervalSeconds specifies the time interval for updates to the structure
+	// of the top pending workloads in the queues.
+	// The minimum value is 1.
+	// Defaults to 5.
+	UpdateIntervalSeconds int32 `json:"updateIntervalSeconds,omitempty"`
+}
+
+type ClusterQueueVisibility struct {
+	// MaxCount indicates the maximal number of pending workloads exposed in the
+	// cluster queue status.  When the value is set to 0, then ClusterQueue
+	// visibility updates are disabled.
+	// The maximal value is 4000.
+	// Defaults to 10.
+	MaxCount int32 `json:"maxCount,omitempty"`
+}
+
+type Resources struct {
+	// ExcludedResourcePrefixes defines which resources should be ignored by Kueue
+	ExcludeResourcePrefixes []string `json:"excludeResourcePrefixes,omitempty"`
+
+	// Transformations defines how to transform PodSpec resources into Workload resource requests.
+	// This is intended to be a map with Input as the key (enforced by validation code)
+	Transformations []ResourceTransformation `json:"transformations,omitempty"`
+
+	// DeviceClassMappings defines mappings from device classes to logical resources
+	// for Dynamic Resource Allocation support.
+	// +optional
+	DeviceClassMappings []DeviceClassMapping `json:"deviceClassMappings,omitempty"`
+}
+
+type ResourceTransformationStrategy string
+
+const Retain ResourceTransformationStrategy = "Retain"
+const Replace ResourceTransformationStrategy = "Replace"
+
+type ResourceTransformation struct {
+	// Input is the name of the input resource.
+	Input corev1.ResourceName `json:"input"`
+
+	// Strategy specifies if the input resource should be replaced or retained.
+	// Defaults to Retain
+	Strategy *ResourceTransformationStrategy `json:"strategy,omitempty"`
+
+	// Outputs specifies the output resources and quantities per unit of input resource.
+	// An empty Outputs combined with a `Replace` Strategy causes the Input resource to be ignored by Kueue.
+	Outputs corev1.ResourceList `json:"outputs,omitempty"`
+}
+
+// DeviceClassMapping holds device class to logical resource mappings
+// for Dynamic Resource Allocation support.
+type DeviceClassMapping struct {
+	// Name is referenced in ClusterQueue.nominalQuota and Workload status.
+	// Must be a valid fully qualified name consisting of an optional DNS subdomain prefix
+	// followed by a slash and a DNS label, or just a DNS label.
+	// DNS labels consist of lower-case alphanumeric characters or hyphens,
+	// and must start and end with an alphanumeric character.
+	// DNS subdomain prefixes follow the same rules as DNS labels but can contain periods.
+	// The total length must not exceed 253 characters.
+	Name corev1.ResourceName `json:"name"`
+
+	// DeviceClassNames enumerates the DeviceClasses represented by this resource name.
+	// Each device class name must be a valid qualified name consisting of an optional DNS subdomain prefix
+	// followed by a slash and a DNS label, or just a DNS label.
+	// DNS labels consist of lower-case alphanumeric characters or hyphens,
+	// and must start and end with an alphanumeric character.
+	// DNS subdomain prefixes follow the same rules as DNS labels but can contain periods.
+	// The total length of each name must not exceed 253 characters.
+	DeviceClassNames []corev1.ResourceName `json:"deviceClassNames"`
+}
+
+type PreemptionStrategy string
+
+const (
+	LessThanOrEqualToFinalShare PreemptionStrategy = "LessThanOrEqualToFinalShare"
+	LessThanInitialShare        PreemptionStrategy = "LessThanInitialShare"
+)
+
+type FairSharing struct {
+	// enable indicates whether to enable Fair Sharing for all cohorts.
+	// Defaults to false.
+	Enable bool `json:"enable"`
+
+	// preemptionStrategies indicates which constraints should a preemption satisfy.
+	// The preemption algorithm will only use the next strategy in the list if the
+	// incoming workload (preemptor) doesn't fit after using the previous strategies.
+	// Possible values are:
+	// - LessThanOrEqualToFinalShare: Only preempt a workload if the share of the preemptor CQ
+	//   with the preemptor workload is less than or equal to the share of the preemptee CQ
+	//   without the workload to be preempted.
+	//   This strategy might favor preemption of smaller workloads in the preemptee CQ,
+	//   regardless of priority or start time, in an effort to keep the share of the CQ
+	//   as high as possible.
+	// - LessThanInitialShare: Only preempt a workload if the share of the preemptor CQ
+	//   with the incoming workload is strictly less than the share of the preemptee CQ.
+	//   This strategy doesn't depend on the share usage of the workload being preempted.
+	//   As a result, the strategy chooses to preempt workloads with the lowest priority and
+	//   newest start time first.
+	// The default strategy is ["LessThanOrEqualToFinalShare", "LessThanInitialShare"].
+	PreemptionStrategies []PreemptionStrategy `json:"preemptionStrategies,omitempty"`
+}
+
+type AdmissionFairSharing struct {
+	// usageHalfLifeTime indicates the time after which the current usage will decay by a half
+	// If set to 0, usage will be reset to 0 immediately.
+	UsageHalfLifeTime metav1.Duration `json:"usageHalfLifeTime"`
+
+	// usageSamplingInterval indicates how often Kueue updates consumedResources in FairSharingStatus
+	// Defaults to 5min.
+	UsageSamplingInterval metav1.Duration `json:"usageSamplingInterval"`
+
+	// resourceWeights assigns weights to resources which then are used to calculate LocalQueue's
+	// resource usage and order Workloads.
+	// Defaults to 1.
+	ResourceWeights map[corev1.ResourceName]float64 `json:"resourceWeights,omitempty"`
+}
+
+// ObjectRetentionPolicies holds retention settings for different object types.
+type ObjectRetentionPolicies struct {
+	// Workloads configures retention for Workloads.
+	// A nil value disables automatic deletion of Workloads.
+	// +optional
+	Workloads *WorkloadRetentionPolicy `json:"workloads,omitempty"`
+}
+
+// WorkloadRetentionPolicy defines the policies for when Workloads should be deleted.
+type WorkloadRetentionPolicy struct {
+	// AfterFinished is the duration to wait after a Workload finishes
+	// before deleting it.
+	// A duration of 0 will delete immediately.
+	// A nil value disables automatic deletion.
+	// Represented using metav1.Duration (e.g. "10m", "1h30m").
+	// +optional
+	AfterFinished *metav1.Duration `json:"afterFinished,omitempty"`
+
+	// AfterDeactivatedByKueue is the duration to wait after *any* Kueue-managed Workload
+	// (such as a Job, JobSet, or other custom workload types) has been marked
+	// as deactivated by Kueue before automatically deleting it.
+	// Deletion of deactivated workloads may cascade to objects not created by
+	// Kueue, since deleting the parent Workload owner (e.g. JobSet) can trigger
+	// garbage-collection of dependent resources.
+	// A duration of 0 will delete immediately.
+	// A nil value disables automatic deletion.
+	// Represented using metav1.Duration (e.g. "10m", "1h30m").
+	// +optional
+	AfterDeactivatedByKueue *metav1.Duration `json:"afterDeactivatedByKueue,omitempty"`
+}
diff --git a/apis/config/v1beta2/defaults.go b/apis/config/v1beta2/defaults.go
new file mode 100644
index 000000000..cbbcbd821
--- /dev/null
+++ b/apis/config/v1beta2/defaults.go
@@ -0,0 +1,138 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta2
+
+import (
+	"cmp"
+	"os"
+	"strings"
+	"time"
+
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/tools/leaderelection/resourcelock"
+	configv1alpha1 "k8s.io/component-base/config/v1alpha1"
+	"k8s.io/utils/ptr"
+)
+
+const (
+	DefaultNamespace                              = "kueue-system"
+	DefaultWebhookServiceName                     = "kueue-webhook-service"
+	DefaultWebhookSecretName                      = "kueue-webhook-server-cert"
+	DefaultWebhookPort                            = 9443
+	DefaultWebhookCertDir                         = "/tmp/k8s-webhook-server/serving-certs"
+	DefaultHealthProbeBindAddress                 = ":8081"
+	DefaultMetricsBindAddress                     = ":8443"
+	DefaultLeaderElectionID                       = "c1f6bfd2.kueue.x-k8s.io"
+	DefaultLeaderElectionLeaseDuration            = 15 * time.Second
+	DefaultLeaderElectionRenewDeadline            = 10 * time.Second
+	DefaultLeaderElectionRetryPeriod              = 2 * time.Second
+	DefaultClientConnectionQPS            float32 = 20.0
+	DefaultClientConnectionBurst          int32   = 30
+	defaultPodsReadyTimeout                       = 5 * time.Minute
+	defaultJobFrameworkName                       = "batch/job"
+	DefaultMultiKueueGCInterval                   = time.Minute
+	DefaultMultiKueueOrigin                       = "multikueue"
+	DefaultMultiKueueWorkerLostTimeout            = 15 * time.Minute
+	DefaultRequeuingBackoffBaseSeconds            = 60
+	DefaultRequeuingBackoffMaxSeconds             = 3600
+	DefaultResourceTransformationStrategy         = Retain
+)
+
+func getOperatorNamespace() string {
+	if data, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace"); err == nil {
+		if ns := strings.TrimSpace(string(data)); len(ns) > 0 {
+			return ns
+		}
+	}
+	return DefaultNamespace
+}
+
+// SetDefaults_Configuration sets default values for ComponentConfig.
+//
+//nolint:revive // format required by generated code for defaulting
+func SetDefaults_Configuration(cfg *Configuration) {
+	cfg.Namespace = cmp.Or(cfg.Namespace, ptr.To(getOperatorNamespace()))
+	cfg.Webhook.Port = cmp.Or(cfg.Webhook.Port, ptr.To(DefaultWebhookPort))
+	cfg.Webhook.CertDir = cmp.Or(cfg.Webhook.CertDir, DefaultWebhookCertDir)
+	cfg.Metrics.BindAddress = cmp.Or(cfg.Metrics.BindAddress, DefaultMetricsBindAddress)
+	cfg.Health.HealthProbeBindAddress = cmp.Or(cfg.Health.HealthProbeBindAddress, DefaultHealthProbeBindAddress)
+	cfg.LeaderElection = cmp.Or(cfg.LeaderElection, &configv1alpha1.LeaderElectionConfiguration{})
+	cfg.LeaderElection.ResourceName = cmp.Or(cfg.LeaderElection.ResourceName, DefaultLeaderElectionID)
+
+	// Default to Lease as component-base still defaults to endpoint resources
+	// until core components migrate to using Leases. See k/k #80289 for more details.
+	cfg.LeaderElection.ResourceLock = cmp.Or(cfg.LeaderElection.ResourceLock, resourcelock.LeasesResourceLock)
+
+	// Use the default LeaderElectionConfiguration options
+	configv1alpha1.RecommendedDefaultLeaderElectionConfiguration(cfg.LeaderElection)
+
+	cfg.InternalCertManagement = cmp.Or(cfg.InternalCertManagement, &InternalCertManagement{})
+	cfg.InternalCertManagement.Enable = cmp.Or(cfg.InternalCertManagement.Enable, ptr.To(true))
+	if *cfg.InternalCertManagement.Enable {
+		cfg.InternalCertManagement.WebhookServiceName = cmp.Or(cfg.InternalCertManagement.WebhookServiceName, ptr.To(DefaultWebhookServiceName))
+		cfg.InternalCertManagement.WebhookSecretName = cmp.Or(cfg.InternalCertManagement.WebhookSecretName, ptr.To(DefaultWebhookSecretName))
+	}
+
+	cfg.ClientConnection = cmp.Or(cfg.ClientConnection, &ClientConnection{})
+	cfg.ClientConnection.QPS = cmp.Or(cfg.ClientConnection.QPS, ptr.To(DefaultClientConnectionQPS))
+	cfg.ClientConnection.Burst = cmp.Or(cfg.ClientConnection.Burst, ptr.To(DefaultClientConnectionBurst))
+
+	cfg.WaitForPodsReady = cmp.Or(cfg.WaitForPodsReady, &WaitForPodsReady{Enable: false})
+	if cfg.WaitForPodsReady.Enable {
+		cfg.WaitForPodsReady.Timeout = cmp.Or(cfg.WaitForPodsReady.Timeout, &metav1.Duration{Duration: defaultPodsReadyTimeout})
+		cfg.WaitForPodsReady.BlockAdmission = cmp.Or(cfg.WaitForPodsReady.BlockAdmission, &cfg.WaitForPodsReady.Enable)
+		cfg.WaitForPodsReady.RequeuingStrategy = cmp.Or(cfg.WaitForPodsReady.RequeuingStrategy, &RequeuingStrategy{})
+		cfg.WaitForPodsReady.RequeuingStrategy.Timestamp = cmp.Or(cfg.WaitForPodsReady.RequeuingStrategy.Timestamp, ptr.To(EvictionTimestamp))
+		cfg.WaitForPodsReady.RequeuingStrategy.BackoffBaseSeconds = cmp.Or(cfg.WaitForPodsReady.RequeuingStrategy.BackoffBaseSeconds, ptr.To[int32](DefaultRequeuingBackoffBaseSeconds))
+		cfg.WaitForPodsReady.RequeuingStrategy.BackoffMaxSeconds = cmp.Or(cfg.WaitForPodsReady.RequeuingStrategy.BackoffMaxSeconds, ptr.To[int32](DefaultRequeuingBackoffMaxSeconds))
+	}
+
+	cfg.Integrations = cmp.Or(cfg.Integrations, &Integrations{})
+	if len(cfg.Integrations.Frameworks) == 0 {
+		cfg.Integrations.Frameworks = []string{defaultJobFrameworkName}
+	}
+
+	cfg.ManagedJobsNamespaceSelector = cmp.Or(cfg.ManagedJobsNamespaceSelector, &metav1.LabelSelector{
+		MatchExpressions: []metav1.LabelSelectorRequirement{
+			{
+				Key:      corev1.LabelMetadataName,
+				Operator: metav1.LabelSelectorOpNotIn,
+				Values:   []string{"kube-system", *cfg.Namespace},
+			},
+		},
+	})
+
+	cfg.MultiKueue = cmp.Or(cfg.MultiKueue, &MultiKueue{})
+	cfg.MultiKueue.GCInterval = cmp.Or(cfg.MultiKueue.GCInterval, &metav1.Duration{Duration: DefaultMultiKueueGCInterval})
+	cfg.MultiKueue.Origin = ptr.To(cmp.Or(ptr.Deref(cfg.MultiKueue.Origin, ""), DefaultMultiKueueOrigin))
+	cfg.MultiKueue.WorkerLostTimeout = cmp.Or(cfg.MultiKueue.WorkerLostTimeout, &metav1.Duration{Duration: DefaultMultiKueueWorkerLostTimeout})
+	cfg.MultiKueue.DispatcherName = cmp.Or(cfg.MultiKueue.DispatcherName, ptr.To(MultiKueueDispatcherModeAllAtOnce))
+
+	if fs := cfg.FairSharing; fs != nil && fs.Enable && len(fs.PreemptionStrategies) == 0 {
+		fs.PreemptionStrategies = []PreemptionStrategy{LessThanOrEqualToFinalShare, LessThanInitialShare}
+	}
+	if afs := cfg.AdmissionFairSharing; afs != nil {
+		afs.UsageSamplingInterval.Duration = cmp.Or(afs.UsageSamplingInterval.Duration, 5*time.Minute)
+	}
+
+	if cfg.Resources != nil {
+		for idx := range cfg.Resources.Transformations {
+			cfg.Resources.Transformations[idx].Strategy = ptr.To(cmp.Or(ptr.Deref(cfg.Resources.Transformations[idx].Strategy, ""), DefaultResourceTransformationStrategy))
+		}
+	}
+}
diff --git a/apis/config/v1beta2/doc.go b/apis/config/v1beta2/doc.go
new file mode 100644
index 000000000..1cb1ffb86
--- /dev/null
+++ b/apis/config/v1beta2/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// +kubebuilder:object:generate=true
+// +groupName=config.kueue.x-k8s.io
+
+package v1beta2
diff --git a/apis/config/v1beta2/groupversion_info.go b/apis/config/v1beta2/groupversion_info.go
new file mode 100644
index 000000000..12d8c6e9c
--- /dev/null
+++ b/apis/config/v1beta2/groupversion_info.go
@@ -0,0 +1,48 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Package v1beta2 contains API Schema definitions for the config v1beta2 API group
+// +kubebuilder:object:generate=true
+// +groupName=config.kueue.x-k8s.io
+package v1beta2
+
+import (
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"sigs.k8s.io/controller-runtime/pkg/scheme"
+)
+
+var (
+	// GroupVersion is group version used to register these objects
+	GroupVersion = schema.GroupVersion{Group: "config.kueue.x-k8s.io", Version: "v1beta2"}
+
+	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
+	SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
+
+	// localSchemeBuilder is used to register autogenerated conversion and defaults functions
+	// It is required by ./zz_generated.conversion.go and ./zz_generated.defaults.go
+	localSchemeBuilder = &SchemeBuilder.SchemeBuilder
+
+	// AddToScheme adds the types in this group-version to the given scheme.
+	AddToScheme = SchemeBuilder.AddToScheme
+)
+
+func init() {
+	SchemeBuilder.Register(&Configuration{})
+	// We only register manually written functions here. The registration of the
+	// generated functions takes place in the generated files. The separation
+	// makes the code compile even when the generated files are missing.
+	localSchemeBuilder.Register(RegisterDefaults)
+}
diff --git a/apis/config/v1beta2/zz_generated.deepcopy.go b/apis/config/v1beta2/zz_generated.deepcopy.go
new file mode 100644
index 000000000..859b944e3
--- /dev/null
+++ b/apis/config/v1beta2/zz_generated.deepcopy.go
@@ -0,0 +1,671 @@
+//go:build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/component-base/config/v1alpha1"
+	timex "time"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AdmissionFairSharing) DeepCopyInto(out *AdmissionFairSharing) {
+	*out = *in
+	out.UsageHalfLifeTime = in.UsageHalfLifeTime
+	out.UsageSamplingInterval = in.UsageSamplingInterval
+	if in.ResourceWeights != nil {
+		in, out := &in.ResourceWeights, &out.ResourceWeights
+		*out = make(map[corev1.ResourceName]float64, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionFairSharing.
+func (in *AdmissionFairSharing) DeepCopy() *AdmissionFairSharing {
+	if in == nil {
+		return nil
+	}
+	out := new(AdmissionFairSharing)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClientConnection) DeepCopyInto(out *ClientConnection) {
+	*out = *in
+	if in.QPS != nil {
+		in, out := &in.QPS, &out.QPS
+		*out = new(float32)
+		**out = **in
+	}
+	if in.Burst != nil {
+		in, out := &in.Burst, &out.Burst
+		*out = new(int32)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientConnection.
+func (in *ClientConnection) DeepCopy() *ClientConnection {
+	if in == nil {
+		return nil
+	}
+	out := new(ClientConnection)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterQueueVisibility) DeepCopyInto(out *ClusterQueueVisibility) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterQueueVisibility.
+func (in *ClusterQueueVisibility) DeepCopy() *ClusterQueueVisibility {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterQueueVisibility)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Configuration) DeepCopyInto(out *Configuration) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	if in.Namespace != nil {
+		in, out := &in.Namespace, &out.Namespace
+		*out = new(string)
+		**out = **in
+	}
+	in.ControllerManager.DeepCopyInto(&out.ControllerManager)
+	if in.ManagedJobsNamespaceSelector != nil {
+		in, out := &in.ManagedJobsNamespaceSelector, &out.ManagedJobsNamespaceSelector
+		*out = new(v1.LabelSelector)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.InternalCertManagement != nil {
+		in, out := &in.InternalCertManagement, &out.InternalCertManagement
+		*out = new(InternalCertManagement)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.WaitForPodsReady != nil {
+		in, out := &in.WaitForPodsReady, &out.WaitForPodsReady
+		*out = new(WaitForPodsReady)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.ClientConnection != nil {
+		in, out := &in.ClientConnection, &out.ClientConnection
+		*out = new(ClientConnection)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Integrations != nil {
+		in, out := &in.Integrations, &out.Integrations
+		*out = new(Integrations)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.QueueVisibility != nil {
+		in, out := &in.QueueVisibility, &out.QueueVisibility
+		*out = new(QueueVisibility)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.MultiKueue != nil {
+		in, out := &in.MultiKueue, &out.MultiKueue
+		*out = new(MultiKueue)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.FairSharing != nil {
+		in, out := &in.FairSharing, &out.FairSharing
+		*out = new(FairSharing)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.AdmissionFairSharing != nil {
+		in, out := &in.AdmissionFairSharing, &out.AdmissionFairSharing
+		*out = new(AdmissionFairSharing)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = new(Resources)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.FeatureGates != nil {
+		in, out := &in.FeatureGates, &out.FeatureGates
+		*out = make(map[string]bool, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.ObjectRetentionPolicies != nil {
+		in, out := &in.ObjectRetentionPolicies, &out.ObjectRetentionPolicies
+		*out = new(ObjectRetentionPolicies)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Configuration.
+func (in *Configuration) DeepCopy() *Configuration {
+	if in == nil {
+		return nil
+	}
+	out := new(Configuration)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Configuration) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerConfigurationSpec) DeepCopyInto(out *ControllerConfigurationSpec) {
+	*out = *in
+	if in.GroupKindConcurrency != nil {
+		in, out := &in.GroupKindConcurrency, &out.GroupKindConcurrency
+		*out = make(map[string]int, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.CacheSyncTimeout != nil {
+		in, out := &in.CacheSyncTimeout, &out.CacheSyncTimeout
+		*out = new(timex.Duration)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerConfigurationSpec.
+func (in *ControllerConfigurationSpec) DeepCopy() *ControllerConfigurationSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ControllerConfigurationSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerHealth) DeepCopyInto(out *ControllerHealth) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerHealth.
+func (in *ControllerHealth) DeepCopy() *ControllerHealth {
+	if in == nil {
+		return nil
+	}
+	out := new(ControllerHealth)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerManager) DeepCopyInto(out *ControllerManager) {
+	*out = *in
+	in.Webhook.DeepCopyInto(&out.Webhook)
+	if in.LeaderElection != nil {
+		in, out := &in.LeaderElection, &out.LeaderElection
+		*out = new(v1alpha1.LeaderElectionConfiguration)
+		(*in).DeepCopyInto(*out)
+	}
+	out.Metrics = in.Metrics
+	out.Health = in.Health
+	if in.Controller != nil {
+		in, out := &in.Controller, &out.Controller
+		*out = new(ControllerConfigurationSpec)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerManager.
+func (in *ControllerManager) DeepCopy() *ControllerManager {
+	if in == nil {
+		return nil
+	}
+	out := new(ControllerManager)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerMetrics) DeepCopyInto(out *ControllerMetrics) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerMetrics.
+func (in *ControllerMetrics) DeepCopy() *ControllerMetrics {
+	if in == nil {
+		return nil
+	}
+	out := new(ControllerMetrics)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerWebhook) DeepCopyInto(out *ControllerWebhook) {
+	*out = *in
+	if in.Port != nil {
+		in, out := &in.Port, &out.Port
+		*out = new(int)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerWebhook.
+func (in *ControllerWebhook) DeepCopy() *ControllerWebhook {
+	if in == nil {
+		return nil
+	}
+	out := new(ControllerWebhook)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DeviceClassMapping) DeepCopyInto(out *DeviceClassMapping) {
+	*out = *in
+	if in.DeviceClassNames != nil {
+		in, out := &in.DeviceClassNames, &out.DeviceClassNames
+		*out = make([]corev1.ResourceName, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassMapping.
+func (in *DeviceClassMapping) DeepCopy() *DeviceClassMapping {
+	if in == nil {
+		return nil
+	}
+	out := new(DeviceClassMapping)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *FairSharing) DeepCopyInto(out *FairSharing) {
+	*out = *in
+	if in.PreemptionStrategies != nil {
+		in, out := &in.PreemptionStrategies, &out.PreemptionStrategies
+		*out = make([]PreemptionStrategy, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FairSharing.
+func (in *FairSharing) DeepCopy() *FairSharing {
+	if in == nil {
+		return nil
+	}
+	out := new(FairSharing)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Integrations) DeepCopyInto(out *Integrations) {
+	*out = *in
+	if in.Frameworks != nil {
+		in, out := &in.Frameworks, &out.Frameworks
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ExternalFrameworks != nil {
+		in, out := &in.ExternalFrameworks, &out.ExternalFrameworks
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.PodOptions != nil {
+		in, out := &in.PodOptions, &out.PodOptions
+		*out = new(PodIntegrationOptions)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.LabelKeysToCopy != nil {
+		in, out := &in.LabelKeysToCopy, &out.LabelKeysToCopy
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Integrations.
+func (in *Integrations) DeepCopy() *Integrations {
+	if in == nil {
+		return nil
+	}
+	out := new(Integrations)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *InternalCertManagement) DeepCopyInto(out *InternalCertManagement) {
+	*out = *in
+	if in.Enable != nil {
+		in, out := &in.Enable, &out.Enable
+		*out = new(bool)
+		**out = **in
+	}
+	if in.WebhookServiceName != nil {
+		in, out := &in.WebhookServiceName, &out.WebhookServiceName
+		*out = new(string)
+		**out = **in
+	}
+	if in.WebhookSecretName != nil {
+		in, out := &in.WebhookSecretName, &out.WebhookSecretName
+		*out = new(string)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InternalCertManagement.
+func (in *InternalCertManagement) DeepCopy() *InternalCertManagement {
+	if in == nil {
+		return nil
+	}
+	out := new(InternalCertManagement)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *MultiKueue) DeepCopyInto(out *MultiKueue) {
+	*out = *in
+	if in.GCInterval != nil {
+		in, out := &in.GCInterval, &out.GCInterval
+		*out = new(v1.Duration)
+		**out = **in
+	}
+	if in.Origin != nil {
+		in, out := &in.Origin, &out.Origin
+		*out = new(string)
+		**out = **in
+	}
+	if in.WorkerLostTimeout != nil {
+		in, out := &in.WorkerLostTimeout, &out.WorkerLostTimeout
+		*out = new(v1.Duration)
+		**out = **in
+	}
+	if in.DispatcherName != nil {
+		in, out := &in.DispatcherName, &out.DispatcherName
+		*out = new(string)
+		**out = **in
+	}
+	if in.ExternalFrameworks != nil {
+		in, out := &in.ExternalFrameworks, &out.ExternalFrameworks
+		*out = make([]MultiKueueExternalFramework, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MultiKueue.
+func (in *MultiKueue) DeepCopy() *MultiKueue {
+	if in == nil {
+		return nil
+	}
+	out := new(MultiKueue)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *MultiKueueExternalFramework) DeepCopyInto(out *MultiKueueExternalFramework) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MultiKueueExternalFramework.
+func (in *MultiKueueExternalFramework) DeepCopy() *MultiKueueExternalFramework {
+	if in == nil {
+		return nil
+	}
+	out := new(MultiKueueExternalFramework)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ObjectRetentionPolicies) DeepCopyInto(out *ObjectRetentionPolicies) {
+	*out = *in
+	if in.Workloads != nil {
+		in, out := &in.Workloads, &out.Workloads
+		*out = new(WorkloadRetentionPolicy)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectRetentionPolicies.
+func (in *ObjectRetentionPolicies) DeepCopy() *ObjectRetentionPolicies {
+	if in == nil {
+		return nil
+	}
+	out := new(ObjectRetentionPolicies)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodIntegrationOptions) DeepCopyInto(out *PodIntegrationOptions) {
+	*out = *in
+	if in.NamespaceSelector != nil {
+		in, out := &in.NamespaceSelector, &out.NamespaceSelector
+		*out = new(v1.LabelSelector)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.PodSelector != nil {
+		in, out := &in.PodSelector, &out.PodSelector
+		*out = new(v1.LabelSelector)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodIntegrationOptions.
+func (in *PodIntegrationOptions) DeepCopy() *PodIntegrationOptions {
+	if in == nil {
+		return nil
+	}
+	out := new(PodIntegrationOptions)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QueueVisibility) DeepCopyInto(out *QueueVisibility) {
+	*out = *in
+	if in.ClusterQueues != nil {
+		in, out := &in.ClusterQueues, &out.ClusterQueues
+		*out = new(ClusterQueueVisibility)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueVisibility.
+func (in *QueueVisibility) DeepCopy() *QueueVisibility {
+	if in == nil {
+		return nil
+	}
+	out := new(QueueVisibility)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RequeuingStrategy) DeepCopyInto(out *RequeuingStrategy) {
+	*out = *in
+	if in.Timestamp != nil {
+		in, out := &in.Timestamp, &out.Timestamp
+		*out = new(RequeuingTimestamp)
+		**out = **in
+	}
+	if in.BackoffLimitCount != nil {
+		in, out := &in.BackoffLimitCount, &out.BackoffLimitCount
+		*out = new(int32)
+		**out = **in
+	}
+	if in.BackoffBaseSeconds != nil {
+		in, out := &in.BackoffBaseSeconds, &out.BackoffBaseSeconds
+		*out = new(int32)
+		**out = **in
+	}
+	if in.BackoffMaxSeconds != nil {
+		in, out := &in.BackoffMaxSeconds, &out.BackoffMaxSeconds
+		*out = new(int32)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequeuingStrategy.
+func (in *RequeuingStrategy) DeepCopy() *RequeuingStrategy {
+	if in == nil {
+		return nil
+	}
+	out := new(RequeuingStrategy)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceTransformation) DeepCopyInto(out *ResourceTransformation) {
+	*out = *in
+	if in.Strategy != nil {
+		in, out := &in.Strategy, &out.Strategy
+		*out = new(ResourceTransformationStrategy)
+		**out = **in
+	}
+	if in.Outputs != nil {
+		in, out := &in.Outputs, &out.Outputs
+		*out = make(corev1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceTransformation.
+func (in *ResourceTransformation) DeepCopy() *ResourceTransformation {
+	if in == nil {
+		return nil
+	}
+	out := new(ResourceTransformation)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Resources) DeepCopyInto(out *Resources) {
+	*out = *in
+	if in.ExcludeResourcePrefixes != nil {
+		in, out := &in.ExcludeResourcePrefixes, &out.ExcludeResourcePrefixes
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Transformations != nil {
+		in, out := &in.Transformations, &out.Transformations
+		*out = make([]ResourceTransformation, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.DeviceClassMappings != nil {
+		in, out := &in.DeviceClassMappings, &out.DeviceClassMappings
+		*out = make([]DeviceClassMapping, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Resources.
+func (in *Resources) DeepCopy() *Resources {
+	if in == nil {
+		return nil
+	}
+	out := new(Resources)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *WaitForPodsReady) DeepCopyInto(out *WaitForPodsReady) {
+	*out = *in
+	if in.Timeout != nil {
+		in, out := &in.Timeout, &out.Timeout
+		*out = new(v1.Duration)
+		**out = **in
+	}
+	if in.BlockAdmission != nil {
+		in, out := &in.BlockAdmission, &out.BlockAdmission
+		*out = new(bool)
+		**out = **in
+	}
+	if in.RequeuingStrategy != nil {
+		in, out := &in.RequeuingStrategy, &out.RequeuingStrategy
+		*out = new(RequeuingStrategy)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.RecoveryTimeout != nil {
+		in, out := &in.RecoveryTimeout, &out.RecoveryTimeout
+		*out = new(v1.Duration)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WaitForPodsReady.
+func (in *WaitForPodsReady) DeepCopy() *WaitForPodsReady {
+	if in == nil {
+		return nil
+	}
+	out := new(WaitForPodsReady)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *WorkloadRetentionPolicy) DeepCopyInto(out *WorkloadRetentionPolicy) {
+	*out = *in
+	if in.AfterFinished != nil {
+		in, out := &in.AfterFinished, &out.AfterFinished
+		*out = new(v1.Duration)
+		**out = **in
+	}
+	if in.AfterDeactivatedByKueue != nil {
+		in, out := &in.AfterDeactivatedByKueue, &out.AfterDeactivatedByKueue
+		*out = new(v1.Duration)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkloadRetentionPolicy.
+func (in *WorkloadRetentionPolicy) DeepCopy() *WorkloadRetentionPolicy {
+	if in == nil {
+		return nil
+	}
+	out := new(WorkloadRetentionPolicy)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/apis/config/v1beta2/zz_generated.defaults.go b/apis/config/v1beta2/zz_generated.defaults.go
new file mode 100644
index 000000000..304886432
--- /dev/null
+++ b/apis/config/v1beta2/zz_generated.defaults.go
@@ -0,0 +1,37 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+	scheme.AddTypeDefaultingFunc(&Configuration{}, func(obj interface{}) { SetObjectDefaults_Configuration(obj.(*Configuration)) })
+	return nil
+}
+
+func SetObjectDefaults_Configuration(in *Configuration) {
+	SetDefaults_Configuration(in)
+}
diff --git a/apis/kueue/v1beta1/localqueue_types.go b/apis/kueue/v1beta1/localqueue_types.go
index 564d24491..c46604d9c 100644
--- a/apis/kueue/v1beta1/localqueue_types.go
+++ b/apis/kueue/v1beta1/localqueue_types.go
@@ -56,6 +56,7 @@ type LocalQueueSpec struct {
 	FairSharing *FairSharing `json:"fairSharing,omitempty"`
 }
 
+// Deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.
 type LocalQueueFlavorStatus struct {
 	// name of the flavor.
 	// +required
@@ -154,6 +155,7 @@ type LocalQueueStatus struct {
 	// +listMapKey=name
 	// +kubebuilder:validation:MaxItems=16
 	// +optional
+	// Deprecated: Flavors is deprecated and marked for removal in v1beta2.
 	Flavors []LocalQueueFlavorStatus `json:"flavors,omitempty"`
 
 	// fairSharing contains the information about the current status of fair sharing.
diff --git a/apis/kueue/v1beta2/localqueue_types.go b/apis/kueue/v1beta2/localqueue_types.go
index 9ad483b1c..a19f2d900 100644
--- a/apis/kueue/v1beta2/localqueue_types.go
+++ b/apis/kueue/v1beta2/localqueue_types.go
@@ -56,6 +56,7 @@ type LocalQueueSpec struct {
 	FairSharing *FairSharing `json:"fairSharing,omitempty"`
 }
 
+// Deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.
 type LocalQueueFlavorStatus struct {
 	// name of the flavor.
 	// +required
@@ -154,6 +155,7 @@ type LocalQueueStatus struct {
 	// +listMapKey=name
 	// +kubebuilder:validation:MaxItems=16
 	// +optional
+	// Deprecated: Flavors is deprecated and marked for removal in v1beta2.
 	Flavors []LocalQueueFlavorStatus `json:"flavors,omitempty"`
 
 	// fairSharing contains the information about the current status of fair sharing.
diff --git a/charts/kueue/templates/crd/kueue.x-k8s.io_localqueues.yaml b/charts/kueue/templates/crd/kueue.x-k8s.io_localqueues.yaml
index fb717a951..b6cf04c6f 100644
--- a/charts/kueue/templates/crd/kueue.x-k8s.io_localqueues.yaml
+++ b/charts/kueue/templates/crd/kueue.x-k8s.io_localqueues.yaml
@@ -276,8 +276,11 @@ spec:
                     - name
                   x-kubernetes-list-type: map
                 flavors:
-                  description: flavors lists all currently available ResourceFlavors in specified ClusterQueue.
+                  description: |-
+                    flavors lists all currently available ResourceFlavors in specified ClusterQueue.
+                    Deprecated: Flavors is deprecated and marked for removal in v1beta2.
                   items:
+                    description: 'Deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.'
                     properties:
                       name:
                         description: name of the flavor.
@@ -623,8 +626,11 @@ spec:
                     - weightedShare
                   type: object
                 flavors:
-                  description: flavors lists all currently available ResourceFlavors in specified ClusterQueue.
+                  description: |-
+                    flavors lists all currently available ResourceFlavors in specified ClusterQueue.
+                    Deprecated: Flavors is deprecated and marked for removal in v1beta2.
                   items:
+                    description: 'Deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.'
                     properties:
                       name:
                         description: name of the flavor.
diff --git a/charts/kueue/values.yaml b/charts/kueue/values.yaml
index e2aa043e2..dac543d6a 100644
--- a/charts/kueue/values.yaml
+++ b/charts/kueue/values.yaml
@@ -95,7 +95,7 @@ managerConfig:
   # ControllerManager utilizes this yaml via manager-config Configmap.
   # @default -- controllerManagerConfigYaml
   controllerManagerConfigYaml: |-
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     health:
       healthProbeBindAddress: :8081
diff --git a/cmd/kueue/main.go b/cmd/kueue/main.go
index 1f8cff3dd..5f8221c17 100644
--- a/cmd/kueue/main.go
+++ b/cmd/kueue/main.go
@@ -48,7 +48,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapiv1beta1 "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	kueuev1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
@@ -96,6 +97,7 @@ func init() {
 	utilruntime.Must(kueue.AddToScheme(scheme))
 	utilruntime.Must(kueuev1beta2.AddToScheme(scheme))
 	utilruntime.Must(kueuealpha.AddToScheme(scheme))
+	utilruntime.Must(configapiv1beta1.AddToScheme(scheme))
 	utilruntime.Must(configapi.AddToScheme(scheme))
 	utilruntime.Must(autoscaling.AddToScheme(scheme))
 	// Add any additional framework integration types.
diff --git a/config/components/crd/bases/kueue.x-k8s.io_localqueues.yaml b/config/components/crd/bases/kueue.x-k8s.io_localqueues.yaml
index e1f2d8b8a..e8c95ba7e 100644
--- a/config/components/crd/bases/kueue.x-k8s.io_localqueues.yaml
+++ b/config/components/crd/bases/kueue.x-k8s.io_localqueues.yaml
@@ -266,9 +266,12 @@ spec:
                 - name
                 x-kubernetes-list-type: map
               flavors:
-                description: flavors lists all currently available ResourceFlavors
-                  in specified ClusterQueue.
+                description: |-
+                  flavors lists all currently available ResourceFlavors in specified ClusterQueue.
+                  Deprecated: Flavors is deprecated and marked for removal in v1beta2.
                 items:
+                  description: 'Deprecated: LocalQueueFlavorStatus is deprecated and
+                    marked for removal in v1beta2.'
                   properties:
                     name:
                       description: name of the flavor.
@@ -625,9 +628,12 @@ spec:
                 - weightedShare
                 type: object
               flavors:
-                description: flavors lists all currently available ResourceFlavors
-                  in specified ClusterQueue.
+                description: |-
+                  flavors lists all currently available ResourceFlavors in specified ClusterQueue.
+                  Deprecated: Flavors is deprecated and marked for removal in v1beta2.
                 items:
+                  description: 'Deprecated: LocalQueueFlavorStatus is deprecated and
+                    marked for removal in v1beta2.'
                   properties:
                     name:
                       description: name of the flavor.
diff --git a/config/components/manager/controller_manager_config.yaml b/config/components/manager/controller_manager_config.yaml
index bed137f84..5a1614fc8 100644
--- a/config/components/manager/controller_manager_config.yaml
+++ b/config/components/manager/controller_manager_config.yaml
@@ -1,4 +1,4 @@
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 health:
   healthProbeBindAddress: :8081
diff --git a/go.mod b/go.mod
index 9b13cd842..a02321e90 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
 	github.com/google/go-cmp v0.7.0
 	github.com/json-iterator/go v1.1.12
 	github.com/kubeflow/mpi-operator v0.6.0
-	github.com/kubeflow/trainer/v2 v2.0.1
+	github.com/kubeflow/trainer/v2 v2.1.0-rc.0
 	github.com/kubeflow/training-operator v1.9.3
 	github.com/onsi/ginkgo/v2 v2.26.0
 	github.com/onsi/gomega v1.38.2
@@ -155,4 +155,5 @@ require (
 	sigs.k8s.io/kustomize/kyaml v0.20.1 // indirect
 	sigs.k8s.io/randfill v1.0.0 // indirect
 	sigs.k8s.io/scheduler-plugins v0.31.8 // indirect
+	volcano.sh/apis v1.12.2 // indirect
 )
diff --git a/go.sum b/go.sum
index a3bd6af76..c08300498 100644
--- a/go.sum
+++ b/go.sum
@@ -136,8 +136,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/kubeflow/mpi-operator v0.6.0 h1:RzzG03oyQIiHe/SH2k19N+Hp4QkxEsG2l9G1T7US+ys=
 github.com/kubeflow/mpi-operator v0.6.0/go.mod h1:lu3cj3ESq3SdS29nbHC26TuXiTYYQYTHJ6fcy5Xv20c=
-github.com/kubeflow/trainer/v2 v2.0.1 h1:4bMZdFIpQBHjcUene6P+MqbY5v7ccyLUIKkefOhUFG8=
-github.com/kubeflow/trainer/v2 v2.0.1/go.mod h1:AH97YWUun+pLQlQHyRIlYcXw+YUuuQhnVWVYTbzGvgo=
+github.com/kubeflow/trainer/v2 v2.1.0-rc.0 h1:kr4Gjb7osBIwZm5qE4ajwxe0P4n2lWwD3grhfXc66ds=
+github.com/kubeflow/trainer/v2 v2.1.0-rc.0/go.mod h1:Y9hmSGG3A9tFKUjlcWf7Kg/SwibYwrZTK5ZqAxMxyno=
 github.com/kubeflow/training-operator v1.9.3 h1:aaSHqskOtCY8Dn8sVd+l9p5XAczW6O0nYMPjVLAw/lc=
 github.com/kubeflow/training-operator v1.9.3/go.mod h1:6zI0hgeCOheiW5Z12IcVkKBuSWm714fz8mUvYu4Fid4=
 github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
@@ -436,3 +436,5 @@ sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/
 sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
 sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
 sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
+volcano.sh/apis v1.12.2 h1:KvNyM/kMizFVlALiH/uFHPwYFHRtxuVnBL0upbFbDss=
+volcano.sh/apis v1.12.2/go.mod h1:0XNNnIOevJSYNiXRmwhXUrYCcCcWcBeTY0nxrlkk03A=
diff --git a/keps/2941-DRA/README.md b/keps/2941-DRA/README.md
index b380b0c45..a12cbfab5 100644
--- a/keps/2941-DRA/README.md
+++ b/keps/2941-DRA/README.md
@@ -285,7 +285,7 @@ metadata:
   namespace: kueue-system
 data:
   config.yaml: |
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     namespace: kueue-system
     manageJobsWithoutQueueName: false
@@ -350,7 +350,7 @@ metadata:
   namespace: kueue-system
 data:
   config.yaml: |
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     resources:
       deviceClassMappings:
@@ -371,7 +371,7 @@ metadata:
   namespace: kueue-system
 data:
   config.yaml: |
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     resources:
       deviceClassMappings:
@@ -467,7 +467,7 @@ metadata:
   namespace: kueue-system
 data:
   config.yaml: |
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     namespace: kueue-system
     resources:
diff --git a/pkg/cache/queue/cluster_queue.go b/pkg/cache/queue/cluster_queue.go
index 3d151fe1b..714b6783e 100644
--- a/pkg/cache/queue/cluster_queue.go
+++ b/pkg/cache/queue/cluster_queue.go
@@ -31,7 +31,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	afs "sigs.k8s.io/kueue/pkg/util/admissionfairsharing"
diff --git a/pkg/cache/queue/manager.go b/pkg/cache/queue/manager.go
index aa7701f36..878c67a74 100644
--- a/pkg/cache/queue/manager.go
+++ b/pkg/cache/queue/manager.go
@@ -32,7 +32,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	utilindexer "sigs.k8s.io/kueue/pkg/controller/core/indexer"
diff --git a/pkg/cache/scheduler/cache.go b/pkg/cache/scheduler/cache.go
index ac2a06cab..46d7a995b 100644
--- a/pkg/cache/scheduler/cache.go
+++ b/pkg/cache/scheduler/cache.go
@@ -34,7 +34,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	utilindexer "sigs.k8s.io/kueue/pkg/controller/core/indexer"
@@ -686,7 +686,7 @@ type ClusterQueueUsageStats struct {
 	ReservingWorkloads int
 	AdmittedResources  []kueue.FlavorUsage
 	AdmittedWorkloads  int
-	WeightedShare      int64
+	WeightedShare      float64
 }
 
 // Usage reports the reserved and admitted resources and number of workloads holding them in the ClusterQueue.
@@ -708,14 +708,13 @@ func (c *Cache) Usage(cqObj *kueue.ClusterQueue) (*ClusterQueueUsageStats, error
 
 	if c.fairSharingEnabled {
 		drs := dominantResourceShare(cq, nil)
-		weightedShare, _ := drs.roundedWeightedShare()
-		stats.WeightedShare = weightedShare
+		stats.WeightedShare = drs.PreciseWeightedShare()
 	}
 	return stats, nil
 }
 
 type CohortUsageStats struct {
-	WeightedShare int64
+	WeightedShare float64
 }
 
 func (c *Cache) CohortStats(cohortObj *kueue.Cohort) (*CohortUsageStats, error) {
@@ -730,8 +729,7 @@ func (c *Cache) CohortStats(cohortObj *kueue.Cohort) (*CohortUsageStats, error)
 	stats := &CohortUsageStats{}
 	if c.fairSharingEnabled {
 		drs := dominantResourceShare(cohort, nil)
-		weightedShare, _ := drs.roundedWeightedShare()
-		stats.WeightedShare = weightedShare
+		stats.WeightedShare = drs.PreciseWeightedShare()
 	}
 
 	return stats, nil
@@ -805,7 +803,8 @@ type LocalQueueUsageStats struct {
 	ReservingWorkloads int
 	AdmittedResources  []kueue.LocalQueueFlavorUsage
 	AdmittedWorkloads  int
-	Flavors            []kueue.LocalQueueFlavorStatus
+	// Deprecated: Flavors is deprecated and marked for removal in v1beta2.
+	Flavors []kueue.LocalQueueFlavorStatus
 }
 
 func (c *Cache) LocalQueueUsage(qObj *kueue.LocalQueue) (*LocalQueueUsageStats, error) {
diff --git a/pkg/cache/scheduler/fair_sharing.go b/pkg/cache/scheduler/fair_sharing.go
index 3db3df730..ceeb9db67 100644
--- a/pkg/cache/scheduler/fair_sharing.go
+++ b/pkg/cache/scheduler/fair_sharing.go
@@ -67,8 +67,6 @@ func (d DRS) PreciseWeightedShare() float64 {
 		return 0.0
 	}
 	if d.isWeightZero() {
-		// This branch is used only for logging; functional
-		// branches never reach here.
 		return math.Inf(1)
 	}
 	return d.unweightedRatio / d.fairWeight
diff --git a/pkg/config/config.go b/pkg/config/config.go
index b84741dc4..5bf2ca91e 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -31,7 +31,7 @@ import (
 	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 var (
diff --git a/pkg/config/validation.go b/pkg/config/validation.go
index c207103ed..7ef3c5651 100644
--- a/pkg/config/validation.go
+++ b/pkg/config/validation.go
@@ -36,7 +36,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	podworkload "sigs.k8s.io/kueue/pkg/controller/jobs/pod"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/pkg/controller/admissionchecks/multikueue/controllers.go b/pkg/controller/admissionchecks/multikueue/controllers.go
index 888b11f85..8cdd382b1 100644
--- a/pkg/controller/admissionchecks/multikueue/controllers.go
+++ b/pkg/controller/admissionchecks/multikueue/controllers.go
@@ -21,7 +21,7 @@ import (
 
 	ctrl "sigs.k8s.io/controller-runtime"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/util/admissioncheck"
diff --git a/pkg/controller/admissionchecks/multikueue/externalframeworks/config.go b/pkg/controller/admissionchecks/multikueue/externalframeworks/config.go
index 2eb0f4b3a..874e6b8a5 100644
--- a/pkg/controller/admissionchecks/multikueue/externalframeworks/config.go
+++ b/pkg/controller/admissionchecks/multikueue/externalframeworks/config.go
@@ -23,7 +23,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	k8serrors "k8s.io/apimachinery/pkg/util/errors"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 // NewAdapters creates and returns adapters from the given configurations.
diff --git a/pkg/controller/admissionchecks/multikueue/workload.go b/pkg/controller/admissionchecks/multikueue/workload.go
index 6ad58de71..4f87ab85f 100644
--- a/pkg/controller/admissionchecks/multikueue/workload.go
+++ b/pkg/controller/admissionchecks/multikueue/workload.go
@@ -42,7 +42,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/pkg/controller/core/admissioncheck_controller.go b/pkg/controller/core/admissioncheck_controller.go
index 6c8fe09c2..326bc6b1d 100644
--- a/pkg/controller/core/admissioncheck_controller.go
+++ b/pkg/controller/core/admissioncheck_controller.go
@@ -36,7 +36,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/core/clusterqueue_controller.go b/pkg/controller/core/clusterqueue_controller.go
index dbe1cb609..7ff8acf76 100644
--- a/pkg/controller/core/clusterqueue_controller.go
+++ b/pkg/controller/core/clusterqueue_controller.go
@@ -19,6 +19,7 @@ package core
 import (
 	"context"
 	"iter"
+	"math"
 	"slices"
 
 	"github.com/go-logr/logr"
@@ -43,7 +44,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -563,12 +564,16 @@ func (r *ClusterQueueReconciler) updateCqStatusIfChanged(
 	})
 	if r.fairSharingEnabled {
 		if r.reportResourceMetrics {
-			metrics.ReportClusterQueueWeightedShare(cq.Name, stats.WeightedShare)
+			weightedShare := stats.WeightedShare
+			if weightedShare == math.Inf(1) {
+				weightedShare = math.NaN()
+			}
+			metrics.ReportClusterQueueWeightedShare(cq.Name, string(cq.Spec.Cohort), weightedShare)
 		}
 		if cq.Status.FairSharing == nil {
 			cq.Status.FairSharing = &kueue.FairSharingStatus{}
 		}
-		cq.Status.FairSharing.WeightedShare = stats.WeightedShare
+		cq.Status.FairSharing.WeightedShare = WeightedShare(stats.WeightedShare)
 	} else {
 		cq.Status.FairSharing = nil
 	}
diff --git a/pkg/controller/core/cohort_controller.go b/pkg/controller/core/cohort_controller.go
index 895e6acc4..77f03a9e9 100644
--- a/pkg/controller/core/cohort_controller.go
+++ b/pkg/controller/core/cohort_controller.go
@@ -34,7 +34,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -171,7 +171,7 @@ func (r *CohortReconciler) updateCohortStatusIfChanged(ctx context.Context, coho
 		if cohort.Status.FairSharing == nil {
 			cohort.Status.FairSharing = &kueue.FairSharingStatus{}
 		}
-		cohort.Status.FairSharing.WeightedShare = stats.WeightedShare
+		cohort.Status.FairSharing.WeightedShare = WeightedShare(stats.WeightedShare)
 	} else {
 		cohort.Status.FairSharing = nil
 	}
diff --git a/pkg/controller/core/core.go b/pkg/controller/core/core.go
index f5cc6dd39..b30c4e582 100644
--- a/pkg/controller/core/core.go
+++ b/pkg/controller/core/core.go
@@ -21,7 +21,7 @@ import (
 
 	ctrl "sigs.k8s.io/controller-runtime"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/pkg/controller/core/helpers.go b/pkg/controller/core/helpers.go
new file mode 100644
index 000000000..c7a7e3381
--- /dev/null
+++ b/pkg/controller/core/helpers.go
@@ -0,0 +1,28 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package core
+
+import (
+	"math"
+)
+
+func WeightedShare(f float64) int64 {
+	if f == math.Inf(1) {
+		return math.MaxInt64
+	}
+	return int64(math.Ceil(f))
+}
diff --git a/pkg/controller/core/leader_aware_reconciler.go b/pkg/controller/core/leader_aware_reconciler.go
index 0d99df92b..faac23198 100644
--- a/pkg/controller/core/leader_aware_reconciler.go
+++ b/pkg/controller/core/leader_aware_reconciler.go
@@ -25,7 +25,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 // WithLeadingManager returns a decorating reconcile.Reconciler that discards reconciliation requests
diff --git a/pkg/controller/core/localqueue_controller.go b/pkg/controller/core/localqueue_controller.go
index 1381b553f..9c0f88636 100644
--- a/pkg/controller/core/localqueue_controller.go
+++ b/pkg/controller/core/localqueue_controller.go
@@ -40,7 +40,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/core/resourceflavor_controller.go b/pkg/controller/core/resourceflavor_controller.go
index f0b4af525..9c14cc51e 100644
--- a/pkg/controller/core/resourceflavor_controller.go
+++ b/pkg/controller/core/resourceflavor_controller.go
@@ -36,7 +36,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/core/workload_controller.go b/pkg/controller/core/workload_controller.go
index 201443f0a..f0594df44 100644
--- a/pkg/controller/core/workload_controller.go
+++ b/pkg/controller/core/workload_controller.go
@@ -48,7 +48,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/jobframework/reconciler.go b/pkg/controller/jobframework/reconciler.go
index 739405853..66d6f7ff5 100644
--- a/pkg/controller/jobframework/reconciler.go
+++ b/pkg/controller/jobframework/reconciler.go
@@ -43,7 +43,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -545,7 +545,7 @@ func (r *JobReconciler) ReconcileGenericJob(ctx context.Context, req ctrl.Reques
 				log.V(6).Info("The job is no longer active, clear the workloads admission")
 				err := workload.PatchAdmissionStatus(ctx, r.client, wl, r.clock, func() (*kueue.Workload, bool, error) {
 					// The requeued condition status set to true only on EvictedByPreemption
-					setRequeued := evCond.Reason == kueue.WorkloadEvictedByPreemption
+					setRequeued := (evCond.Reason == kueue.WorkloadEvictedByPreemption) || (evCond.Reason == kueue.WorkloadEvictedDueToNodeFailures)
 					updated := workload.SetRequeuedCondition(wl, evCond.Reason, evCond.Message, setRequeued)
 					if workload.UnsetQuotaReservationWithCondition(wl, "Pending", evCond.Message, r.clock.Now()) {
 						updated = true
diff --git a/pkg/controller/jobframework/tas_validation.go b/pkg/controller/jobframework/tas_validation.go
index 051a12540..0a1e41b23 100644
--- a/pkg/controller/jobframework/tas_validation.go
+++ b/pkg/controller/jobframework/tas_validation.go
@@ -25,17 +25,17 @@ import (
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"k8s.io/utils/ptr"
 
-	kueuebeta "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/orderedgroups"
 )
 
 func ValidateTASPodSetRequest(replicaPath *field.Path, replicaMetadata *metav1.ObjectMeta) field.ErrorList {
 	var allErrs field.ErrorList
-	requiredValue, requiredFound := replicaMetadata.Annotations[kueuebeta.PodSetRequiredTopologyAnnotation]
-	preferredValue, preferredFound := replicaMetadata.Annotations[kueuebeta.PodSetPreferredTopologyAnnotation]
-	_, unconstrainedFound := replicaMetadata.Annotations[kueuebeta.PodSetUnconstrainedTopologyAnnotation]
-	sliceRequiredValue, sliceRequiredFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceRequiredTopologyAnnotation]
-	_, sliceSizeFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceSizeAnnotation]
+	requiredValue, requiredFound := replicaMetadata.Annotations[kueue.PodSetRequiredTopologyAnnotation]
+	preferredValue, preferredFound := replicaMetadata.Annotations[kueue.PodSetPreferredTopologyAnnotation]
+	_, unconstrainedFound := replicaMetadata.Annotations[kueue.PodSetUnconstrainedTopologyAnnotation]
+	sliceRequiredValue, sliceRequiredFound := replicaMetadata.Annotations[kueue.PodSetSliceRequiredTopologyAnnotation]
+	_, sliceSizeFound := replicaMetadata.Annotations[kueue.PodSetSliceSizeAnnotation]
 
 	// validate no more than 1 annotation
 	asInt := func(b bool) int {
@@ -49,38 +49,38 @@ func ValidateTASPodSetRequest(replicaPath *field.Path, replicaMetadata *metav1.O
 	if annotationFoundCount > 1 {
 		allErrs = append(allErrs, field.Invalid(annotationsPath, field.OmitValueType{},
 			fmt.Sprintf("must not contain more than one topology annotation: [%q, %q, %q]",
-				kueuebeta.PodSetRequiredTopologyAnnotation,
-				kueuebeta.PodSetPreferredTopologyAnnotation,
-				kueuebeta.PodSetUnconstrainedTopologyAnnotation),
+				kueue.PodSetRequiredTopologyAnnotation,
+				kueue.PodSetPreferredTopologyAnnotation,
+				kueue.PodSetUnconstrainedTopologyAnnotation),
 		))
 	}
 
 	// validate labels
 	if requiredFound {
-		allErrs = append(allErrs, metavalidation.ValidateLabelName(requiredValue, annotationsPath.Key(kueuebeta.PodSetRequiredTopologyAnnotation))...)
+		allErrs = append(allErrs, metavalidation.ValidateLabelName(requiredValue, annotationsPath.Key(kueue.PodSetRequiredTopologyAnnotation))...)
 	}
 	if preferredFound {
-		allErrs = append(allErrs, metavalidation.ValidateLabelName(preferredValue, annotationsPath.Key(kueuebeta.PodSetPreferredTopologyAnnotation))...)
+		allErrs = append(allErrs, metavalidation.ValidateLabelName(preferredValue, annotationsPath.Key(kueue.PodSetPreferredTopologyAnnotation))...)
 	}
 	if sliceRequiredFound {
-		allErrs = append(allErrs, metavalidation.ValidateLabelName(sliceRequiredValue, annotationsPath.Key(kueuebeta.PodSetSliceRequiredTopologyAnnotation))...)
+		allErrs = append(allErrs, metavalidation.ValidateLabelName(sliceRequiredValue, annotationsPath.Key(kueue.PodSetSliceRequiredTopologyAnnotation))...)
 	}
 
 	// validate PodSetGroupName annotation
-	podSetGroupNameValue, podSetGroupNameFound := replicaMetadata.Annotations[kueuebeta.PodSetGroupName]
+	podSetGroupNameValue, podSetGroupNameFound := replicaMetadata.Annotations[kueue.PodSetGroupName]
 	if podSetGroupNameFound {
-		allErrs = append(allErrs, validatePodSetGroupNameAnnotation(podSetGroupNameValue, annotationsPath.Key(kueuebeta.PodSetGroupName))...)
+		allErrs = append(allErrs, validatePodSetGroupNameAnnotation(podSetGroupNameValue, annotationsPath.Key(kueue.PodSetGroupName))...)
 
 		if sliceSizeFound {
-			allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueuebeta.PodSetGroupName), fmt.Sprintf("may not be set when '%s' is specified", kueuebeta.PodSetSliceSizeAnnotation)))
+			allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueue.PodSetGroupName), fmt.Sprintf("may not be set when '%s' is specified", kueue.PodSetSliceSizeAnnotation)))
 		}
 
 		if sliceRequiredFound {
-			allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueuebeta.PodSetGroupName), fmt.Sprintf("may not be set when '%s' is specified", kueuebeta.PodSetSliceRequiredTopologyAnnotation)))
+			allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueue.PodSetGroupName), fmt.Sprintf("may not be set when '%s' is specified", kueue.PodSetSliceRequiredTopologyAnnotation)))
 		}
 
 		if !preferredFound && !requiredFound {
-			allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueuebeta.PodSetGroupName), fmt.Sprintf("may not be set when neither '%s' nor '%s' is specified", kueuebeta.PodSetPreferredTopologyAnnotation, kueuebeta.PodSetRequiredTopologyAnnotation)))
+			allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueue.PodSetGroupName), fmt.Sprintf("may not be set when neither '%s' nor '%s' is specified", kueue.PodSetPreferredTopologyAnnotation, kueue.PodSetRequiredTopologyAnnotation)))
 		}
 	}
 
@@ -92,21 +92,21 @@ func ValidateTASPodSetRequest(replicaPath *field.Path, replicaMetadata *metav1.O
 
 	// validate slice annotations
 	if sliceRequiredFound && !sliceSizeFound {
-		allErrs = append(allErrs, field.Required(annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), fmt.Sprintf("must be set when '%s' is specified", kueuebeta.PodSetSliceRequiredTopologyAnnotation)))
+		allErrs = append(allErrs, field.Required(annotationsPath.Key(kueue.PodSetSliceSizeAnnotation), fmt.Sprintf("must be set when '%s' is specified", kueue.PodSetSliceRequiredTopologyAnnotation)))
 	}
 	if !sliceRequiredFound && sliceSizeFound {
-		allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), fmt.Sprintf("may not be set when '%s' is not specified", kueuebeta.PodSetSliceRequiredTopologyAnnotation)))
+		allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueue.PodSetSliceSizeAnnotation), fmt.Sprintf("may not be set when '%s' is not specified", kueue.PodSetSliceRequiredTopologyAnnotation)))
 	}
 
 	return allErrs
 }
 
 func validateTASUnconstrained(annotationsPath *field.Path, replicaMetadata *metav1.ObjectMeta) field.ErrorList {
-	if val, ok := replicaMetadata.Annotations[kueuebeta.PodSetUnconstrainedTopologyAnnotation]; ok {
+	if val, ok := replicaMetadata.Annotations[kueue.PodSetUnconstrainedTopologyAnnotation]; ok {
 		if _, err := strconv.ParseBool(val); err != nil {
 			return field.ErrorList{
 				field.Invalid(
-					annotationsPath.Key(kueuebeta.PodSetUnconstrainedTopologyAnnotation), val, "must be a boolean value",
+					annotationsPath.Key(kueue.PodSetUnconstrainedTopologyAnnotation), val, "must be a boolean value",
 				),
 			}
 		}
@@ -115,7 +115,7 @@ func validateTASUnconstrained(annotationsPath *field.Path, replicaMetadata *meta
 }
 
 func validateSliceSizeAnnotation(annotationsPath *field.Path, replicaMetadata *metav1.ObjectMeta) field.ErrorList {
-	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceSizeAnnotation]
+	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueue.PodSetSliceSizeAnnotation]
 	if !sliceSizeFound {
 		return nil
 	}
@@ -124,7 +124,7 @@ func validateSliceSizeAnnotation(annotationsPath *field.Path, replicaMetadata *m
 	if err != nil {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
+				annotationsPath.Key(kueue.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
 			),
 		}
 	}
@@ -132,7 +132,7 @@ func validateSliceSizeAnnotation(annotationsPath *field.Path, replicaMetadata *m
 	if int32(val) < 1 {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue,
+				annotationsPath.Key(kueue.PodSetSliceSizeAnnotation), sliceSizeValue,
 				"must be greater than or equal to 1",
 			),
 		}
@@ -153,8 +153,8 @@ func validatePodSetGroupNameAnnotation(groupName string, annotationPath *field.P
 	return nil
 }
 
-func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetadata *metav1.ObjectMeta, podSet *kueuebeta.PodSet) field.ErrorList {
-	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceSizeAnnotation]
+func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetadata *metav1.ObjectMeta, podSet *kueue.PodSet) field.ErrorList {
+	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueue.PodSetSliceSizeAnnotation]
 	if !sliceSizeFound || podSet == nil {
 		return nil
 	}
@@ -165,7 +165,7 @@ func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetad
 	if err != nil {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
+				annotationsPath.Key(kueue.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
 			),
 		}
 	}
@@ -173,7 +173,7 @@ func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetad
 	if int32(val) > podSet.Count {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue,
+				annotationsPath.Key(kueue.PodSetSliceSizeAnnotation), sliceSizeValue,
 				fmt.Sprintf("must not be greater than pod set count %d", podSet.Count),
 			),
 		}
@@ -182,8 +182,8 @@ func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetad
 	return nil
 }
 
-func ValidatePodSetGroupingTopology(podSets []kueuebeta.PodSet, podSetAnnotationsByName map[kueuebeta.PodSetReference]*field.Path) field.ErrorList {
-	podSetGroups := orderedgroups.NewOrderedGroups[string, kueuebeta.PodSet]()
+func ValidatePodSetGroupingTopology(podSets []kueue.PodSet, podSetAnnotationsByName map[kueue.PodSetReference]*field.Path) field.ErrorList {
+	podSetGroups := orderedgroups.NewOrderedGroups[string, kueue.PodSet]()
 	for _, podSet := range podSets {
 		if podSet.TopologyRequest == nil || podSet.TopologyRequest.PodSetGroupName == nil {
 			continue
@@ -200,7 +200,7 @@ func ValidatePodSetGroupingTopology(podSets []kueuebeta.PodSet, podSetAnnotation
 				allErrs = append(
 					allErrs,
 					field.Invalid(
-						podSetAnnotationsByName[podSet.Name].Key(kueuebeta.PodSetGroupName),
+						podSetAnnotationsByName[podSet.Name].Key(kueue.PodSetGroupName),
 						groupName,
 						fmt.Sprintf("can only define groups of exactly 2 pod sets, got: %d pod set(s)", groupSize),
 					),
@@ -222,12 +222,12 @@ func ValidatePodSetGroupingTopology(podSets []kueuebeta.PodSet, podSetAnnotation
 			)
 			allErrs = append(allErrs,
 				field.Invalid(
-					annotationsPath1.Key(kueuebeta.PodSetGroupName),
+					annotationsPath1.Key(kueue.PodSetGroupName),
 					groupName,
 					sizeErrorMessage,
 				),
 				field.Invalid(
-					annotationsPath2.Key(kueuebeta.PodSetGroupName),
+					annotationsPath2.Key(kueue.PodSetGroupName),
 					groupName,
 					sizeErrorMessage,
 				),
@@ -237,8 +237,8 @@ func ValidatePodSetGroupingTopology(podSets []kueuebeta.PodSet, podSetAnnotation
 		if !topologyRequestsValid(podSet1.TopologyRequest, podSet2.TopologyRequest) {
 			errorMessageTemplate := fmt.Sprintf(
 				"must specify '%s' or '%s' topology consistent with '%%s' in group '%s'",
-				kueuebeta.PodSetRequiredTopologyAnnotation,
-				kueuebeta.PodSetPreferredTopologyAnnotation,
+				kueue.PodSetRequiredTopologyAnnotation,
+				kueue.PodSetPreferredTopologyAnnotation,
 				groupName,
 			)
 			allErrs = append(
@@ -260,7 +260,7 @@ func ValidatePodSetGroupingTopology(podSets []kueuebeta.PodSet, podSetAnnotation
 	return allErrs
 }
 
-func topologyRequestsValid(r1, r2 *kueuebeta.PodSetTopologyRequest) bool {
+func topologyRequestsValid(r1, r2 *kueue.PodSetTopologyRequest) bool {
 	// Check that the requests have exactly one of `Required` and `Preferred`.
 	if r1.Required == nil && r1.Preferred == nil {
 		return false
diff --git a/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook.go b/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook.go
index af985e1e2..edbe8686c 100644
--- a/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook.go
+++ b/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook.go
@@ -32,7 +32,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 
-	kueuebeta "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -116,7 +116,7 @@ var (
 	workerTemplatePath            = leaderWorkerTemplatePath.Child("workerTemplate")
 	workerTemplateMetaPath        = workerTemplatePath.Child("metadata")
 	workerTemplateAnnotationsPath = workerTemplateMetaPath.Child("annotations")
-	podSetAnnotationsPathByName   = map[kueuebeta.PodSetReference]*field.Path{
+	podSetAnnotationsPathByName   = map[kueue.PodSetReference]*field.Path{
 		"leader": leaderTemplateMetaPath.Child("annotations"),
 		"worker": workerTemplateAnnotationsPath,
 		"main":   workerTemplateAnnotationsPath,
@@ -211,7 +211,7 @@ func validateTopologyRequest(lws *LeaderWorkerSet) (field.ErrorList, error) {
 	lwsv1 := leaderworkersetv1.LeaderWorkerSet(*lws)
 	podSets, podSetsErr := podSets(&lwsv1)
 
-	defaultPodSetName := kueuebeta.DefaultPodSetName
+	defaultPodSetName := kueue.DefaultPodSetName
 
 	if lws.Spec.LeaderWorkerTemplate.LeaderTemplate != nil {
 		defaultPodSetName = workerPodSetName
diff --git a/pkg/controller/jobs/pod/pod_webhook.go b/pkg/controller/jobs/pod/pod_webhook.go
index b15d43c8d..4f8ee2e4a 100644
--- a/pkg/controller/jobs/pod/pod_webhook.go
+++ b/pkg/controller/jobs/pod/pod_webhook.go
@@ -32,7 +32,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/pkg/controller/jobs/raycluster/raycluster_webhook.go b/pkg/controller/jobs/raycluster/raycluster_webhook.go
index a2b5a82ed..613dd24b0 100644
--- a/pkg/controller/jobs/raycluster/raycluster_webhook.go
+++ b/pkg/controller/jobs/raycluster/raycluster_webhook.go
@@ -31,7 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
-	kueuebeta "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -96,12 +96,12 @@ func (w *RayClusterWebhook) Default(ctx context.Context, obj runtime.Object) err
 
 	if isAnElasticJob(rjob) {
 		// Ensure that the PodSchedulingGate is present in the RayCluster's pod Templates for its Head and all its Workers
-		utilpod.GateTemplate(&job.Spec.HeadGroupSpec.Template, kueuebeta.ElasticJobSchedulingGate)
+		utilpod.GateTemplate(&job.Spec.HeadGroupSpec.Template, kueue.ElasticJobSchedulingGate)
 
 		for index := range job.Spec.WorkerGroupSpecs {
 			wgs := &job.Spec.WorkerGroupSpecs[index]
 
-			utilpod.GateTemplate(&wgs.Template, kueuebeta.ElasticJobSchedulingGate)
+			utilpod.GateTemplate(&wgs.Template, kueue.ElasticJobSchedulingGate)
 		}
 	}
 
@@ -175,7 +175,7 @@ func validateElasticJob(job *rayv1.RayCluster) field.ErrorList {
 	specPath := field.NewPath("spec")
 
 	workloadSliceSchedulingGate := corev1.PodSchedulingGate{
-		Name: kueuebeta.ElasticJobSchedulingGate,
+		Name: kueue.ElasticJobSchedulingGate,
 	}
 
 	for index := range job.Spec.WorkerGroupSpecs {
@@ -214,7 +214,7 @@ func (w *RayClusterWebhook) validateTopologyRequest(ctx context.Context, rayJob
 			continue
 		}
 
-		podSet := podset.FindPodSetByName(podSets, kueuebeta.NewPodSetReference(wgs.GroupName))
+		podSet := podset.FindPodSetByName(podSets, kueue.NewPodSetReference(wgs.GroupName))
 		allErrs = append(allErrs, jobframework.ValidateSliceSizeAnnotationUpperBound(workerGroupMetaPath, &rayJob.Spec.WorkerGroupSpecs[i].Template.ObjectMeta, podSet)...)
 	}
 
@@ -225,11 +225,11 @@ func (w *RayClusterWebhook) validateTopologyRequest(ctx context.Context, rayJob
 	return nil, podSetsErr
 }
 
-func buildPodSetAnnotationsPathByNameMap(rayJob *RayCluster) map[kueuebeta.PodSetReference]*field.Path {
-	podSetAnnotationsPathByName := make(map[kueuebeta.PodSetReference]*field.Path)
+func buildPodSetAnnotationsPathByNameMap(rayJob *RayCluster) map[kueue.PodSetReference]*field.Path {
+	podSetAnnotationsPathByName := make(map[kueue.PodSetReference]*field.Path)
 	podSetAnnotationsPathByName[headGroupPodSetName] = headGroupMetaPath.Child("annotations")
 	for i, wgs := range rayJob.Spec.WorkerGroupSpecs {
-		podSetAnnotationsPathByName[kueuebeta.PodSetReference(wgs.GroupName)] = workerGroupSpecsPath.Index(i).Child("template", "metadata", "annotations")
+		podSetAnnotationsPathByName[kueue.PodSetReference(wgs.GroupName)] = workerGroupSpecsPath.Index(i).Child("template", "metadata", "annotations")
 	}
 	return podSetAnnotationsPathByName
 }
diff --git a/pkg/controller/jobs/rayjob/rayjob_webhook.go b/pkg/controller/jobs/rayjob/rayjob_webhook.go
index 96571c129..4e1a222a6 100644
--- a/pkg/controller/jobs/rayjob/rayjob_webhook.go
+++ b/pkg/controller/jobs/rayjob/rayjob_webhook.go
@@ -29,7 +29,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
-	kueuebeta "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -195,7 +195,7 @@ func (w *RayJobWebhook) validateTopologyRequest(ctx context.Context, rayJob *ray
 			continue
 		}
 
-		workerPodSetName := podset.FindPodSetByName(podSets, kueuebeta.NewPodSetReference(wgs.GroupName))
+		workerPodSetName := podset.FindPodSetByName(podSets, kueue.NewPodSetReference(wgs.GroupName))
 		allErrs = append(allErrs, jobframework.ValidateSliceSizeAnnotationUpperBound(workerGroupMetaPath, &rayJob.Spec.RayClusterSpec.WorkerGroupSpecs[i].Template.ObjectMeta, workerPodSetName)...)
 	}
 
@@ -206,12 +206,12 @@ func (w *RayJobWebhook) validateTopologyRequest(ctx context.Context, rayJob *ray
 	return nil, podSetsErr
 }
 
-func buildPodSetAnnotationsPathByNameMap(rayJob *rayv1.RayJob) map[kueuebeta.PodSetReference]*field.Path {
-	podSetAnnotationsPathByName := make(map[kueuebeta.PodSetReference]*field.Path)
+func buildPodSetAnnotationsPathByNameMap(rayJob *rayv1.RayJob) map[kueue.PodSetReference]*field.Path {
+	podSetAnnotationsPathByName := make(map[kueue.PodSetReference]*field.Path)
 	podSetAnnotationsPathByName[headGroupPodSetName] = headGroupMetaPath.Child("annotations")
 	podSetAnnotationsPathByName[submitterJobPodSetName] = field.NewPath("spec", "submitterPodTemplate", "metadata", "annotations")
 	for i, wgs := range rayJob.Spec.RayClusterSpec.WorkerGroupSpecs {
-		podSetAnnotationsPathByName[kueuebeta.PodSetReference(wgs.GroupName)] = workerGroupSpecsPath.Index(i).Child("template", "metadata", "annotations")
+		podSetAnnotationsPathByName[kueue.PodSetReference(wgs.GroupName)] = workerGroupSpecsPath.Index(i).Child("template", "metadata", "annotations")
 	}
 	return podSetAnnotationsPathByName
 }
diff --git a/pkg/controller/jobs/trainjob/trainjob_controller.go b/pkg/controller/jobs/trainjob/trainjob_controller.go
index 544cd621d..1af7476d6 100644
--- a/pkg/controller/jobs/trainjob/trainjob_controller.go
+++ b/pkg/controller/jobs/trainjob/trainjob_controller.go
@@ -21,7 +21,6 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	"strconv"
 	"sync"
 
 	kftrainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
@@ -43,6 +42,7 @@ import (
 	jobsetapplyapi "sigs.k8s.io/jobset/client-go/applyconfiguration/jobset/v1alpha2"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadjobset "sigs.k8s.io/kueue/pkg/controller/jobs/jobset"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -57,11 +57,6 @@ var (
 	TrainJobControllerName = "trainer.kubeflow.org/trainjob-controller"
 )
 
-const (
-	// This is alpha level annotation
-	firstOverrideIdx = "kueue.x-k8s.io/trainjob-override-idx"
-)
-
 func init() {
 	utilruntime.Must(jobframework.RegisterIntegration(FrameworkName, jobframework.IntegrationCallbacks{
 		SetupIndexes:      SetupIndexes,
@@ -138,7 +133,8 @@ func (t *TrainJob) IsSuspended() bool {
 
 func (t *TrainJob) IsActive() bool {
 	for i := range t.Status.JobsStatus {
-		if t.Status.JobsStatus[i].Active > 0 {
+		active := ptr.Deref(t.Status.JobsStatus[i].Active, 0)
+		if active > 0 {
 			return true
 		}
 	}
@@ -229,13 +225,17 @@ func getRuntimeSpec(ctx context.Context, trainJob *kftrainer.TrainJob) (*kftrain
 	}
 }
 
-func (t *TrainJob) PodSets(ctx context.Context) ([]kueue.PodSet, error) {
+func podSets(ctx context.Context, t *TrainJob) ([]kueue.PodSet, error) {
 	jobset, err := getChildJobSet(ctx, t)
 	if err != nil {
 		return nil, err
 	}
 
-	podsets, err := (*workloadjobset.JobSet)(jobset).PodSets(ctx)
+	return (*workloadjobset.JobSet)(jobset).PodSets(ctx)
+}
+
+func (t *TrainJob) PodSets(ctx context.Context) ([]kueue.PodSet, error) {
+	podsets, err := podSets(ctx, t)
 	if err != nil {
 		return nil, err
 	}
@@ -261,26 +261,27 @@ func (t *TrainJob) RunWithPodSetsInfo(ctx context.Context, podSetsInfo []podset.
 		return podset.BadPodSetsInfoLenError(len(jobset.Spec.ReplicatedJobs), len(podSetsInfo))
 	}
 
-	if t.Spec.PodSpecOverrides == nil {
-		t.Spec.PodSpecOverrides = []kftrainer.PodSpecOverride{}
+	if t.Spec.PodTemplateOverrides == nil {
+		t.Spec.PodTemplateOverrides = []kftrainer.PodTemplateOverride{}
 	}
 	if t.Annotations == nil {
 		t.Annotations = map[string]string{}
 	}
-	t.Annotations[firstOverrideIdx] = strconv.Itoa(len(t.Spec.PodSpecOverrides))
 	for _, info := range podSetsInfo {
 		// The trainjob controller merges each podSpecOverride sequentially, so any existing user provided override will be processed first
-		t.Spec.PodSpecOverrides = append(t.Spec.PodSpecOverrides, kftrainer.PodSpecOverride{
-			TargetJobs: []kftrainer.PodSpecOverrideTargetJob{
+		t.Spec.PodTemplateOverrides = append(t.Spec.PodTemplateOverrides, kftrainer.PodTemplateOverride{
+			TargetJobs: []kftrainer.PodTemplateOverrideTargetJob{
 				{Name: string(info.Name)},
 			},
-			// TODO: Set the labels/annotations when supported. See https://github.com/kubeflow/trainer/pull/2785
-			//
-			// NOTE: Due to the issue above, in TAS mode, missing PodSet-specific labels and annotations
-			//       prevent removal of the scheduling gate, leaving the Pod in a Pending state.
-			NodeSelector:    info.NodeSelector,
-			Tolerations:     info.Tolerations,
-			SchedulingGates: info.SchedulingGates,
+			Metadata: &metav1.ObjectMeta{
+				Annotations: info.Annotations,
+				Labels:      info.Labels,
+			},
+			Spec: &kftrainer.PodTemplateSpecOverride{
+				NodeSelector:    info.NodeSelector,
+				Tolerations:     info.Tolerations,
+				SchedulingGates: info.SchedulingGates,
+			},
 		})
 	}
 	// Update the podSpecOverrides while the job is suspended, since is a requirement from the trainjob admission webhook
@@ -309,7 +310,6 @@ func (t *TrainJob) Stop(ctx context.Context, c client.Client, podSetsInfo []pods
 		if !t.RestorePodSetsInfo(podSetsInfo) {
 			return t.Object(), false, errors.New("error restoring info to the trainjob")
 		}
-		delete(t.Annotations, firstOverrideIdx)
 		return t.Object(), true, nil
 	}); err != nil {
 		return false, err
@@ -318,16 +318,16 @@ func (t *TrainJob) Stop(ctx context.Context, c client.Client, podSetsInfo []pods
 }
 
 func (t *TrainJob) RestorePodSetsInfo(_ []podset.PodSetInfo) bool {
-	idx, ok := t.Annotations[firstOverrideIdx]
-	if !ok {
-		// Kueue didn't inject any config yet
-		return true
-	}
-	idxInt, err := strconv.Atoi(idx)
-	if err != nil {
-		return false
+	for i, o := range t.Spec.PodTemplateOverrides {
+		if o.Metadata != nil {
+			_, exists := o.Metadata.Labels[controllerconsts.PodSetLabel]
+			if exists {
+				t.Spec.PodTemplateOverrides = t.Spec.PodTemplateOverrides[:i]
+				break
+			}
+		}
 	}
-	t.Spec.PodSpecOverrides = t.Spec.PodSpecOverrides[:idxInt]
+
 	return true
 }
 
@@ -353,7 +353,7 @@ func (t *TrainJob) PodsReady(ctx context.Context) bool {
 	}
 	var readyReplicas int32
 	for _, jobStatus := range t.Status.JobsStatus {
-		readyReplicas += jobStatus.Ready + jobStatus.Succeeded
+		readyReplicas += ptr.Deref(jobStatus.Ready, 0) + ptr.Deref(jobStatus.Succeeded, 0)
 	}
 	return replicas == readyReplicas
 }
@@ -372,11 +372,12 @@ func (t *TrainJob) ReclaimablePods(ctx context.Context) ([]kueue.ReclaimablePod,
 
 	for i := range jobset.Spec.ReplicatedJobs {
 		spec := &jobset.Spec.ReplicatedJobs[i]
-		if status, found := statuses[spec.Name]; found && status.Succeeded > 0 {
-			if status.Succeeded > 0 && status.Succeeded <= spec.Replicas {
+		if status, found := statuses[spec.Name]; found {
+			succeeded := ptr.Deref(status.Succeeded, 0)
+			if succeeded > 0 && succeeded <= spec.Replicas {
 				ret = append(ret, kueue.ReclaimablePod{
 					Name:  kueue.NewPodSetReference(spec.Name),
-					Count: status.Succeeded * workloadjobset.PodsCountPerReplica(spec),
+					Count: succeeded * workloadjobset.PodsCountPerReplica(spec),
 				})
 			}
 		}
diff --git a/pkg/controller/jobs/trainjob/trainjob_webhook.go b/pkg/controller/jobs/trainjob/trainjob_webhook.go
index bea81f631..37f736f2d 100644
--- a/pkg/controller/jobs/trainjob/trainjob_webhook.go
+++ b/pkg/controller/jobs/trainjob/trainjob_webhook.go
@@ -32,6 +32,7 @@ import (
 	controllerconstants "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework/webhook"
+	"sigs.k8s.io/kueue/pkg/features"
 )
 
 type TrainJobWebhook struct {
@@ -97,7 +98,11 @@ func (w *TrainJobWebhook) ValidateCreate(ctx context.Context, obj runtime.Object
 	trainjob := fromObject(obj)
 	log := ctrl.LoggerFrom(ctx).WithName("trainjob-webhook")
 	log.Info("Validating create")
-	return nil, w.validateCreate(trainjob).ToAggregate()
+	validationErrs, err := w.validateCreate(ctx, trainjob)
+	if err != nil {
+		return nil, err
+	}
+	return nil, validationErrs.ToAggregate()
 }
 
 // ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type
@@ -106,20 +111,55 @@ func (w *TrainJobWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj run
 	newTrainJob := fromObject(newObj)
 	log := ctrl.LoggerFrom(ctx).WithName("trainjob-webhook")
 	log.Info("Validating update")
-	return nil, w.validateUpdate(oldTrainJob, newTrainJob).ToAggregate()
+	validationErrs, err := w.validateUpdate(ctx, oldTrainJob, newTrainJob)
+	if err != nil {
+		return nil, err
+	}
+	return nil, validationErrs.ToAggregate()
 }
 
-func (w *TrainJobWebhook) validateUpdate(oldTrainJob, newTrainJob *TrainJob) field.ErrorList {
+func (w *TrainJobWebhook) validateUpdate(ctx context.Context, oldTrainJob, newTrainJob *TrainJob) (field.ErrorList, error) {
 	var allErrs field.ErrorList
 	allErrs = append(allErrs, jobframework.ValidateJobOnUpdate(oldTrainJob, newTrainJob, w.queues.DefaultLocalQueueExist)...)
-	allErrs = append(allErrs, w.validateCreate(newTrainJob)...)
-	return allErrs
+	validationErrs, err := w.validateCreate(ctx, newTrainJob)
+	if err != nil {
+		return nil, err
+	}
+	allErrs = append(allErrs, validationErrs...)
+	return allErrs, nil
 }
 
-func (w *TrainJobWebhook) validateCreate(trainjob *TrainJob) field.ErrorList {
+func (w *TrainJobWebhook) validateCreate(ctx context.Context, trainjob *TrainJob) (field.ErrorList, error) {
 	var allErrs field.ErrorList
 	allErrs = append(allErrs, jobframework.ValidateJobOnCreate(trainjob)...)
-	return allErrs
+	if features.Enabled(features.TopologyAwareScheduling) {
+		validationErrs, err := w.validateTopologyRequest(ctx, trainjob)
+		if err != nil {
+			return nil, err
+		}
+		allErrs = append(allErrs, validationErrs...)
+	}
+	return allErrs, nil
+}
+
+func (w *TrainJobWebhook) validateTopologyRequest(ctx context.Context, trainJob *TrainJob) (field.ErrorList, error) {
+	var allErrs field.ErrorList
+
+	podSets, podSetsErr := podSets(ctx, trainJob)
+	for _, p := range podSets {
+		jobPath := field.NewPath("job").Key(string(p.Name))
+		allErrs = append(allErrs, jobframework.ValidateTASPodSetRequest(jobPath, &p.Template.ObjectMeta)...)
+		allErrs = append(allErrs, jobframework.ValidateSliceSizeAnnotationUpperBound(jobPath, &p.Template.ObjectMeta, &p)...)
+	}
+
+	if len(allErrs) > 0 {
+		for _, err := range allErrs {
+			err.Detail += `. Adjust either the "TrainJob.spec.podTemplateOverrides" or the "TrainingRuntime.Template" annotations for the corresponding Job`
+		}
+		return allErrs, nil
+	}
+
+	return nil, podSetsErr
 }
 
 // ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type
diff --git a/pkg/controller/tas/controllers.go b/pkg/controller/tas/controllers.go
index 6e32fee1e..941ebced5 100644
--- a/pkg/controller/tas/controllers.go
+++ b/pkg/controller/tas/controllers.go
@@ -19,7 +19,7 @@ package tas
 import (
 	ctrl "sigs.k8s.io/controller-runtime"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/pkg/controller/tas/node_failure_controller.go b/pkg/controller/tas/node_failure_controller.go
index 56ef9b3d2..0f172be2d 100644
--- a/pkg/controller/tas/node_failure_controller.go
+++ b/pkg/controller/tas/node_failure_controller.go
@@ -43,7 +43,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/core"
 	"sigs.k8s.io/kueue/pkg/controller/tas/indexer"
diff --git a/pkg/controller/tas/resource_flavor.go b/pkg/controller/tas/resource_flavor.go
index 39d15ad4f..e7165615d 100644
--- a/pkg/controller/tas/resource_flavor.go
+++ b/pkg/controller/tas/resource_flavor.go
@@ -39,7 +39,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/tas/topology_controller.go b/pkg/controller/tas/topology_controller.go
index 931c5ad40..cea24de59 100644
--- a/pkg/controller/tas/topology_controller.go
+++ b/pkg/controller/tas/topology_controller.go
@@ -35,7 +35,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/tas/topology_ungater.go b/pkg/controller/tas/topology_ungater.go
index 70ef8a1a0..7042cffa4 100644
--- a/pkg/controller/tas/topology_ungater.go
+++ b/pkg/controller/tas/topology_ungater.go
@@ -40,7 +40,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/controller/workloaddispatcher/controllers.go b/pkg/controller/workloaddispatcher/controllers.go
index 59bb0da5e..12d2bb86e 100644
--- a/pkg/controller/workloaddispatcher/controllers.go
+++ b/pkg/controller/workloaddispatcher/controllers.go
@@ -19,7 +19,7 @@ package dispatcher
 import (
 	ctrl "sigs.k8s.io/controller-runtime"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	"sigs.k8s.io/kueue/pkg/util/admissioncheck"
 )
 
diff --git a/pkg/controller/workloaddispatcher/incrementaldispatcher.go b/pkg/controller/workloaddispatcher/incrementaldispatcher.go
index 115c506c4..76228f2fe 100644
--- a/pkg/controller/workloaddispatcher/incrementaldispatcher.go
+++ b/pkg/controller/workloaddispatcher/incrementaldispatcher.go
@@ -31,7 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueueconfig "sigs.k8s.io/kueue/apis/config/v1beta1"
+	kueueconfig "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/core"
 	"sigs.k8s.io/kueue/pkg/util/admissioncheck"
diff --git a/pkg/dra/claims.go b/pkg/dra/claims.go
index a647ae912..0781f2043 100644
--- a/pkg/dra/claims.go
+++ b/pkg/dra/claims.go
@@ -33,38 +33,69 @@ import (
 )
 
 var (
-	ErrDeviceClassNotMapped = errors.New("DeviceClass is not mapped in DRA configuration")
-	ErrResourceClaimInUse   = errors.New("ResourceClaim is in use")
-	ErrClaimSpecNotFound    = errors.New("failed to get claim spec")
+	errDeviceClassNotMapped  = errors.New("DeviceClass is not mapped in DRA configuration")
+	errClaimSpecNotFound     = errors.New("failed to get claim spec")
+	errUnsupportedDRAFeature = errors.New("unsupported DRA feature")
+
+	// Specific unsupported DRA feature errors
+	errUnsupportedDRADeviceConstraints = errors.New("device constraints (MatchAttribute) are not supported")
+	errUnsupportedDRADeviceConfig      = errors.New("device config is not supported")
+	errUnsupportedDRAFirstAvailable    = errors.New("FirstAvailable device selection is not supported")
+	errUnsupportedDRACELSelectors      = errors.New("CEL selectors are not supported")
+	errUnsupportedDRAAdminAccess       = errors.New("AdminAccess is not supported")
+	errUnsupportedDRAAllocationModeAll = errors.New("AllocationMode 'All' is not supported")
 )
 
 // countDevicesPerClass returns a resources.Requests representing the
 // total number of devices requested for each DeviceClass inside the provided
-// ResourceClaimSpec.
-func countDevicesPerClass(claimSpec *resourcev1.ResourceClaimSpec) resources.Requests {
+// ResourceClaimSpec. It validates that only supported DRA features are used
+// and returns an error if unsupported features are detected.
+func countDevicesPerClass(claimSpec *resourcev1.ResourceClaimSpec) (resources.Requests, error) {
 	out := resources.Requests{}
 	if claimSpec == nil {
-		return out
+		return out, nil
+	}
+
+	// Check for unsupported device constraints
+	if len(claimSpec.Devices.Constraints) > 0 {
+		return nil, errUnsupportedDRADeviceConstraints
 	}
+
+	// Check for unsupported device config
+	if len(claimSpec.Devices.Config) > 0 {
+		return nil, errUnsupportedDRADeviceConfig
+	}
+
 	for _, req := range claimSpec.Devices.Requests {
-		// v1beta2 DeviceRequest has Exactly or FirstAvailable. For Step 1, we
+		// v1 DeviceRequest has Exactly or FirstAvailable. For Step 1, we
 		// preserve existing semantics by only supporting Exactly with Count.
 		var dcName string
 		var q int64
-		if req.Exactly != nil {
+		if req.FirstAvailable != nil {
+			return nil, errUnsupportedDRAFirstAvailable
+		}
+
+		switch {
+		case len(req.Exactly.Selectors) > 0:
+			return nil, errUnsupportedDRACELSelectors
+		case req.Exactly.AdminAccess != nil && *req.Exactly.AdminAccess:
+			return nil, errUnsupportedDRAAdminAccess
+		case req.Exactly.AllocationMode == resourcev1.DeviceAllocationModeAll:
+			return nil, errUnsupportedDRAAllocationModeAll
+		case req.Exactly.AllocationMode == resourcev1.DeviceAllocationModeExactCount:
 			dcName = req.Exactly.DeviceClassName
-			if req.Exactly.AllocationMode == resourcev1.DeviceAllocationModeExactCount {
-				q = req.Exactly.Count
-			}
+			q = req.Exactly.Count
+		default:
+			return nil, fmt.Errorf("%w: unsupported allocation mode: %s", errUnsupportedDRAFeature, req.Exactly.AllocationMode)
 		}
+
 		dc := corev1.ResourceName(dcName)
 		if dc == "" {
 			continue
 		}
-		// TODO: handle other Allocation modes
 		out[dc] += q
 	}
-	return out
+	return out, nil
 }
 
 // getClaimSpec resolves the ResourceClaim(Template) referenced by the PodResourceClaim
@@ -93,8 +124,8 @@ func getClaimSpec(ctx context.Context, cl client.Client, namespace string, prc c
 // converts DeviceClass counts into logical resources using the provided lookup function and
 // returns the aggregated quantities per PodSet.
 //
-// If at least one DeviceClass is not present in the DRA configuration the function
-// returns an error.
+// If at least one DeviceClass is not present in the DRA configuration or if unsupported DRA
+// features are detected, the function returns an error.
 func GetResourceRequestsForResourceClaimTemplates(
 	ctx context.Context,
 	cl client.Client,
@@ -110,16 +141,21 @@ func GetResourceRequestsForResourceClaimTemplates(
 			}
 			spec, err := getClaimSpec(ctx, cl, wl.Namespace, prc)
 			if err != nil {
-				return nil, fmt.Errorf("failed to get claim spec for ResourceClaimTemplate %s in workload %s podset %s: %w", *prc.ResourceClaimTemplateName, wl.Name, ps.Name, fmt.Errorf("%w: %v", ErrClaimSpecNotFound, err))
+				return nil, fmt.Errorf("failed to get claim spec for ResourceClaimTemplate %s in workload %s podset %s: %w", *prc.ResourceClaimTemplateName, wl.Name, ps.Name, fmt.Errorf("%w: %v", errClaimSpecNotFound, err))
 			}
 			if spec == nil {
 				continue
 			}
 
-			for dc, qty := range countDevicesPerClass(spec) {
+			deviceCounts, err := countDevicesPerClass(spec)
+			if err != nil {
+				return nil, fmt.Errorf("unsupported DRA feature in ResourceClaimTemplate %s in workload %s podset %s: %w", *prc.ResourceClaimTemplateName, wl.Name, ps.Name, err)
+			}
+
+			for dc, qty := range deviceCounts {
 				logical, found := Mapper().lookup(dc)
 				if !found {
-					return nil, fmt.Errorf("DeviceClass %s is not mapped in DRA configuration for workload %s podset %s: %w", dc, wl.Name, ps.Name, ErrDeviceClassNotMapped)
+					return nil, fmt.Errorf("DeviceClass %s is not mapped in DRA configuration for workload %s podset %s: %w", dc, wl.Name, ps.Name, errDeviceClassNotMapped)
 				}
 				aggregated = utilresource.MergeResourceListKeepSum(aggregated, corev1.ResourceList{logical: resource.MustParse(strconv.FormatInt(qty, 10))})
 			}
diff --git a/pkg/dra/mapper.go b/pkg/dra/mapper.go
index 64977e0c3..0167aa680 100644
--- a/pkg/dra/mapper.go
+++ b/pkg/dra/mapper.go
@@ -19,7 +19,7 @@ package dra
 import (
 	corev1 "k8s.io/api/core/v1"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 var (
diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go
index 8b5bc2ffe..b7de2ef40 100644
--- a/pkg/metrics/metrics.go
+++ b/pkg/metrics/metrics.go
@@ -477,9 +477,8 @@ For a LocalQueue, the metric only reports a value of 1 for one of the statuses.`
 quota to the lendable resources in the cohort, among all the resources provided by
 the ClusterQueue, and divided by the weight.
 If zero, it means that the usage of the ClusterQueue is below the nominal quota.
-If the ClusterQueue has a weight of zero and is borrowing, this will return 9223372036854775807,
-the maximum possible share value.`,
-		}, []string{"cluster_queue"},
+If the ClusterQueue has a weight of zero and is borrowing, this will return NaN.`,
+		}, []string{"cluster_queue", "cohort"},
 	)
 
 	CohortWeightedShare = prometheus.NewGaugeVec(
@@ -490,8 +489,7 @@ the maximum possible share value.`,
 quota to the lendable resources in the Cohort, among all the resources provided by
 the Cohort, and divided by the weight.
 If zero, it means that the usage of the Cohort is below the nominal quota.
-If the Cohort has a weight of zero and is borrowing, this will return 9223372036854775807,
-the maximum possible share value.`,
+If the Cohort has a weight of zero and is borrowing, this will return NaN.`,
 		}, []string{"cohort"},
 	)
 )
@@ -685,12 +683,12 @@ func ReportLocalQueueResourceUsage(lq LocalQueueReference, flavor, resource stri
 	LocalQueueResourceUsage.WithLabelValues(string(lq.Name), lq.Namespace, flavor, resource).Set(usage)
 }
 
-func ReportClusterQueueWeightedShare(cq string, weightedShare int64) {
-	ClusterQueueWeightedShare.WithLabelValues(cq).Set(float64(weightedShare))
+func ReportClusterQueueWeightedShare(cq, cohort string, weightedShare float64) {
+	ClusterQueueWeightedShare.WithLabelValues(cq, cohort).Set(weightedShare)
 }
 
-func ReportCohortWeightedShare(cohort string, weightedShare int64) {
-	CohortWeightedShare.WithLabelValues(cohort).Set(float64(weightedShare))
+func ReportCohortWeightedShare(cohort string, weightedShare float64) {
+	CohortWeightedShare.WithLabelValues(cohort).Set(weightedShare)
 }
 
 func ClearClusterQueueResourceMetrics(cqName string) {
diff --git a/pkg/scheduler/preemption/preemption.go b/pkg/scheduler/preemption/preemption.go
index f20387fe1..e6a25c997 100644
--- a/pkg/scheduler/preemption/preemption.go
+++ b/pkg/scheduler/preemption/preemption.go
@@ -33,7 +33,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go
index 38e14e479..c5008773d 100644
--- a/pkg/scheduler/scheduler.go
+++ b/pkg/scheduler/scheduler.go
@@ -37,7 +37,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/util/admissionfairsharing/admission_fair_sharing.go b/pkg/util/admissionfairsharing/admission_fair_sharing.go
index b12298b68..b867af8a4 100644
--- a/pkg/util/admissionfairsharing/admission_fair_sharing.go
+++ b/pkg/util/admissionfairsharing/admission_fair_sharing.go
@@ -21,7 +21,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/util/resource"
diff --git a/pkg/util/cert/cert.go b/pkg/util/cert/cert.go
index 7fe7e236e..18c6d4e5e 100644
--- a/pkg/util/cert/cert.go
+++ b/pkg/util/cert/cert.go
@@ -25,7 +25,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	ctrl "sigs.k8s.io/controller-runtime"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 const (
diff --git a/pkg/workload/workload.go b/pkg/workload/workload.go
index bf38b9438..3fa731282 100644
--- a/pkg/workload/workload.go
+++ b/pkg/workload/workload.go
@@ -39,7 +39,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/site/content/en/docs/concepts/preemption.md b/site/content/en/docs/concepts/preemption.md
index 75f545d49..29fe0874d 100644
--- a/site/content/en/docs/concepts/preemption.md
+++ b/site/content/en/docs/concepts/preemption.md
@@ -135,7 +135,7 @@ unsupported, and results in undefined behavior.
 To enable Fair Sharing, [use a Kueue Configuration](/docs/installation#install-a-custom-configured-release-version) similar to the following:
 
 ```yaml
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 fairSharing:
   enable: true
diff --git a/site/content/en/docs/installation/_index.md b/site/content/en/docs/installation/_index.md
index e83ad0014..03c2da36d 100644
--- a/site/content/en/docs/installation/_index.md
+++ b/site/content/en/docs/installation/_index.md
@@ -140,7 +140,7 @@ metadata:
   namespace: kueue-system
 data:
   controller_manager_config.yaml: |
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     namespace: kueue-system
     health:
diff --git a/site/content/en/docs/reference/kueue-config.v1beta1.md b/site/content/en/docs/reference/kueue-config.v1beta1.md
index 75f61714c..3f0e2025f 100644
--- a/site/content/en/docs/reference/kueue-config.v1beta1.md
+++ b/site/content/en/docs/reference/kueue-config.v1beta1.md
@@ -1,21 +1,18 @@
 ---
 title: Kueue Configuration API
 content_type: tool-reference
-package: /v1beta1
+package: config.kueue.x-k8s.io/v1beta1
 auto_generated: true
-description: Generated API reference documentation for Kueue Configuration.
+description: Generated API reference documentation for config.kueue.x-k8s.io/v1beta1.
 ---
 
 
 ## Resource Types 
 
 
-- [Configuration](#Configuration)
   
-    
-    
 
-## `AdmissionFairSharing`     {#AdmissionFairSharing}
+## `AdmissionFairSharing`     {#config-kueue-x-k8s-io-v1beta1-AdmissionFairSharing}
     
 
 **Appears in:**
@@ -56,7 +53,7 @@ Defaults to 1.</p>
 </tbody>
 </table>
 
-## `ClientConnection`     {#ClientConnection}
+## `ClientConnection`     {#config-kueue-x-k8s-io-v1beta1-ClientConnection}
     
 
 **Appears in:**
@@ -88,12 +85,12 @@ connection.</p>
 </tbody>
 </table>
 
-## `ClusterQueueVisibility`     {#ClusterQueueVisibility}
+## `ClusterQueueVisibility`     {#config-kueue-x-k8s-io-v1beta1-ClusterQueueVisibility}
     
 
 **Appears in:**
 
-- [QueueVisibility](#QueueVisibility)
+- [QueueVisibility](#config-kueue-x-k8s-io-v1beta1-QueueVisibility)
 
 
 
@@ -116,165 +113,12 @@ Defaults to 10.</p>
 </tbody>
 </table>
 
-## `Configuration`     {#Configuration}
-    
-
-
-<p>Configuration is the Schema for the kueueconfigurations API</p>
-
-
-<table class="table">
-<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
-<tbody>
-    
-  
-<tr><td><code>namespace</code> <B>[Required]</B><br/>
-<code>string</code>
-</td>
-<td>
-   <p>Namespace is the namespace in which kueue is deployed. It is used as part of DNSName of the webhook Service.
-If not set, the value is set from the file /var/run/secrets/kubernetes.io/serviceaccount/namespace
-If the file doesn't exist, default value is kueue-system.</p>
-</td>
-</tr>
-<tr><td><code>ControllerManager</code> <B>[Required]</B><br/>
-<a href="#ControllerManager"><code>ControllerManager</code></a>
-</td>
-<td>(Members of <code>ControllerManager</code> are embedded into this type.)
-   <p>ControllerManager returns the configurations for controllers</p>
-</td>
-</tr>
-<tr><td><code>manageJobsWithoutQueueName</code> <B>[Required]</B><br/>
-<code>bool</code>
-</td>
-<td>
-   <p>ManageJobsWithoutQueueName controls whether or not Kueue reconciles
-jobs that don't set the label kueue.x-k8s.io/queue-name.
-If set to true, then those jobs will be suspended and never started unless
-they are assigned a queue and eventually admitted. This also applies to
-jobs created before starting the kueue controller.
-Defaults to false; therefore, those jobs are not managed and if they are created
-unsuspended, they will start immediately.</p>
-</td>
-</tr>
-<tr><td><code>managedJobsNamespaceSelector</code> <B>[Required]</B><br/>
-<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#labelselector-v1-meta"><code>k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector</code></a>
-</td>
-<td>
-   <p>ManagedJobsNamespaceSelector provides a namespace-based mechanism to exempt jobs
-from management by Kueue.</p>
-<p>It provides a strong exemption for the Pod-based integrations (pod, deployment, statefulset, etc.),
-For Pod-based integrations, only jobs whose namespaces match ManagedJobsNamespaceSelector are
-eligible to be managed by Kueue.  Pods, deployments, etc. in non-matching namespaces will
-never be managed by Kueue, even if they have a kueue.x-k8s.io/queue-name label.
-This strong exemption ensures that Kueue will not interfere with the basic operation
-of system namespace.</p>
-<p>For all other integrations, ManagedJobsNamespaceSelector provides a weaker exemption
-by only modulating the effects of ManageJobsWithoutQueueName.  For these integrations,
-a job that has a kueue.x-k8s.io/queue-name label will always be managed by Kueue. Jobs without
-a kueue.x-k8s.io/queue-name label will be managed by Kueue only when ManageJobsWithoutQueueName is
-true and the job's namespace matches ManagedJobsNamespaceSelector.</p>
-</td>
-</tr>
-<tr><td><code>internalCertManagement</code> <B>[Required]</B><br/>
-<a href="#InternalCertManagement"><code>InternalCertManagement</code></a>
-</td>
-<td>
-   <p>InternalCertManagement is configuration for internalCertManagement</p>
-</td>
-</tr>
-<tr><td><code>waitForPodsReady</code> <B>[Required]</B><br/>
-<a href="#WaitForPodsReady"><code>WaitForPodsReady</code></a>
-</td>
-<td>
-   <p>WaitForPodsReady is configuration to provide a time-based all-or-nothing
-scheduling semantics for Jobs, by ensuring all pods are ready (running
-and passing the readiness probe) within the specified time. If the timeout
-is exceeded, then the workload is evicted.</p>
-</td>
-</tr>
-<tr><td><code>clientConnection</code> <B>[Required]</B><br/>
-<a href="#ClientConnection"><code>ClientConnection</code></a>
-</td>
-<td>
-   <p>ClientConnection provides additional configuration options for Kubernetes
-API server client.</p>
-</td>
-</tr>
-<tr><td><code>integrations</code> <B>[Required]</B><br/>
-<a href="#Integrations"><code>Integrations</code></a>
-</td>
-<td>
-   <p>Integrations provide configuration options for AI/ML/Batch frameworks
-integrations (including K8S job).</p>
-</td>
-</tr>
-<tr><td><code>queueVisibility</code> <B>[Required]</B><br/>
-<a href="#QueueVisibility"><code>QueueVisibility</code></a>
-</td>
-<td>
-   <p>QueueVisibility is configuration to expose the information about the top
-pending workloads.
-Deprecated: This field will be removed on v1beta2, use VisibilityOnDemand
-(https://kueue.sigs.k8s.io/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand/)
-instead.</p>
-</td>
-</tr>
-<tr><td><code>multiKueue</code> <B>[Required]</B><br/>
-<a href="#MultiKueue"><code>MultiKueue</code></a>
-</td>
-<td>
-   <p>MultiKueue controls the behaviour of the MultiKueue AdmissionCheck Controller.</p>
-</td>
-</tr>
-<tr><td><code>fairSharing</code> <B>[Required]</B><br/>
-<a href="#FairSharing"><code>FairSharing</code></a>
-</td>
-<td>
-   <p>FairSharing controls the Fair Sharing semantics across the cluster.</p>
-</td>
-</tr>
-<tr><td><code>admissionFairSharing</code> <B>[Required]</B><br/>
-<a href="#AdmissionFairSharing"><code>AdmissionFairSharing</code></a>
-</td>
-<td>
-   <p>admissionFairSharing indicates configuration of FairSharing with the <code>AdmissionTime</code> mode on</p>
-</td>
-</tr>
-<tr><td><code>resources</code> <B>[Required]</B><br/>
-<a href="#Resources"><code>Resources</code></a>
-</td>
-<td>
-   <p>Resources provides additional configuration options for handling the resources.</p>
-</td>
-</tr>
-<tr><td><code>featureGates</code> <B>[Required]</B><br/>
-<code>map[string]bool</code>
-</td>
-<td>
-   <p>FeatureGates is a map of feature names to bools that allows to override the
-default enablement status of a feature. The map cannot be used in conjunction
-with passing the list of features via the command line argument &quot;--feature-gates&quot;
-for the Kueue Deployment.</p>
-</td>
-</tr>
-<tr><td><code>objectRetentionPolicies</code><br/>
-<a href="#ObjectRetentionPolicies"><code>ObjectRetentionPolicies</code></a>
-</td>
-<td>
-   <p>ObjectRetentionPolicies provides configuration options for automatic deletion
-of Kueue-managed objects. A nil value disables all automatic deletions.</p>
-</td>
-</tr>
-</tbody>
-</table>
-
-## `ControllerConfigurationSpec`     {#ControllerConfigurationSpec}
+## `ControllerConfigurationSpec`     {#config-kueue-x-k8s-io-v1beta1-ControllerConfigurationSpec}
     
 
 **Appears in:**
 
-- [ControllerManager](#ControllerManager)
+- [ControllerManager](#config-kueue-x-k8s-io-v1beta1-ControllerManager)
 
 
 <p>ControllerConfigurationSpec defines the global configuration for
@@ -311,12 +155,12 @@ Defaults to 2 minutes if not set.</p>
 </tbody>
 </table>
 
-## `ControllerHealth`     {#ControllerHealth}
+## `ControllerHealth`     {#config-kueue-x-k8s-io-v1beta1-ControllerHealth}
     
 
 **Appears in:**
 
-- [ControllerManager](#ControllerManager)
+- [ControllerManager](#config-kueue-x-k8s-io-v1beta1-ControllerManager)
 
 
 <p>ControllerHealth defines the health configs.</p>
@@ -353,7 +197,7 @@ It can be set to &quot;0&quot; or &quot;&quot; to disable serving the health pro
 </tbody>
 </table>
 
-## `ControllerManager`     {#ControllerManager}
+## `ControllerManager`     {#config-kueue-x-k8s-io-v1beta1-ControllerManager}
     
 
 **Appears in:**
@@ -367,7 +211,7 @@ It can be set to &quot;0&quot; or &quot;&quot; to disable serving the health pro
     
   
 <tr><td><code>webhook</code><br/>
-<a href="#ControllerWebhook"><code>ControllerWebhook</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-ControllerWebhook"><code>ControllerWebhook</code></a>
 </td>
 <td>
    <p>Webhook contains the controllers webhook configuration</p>
@@ -382,14 +226,14 @@ the manager.Manager leader election</p>
 </td>
 </tr>
 <tr><td><code>metrics</code><br/>
-<a href="#ControllerMetrics"><code>ControllerMetrics</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-ControllerMetrics"><code>ControllerMetrics</code></a>
 </td>
 <td>
    <p>Metrics contains the controller metrics configuration</p>
 </td>
 </tr>
 <tr><td><code>health</code><br/>
-<a href="#ControllerHealth"><code>ControllerHealth</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-ControllerHealth"><code>ControllerHealth</code></a>
 </td>
 <td>
    <p>Health contains the controller health configuration</p>
@@ -407,7 +251,7 @@ before exposing it to public.</p>
 </td>
 </tr>
 <tr><td><code>controller</code><br/>
-<a href="#ControllerConfigurationSpec"><code>ControllerConfigurationSpec</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-ControllerConfigurationSpec"><code>ControllerConfigurationSpec</code></a>
 </td>
 <td>
    <p>Controller contains global configuration options for controllers
@@ -417,12 +261,12 @@ registered within this manager.</p>
 </tbody>
 </table>
 
-## `ControllerMetrics`     {#ControllerMetrics}
+## `ControllerMetrics`     {#config-kueue-x-k8s-io-v1beta1-ControllerMetrics}
     
 
 **Appears in:**
 
-- [ControllerManager](#ControllerManager)
+- [ControllerManager](#config-kueue-x-k8s-io-v1beta1-ControllerManager)
 
 
 <p>ControllerMetrics defines the metrics configs.</p>
@@ -453,12 +297,12 @@ metrics will be reported.</p>
 </tbody>
 </table>
 
-## `ControllerWebhook`     {#ControllerWebhook}
+## `ControllerWebhook`     {#config-kueue-x-k8s-io-v1beta1-ControllerWebhook}
     
 
 **Appears in:**
 
-- [ControllerManager](#ControllerManager)
+- [ControllerManager](#config-kueue-x-k8s-io-v1beta1-ControllerManager)
 
 
 <p>ControllerWebhook defines the webhook server for the controller.</p>
@@ -498,12 +342,12 @@ must be named tls.key and tls.crt, respectively.</p>
 </tbody>
 </table>
 
-## `DeviceClassMapping`     {#DeviceClassMapping}
+## `DeviceClassMapping`     {#config-kueue-x-k8s-io-v1beta1-DeviceClassMapping}
     
 
 **Appears in:**
 
-- [Resources](#Resources)
+- [Resources](#config-kueue-x-k8s-io-v1beta1-Resources)
 
 
 <p>DeviceClassMapping holds device class to logical resource mappings
@@ -544,7 +388,7 @@ The total length of each name must not exceed 253 characters.</p>
 </tbody>
 </table>
 
-## `FairSharing`     {#FairSharing}
+## `FairSharing`     {#config-kueue-x-k8s-io-v1beta1-FairSharing}
     
 
 **Appears in:**
@@ -566,7 +410,7 @@ Defaults to false.</p>
 </td>
 </tr>
 <tr><td><code>preemptionStrategies</code> <B>[Required]</B><br/>
-<a href="#PreemptionStrategy"><code>[]PreemptionStrategy</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-PreemptionStrategy"><code>[]PreemptionStrategy</code></a>
 </td>
 <td>
    <p>preemptionStrategies indicates which constraints should a preemption satisfy.
@@ -592,7 +436,7 @@ The default strategy is [&quot;LessThanOrEqualToFinalShare&quot;, &quot;LessThan
 </tbody>
 </table>
 
-## `Integrations`     {#Integrations}
+## `Integrations`     {#config-kueue-x-k8s-io-v1beta1-Integrations}
     
 
 **Appears in:**
@@ -640,7 +484,7 @@ the expected format is <code>Kind.version.group.com</code>.</p>
 </td>
 </tr>
 <tr><td><code>podOptions</code> <B>[Required]</B><br/>
-<a href="#PodIntegrationOptions"><code>PodIntegrationOptions</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-PodIntegrationOptions"><code>PodIntegrationOptions</code></a>
 </td>
 <td>
    <p>PodOptions defines kueue controller behaviour for pod objects
@@ -667,7 +511,7 @@ underlying job are changed.</p>
 </tbody>
 </table>
 
-## `InternalCertManagement`     {#InternalCertManagement}
+## `InternalCertManagement`     {#config-kueue-x-k8s-io-v1beta1-InternalCertManagement}
     
 
 **Appears in:**
@@ -716,7 +560,7 @@ Defaults to kueue-webhook-server-cert.</p>
 </tbody>
 </table>
 
-## `MultiKueue`     {#MultiKueue}
+## `MultiKueue`     {#config-kueue-x-k8s-io-v1beta1-MultiKueue}
     
 
 **Appears in:**
@@ -769,7 +613,7 @@ if the connection with its reserving worker cluster is lost.</p>
 </td>
 </tr>
 <tr><td><code>externalFrameworks</code><br/>
-<a href="#MultiKueueExternalFramework"><code>[]MultiKueueExternalFramework</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-MultiKueueExternalFramework"><code>[]MultiKueueExternalFramework</code></a>
 </td>
 <td>
    <p>ExternalFrameworks defines a list of external frameworks that should be supported
@@ -780,12 +624,12 @@ GroupVersionKind (GVK) for MultiKueue operations.</p>
 </tbody>
 </table>
 
-## `MultiKueueExternalFramework`     {#MultiKueueExternalFramework}
+## `MultiKueueExternalFramework`     {#config-kueue-x-k8s-io-v1beta1-MultiKueueExternalFramework}
     
 
 **Appears in:**
 
-- [MultiKueue](#MultiKueue)
+- [MultiKueue](#config-kueue-x-k8s-io-v1beta1-MultiKueue)
 
 
 <p>MultiKueueExternalFramework defines a framework that is not built-in.</p>
@@ -808,7 +652,7 @@ the expected format is <code>kind.version.group</code>.</p>
 </tbody>
 </table>
 
-## `ObjectRetentionPolicies`     {#ObjectRetentionPolicies}
+## `ObjectRetentionPolicies`     {#config-kueue-x-k8s-io-v1beta1-ObjectRetentionPolicies}
     
 
 **Appears in:**
@@ -824,7 +668,7 @@ the expected format is <code>kind.version.group</code>.</p>
     
   
 <tr><td><code>workloads</code><br/>
-<a href="#WorkloadRetentionPolicy"><code>WorkloadRetentionPolicy</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-WorkloadRetentionPolicy"><code>WorkloadRetentionPolicy</code></a>
 </td>
 <td>
    <p>Workloads configures retention for Workloads.
@@ -834,12 +678,12 @@ A nil value disables automatic deletion of Workloads.</p>
 </tbody>
 </table>
 
-## `PodIntegrationOptions`     {#PodIntegrationOptions}
+## `PodIntegrationOptions`     {#config-kueue-x-k8s-io-v1beta1-PodIntegrationOptions}
     
 
 **Appears in:**
 
-- [Integrations](#Integrations)
+- [Integrations](#config-kueue-x-k8s-io-v1beta1-Integrations)
 
 
 
@@ -865,19 +709,19 @@ A nil value disables automatic deletion of Workloads.</p>
 </tbody>
 </table>
 
-## `PreemptionStrategy`     {#PreemptionStrategy}
+## `PreemptionStrategy`     {#config-kueue-x-k8s-io-v1beta1-PreemptionStrategy}
     
 (Alias of `string`)
 
 **Appears in:**
 
-- [FairSharing](#FairSharing)
+- [FairSharing](#config-kueue-x-k8s-io-v1beta1-FairSharing)
 
 
 
 
 
-## `QueueVisibility`     {#QueueVisibility}
+## `QueueVisibility`     {#config-kueue-x-k8s-io-v1beta1-QueueVisibility}
     
 
 **Appears in:**
@@ -891,7 +735,7 @@ A nil value disables automatic deletion of Workloads.</p>
     
   
 <tr><td><code>clusterQueues</code> <B>[Required]</B><br/>
-<a href="#ClusterQueueVisibility"><code>ClusterQueueVisibility</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-ClusterQueueVisibility"><code>ClusterQueueVisibility</code></a>
 </td>
 <td>
    <p>ClusterQueues is configuration to expose the information
@@ -911,12 +755,12 @@ Defaults to 5.</p>
 </tbody>
 </table>
 
-## `RequeuingStrategy`     {#RequeuingStrategy}
+## `RequeuingStrategy`     {#config-kueue-x-k8s-io-v1beta1-RequeuingStrategy}
     
 
 **Appears in:**
 
-- [WaitForPodsReady](#WaitForPodsReady)
+- [WaitForPodsReady](#config-kueue-x-k8s-io-v1beta1-WaitForPodsReady)
 
 
 
@@ -926,7 +770,7 @@ Defaults to 5.</p>
     
   
 <tr><td><code>timestamp</code><br/>
-<a href="#RequeuingTimestamp"><code>RequeuingTimestamp</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-RequeuingTimestamp"><code>RequeuingTimestamp</code></a>
 </td>
 <td>
    <p>Timestamp defines the timestamp used for re-queuing a Workload
@@ -976,24 +820,24 @@ re-queuing an evicted workload.</p>
 </tbody>
 </table>
 
-## `RequeuingTimestamp`     {#RequeuingTimestamp}
+## `RequeuingTimestamp`     {#config-kueue-x-k8s-io-v1beta1-RequeuingTimestamp}
     
 (Alias of `string`)
 
 **Appears in:**
 
-- [RequeuingStrategy](#RequeuingStrategy)
+- [RequeuingStrategy](#config-kueue-x-k8s-io-v1beta1-RequeuingStrategy)
 
 
 
 
 
-## `ResourceTransformation`     {#ResourceTransformation}
+## `ResourceTransformation`     {#config-kueue-x-k8s-io-v1beta1-ResourceTransformation}
     
 
 **Appears in:**
 
-- [Resources](#Resources)
+- [Resources](#config-kueue-x-k8s-io-v1beta1-Resources)
 
 
 
@@ -1010,7 +854,7 @@ re-queuing an evicted workload.</p>
 </td>
 </tr>
 <tr><td><code>strategy</code> <B>[Required]</B><br/>
-<a href="#ResourceTransformationStrategy"><code>ResourceTransformationStrategy</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-ResourceTransformationStrategy"><code>ResourceTransformationStrategy</code></a>
 </td>
 <td>
    <p>Strategy specifies if the input resource should be replaced or retained.
@@ -1028,19 +872,19 @@ An empty Outputs combined with a <code>Replace</code> Strategy causes the Input
 </tbody>
 </table>
 
-## `ResourceTransformationStrategy`     {#ResourceTransformationStrategy}
+## `ResourceTransformationStrategy`     {#config-kueue-x-k8s-io-v1beta1-ResourceTransformationStrategy}
     
 (Alias of `string`)
 
 **Appears in:**
 
-- [ResourceTransformation](#ResourceTransformation)
+- [ResourceTransformation](#config-kueue-x-k8s-io-v1beta1-ResourceTransformation)
 
 
 
 
 
-## `Resources`     {#Resources}
+## `Resources`     {#config-kueue-x-k8s-io-v1beta1-Resources}
     
 
 **Appears in:**
@@ -1061,7 +905,7 @@ An empty Outputs combined with a <code>Replace</code> Strategy causes the Input
 </td>
 </tr>
 <tr><td><code>transformations</code> <B>[Required]</B><br/>
-<a href="#ResourceTransformation"><code>[]ResourceTransformation</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-ResourceTransformation"><code>[]ResourceTransformation</code></a>
 </td>
 <td>
    <p>Transformations defines how to transform PodSpec resources into Workload resource requests.
@@ -1069,7 +913,7 @@ This is intended to be a map with Input as the key (enforced by validation code)
 </td>
 </tr>
 <tr><td><code>deviceClassMappings</code><br/>
-<a href="#DeviceClassMapping"><code>[]DeviceClassMapping</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-DeviceClassMapping"><code>[]DeviceClassMapping</code></a>
 </td>
 <td>
    <p>DeviceClassMappings defines mappings from device classes to logical resources
@@ -1079,7 +923,7 @@ for Dynamic Resource Allocation support.</p>
 </tbody>
 </table>
 
-## `WaitForPodsReady`     {#WaitForPodsReady}
+## `WaitForPodsReady`     {#config-kueue-x-k8s-io-v1beta1-WaitForPodsReady}
     
 
 **Appears in:**
@@ -1123,7 +967,7 @@ This setting is only honored when <code>Enable</code> is set to true.</p>
 </td>
 </tr>
 <tr><td><code>requeuingStrategy</code><br/>
-<a href="#RequeuingStrategy"><code>RequeuingStrategy</code></a>
+<a href="#config-kueue-x-k8s-io-v1beta1-RequeuingStrategy"><code>RequeuingStrategy</code></a>
 </td>
 <td>
    <p>RequeuingStrategy defines the strategy for requeuing a Workload.</p>
@@ -1145,12 +989,12 @@ If not set, there is no timeout.</p>
 </tbody>
 </table>
 
-## `WorkloadRetentionPolicy`     {#WorkloadRetentionPolicy}
+## `WorkloadRetentionPolicy`     {#config-kueue-x-k8s-io-v1beta1-WorkloadRetentionPolicy}
     
 
 **Appears in:**
 
-- [ObjectRetentionPolicies](#ObjectRetentionPolicies)
+- [ObjectRetentionPolicies](#config-kueue-x-k8s-io-v1beta1-ObjectRetentionPolicies)
 
 
 <p>WorkloadRetentionPolicy defines the policies for when Workloads should be deleted.</p>
@@ -1188,4 +1032,5 @@ Represented using metav1.Duration (e.g. &quot;10m&quot;, &quot;1h30m&quot;).</p>
 </td>
 </tr>
 </tbody>
-</table>
\ No newline at end of file
+</table>
+  
\ No newline at end of file
diff --git a/site/content/en/docs/reference/kueue.v1beta1.md b/site/content/en/docs/reference/kueue.v1beta1.md
index 0fff02f80..c6e40fb29 100644
--- a/site/content/en/docs/reference/kueue.v1beta1.md
+++ b/site/content/en/docs/reference/kueue.v1beta1.md
@@ -1592,6 +1592,8 @@ which the kueue controller manager is running. The config should be stored in th
 - [LocalQueueStatus](#kueue-x-k8s-io-v1beta1-LocalQueueStatus)
 
 
+<p>Deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.</p>
+
 
 <table class="table">
 <thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
@@ -1833,7 +1835,8 @@ workloads assigned to this LocalQueue.</p>
 <a href="#kueue-x-k8s-io-v1beta1-LocalQueueFlavorStatus"><code>[]LocalQueueFlavorStatus</code></a>
 </td>
 <td>
-   <p>flavors lists all currently available ResourceFlavors in specified ClusterQueue.</p>
+   <p>flavors lists all currently available ResourceFlavors in specified ClusterQueue.
+Deprecated: Flavors is deprecated and marked for removal in v1beta2.</p>
 </td>
 </tr>
 <tr><td><code>fairSharing</code><br/>
diff --git a/site/content/en/docs/tasks/manage/administer_cluster_quotas.md b/site/content/en/docs/tasks/manage/administer_cluster_quotas.md
index fa2366c8a..d8074d21a 100644
--- a/site/content/en/docs/tasks/manage/administer_cluster_quotas.md
+++ b/site/content/en/docs/tasks/manage/administer_cluster_quotas.md
@@ -394,7 +394,7 @@ Follow the [installation instructions for using a custom configuration](/docs/in
 and extend the configuration with fields similar to the following:
 
 ```yaml
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 resources:
   excludeResourcePrefixes:
@@ -422,7 +422,7 @@ Follow the [installation instructions for using a custom configuration](/docs/in
 and extend the Kueue configuration with fields similar to the following:
 
 ```yaml
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 resources:
   transformations:
diff --git a/site/content/en/docs/tasks/run/deployment.md b/site/content/en/docs/tasks/run/deployment.md
index 61cd8edcd..5b5310fb2 100644
--- a/site/content/en/docs/tasks/run/deployment.md
+++ b/site/content/en/docs/tasks/run/deployment.md
@@ -25,7 +25,7 @@ For more information, see [Kueue's overview](/docs/overview).
 
 2. Ensure that you have the `deployment` integration enabled, for example:
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    integrations:
      frameworks:
diff --git a/site/content/en/docs/tasks/run/leaderworkerset.md b/site/content/en/docs/tasks/run/leaderworkerset.md
index 193e2d999..a41e00ff5 100644
--- a/site/content/en/docs/tasks/run/leaderworkerset.md
+++ b/site/content/en/docs/tasks/run/leaderworkerset.md
@@ -25,7 +25,7 @@ For more information, see [Kueue's overview](/docs/overview).
 
 2. Ensure that you have the `leaderworkerset.x-k8s.io/leaderworkerset` integration enabled, for example:
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    integrations:
      frameworks:
diff --git a/site/content/en/docs/tasks/run/multikueue/external-frameworks.md b/site/content/en/docs/tasks/run/multikueue/external-frameworks.md
index a603ee44b..85f1fa7a9 100644
--- a/site/content/en/docs/tasks/run/multikueue/external-frameworks.md
+++ b/site/content/en/docs/tasks/run/multikueue/external-frameworks.md
@@ -60,7 +60,7 @@ To demonstrate how to configure the adapter, let's use Tekton `PipelineRun` as a
 First, update your Kueue configuration to include `PipelineRun` in the `externalFrameworks` list:
 
 ```yaml
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 data:
   multikueue:
diff --git a/site/content/en/docs/tasks/run/plain_pods.md b/site/content/en/docs/tasks/run/plain_pods.md
index 99e4087d1..d748ec5b3 100644
--- a/site/content/en/docs/tasks/run/plain_pods.md
+++ b/site/content/en/docs/tasks/run/plain_pods.md
@@ -25,7 +25,7 @@ This guide is for [batch users](/docs/tasks#batch-user) that have a basic unders
 
    One approach is to only enable management only for specific namespaces:
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    managedJobsNamespaceSelector:
      matchLabels:
@@ -36,7 +36,7 @@ This guide is for [batch users](/docs/tasks#batch-user) that have a basic unders
    ```
    An alternate approach is to exempt system namespaces from management:
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    managedJobsNamespaceSelector:
       matchExpressions:
diff --git a/site/content/en/docs/tasks/run/statefulset.md b/site/content/en/docs/tasks/run/statefulset.md
index 48cc78e5e..f6219690b 100644
--- a/site/content/en/docs/tasks/run/statefulset.md
+++ b/site/content/en/docs/tasks/run/statefulset.md
@@ -23,7 +23,7 @@ For more information, see [Kueue's overview](/docs/overview).
 
 2. Ensure that you have the v1/statefulset integration enabled, for example:
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    integrations:
      frameworks:
diff --git a/site/content/zh-CN/docs/concepts/preemption.md b/site/content/zh-CN/docs/concepts/preemption.md
index ed03293c6..3b6490fe4 100644
--- a/site/content/zh-CN/docs/concepts/preemption.md
+++ b/site/content/zh-CN/docs/concepts/preemption.md
@@ -101,7 +101,7 @@ Kueue 提供了两种抢占算法。它们的主要区别在于：当抢占 Clus
 要启用公平共享，[请使用如下 Kueue 配置](/docs/installation#install-a-custom-configured-release-version)：
 
 ```yaml
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 fairSharing:
   enable: true
diff --git a/site/content/zh-CN/docs/installation/_index.md b/site/content/zh-CN/docs/installation/_index.md
index 08f9a9248..8ad673b03 100644
--- a/site/content/zh-CN/docs/installation/_index.md
+++ b/site/content/zh-CN/docs/installation/_index.md
@@ -139,7 +139,7 @@ metadata:
   namespace: kueue-system
 data:
   controller_manager_config.yaml: |
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     namespace: kueue-system
     health:
diff --git a/site/content/zh-CN/docs/reference/kueue.v1beta1.md b/site/content/zh-CN/docs/reference/kueue.v1beta1.md
index 9082b376b..852b67978 100644
--- a/site/content/zh-CN/docs/reference/kueue.v1beta1.md
+++ b/site/content/zh-CN/docs/reference/kueue.v1beta1.md
@@ -1519,6 +1519,7 @@ which the kueue controller manager is running. The config should be stored in th
 **Appears in:**
 
 - [LocalQueueStatus](#kueue-x-k8s-io-v1beta1-LocalQueueStatus)
+<p>Deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.</p>
 
 
 
@@ -1763,6 +1764,7 @@ workloads assigned to this LocalQueue.</p>
 </td>
 <td>
    <p>flavors lists all currently available ResourceFlavors in specified ClusterQueue.</p>
+   <p>Deprecated: LocalQueueFlavorStatus is deprecated and marked for removal in v1beta2.</p>
 </td>
 </tr>
 <tr><td><code>fairSharing</code><br/>
diff --git a/site/content/zh-CN/docs/tasks/manage/administer_cluster_quotas.md b/site/content/zh-CN/docs/tasks/manage/administer_cluster_quotas.md
index f696b3d4a..5ac6202af 100644
--- a/site/content/zh-CN/docs/tasks/manage/administer_cluster_quotas.md
+++ b/site/content/zh-CN/docs/tasks/manage/administer_cluster_quotas.md
@@ -383,7 +383,7 @@ kubectl apply -f team-a-cq.yaml -f team-b-cq.yaml -f shared-cq.yaml
 操作，并在配置中添加如下字段：
 
 ```yaml
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 resources:
   excludeResourcePrefixes:
@@ -410,7 +410,7 @@ resources:
 操作，并在 Kueue 配置中添加如下字段：
 
 ```yaml
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 resources:
   transformations:
diff --git a/site/content/zh-CN/docs/tasks/run/leaderworkerset.md b/site/content/zh-CN/docs/tasks/run/leaderworkerset.md
index fdc25bcd0..78a5f7115 100644
--- a/site/content/zh-CN/docs/tasks/run/leaderworkerset.md
+++ b/site/content/zh-CN/docs/tasks/run/leaderworkerset.md
@@ -24,7 +24,7 @@ description: 将 LeaderWorkerSet 作为由 Kueue 管理的工作负载运行
 
 2. 确保你已启用 `leaderworkerset.x-k8s.io/leaderworkerset` 集成，例如：
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    integrations:
      frameworks:
diff --git a/site/content/zh-CN/docs/tasks/run/plain_pods.md b/site/content/zh-CN/docs/tasks/run/plain_pods.md
index 3523f14c1..f6861a469 100644
--- a/site/content/zh-CN/docs/tasks/run/plain_pods.md
+++ b/site/content/zh-CN/docs/tasks/run/plain_pods.md
@@ -24,7 +24,7 @@ Kueue 支持管理[单个 Pod](#running-a-single-pod-admitted-by-kueue)
 
    一种方法是仅对特定命名空间启用管理：
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    managedJobsNamespaceSelector:
      matchLabels:
@@ -35,7 +35,7 @@ Kueue 支持管理[单个 Pod](#running-a-single-pod-admitted-by-kueue)
    ```
    另一种方法是免除系统命名空间的管理：
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    managedJobsNamespaceSelector:
       matchExpressions:
diff --git a/site/content/zh-CN/docs/tasks/run/statefulset.md b/site/content/zh-CN/docs/tasks/run/statefulset.md
index a008ec654..d4f6666f8 100644
--- a/site/content/zh-CN/docs/tasks/run/statefulset.md
+++ b/site/content/zh-CN/docs/tasks/run/statefulset.md
@@ -20,7 +20,7 @@ description: 将 StatefulSet 作为 Kueue 管理的工作负载运行。
 
 2. 确保你启用了 v1/statefulset 集成，例如：
    ```yaml
-   apiVersion: config.kueue.x-k8s.io/v1beta1
+   apiVersion: config.kueue.x-k8s.io/v1beta2
    kind: Configuration
    integrations:
      frameworks:
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainingruntime_types.go b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainingruntime_types.go
index 6c4478b4c..221e70d8c 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainingruntime_types.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainingruntime_types.go
@@ -21,6 +21,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 	jobsetv1alpha2 "sigs.k8s.io/jobset/api/jobset/v1alpha2"
+	volcanov1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
 )
 
 const (
@@ -44,11 +45,13 @@ const (
 type ClusterTrainingRuntime struct {
 	metav1.TypeMeta `json:",inline"`
 
-	// Standard object's metadata.
+	// metadata of the ClusterTrainingRuntime.
+	// +optional
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	// Specification of the desired ClusterTrainingRuntime.
-	Spec TrainingRuntimeSpec `json:"spec,omitempty"`
+	// spec of the ClusterTrainingRuntime.
+	// +optional
+	Spec TrainingRuntimeSpec `json:"spec,omitzero"`
 }
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
@@ -78,11 +81,13 @@ type ClusterTrainingRuntimeList struct {
 type TrainingRuntime struct {
 	metav1.TypeMeta `json:",inline"`
 
-	// Standard object's metadata.
+	// metadata of the TrainingRuntime.
+	// +optional
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	// Specification of the desired TrainingRuntime.
-	Spec TrainingRuntimeSpec `json:"spec,omitempty"`
+	// spec of the TrainingRuntime.
+	// +optional
+	Spec TrainingRuntimeSpec `json:"spec,omitempty,omitzero"`
 }
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
@@ -101,24 +106,31 @@ type TrainingRuntimeList struct {
 }
 
 // TrainingRuntimeSpec represents a specification of the desired training runtime.
+// +kubebuilder:validation:MinProperties=1
 type TrainingRuntimeSpec struct {
-	// Configuration for the model training with ML-specific parameters.
+	// mlPolicy provides the ML-specific parameters for the model training.
+	// +optional
 	MLPolicy *MLPolicy `json:"mlPolicy,omitempty"`
 
-	// Configuration for the PodGroup to enable gang-scheduling via supported plugins.
+	// podGroupPolicy defines the configuration for the PodGroup to enable gang-scheduling via supported plugins.
+	// +optional
 	PodGroupPolicy *PodGroupPolicy `json:"podGroupPolicy,omitempty"`
 
-	// JobSet template which will be used by TrainJob.
-	Template JobSetTemplateSpec `json:"template"`
+	// template for the JobSet which will be used by TrainJob.
+	// +optional
+	Template JobSetTemplateSpec `json:"template,omitzero"`
 }
 
 // JobSetTemplateSpec represents a template of the desired JobSet.
+// +kubebuilder:validation:MinProperties=1
 type JobSetTemplateSpec struct {
-	// Metadata for custom JobSet's labels and annotations.
+	// metadata for custom JobSet's labels and annotations.
 	// JobSet name and namespace is equal to the TrainJob's name and namespace.
+	// +optional
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	// Specification of the desired JobSet which will be created from TrainJob.
+	// spec of the desired JobSet which will be created from TrainJob.
+	// +optional
 	Spec jobsetv1alpha2.JobSetSpec `json:"spec,omitempty"`
 }
 
@@ -131,28 +143,40 @@ type PodGroupPolicy struct {
 // PodGroupPolicySource represents supported plugins for gang-scheduling.
 // Only one of its members may be specified.
 type PodGroupPolicySource struct {
-	// Coscheduling plugin from the Kubernetes scheduler-plugins for gang-scheduling.
+	// coscheduling plugin from the Kubernetes scheduler-plugins for gang-scheduling.
+	// +optional
 	Coscheduling *CoschedulingPodGroupPolicySource `json:"coscheduling,omitempty"`
 
-	// TODO (andreyvelich): Add support for Volcano gang-scheduler.
+	// volcano plugin for gang-scheduling.
+	// +optional
+	Volcano *VolcanoPodGroupPolicySource `json:"volcano,omitempty"`
 }
 
 // CoschedulingPodGroupPolicySource represents configuration for coscheduling plugin.
 // The number of min members in the PodGroupSpec is always equal to the number of nodes.
 type CoschedulingPodGroupPolicySource struct {
-	// Time threshold to schedule PodGroup for gang-scheduling.
+	// scheduleTimeoutSeconds is the maximum duration to schedule PodGroup for gang-scheduling.
 	// If the scheduling timeout is equal to 0, the default value is used.
 	// Defaults to 60 seconds.
 	// +kubebuilder:default=60
+	// +optional
 	ScheduleTimeoutSeconds *int32 `json:"scheduleTimeoutSeconds,omitempty"`
 }
 
-// MLPolicy represents configuration for the model trining with ML-specific parameters.
+// VolcanoPodGroupPolicySource represents configuration for the Volcano gang-scheduler.
+type VolcanoPodGroupPolicySource struct {
+	// networkTopology defines the NetworkTopology config, this field works in conjunction with network topology feature and hyperNode CRD.
+	// +optional
+	NetworkTopology *volcanov1beta1.NetworkTopologySpec `json:"networkTopology,omitempty"`
+}
+
+// MLPolicy represents configuration for the model training with ML-specific parameters.
 // +kubebuilder:validation:XValidation:rule="!(has(self.numNodes) && (has(self.torch) && has(self.torch.elasticPolicy)))", message="numNodes should not be set if torch.elasticPolicy is configured"
 // +kubebuilder:validation:XValidation:rule="!(has(self.torch) && has(self.mpi))", message="Only one of the policy can be configured"
 type MLPolicy struct {
-	// Number of training nodes.
+	// numNodes is the number of training nodes.
 	// Defaults to 1.
+	// +optional
 	NumNodes *int32 `json:"numNodes,omitempty"`
 
 	// Configuration for the runtime-specific parameters, such as Torch or MPI.
@@ -163,24 +187,28 @@ type MLPolicy struct {
 // MLPolicySource represents the runtime-specific configuration for various technologies.
 // One of the following specs can be set.
 type MLPolicySource struct {
-	// Configuration for the PyTorch runtime.
+	// torch defines the configuration for the PyTorch runtime.
+	// +optional
 	Torch *TorchMLPolicySource `json:"torch,omitempty"`
 
-	// Configuration for the MPI Runtime.
+	// mpi defines the configuration for the MPI Runtime.
+	// +optional
 	MPI *MPIMLPolicySource `json:"mpi,omitempty"`
 }
 
 // TorchMLPolicySource represents a PyTorch runtime configuration.
 type TorchMLPolicySource struct {
-	// Number of processes per node.
+	// numProcPerNode is the number of processes per node.
 	// This value is inserted into the `--nproc-per-node` argument of the `torchrun` CLI.
 	// Supported values: `auto`, `cpu`, `gpu`, or int value.
 	// Defaults to `auto`.
 	// +kubebuilder:default="auto"
 	// +kubebuilder:validation:XValidation:rule="self > 0 || self in ['auto', 'cpu', 'gpu']", message="NumProcPerNode must be equal to auto, cpu, gpu, or int value"
+	// +optional
 	NumProcPerNode *intstr.IntOrString `json:"numProcPerNode,omitempty"`
 
-	// Elastic policy for the PyTorch training.
+	// elasticPolicy defines the Elastic policy for the PyTorch training.
+	// +optional
 	ElasticPolicy *TorchElasticPolicy `json:"elasticPolicy,omitempty"`
 }
 
@@ -189,46 +217,54 @@ type TorchMLPolicySource struct {
 // is used to configure the `torchrun` CLI argument: `--nnodes=minNodes:maxNodes`.
 // Only `c10d` backend is supported for the Rendezvous communication.
 type TorchElasticPolicy struct {
-	// How many times the training job can be restarted.
+	// maxRestarts defines how many times the training job can be restarted.
 	// This value is inserted into the `--max-restarts` argument of the `torchrun` CLI and
 	// the `.spec.failurePolicy.maxRestarts` parameter of the training Job.
+	// +optional
 	MaxRestarts *int32 `json:"maxRestarts,omitempty"`
 
-	// Lower limit for the number of nodes to which training job can scale down.
+	// minNodes is the lower limit for the number of nodes to which training job can scale down.
+	// +optional
 	MinNodes *int32 `json:"minNodes,omitempty"`
 
-	// Upper limit for the number of nodes to which training job can scale up.
+	// maxNodes is the upper limit for the number of nodes to which training job can scale up.
+	// +optional
 	MaxNodes *int32 `json:"maxNodes,omitempty"`
 
-	// Specification which are used to calculate the desired number of nodes. See the individual
+	// metrics which are used to calculate the desired number of nodes. See the individual
 	// metric source types for more information about how each type of metric must respond.
 	// The HPA will be created to perform auto-scaling.
 	// +listType=atomic
+	// +optional
 	Metrics []autoscalingv2.MetricSpec `json:"metrics,omitempty"`
 }
 
 // MPIMLPolicySource represents a MPI runtime configuration.
 type MPIMLPolicySource struct {
-	// Number of processes per node.
+	// numProcPerNode is the number of processes per node.
 	// This value is equal to the number of slots for each node in the hostfile.
 	// Defaults to 1.
 	// +kubebuilder:default=1
+	// +optional
 	NumProcPerNode *int32 `json:"numProcPerNode,omitempty"`
 
-	// Implementation name for the MPI to create the appropriate hostfile.
+	// mpiImplementation is the name of the MPI implementation to create the appropriate hostfile.
 	// Defaults to OpenMPI.
 	// +kubebuilder:default=OpenMPI
-	// +kubebuilder:validation:Enum=OpenMPI
+	// +kubebuilder:validation:Enum=OpenMPI;""
+	// +optional
 	MPIImplementation *MPIImplementation `json:"mpiImplementation,omitempty"`
 
-	// Directory where SSH keys are mounted.
+	// sshAuthMountPath is the directory where SSH keys are mounted.
 	// Defaults to /root/.ssh.
 	// +kubebuilder:default=/root/.ssh
+	// +optional
 	SSHAuthMountPath *string `json:"sshAuthMountPath,omitempty"`
 
-	// Whether to run training process on the launcher Job.
+	// runLauncherAsNode defines whether to run training process on the launcher Job.
 	// Defaults to false.
 	// +kubebuilder:default=false
+	// +optional
 	RunLauncherAsNode *bool `json:"runLauncherAsNode,omitempty"`
 }
 
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainjob_types.go b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainjob_types.go
index 6d0f9e122..580382ee3 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainjob_types.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/trainjob_types.go
@@ -34,19 +34,24 @@ const (
 // +kubebuilder:storageversion
 // +kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.conditions[-1:].type`
 // +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:validation:XValidation:rule="self.metadata.name.matches('^[a-z]([-a-z0-9]*[a-z0-9])?$')", message="metadata.name must match RFC 1035 DNS label format"
+// +kubebuilder:validation:XValidation:rule="size(self.metadata.name) <= 63", message="metadata.name must be no more than 63 characters"
 
 // TrainJob represents configuration of a training job.
 type TrainJob struct {
 	metav1.TypeMeta `json:",inline"`
 
-	// Standard object's metadata.
+	// metadata of the TrainJob.
+	// +optional
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	// Specification of the desired TrainJob.
-	Spec TrainJobSpec `json:"spec,omitempty"`
+	// spec of the TrainJob.
+	// +optional
+	Spec TrainJobSpec `json:"spec,omitzero"`
 
-	// Current status of TrainJob.
-	Status TrainJobStatus `json:"status,omitempty"`
+	// status of TrainJob.
+	// +optional
+	Status TrainJobStatus `json:"status,omitzero"`
 }
 
 const (
@@ -91,35 +96,43 @@ type TrainJobList struct {
 
 // TrainJobSpec represents specification of the desired TrainJob.
 type TrainJobSpec struct {
-	// Reference to the training runtime.
+	// runtimeRef is the reference to the training runtime.
 	// The field is immutable.
 	// +kubebuilder:validation:XValidation:rule="self == oldSelf", message="runtimeRef is immutable"
-	RuntimeRef RuntimeRef `json:"runtimeRef"`
+	// +required
+	RuntimeRef RuntimeRef `json:"runtimeRef,omitzero"`
 
-	// Configuration of the initializer.
+	// initializer defines the configuration of the initializer.
+	// +optional
 	Initializer *Initializer `json:"initializer,omitempty"`
 
-	// Configuration of the trainer.
+	// trainer defines the configuration of the trainer.
+	// +optional
 	Trainer *Trainer `json:"trainer,omitempty"`
 
-	// Labels to apply for the derivative JobSet and Jobs.
+	// labels to apply for the derivative JobSet and Jobs.
 	// They will be merged with the TrainingRuntime values.
+	// +optional
 	Labels map[string]string `json:"labels,omitempty"`
 
-	// Annotations to apply for the derivative JobSet and Jobs.
+	// annotations to apply for the derivative JobSet and Jobs.
 	// They will be merged with the TrainingRuntime values.
+	// +optional
 	Annotations map[string]string `json:"annotations,omitempty"`
 
-	// Custom overrides for the training runtime.
+	// podTemplateOverrides define the PodTemplateOverrides for the training runtime.
+	// When multiple overrides apply to the same targetJob, later entries in the slice override earlier field values.
 	// +listType=atomic
-	PodSpecOverrides []PodSpecOverride `json:"podSpecOverrides,omitempty"`
+	// +optional
+	PodTemplateOverrides []PodTemplateOverride `json:"podTemplateOverrides,omitempty"`
 
-	// Whether the controller should suspend the running TrainJob.
+	// suspend defines whether to suspend the running TrainJob.
 	// Defaults to false.
 	// +kubebuilder:default=false
+	// +optional
 	Suspend *bool `json:"suspend,omitempty"`
 
-	// ManagedBy is used to indicate the controller or entity that manages a TrainJob.
+	// managedBy is used to indicate the controller or entity that manages a TrainJob.
 	// The value must be either an empty, `trainer.kubeflow.org/trainjob-controller` or
 	// `kueue.x-k8s.io/multikueue`. The built-in TrainJob controller reconciles TrainJob which
 	// don't have this field at all or the field value is the reserved string
@@ -129,34 +142,41 @@ type TrainJobSpec struct {
 	// +kubebuilder:default="trainer.kubeflow.org/trainjob-controller"
 	// +kubebuilder:validation:XValidation:rule="self in ['trainer.kubeflow.org/trainjob-controller', 'kueue.x-k8s.io/multikueue']", message="ManagedBy must be trainer.kubeflow.org/trainjob-controller or kueue.x-k8s.io/multikueue if set"
 	// +kubebuilder:validation:XValidation:rule="self == oldSelf", message="ManagedBy value is immutable"
+	// +optional
 	ManagedBy *string `json:"managedBy,omitempty"`
 }
 
 // RuntimeRef represents the reference to the existing training runtime.
 type RuntimeRef struct {
-	// Name of the runtime being referenced.
+	// name of the runtime being referenced.
 	// When namespaced-scoped TrainingRuntime is used, the TrainJob must have
 	// the same namespace as the deployed runtime.
-	Name string `json:"name"`
+	// +kubebuilder:validation:MinLength=1
+	// +required
+	Name string `json:"name,omitempty"`
 
-	// APIGroup of the runtime being referenced.
+	// apiGroup of the runtime being referenced.
 	// Defaults to `trainer.kubeflow.org`.
 	// +kubebuilder:default="trainer.kubeflow.org"
+	// +optional
 	APIGroup *string `json:"apiGroup,omitempty"`
 
-	// Kind of the runtime being referenced.
+	// kind of the runtime being referenced.
 	// Defaults to ClusterTrainingRuntime.
 	// +kubebuilder:default="ClusterTrainingRuntime"
+	// +optional
 	Kind *string `json:"kind,omitempty"`
 }
 
 // Initializer represents the desired configuration for the dataset and model initialization.
 // It is used to initialize the assets (dataset and pre-trained model) and pre-process data.
 type Initializer struct {
-	// Configuration of the dataset initialization and pre-processing.
+	// dataset defines the configuration for the dataset initialization and pre-processing.
+	// +optional
 	Dataset *DatasetInitializer `json:"dataset,omitempty"`
 
-	// Configuration of the pre-trained model initialization
+	// model defines the configuration for the pre-trained model initialization
+	// +optional
 	Model *ModelInitializer `json:"model,omitempty"`
 }
 
@@ -164,35 +184,41 @@ type Initializer struct {
 // The DatasetInitializer spec will override the runtime Job template
 // which contains this label: `trainer.kubeflow.org/trainjob-ancestor-step: dataset-initializer`
 type DatasetInitializer struct {
-	// Storage uri for the dataset provider.
+	// storageUri is the URI for the dataset provider.
+	// +optional
 	StorageUri *string `json:"storageUri,omitempty"`
 
-	// List of environment variables to set in the dataset initializer container.
+	// env is the list of environment variables to set in the dataset initializer container.
 	// These values will be merged with the TrainingRuntime's dataset initializer environments.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	Env []corev1.EnvVar `json:"env,omitempty"`
 
-	// Reference to the secret with credentials to download dataset.
+	// secretRef is the reference to the secret with credentials to download dataset.
 	// Secret must be created in the TrainJob's namespace.
+	// +optional
 	SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"`
 }
 
-// DatasetInitializer represents the desired configuration to initialize pre-trained model.
-// The DatasetInitializer spec will override the runtime Job template
+// ModelInitializer represents the desired configuration to initialize pre-trained model.
+// The ModelInitializer spec will override the runtime Job template
 // which contains this label: `trainer.kubeflow.org/trainjob-ancestor-step: dataset-initializer`
 type ModelInitializer struct {
-	// Storage uri for the model provider.
+	// storageUri is the URI for the model provider.
+	// +optional
 	StorageUri *string `json:"storageUri,omitempty"`
 
-	// List of environment variables to set in the model initializer container.
+	// env is the list of environment variables to set in the model initializer container.
 	// These values will be merged with the TrainingRuntime's model initializer environments.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	Env []corev1.EnvVar `json:"env,omitempty"`
 
-	// Reference to the secret with credentials to download model.
+	// secretRef is the reference to the secret with credentials to download model.
 	// Secret must be created in the TrainJob's namespace.
+	// +optional
 	SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"`
 }
 
@@ -200,135 +226,191 @@ type ModelInitializer struct {
 // The Trainer spec will override the runtime template
 // which contains this label: `trainer.kubeflow.org/trainjob-ancestor-step: trainer`
 type Trainer struct {
-	// Docker image for the training container.
+	// image is the container image for the training container.
+	// +optional
 	Image *string `json:"image,omitempty"`
 
-	// Entrypoint commands for the training container.
+	// command for the entrypoint of the training container.
 	// +listType=atomic
+	// +optional
 	Command []string `json:"command,omitempty"`
 
-	// Arguments to the entrypoint for the training container.
+	// args for the entrypoint for the training container.
 	// +listType=atomic
+	// +optional
 	Args []string `json:"args,omitempty"`
 
-	// List of environment variables to set in the training container.
+	// env is the list of environment variables to set in the training container.
 	// These values will be merged with the TrainingRuntime's trainer environments.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	Env []corev1.EnvVar `json:"env,omitempty"`
 
-	// Number of training nodes.
+	// numNodes is the number of training nodes.
 	// TODO (andreyvelich): Do we want to support dynamic num of nodes in TrainJob for PyTorch elastic: `--nnodes=1:4` ?
+	// +optional
 	NumNodes *int32 `json:"numNodes,omitempty"`
 
-	// Compute resources for each training node.
+	// resourcesPerNode defines the compute resources for each training node.
+	// +optional
 	ResourcesPerNode *corev1.ResourceRequirements `json:"resourcesPerNode,omitempty"`
 
-	// Number of processes/workers/slots on every training node.
+	// numProcPerNode is the number of processes/workers/slots on every training node.
 	// For the Torch runtime: `auto`, `cpu`, `gpu`, or int value can be set.
 	// For the MPI runtime only int value can be set.
+	// +optional
 	NumProcPerNode *intstr.IntOrString `json:"numProcPerNode,omitempty"`
 }
 
-// PodSpecOverride represents the custom overrides that will be applied for the TrainJob's resources.
-type PodSpecOverride struct {
-	// TrainJobs is the training job replicas in the training runtime template to apply the overrides.
+// PodTemplateOverride represents a custom PodTemplateSpec override that will be applied to the TrainJob's training runtime.
+type PodTemplateOverride struct {
+	// targetJobs is the list of replicated jobs in the training runtime template to apply the overrides.
 	// +listType=atomic
-	TargetJobs []PodSpecOverrideTargetJob `json:"targetJobs"`
+	// +required
+	TargetJobs []PodTemplateOverrideTargetJob `json:"targetJobs,omitempty"`
+
+	// metadata overrides the Pod template metadata.
+	// These values will be merged with the TrainingRuntime's Pod template metadata.
+	// +optional
+	Metadata *metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	// spec overrides the Pod template spec.
+	// These values will be merged with the TrainingRuntime's Pod template spec.
+	// +optional
+	Spec *PodTemplateSpecOverride `json:"spec,omitempty"`
+}
 
-	// Override for the service account.
+type PodTemplateOverrideTargetJob struct {
+	// name is the target training job name for which the PodTemplateSpec is overridden.
+	// +kubebuilder:validation:MinLength=1
+	// +required
+	Name string `json:"name,omitempty"`
+}
+
+// PodTemplateSpecOverride represents the spec overrides for Pod template.
+type PodTemplateSpecOverride struct {
+	// serviceAccountName overrides the service account.
+	// +optional
 	ServiceAccountName *string `json:"serviceAccountName,omitempty"`
 
-	// Override for the node selector to place Pod on the specific node.
+	// nodeSelector overrides the node selector to place Pod on the specific node.
+	// +optional
 	NodeSelector map[string]string `json:"nodeSelector,omitempty"`
 
-	// Override for the Pod's tolerations.
+	// affinity overrides for the Pod's affinity.
+	// +optional
+	Affinity *corev1.Affinity `json:"affinity,omitempty"`
+
+	// tolerations overrides the Pod's tolerations.
 	// +listType=atomic
+	// +optional
 	Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
 
-	// Overrides for the Pod volume configurations.
+	// volumes overrides the Pod's volumes.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	Volumes []corev1.Volume `json:"volumes,omitempty"`
 
-	// Overrides for the init container in the target job templates.
+	// initContainers overrides the init container in the target job templates.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	InitContainers []ContainerOverride `json:"initContainers,omitempty"`
 
-	// Overrides for the containers in the target job templates.
+	// containers overrides for the containers in the target job templates.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	Containers []ContainerOverride `json:"containers,omitempty"`
 
-	// SchedulingGates overrides the scheduling gates of the Pods in the target job templates.
+	// schedulingGates overrides the scheduling gates of the Pods in the target job templates.
 	// More info: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-scheduling-readiness/
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	SchedulingGates []corev1.PodSchedulingGate `json:"schedulingGates,omitempty"`
-}
 
-type PodSpecOverrideTargetJob struct {
-	// Name is the target training job name for which the PodSpec is overridden.
-	Name string `json:"name"`
+	// imagePullSecrets overrides the image pull secrets for the Pods in the target job templates.
+	// +listType=map
+	// +listMapKey=name
+	// +optional
+	ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
 }
 
 // ContainerOverride represents parameters that can be overridden using PodSpecOverrides.
 type ContainerOverride struct {
-	// Name for the container. TrainingRuntime must have this container.
-	Name string `json:"name"`
+	// name for the container. TrainingRuntime must have this container.
+	// +kubebuilder:validation:MinLength=1
+	// +required
+	Name string `json:"name,omitempty"`
 
-	// List of environment variables to set in the container.
+	// env is the list of environment variables to set in the container.
 	// These values will be merged with the TrainingRuntime's environments.
 	// These values can't be set for container with the name: `node`, `dataset-initializer`, or
 	// `model-initializer`. For those containers the envs can only be set via Trainer or Initializer APIs.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	Env []corev1.EnvVar `json:"env,omitempty"`
 
-	// Pod volumes to mount into the container's filesystem.
+	// volumeMounts are the volumes to mount into the container's filesystem.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"`
 }
 
 // TrainJobStatus represents the current status of TrainJob.
+// +kubebuilder:validation:MinProperties=1
 type TrainJobStatus struct {
-	// Conditions for the TrainJob.
+	// conditions for the TrainJob.
 	//
 	// +optional
 	// +listType=map
 	// +listMapKey=type
-	// +patchStrategy=merge
-	// +patchMergeKey=type
-	Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"`
+	Conditions []metav1.Condition `json:"conditions,omitempty"`
 
-	// JobsStatus tracks the child Jobs in TrainJob.
+	// jobsStatus tracks the child Jobs in TrainJob.
 	// +listType=map
 	// +listMapKey=name
+	// +optional
 	JobsStatus []JobStatus `json:"jobsStatus,omitempty"`
 }
 
 type JobStatus struct {
-	// Name of the child Job.
-	Name string `json:"name"`
+	// name of the child Job.
+	// +kubebuilder:validation:MinLength=1
+	// +required
+	Name string `json:"name,omitempty"`
 
-	// Ready is the number of child Jobs where the number of ready pods and completed pods
+	// ready is the number of child Jobs where the number of ready pods and completed pods
 	// is greater than or equal to the total expected pod count for the child Job.
-	Ready int32 `json:"ready"`
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	Ready *int32 `json:"ready,omitempty"`
 
-	// Succeeded is the number of successfully completed child Jobs.
-	Succeeded int32 `json:"succeeded"`
+	// succeeded is the number of successfully completed child Jobs.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	Succeeded *int32 `json:"succeeded,omitempty"`
 
-	// Failed is the number of failed child Jobs.
-	Failed int32 `json:"failed"`
+	// failed is the number of failed child Jobs.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	Failed *int32 `json:"failed,omitempty"`
 
-	// Active is the number of child Jobs with at least 1 pod in a running or pending state
+	// active is the number of child Jobs with at least 1 pod in a running or pending state
 	// which are not marked for deletion.
-	Active int32 `json:"active"`
-
-	// Suspended is the number of child Jobs which are in a suspended state.
-	Suspended int32 `json:"suspended"`
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	Active *int32 `json:"active,omitempty"`
+
+	// suspended is the number of child Jobs which are in a suspended state.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	Suspended *int32 `json:"suspended,omitempty"`
 }
 
 func init() {
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.deepcopy.go
index edf81854d..93602c41a 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.deepcopy.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.deepcopy.go
@@ -25,6 +25,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	intstr "k8s.io/apimachinery/pkg/util/intstr"
+	v1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
 )
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
@@ -218,6 +219,31 @@ func (in *JobSetTemplateSpec) DeepCopy() *JobSetTemplateSpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *JobStatus) DeepCopyInto(out *JobStatus) {
 	*out = *in
+	if in.Ready != nil {
+		in, out := &in.Ready, &out.Ready
+		*out = new(int32)
+		**out = **in
+	}
+	if in.Succeeded != nil {
+		in, out := &in.Succeeded, &out.Succeeded
+		*out = new(int32)
+		**out = **in
+	}
+	if in.Failed != nil {
+		in, out := &in.Failed, &out.Failed
+		*out = new(int32)
+		**out = **in
+	}
+	if in.Active != nil {
+		in, out := &in.Active, &out.Active
+		*out = new(int32)
+		**out = **in
+	}
+	if in.Suspended != nil {
+		in, out := &in.Suspended, &out.Suspended
+		*out = new(int32)
+		**out = **in
+	}
 	return
 }
 
@@ -373,6 +399,11 @@ func (in *PodGroupPolicySource) DeepCopyInto(out *PodGroupPolicySource) {
 		*out = new(CoschedulingPodGroupPolicySource)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.Volcano != nil {
+		in, out := &in.Volcano, &out.Volcano
+		*out = new(VolcanoPodGroupPolicySource)
+		(*in).DeepCopyInto(*out)
+	}
 	return
 }
 
@@ -387,13 +418,55 @@ func (in *PodGroupPolicySource) DeepCopy() *PodGroupPolicySource {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *PodSpecOverride) DeepCopyInto(out *PodSpecOverride) {
+func (in *PodTemplateOverride) DeepCopyInto(out *PodTemplateOverride) {
 	*out = *in
 	if in.TargetJobs != nil {
 		in, out := &in.TargetJobs, &out.TargetJobs
-		*out = make([]PodSpecOverrideTargetJob, len(*in))
+		*out = make([]PodTemplateOverrideTargetJob, len(*in))
 		copy(*out, *in)
 	}
+	if in.Metadata != nil {
+		in, out := &in.Metadata, &out.Metadata
+		*out = new(metav1.ObjectMeta)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Spec != nil {
+		in, out := &in.Spec, &out.Spec
+		*out = new(PodTemplateSpecOverride)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTemplateOverride.
+func (in *PodTemplateOverride) DeepCopy() *PodTemplateOverride {
+	if in == nil {
+		return nil
+	}
+	out := new(PodTemplateOverride)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodTemplateOverrideTargetJob) DeepCopyInto(out *PodTemplateOverrideTargetJob) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTemplateOverrideTargetJob.
+func (in *PodTemplateOverrideTargetJob) DeepCopy() *PodTemplateOverrideTargetJob {
+	if in == nil {
+		return nil
+	}
+	out := new(PodTemplateOverrideTargetJob)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodTemplateSpecOverride) DeepCopyInto(out *PodTemplateSpecOverride) {
+	*out = *in
 	if in.ServiceAccountName != nil {
 		in, out := &in.ServiceAccountName, &out.ServiceAccountName
 		*out = new(string)
@@ -406,6 +479,11 @@ func (in *PodSpecOverride) DeepCopyInto(out *PodSpecOverride) {
 			(*out)[key] = val
 		}
 	}
+	if in.Affinity != nil {
+		in, out := &in.Affinity, &out.Affinity
+		*out = new(v1.Affinity)
+		(*in).DeepCopyInto(*out)
+	}
 	if in.Tolerations != nil {
 		in, out := &in.Tolerations, &out.Tolerations
 		*out = make([]v1.Toleration, len(*in))
@@ -439,31 +517,20 @@ func (in *PodSpecOverride) DeepCopyInto(out *PodSpecOverride) {
 		*out = make([]v1.PodSchedulingGate, len(*in))
 		copy(*out, *in)
 	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodSpecOverride.
-func (in *PodSpecOverride) DeepCopy() *PodSpecOverride {
-	if in == nil {
-		return nil
+	if in.ImagePullSecrets != nil {
+		in, out := &in.ImagePullSecrets, &out.ImagePullSecrets
+		*out = make([]v1.LocalObjectReference, len(*in))
+		copy(*out, *in)
 	}
-	out := new(PodSpecOverride)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *PodSpecOverrideTargetJob) DeepCopyInto(out *PodSpecOverrideTargetJob) {
-	*out = *in
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodSpecOverrideTargetJob.
-func (in *PodSpecOverrideTargetJob) DeepCopy() *PodSpecOverrideTargetJob {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTemplateSpecOverride.
+func (in *PodTemplateSpecOverride) DeepCopy() *PodTemplateSpecOverride {
 	if in == nil {
 		return nil
 	}
-	out := new(PodSpecOverrideTargetJob)
+	out := new(PodTemplateSpecOverride)
 	in.DeepCopyInto(out)
 	return out
 }
@@ -647,9 +714,9 @@ func (in *TrainJobSpec) DeepCopyInto(out *TrainJobSpec) {
 			(*out)[key] = val
 		}
 	}
-	if in.PodSpecOverrides != nil {
-		in, out := &in.PodSpecOverrides, &out.PodSpecOverrides
-		*out = make([]PodSpecOverride, len(*in))
+	if in.PodTemplateOverrides != nil {
+		in, out := &in.PodTemplateOverrides, &out.PodTemplateOverrides
+		*out = make([]PodTemplateOverride, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -690,7 +757,9 @@ func (in *TrainJobStatus) DeepCopyInto(out *TrainJobStatus) {
 	if in.JobsStatus != nil {
 		in, out := &in.JobsStatus, &out.JobsStatus
 		*out = make([]JobStatus, len(*in))
-		copy(*out, *in)
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
 	}
 	return
 }
@@ -844,3 +913,24 @@ func (in *TrainingRuntimeSpec) DeepCopy() *TrainingRuntimeSpec {
 	in.DeepCopyInto(out)
 	return out
 }
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolcanoPodGroupPolicySource) DeepCopyInto(out *VolcanoPodGroupPolicySource) {
+	*out = *in
+	if in.NetworkTopology != nil {
+		in, out := &in.NetworkTopology, &out.NetworkTopology
+		*out = new(v1beta1.NetworkTopologySpec)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolcanoPodGroupPolicySource.
+func (in *VolcanoPodGroupPolicySource) DeepCopy() *VolcanoPodGroupPolicySource {
+	if in == nil {
+		return nil
+	}
+	out := new(VolcanoPodGroupPolicySource)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.defaults.go b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.defaults.go
index fc71e0087..4482b70d9 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.defaults.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.defaults.go
@@ -93,6 +93,17 @@ func SetObjectDefaults_ClusterTrainingRuntime(in *ClusterTrainingRuntime) {
 					c.Protocol = "TCP"
 				}
 			}
+			for k := range b.Env {
+				c := &b.Env[k]
+				if c.ValueFrom != nil {
+					if c.ValueFrom.FileKeyRef != nil {
+						if c.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
+				}
+			}
 			if b.LivenessProbe != nil {
 				if b.LivenessProbe.ProbeHandler.GRPC != nil {
 					if b.LivenessProbe.ProbeHandler.GRPC.Service == nil {
@@ -126,6 +137,17 @@ func SetObjectDefaults_ClusterTrainingRuntime(in *ClusterTrainingRuntime) {
 					c.Protocol = "TCP"
 				}
 			}
+			for k := range b.Env {
+				c := &b.Env[k]
+				if c.ValueFrom != nil {
+					if c.ValueFrom.FileKeyRef != nil {
+						if c.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
+				}
+			}
 			if b.LivenessProbe != nil {
 				if b.LivenessProbe.ProbeHandler.GRPC != nil {
 					if b.LivenessProbe.ProbeHandler.GRPC.Service == nil {
@@ -159,6 +181,17 @@ func SetObjectDefaults_ClusterTrainingRuntime(in *ClusterTrainingRuntime) {
 					c.Protocol = "TCP"
 				}
 			}
+			for k := range b.EphemeralContainerCommon.Env {
+				c := &b.EphemeralContainerCommon.Env[k]
+				if c.ValueFrom != nil {
+					if c.ValueFrom.FileKeyRef != nil {
+						if c.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
+				}
+			}
 			if b.EphemeralContainerCommon.LivenessProbe != nil {
 				if b.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC != nil {
 					if b.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC.Service == nil {
@@ -195,50 +228,121 @@ func SetObjectDefaults_ClusterTrainingRuntimeList(in *ClusterTrainingRuntimeList
 }
 
 func SetObjectDefaults_TrainJob(in *TrainJob) {
-	for i := range in.Spec.PodSpecOverrides {
-		a := &in.Spec.PodSpecOverrides[i]
-		for j := range a.Volumes {
-			b := &a.Volumes[j]
-			if b.VolumeSource.ISCSI != nil {
-				if b.VolumeSource.ISCSI.ISCSIInterface == "" {
-					b.VolumeSource.ISCSI.ISCSIInterface = "default"
+	if in.Spec.Initializer != nil {
+		if in.Spec.Initializer.Dataset != nil {
+			for i := range in.Spec.Initializer.Dataset.Env {
+				a := &in.Spec.Initializer.Dataset.Env[i]
+				if a.ValueFrom != nil {
+					if a.ValueFrom.FileKeyRef != nil {
+						if a.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							a.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
 				}
 			}
-			if b.VolumeSource.RBD != nil {
-				if b.VolumeSource.RBD.RBDPool == "" {
-					b.VolumeSource.RBD.RBDPool = "rbd"
-				}
-				if b.VolumeSource.RBD.RadosUser == "" {
-					b.VolumeSource.RBD.RadosUser = "admin"
+		}
+		if in.Spec.Initializer.Model != nil {
+			for i := range in.Spec.Initializer.Model.Env {
+				a := &in.Spec.Initializer.Model.Env[i]
+				if a.ValueFrom != nil {
+					if a.ValueFrom.FileKeyRef != nil {
+						if a.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							a.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
 				}
-				if b.VolumeSource.RBD.Keyring == "" {
-					b.VolumeSource.RBD.Keyring = "/etc/ceph/keyring"
+			}
+		}
+	}
+	if in.Spec.Trainer != nil {
+		for i := range in.Spec.Trainer.Env {
+			a := &in.Spec.Trainer.Env[i]
+			if a.ValueFrom != nil {
+				if a.ValueFrom.FileKeyRef != nil {
+					if a.ValueFrom.FileKeyRef.Optional == nil {
+						var ptrVar1 bool = false
+						a.ValueFrom.FileKeyRef.Optional = &ptrVar1
+					}
 				}
 			}
-			if b.VolumeSource.AzureDisk != nil {
-				if b.VolumeSource.AzureDisk.CachingMode == nil {
-					ptrVar1 := v1.AzureDataDiskCachingMode(v1.AzureDataDiskCachingReadWrite)
-					b.VolumeSource.AzureDisk.CachingMode = &ptrVar1
+		}
+	}
+	for i := range in.Spec.PodTemplateOverrides {
+		a := &in.Spec.PodTemplateOverrides[i]
+		if a.Spec != nil {
+			for j := range a.Spec.Volumes {
+				b := &a.Spec.Volumes[j]
+				if b.VolumeSource.ISCSI != nil {
+					if b.VolumeSource.ISCSI.ISCSIInterface == "" {
+						b.VolumeSource.ISCSI.ISCSIInterface = "default"
+					}
 				}
-				if b.VolumeSource.AzureDisk.FSType == nil {
-					var ptrVar1 string = "ext4"
-					b.VolumeSource.AzureDisk.FSType = &ptrVar1
+				if b.VolumeSource.RBD != nil {
+					if b.VolumeSource.RBD.RBDPool == "" {
+						b.VolumeSource.RBD.RBDPool = "rbd"
+					}
+					if b.VolumeSource.RBD.RadosUser == "" {
+						b.VolumeSource.RBD.RadosUser = "admin"
+					}
+					if b.VolumeSource.RBD.Keyring == "" {
+						b.VolumeSource.RBD.Keyring = "/etc/ceph/keyring"
+					}
 				}
-				if b.VolumeSource.AzureDisk.ReadOnly == nil {
-					var ptrVar1 bool = false
-					b.VolumeSource.AzureDisk.ReadOnly = &ptrVar1
+				if b.VolumeSource.AzureDisk != nil {
+					if b.VolumeSource.AzureDisk.CachingMode == nil {
+						ptrVar1 := v1.AzureDataDiskCachingMode(v1.AzureDataDiskCachingReadWrite)
+						b.VolumeSource.AzureDisk.CachingMode = &ptrVar1
+					}
+					if b.VolumeSource.AzureDisk.FSType == nil {
+						var ptrVar1 string = "ext4"
+						b.VolumeSource.AzureDisk.FSType = &ptrVar1
+					}
+					if b.VolumeSource.AzureDisk.ReadOnly == nil {
+						var ptrVar1 bool = false
+						b.VolumeSource.AzureDisk.ReadOnly = &ptrVar1
+					}
+					if b.VolumeSource.AzureDisk.Kind == nil {
+						ptrVar1 := v1.AzureDataDiskKind(v1.AzureSharedBlobDisk)
+						b.VolumeSource.AzureDisk.Kind = &ptrVar1
+					}
 				}
-				if b.VolumeSource.AzureDisk.Kind == nil {
-					ptrVar1 := v1.AzureDataDiskKind(v1.AzureSharedBlobDisk)
-					b.VolumeSource.AzureDisk.Kind = &ptrVar1
+				if b.VolumeSource.ScaleIO != nil {
+					if b.VolumeSource.ScaleIO.StorageMode == "" {
+						b.VolumeSource.ScaleIO.StorageMode = "ThinProvisioned"
+					}
+					if b.VolumeSource.ScaleIO.FSType == "" {
+						b.VolumeSource.ScaleIO.FSType = "xfs"
+					}
 				}
 			}
-			if b.VolumeSource.ScaleIO != nil {
-				if b.VolumeSource.ScaleIO.StorageMode == "" {
-					b.VolumeSource.ScaleIO.StorageMode = "ThinProvisioned"
+			for j := range a.Spec.InitContainers {
+				b := &a.Spec.InitContainers[j]
+				for k := range b.Env {
+					c := &b.Env[k]
+					if c.ValueFrom != nil {
+						if c.ValueFrom.FileKeyRef != nil {
+							if c.ValueFrom.FileKeyRef.Optional == nil {
+								var ptrVar1 bool = false
+								c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+							}
+						}
+					}
 				}
-				if b.VolumeSource.ScaleIO.FSType == "" {
-					b.VolumeSource.ScaleIO.FSType = "xfs"
+			}
+			for j := range a.Spec.Containers {
+				b := &a.Spec.Containers[j]
+				for k := range b.Env {
+					c := &b.Env[k]
+					if c.ValueFrom != nil {
+						if c.ValueFrom.FileKeyRef != nil {
+							if c.ValueFrom.FileKeyRef.Optional == nil {
+								var ptrVar1 bool = false
+								c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+							}
+						}
+					}
 				}
 			}
 		}
@@ -308,6 +412,17 @@ func SetObjectDefaults_TrainingRuntime(in *TrainingRuntime) {
 					c.Protocol = "TCP"
 				}
 			}
+			for k := range b.Env {
+				c := &b.Env[k]
+				if c.ValueFrom != nil {
+					if c.ValueFrom.FileKeyRef != nil {
+						if c.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
+				}
+			}
 			if b.LivenessProbe != nil {
 				if b.LivenessProbe.ProbeHandler.GRPC != nil {
 					if b.LivenessProbe.ProbeHandler.GRPC.Service == nil {
@@ -341,6 +456,17 @@ func SetObjectDefaults_TrainingRuntime(in *TrainingRuntime) {
 					c.Protocol = "TCP"
 				}
 			}
+			for k := range b.Env {
+				c := &b.Env[k]
+				if c.ValueFrom != nil {
+					if c.ValueFrom.FileKeyRef != nil {
+						if c.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
+				}
+			}
 			if b.LivenessProbe != nil {
 				if b.LivenessProbe.ProbeHandler.GRPC != nil {
 					if b.LivenessProbe.ProbeHandler.GRPC.Service == nil {
@@ -374,6 +500,17 @@ func SetObjectDefaults_TrainingRuntime(in *TrainingRuntime) {
 					c.Protocol = "TCP"
 				}
 			}
+			for k := range b.EphemeralContainerCommon.Env {
+				c := &b.EphemeralContainerCommon.Env[k]
+				if c.ValueFrom != nil {
+					if c.ValueFrom.FileKeyRef != nil {
+						if c.ValueFrom.FileKeyRef.Optional == nil {
+							var ptrVar1 bool = false
+							c.ValueFrom.FileKeyRef.Optional = &ptrVar1
+						}
+					}
+				}
+			}
 			if b.EphemeralContainerCommon.LivenessProbe != nil {
 				if b.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC != nil {
 					if b.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC.Service == nil {
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.openapi.go b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.openapi.go
index 235b2a823..acafe1b57 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.openapi.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1/zz_generated.openapi.go
@@ -44,8 +44,9 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.ModelInitializer":                 schema_pkg_apis_trainer_v1alpha1_ModelInitializer(ref),
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodGroupPolicy":                   schema_pkg_apis_trainer_v1alpha1_PodGroupPolicy(ref),
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodGroupPolicySource":             schema_pkg_apis_trainer_v1alpha1_PodGroupPolicySource(ref),
-		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodSpecOverride":                  schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref),
-		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodSpecOverrideTargetJob":         schema_pkg_apis_trainer_v1alpha1_PodSpecOverrideTargetJob(ref),
+		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateOverride":              schema_pkg_apis_trainer_v1alpha1_PodTemplateOverride(ref),
+		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateOverrideTargetJob":     schema_pkg_apis_trainer_v1alpha1_PodTemplateOverrideTargetJob(ref),
+		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateSpecOverride":          schema_pkg_apis_trainer_v1alpha1_PodTemplateSpecOverride(ref),
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.RuntimeRef":                       schema_pkg_apis_trainer_v1alpha1_RuntimeRef(ref),
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TorchElasticPolicy":               schema_pkg_apis_trainer_v1alpha1_TorchElasticPolicy(ref),
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TorchMLPolicySource":              schema_pkg_apis_trainer_v1alpha1_TorchMLPolicySource(ref),
@@ -57,6 +58,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TrainingRuntime":                  schema_pkg_apis_trainer_v1alpha1_TrainingRuntime(ref),
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TrainingRuntimeList":              schema_pkg_apis_trainer_v1alpha1_TrainingRuntimeList(ref),
 		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TrainingRuntimeSpec":              schema_pkg_apis_trainer_v1alpha1_TrainingRuntimeSpec(ref),
+		"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.VolcanoPodGroupPolicySource":      schema_pkg_apis_trainer_v1alpha1_VolcanoPodGroupPolicySource(ref),
 		"k8s.io/api/autoscaling/v2.ContainerResourceMetricSource":                                   schema_k8sio_api_autoscaling_v2_ContainerResourceMetricSource(ref),
 		"k8s.io/api/autoscaling/v2.ContainerResourceMetricStatus":                                   schema_k8sio_api_autoscaling_v2_ContainerResourceMetricStatus(ref),
 		"k8s.io/api/autoscaling/v2.CrossVersionObjectReference":                                     schema_k8sio_api_autoscaling_v2_CrossVersionObjectReference(ref),
@@ -127,9 +129,12 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"k8s.io/api/core/v1.ConfigMapProjection":                                                    schema_k8sio_api_core_v1_ConfigMapProjection(ref),
 		"k8s.io/api/core/v1.ConfigMapVolumeSource":                                                  schema_k8sio_api_core_v1_ConfigMapVolumeSource(ref),
 		"k8s.io/api/core/v1.Container":                                                              schema_k8sio_api_core_v1_Container(ref),
+		"k8s.io/api/core/v1.ContainerExtendedResourceRequest":                                       schema_k8sio_api_core_v1_ContainerExtendedResourceRequest(ref),
 		"k8s.io/api/core/v1.ContainerImage":                                                         schema_k8sio_api_core_v1_ContainerImage(ref),
 		"k8s.io/api/core/v1.ContainerPort":                                                          schema_k8sio_api_core_v1_ContainerPort(ref),
 		"k8s.io/api/core/v1.ContainerResizePolicy":                                                  schema_k8sio_api_core_v1_ContainerResizePolicy(ref),
+		"k8s.io/api/core/v1.ContainerRestartRule":                                                   schema_k8sio_api_core_v1_ContainerRestartRule(ref),
+		"k8s.io/api/core/v1.ContainerRestartRuleOnExitCodes":                                        schema_k8sio_api_core_v1_ContainerRestartRuleOnExitCodes(ref),
 		"k8s.io/api/core/v1.ContainerState":                                                         schema_k8sio_api_core_v1_ContainerState(ref),
 		"k8s.io/api/core/v1.ContainerStateRunning":                                                  schema_k8sio_api_core_v1_ContainerStateRunning(ref),
 		"k8s.io/api/core/v1.ContainerStateTerminated":                                               schema_k8sio_api_core_v1_ContainerStateTerminated(ref),
@@ -158,6 +163,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"k8s.io/api/core/v1.EventSource":                                                            schema_k8sio_api_core_v1_EventSource(ref),
 		"k8s.io/api/core/v1.ExecAction":                                                             schema_k8sio_api_core_v1_ExecAction(ref),
 		"k8s.io/api/core/v1.FCVolumeSource":                                                         schema_k8sio_api_core_v1_FCVolumeSource(ref),
+		"k8s.io/api/core/v1.FileKeySelector":                                                        schema_k8sio_api_core_v1_FileKeySelector(ref),
 		"k8s.io/api/core/v1.FlexPersistentVolumeSource":                                             schema_k8sio_api_core_v1_FlexPersistentVolumeSource(ref),
 		"k8s.io/api/core/v1.FlexVolumeSource":                                                       schema_k8sio_api_core_v1_FlexVolumeSource(ref),
 		"k8s.io/api/core/v1.FlockerVolumeSource":                                                    schema_k8sio_api_core_v1_FlockerVolumeSource(ref),
@@ -211,6 +217,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"k8s.io/api/core/v1.NodeSelectorTerm":                                                       schema_k8sio_api_core_v1_NodeSelectorTerm(ref),
 		"k8s.io/api/core/v1.NodeSpec":                                                               schema_k8sio_api_core_v1_NodeSpec(ref),
 		"k8s.io/api/core/v1.NodeStatus":                                                             schema_k8sio_api_core_v1_NodeStatus(ref),
+		"k8s.io/api/core/v1.NodeSwapStatus":                                                         schema_k8sio_api_core_v1_NodeSwapStatus(ref),
 		"k8s.io/api/core/v1.NodeSystemInfo":                                                         schema_k8sio_api_core_v1_NodeSystemInfo(ref),
 		"k8s.io/api/core/v1.ObjectFieldSelector":                                                    schema_k8sio_api_core_v1_ObjectFieldSelector(ref),
 		"k8s.io/api/core/v1.ObjectReference":                                                        schema_k8sio_api_core_v1_ObjectReference(ref),
@@ -232,10 +239,12 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"k8s.io/api/core/v1.PodAffinityTerm":                                                        schema_k8sio_api_core_v1_PodAffinityTerm(ref),
 		"k8s.io/api/core/v1.PodAntiAffinity":                                                        schema_k8sio_api_core_v1_PodAntiAffinity(ref),
 		"k8s.io/api/core/v1.PodAttachOptions":                                                       schema_k8sio_api_core_v1_PodAttachOptions(ref),
+		"k8s.io/api/core/v1.PodCertificateProjection":                                               schema_k8sio_api_core_v1_PodCertificateProjection(ref),
 		"k8s.io/api/core/v1.PodCondition":                                                           schema_k8sio_api_core_v1_PodCondition(ref),
 		"k8s.io/api/core/v1.PodDNSConfig":                                                           schema_k8sio_api_core_v1_PodDNSConfig(ref),
 		"k8s.io/api/core/v1.PodDNSConfigOption":                                                     schema_k8sio_api_core_v1_PodDNSConfigOption(ref),
 		"k8s.io/api/core/v1.PodExecOptions":                                                         schema_k8sio_api_core_v1_PodExecOptions(ref),
+		"k8s.io/api/core/v1.PodExtendedResourceClaimStatus":                                         schema_k8sio_api_core_v1_PodExtendedResourceClaimStatus(ref),
 		"k8s.io/api/core/v1.PodIP":                                                                  schema_k8sio_api_core_v1_PodIP(ref),
 		"k8s.io/api/core/v1.PodList":                                                                schema_k8sio_api_core_v1_PodList(ref),
 		"k8s.io/api/core/v1.PodLogOptions":                                                          schema_k8sio_api_core_v1_PodLogOptions(ref),
@@ -395,6 +404,22 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"sigs.k8s.io/jobset/api/jobset/v1alpha2.ReplicatedJobStatus":                                schema_jobset_api_jobset_v1alpha2_ReplicatedJobStatus(ref),
 		"sigs.k8s.io/jobset/api/jobset/v1alpha2.StartupPolicy":                                      schema_jobset_api_jobset_v1alpha2_StartupPolicy(ref),
 		"sigs.k8s.io/jobset/api/jobset/v1alpha2.SuccessPolicy":                                      schema_jobset_api_jobset_v1alpha2_SuccessPolicy(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.Affinity":                                      schema_pkg_apis_scheduling_v1beta1_Affinity(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.Cluster":                                       schema_pkg_apis_scheduling_v1beta1_Cluster(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.Guarantee":                                     schema_pkg_apis_scheduling_v1beta1_Guarantee(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.NetworkTopologySpec":                           schema_pkg_apis_scheduling_v1beta1_NetworkTopologySpec(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.NodeGroupAffinity":                             schema_pkg_apis_scheduling_v1beta1_NodeGroupAffinity(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.NodeGroupAntiAffinity":                         schema_pkg_apis_scheduling_v1beta1_NodeGroupAntiAffinity(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroup":                                      schema_pkg_apis_scheduling_v1beta1_PodGroup(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupCondition":                             schema_pkg_apis_scheduling_v1beta1_PodGroupCondition(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupList":                                  schema_pkg_apis_scheduling_v1beta1_PodGroupList(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupSpec":                                  schema_pkg_apis_scheduling_v1beta1_PodGroupSpec(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupStatus":                                schema_pkg_apis_scheduling_v1beta1_PodGroupStatus(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.Queue":                                         schema_pkg_apis_scheduling_v1beta1_Queue(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.QueueList":                                     schema_pkg_apis_scheduling_v1beta1_QueueList(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.QueueSpec":                                     schema_pkg_apis_scheduling_v1beta1_QueueSpec(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.QueueStatus":                                   schema_pkg_apis_scheduling_v1beta1_QueueStatus(ref),
+		"volcano.sh/apis/pkg/apis/scheduling/v1beta1.Reservation":                                   schema_pkg_apis_scheduling_v1beta1_Reservation(ref),
 	}
 }
 
@@ -421,14 +446,14 @@ func schema_pkg_apis_trainer_v1alpha1_ClusterTrainingRuntime(ref common.Referenc
 					},
 					"metadata": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Standard object's metadata.",
+							Description: "metadata of the ClusterTrainingRuntime.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
 						},
 					},
 					"spec": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specification of the desired ClusterTrainingRuntime.",
+							Description: "spec of the ClusterTrainingRuntime.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TrainingRuntimeSpec"),
 						},
@@ -501,8 +526,7 @@ func schema_pkg_apis_trainer_v1alpha1_ContainerOverride(ref common.ReferenceCall
 				Properties: map[string]spec.Schema{
 					"name": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Name for the container. TrainingRuntime must have this container.",
-							Default:     "",
+							Description: "name for the container. TrainingRuntime must have this container.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -517,7 +541,7 @@ func schema_pkg_apis_trainer_v1alpha1_ContainerOverride(ref common.ReferenceCall
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of environment variables to set in the container. These values will be merged with the TrainingRuntime's environments. These values can't be set for container with the name: `node`, `dataset-initializer`, or `model-initializer`. For those containers the envs can only be set via Trainer or Initializer APIs.",
+							Description: "env is the list of environment variables to set in the container. These values will be merged with the TrainingRuntime's environments. These values can't be set for container with the name: `node`, `dataset-initializer`, or `model-initializer`. For those containers the envs can only be set via Trainer or Initializer APIs.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -539,7 +563,7 @@ func schema_pkg_apis_trainer_v1alpha1_ContainerOverride(ref common.ReferenceCall
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Pod volumes to mount into the container's filesystem.",
+							Description: "volumeMounts are the volumes to mount into the container's filesystem.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -569,7 +593,7 @@ func schema_pkg_apis_trainer_v1alpha1_CoschedulingPodGroupPolicySource(ref commo
 				Properties: map[string]spec.Schema{
 					"scheduleTimeoutSeconds": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Time threshold to schedule PodGroup for gang-scheduling. If the scheduling timeout is equal to 0, the default value is used. Defaults to 60 seconds.",
+							Description: "scheduleTimeoutSeconds is the maximum duration to schedule PodGroup for gang-scheduling. If the scheduling timeout is equal to 0, the default value is used. Defaults to 60 seconds.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
@@ -589,7 +613,7 @@ func schema_pkg_apis_trainer_v1alpha1_DatasetInitializer(ref common.ReferenceCal
 				Properties: map[string]spec.Schema{
 					"storageUri": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Storage uri for the dataset provider.",
+							Description: "storageUri is the URI for the dataset provider.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -604,7 +628,7 @@ func schema_pkg_apis_trainer_v1alpha1_DatasetInitializer(ref common.ReferenceCal
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of environment variables to set in the dataset initializer container. These values will be merged with the TrainingRuntime's dataset initializer environments.",
+							Description: "env is the list of environment variables to set in the dataset initializer container. These values will be merged with the TrainingRuntime's dataset initializer environments.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -618,7 +642,7 @@ func schema_pkg_apis_trainer_v1alpha1_DatasetInitializer(ref common.ReferenceCal
 					},
 					"secretRef": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Reference to the secret with credentials to download dataset. Secret must be created in the TrainJob's namespace.",
+							Description: "secretRef is the reference to the secret with credentials to download dataset. Secret must be created in the TrainJob's namespace.",
 							Ref:         ref("k8s.io/api/core/v1.LocalObjectReference"),
 						},
 					},
@@ -639,13 +663,13 @@ func schema_pkg_apis_trainer_v1alpha1_Initializer(ref common.ReferenceCallback)
 				Properties: map[string]spec.Schema{
 					"dataset": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration of the dataset initialization and pre-processing.",
+							Description: "dataset defines the configuration for the dataset initialization and pre-processing.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.DatasetInitializer"),
 						},
 					},
 					"model": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration of the pre-trained model initialization",
+							Description: "model defines the configuration for the pre-trained model initialization",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.ModelInitializer"),
 						},
 					},
@@ -666,14 +690,14 @@ func schema_pkg_apis_trainer_v1alpha1_JobSetTemplateSpec(ref common.ReferenceCal
 				Properties: map[string]spec.Schema{
 					"metadata": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Metadata for custom JobSet's labels and annotations. JobSet name and namespace is equal to the TrainJob's name and namespace.",
+							Description: "metadata for custom JobSet's labels and annotations. JobSet name and namespace is equal to the TrainJob's name and namespace.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
 						},
 					},
 					"spec": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specification of the desired JobSet which will be created from TrainJob.",
+							Description: "spec of the desired JobSet which will be created from TrainJob.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("sigs.k8s.io/jobset/api/jobset/v1alpha2.JobSetSpec"),
 						},
@@ -694,48 +718,42 @@ func schema_pkg_apis_trainer_v1alpha1_JobStatus(ref common.ReferenceCallback) co
 				Properties: map[string]spec.Schema{
 					"name": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Name of the child Job.",
-							Default:     "",
+							Description: "name of the child Job.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
 					"ready": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Ready is the number of child Jobs where the number of ready pods and completed pods is greater than or equal to the total expected pod count for the child Job.",
-							Default:     0,
+							Description: "ready is the number of child Jobs where the number of ready pods and completed pods is greater than or equal to the total expected pod count for the child Job.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"succeeded": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Succeeded is the number of successfully completed child Jobs.",
-							Default:     0,
+							Description: "succeeded is the number of successfully completed child Jobs.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"failed": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Failed is the number of failed child Jobs.",
-							Default:     0,
+							Description: "failed is the number of failed child Jobs.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"active": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Active is the number of child Jobs with at least 1 pod in a running or pending state which are not marked for deletion.",
-							Default:     0,
+							Description: "active is the number of child Jobs with at least 1 pod in a running or pending state which are not marked for deletion.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"suspended": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Suspended is the number of child Jobs which are in a suspended state.",
-							Default:     0,
+							Description: "suspended is the number of child Jobs which are in a suspended state.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
@@ -751,25 +769,25 @@ func schema_pkg_apis_trainer_v1alpha1_MLPolicy(ref common.ReferenceCallback) com
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "MLPolicy represents configuration for the model trining with ML-specific parameters.",
+				Description: "MLPolicy represents configuration for the model training with ML-specific parameters.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"numNodes": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Number of training nodes. Defaults to 1.",
+							Description: "numNodes is the number of training nodes. Defaults to 1.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"torch": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration for the PyTorch runtime.",
+							Description: "torch defines the configuration for the PyTorch runtime.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TorchMLPolicySource"),
 						},
 					},
 					"mpi": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration for the MPI Runtime.",
+							Description: "mpi defines the configuration for the MPI Runtime.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.MPIMLPolicySource"),
 						},
 					},
@@ -790,13 +808,13 @@ func schema_pkg_apis_trainer_v1alpha1_MLPolicySource(ref common.ReferenceCallbac
 				Properties: map[string]spec.Schema{
 					"torch": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration for the PyTorch runtime.",
+							Description: "torch defines the configuration for the PyTorch runtime.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TorchMLPolicySource"),
 						},
 					},
 					"mpi": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration for the MPI Runtime.",
+							Description: "mpi defines the configuration for the MPI Runtime.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.MPIMLPolicySource"),
 						},
 					},
@@ -817,28 +835,28 @@ func schema_pkg_apis_trainer_v1alpha1_MPIMLPolicySource(ref common.ReferenceCall
 				Properties: map[string]spec.Schema{
 					"numProcPerNode": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Number of processes per node. This value is equal to the number of slots for each node in the hostfile. Defaults to 1.",
+							Description: "numProcPerNode is the number of processes per node. This value is equal to the number of slots for each node in the hostfile. Defaults to 1.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"mpiImplementation": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Implementation name for the MPI to create the appropriate hostfile. Defaults to OpenMPI.",
+							Description: "mpiImplementation is the name of the MPI implementation to create the appropriate hostfile. Defaults to OpenMPI.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
 					"sshAuthMountPath": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Directory where SSH keys are mounted. Defaults to /root/.ssh.",
+							Description: "sshAuthMountPath is the directory where SSH keys are mounted. Defaults to /root/.ssh.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
 					"runLauncherAsNode": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Whether to run training process on the launcher Job. Defaults to false.",
+							Description: "runLauncherAsNode defines whether to run training process on the launcher Job. Defaults to false.",
 							Type:        []string{"boolean"},
 							Format:      "",
 						},
@@ -853,12 +871,12 @@ func schema_pkg_apis_trainer_v1alpha1_ModelInitializer(ref common.ReferenceCallb
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "DatasetInitializer represents the desired configuration to initialize pre-trained model. The DatasetInitializer spec will override the runtime Job template which contains this label: `trainer.kubeflow.org/trainjob-ancestor-step: dataset-initializer`",
+				Description: "ModelInitializer represents the desired configuration to initialize pre-trained model. The ModelInitializer spec will override the runtime Job template which contains this label: `trainer.kubeflow.org/trainjob-ancestor-step: dataset-initializer`",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"storageUri": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Storage uri for the model provider.",
+							Description: "storageUri is the URI for the model provider.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -873,7 +891,7 @@ func schema_pkg_apis_trainer_v1alpha1_ModelInitializer(ref common.ReferenceCallb
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of environment variables to set in the model initializer container. These values will be merged with the TrainingRuntime's model initializer environments.",
+							Description: "env is the list of environment variables to set in the model initializer container. These values will be merged with the TrainingRuntime's model initializer environments.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -887,7 +905,7 @@ func schema_pkg_apis_trainer_v1alpha1_ModelInitializer(ref common.ReferenceCallb
 					},
 					"secretRef": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Reference to the secret with credentials to download model. Secret must be created in the TrainJob's namespace.",
+							Description: "secretRef is the reference to the secret with credentials to download model. Secret must be created in the TrainJob's namespace.",
 							Ref:         ref("k8s.io/api/core/v1.LocalObjectReference"),
 						},
 					},
@@ -908,15 +926,21 @@ func schema_pkg_apis_trainer_v1alpha1_PodGroupPolicy(ref common.ReferenceCallbac
 				Properties: map[string]spec.Schema{
 					"coscheduling": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Coscheduling plugin from the Kubernetes scheduler-plugins for gang-scheduling.",
+							Description: "coscheduling plugin from the Kubernetes scheduler-plugins for gang-scheduling.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.CoschedulingPodGroupPolicySource"),
 						},
 					},
+					"volcano": {
+						SchemaProps: spec.SchemaProps{
+							Description: "volcano plugin for gang-scheduling.",
+							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.VolcanoPodGroupPolicySource"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.CoschedulingPodGroupPolicySource"},
+			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.CoschedulingPodGroupPolicySource", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.VolcanoPodGroupPolicySource"},
 	}
 }
 
@@ -929,23 +953,29 @@ func schema_pkg_apis_trainer_v1alpha1_PodGroupPolicySource(ref common.ReferenceC
 				Properties: map[string]spec.Schema{
 					"coscheduling": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Coscheduling plugin from the Kubernetes scheduler-plugins for gang-scheduling.",
+							Description: "coscheduling plugin from the Kubernetes scheduler-plugins for gang-scheduling.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.CoschedulingPodGroupPolicySource"),
 						},
 					},
+					"volcano": {
+						SchemaProps: spec.SchemaProps{
+							Description: "volcano plugin for gang-scheduling.",
+							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.VolcanoPodGroupPolicySource"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.CoschedulingPodGroupPolicySource"},
+			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.CoschedulingPodGroupPolicySource", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.VolcanoPodGroupPolicySource"},
 	}
 }
 
-func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallback) common.OpenAPIDefinition {
+func schema_pkg_apis_trainer_v1alpha1_PodTemplateOverride(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "PodSpecOverride represents the custom overrides that will be applied for the TrainJob's resources.",
+				Description: "PodTemplateOverride represents a custom PodTemplateSpec override that will be applied to the TrainJob's training runtime.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"targetJobs": {
@@ -955,28 +985,76 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "TrainJobs is the training job replicas in the training runtime template to apply the overrides.",
+							Description: "targetJobs is the list of replicated jobs in the training runtime template to apply the overrides.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
 									SchemaProps: spec.SchemaProps{
 										Default: map[string]interface{}{},
-										Ref:     ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodSpecOverrideTargetJob"),
+										Ref:     ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateOverrideTargetJob"),
 									},
 								},
 							},
 						},
 					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "metadata overrides the Pod template metadata. These values will be merged with the TrainingRuntime's Pod template metadata.",
+							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+						},
+					},
+					"spec": {
+						SchemaProps: spec.SchemaProps{
+							Description: "spec overrides the Pod template spec. These values will be merged with the TrainingRuntime's Pod template spec.",
+							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateSpecOverride"),
+						},
+					},
+				},
+				Required: []string{"targetJobs"},
+			},
+		},
+		Dependencies: []string{
+			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateOverrideTargetJob", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateSpecOverride", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+	}
+}
+
+func schema_pkg_apis_trainer_v1alpha1_PodTemplateOverrideTargetJob(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"name": {
+						SchemaProps: spec.SchemaProps{
+							Description: "name is the target training job name for which the PodTemplateSpec is overridden.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+				},
+				Required: []string{"name"},
+			},
+		},
+	}
+}
+
+func schema_pkg_apis_trainer_v1alpha1_PodTemplateSpecOverride(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodTemplateSpecOverride represents the spec overrides for Pod template.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
 					"serviceAccountName": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Override for the service account.",
+							Description: "serviceAccountName overrides the service account.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
 					"nodeSelector": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Override for the node selector to place Pod on the specific node.",
+							Description: "nodeSelector overrides the node selector to place Pod on the specific node.",
 							Type:        []string{"object"},
 							AdditionalProperties: &spec.SchemaOrBool{
 								Allows: true,
@@ -990,6 +1068,12 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 					},
+					"affinity": {
+						SchemaProps: spec.SchemaProps{
+							Description: "affinity overrides for the Pod's affinity.",
+							Ref:         ref("k8s.io/api/core/v1.Affinity"),
+						},
+					},
 					"tolerations": {
 						VendorExtensible: spec.VendorExtensible{
 							Extensions: spec.Extensions{
@@ -997,7 +1081,7 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Override for the Pod's tolerations.",
+							Description: "tolerations overrides the Pod's tolerations.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1019,7 +1103,7 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Overrides for the Pod volume configurations.",
+							Description: "volumes overrides the Pod's volumes.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1041,7 +1125,7 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Overrides for the init container in the target job templates.",
+							Description: "initContainers overrides the init container in the target job templates.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1063,7 +1147,7 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Overrides for the containers in the target job templates.",
+							Description: "containers overrides for the containers in the target job templates.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1085,7 +1169,7 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "SchedulingGates overrides the scheduling gates of the Pods in the target job templates. More info: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-scheduling-readiness/",
+							Description: "schedulingGates overrides the scheduling gates of the Pods in the target job templates. More info: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-scheduling-readiness/",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1097,33 +1181,33 @@ func schema_pkg_apis_trainer_v1alpha1_PodSpecOverride(ref common.ReferenceCallba
 							},
 						},
 					},
-				},
-				Required: []string{"targetJobs"},
-			},
-		},
-		Dependencies: []string{
-			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.ContainerOverride", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodSpecOverrideTargetJob", "k8s.io/api/core/v1.PodSchedulingGate", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume"},
-	}
-}
-
-func schema_pkg_apis_trainer_v1alpha1_PodSpecOverrideTargetJob(ref common.ReferenceCallback) common.OpenAPIDefinition {
-	return common.OpenAPIDefinition{
-		Schema: spec.Schema{
-			SchemaProps: spec.SchemaProps{
-				Type: []string{"object"},
-				Properties: map[string]spec.Schema{
-					"name": {
+					"imagePullSecrets": {
+						VendorExtensible: spec.VendorExtensible{
+							Extensions: spec.Extensions{
+								"x-kubernetes-list-map-keys": []interface{}{
+									"name",
+								},
+								"x-kubernetes-list-type": "map",
+							},
+						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Name is the target training job name for which the PodSpec is overridden.",
-							Default:     "",
-							Type:        []string{"string"},
-							Format:      "",
+							Description: "imagePullSecrets overrides the image pull secrets for the Pods in the target job templates.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("k8s.io/api/core/v1.LocalObjectReference"),
+									},
+								},
+							},
 						},
 					},
 				},
-				Required: []string{"name"},
 			},
 		},
+		Dependencies: []string{
+			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.ContainerOverride", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodSchedulingGate", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume"},
 	}
 }
 
@@ -1136,22 +1220,21 @@ func schema_pkg_apis_trainer_v1alpha1_RuntimeRef(ref common.ReferenceCallback) c
 				Properties: map[string]spec.Schema{
 					"name": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Name of the runtime being referenced. When namespaced-scoped TrainingRuntime is used, the TrainJob must have the same namespace as the deployed runtime.",
-							Default:     "",
+							Description: "name of the runtime being referenced. When namespaced-scoped TrainingRuntime is used, the TrainJob must have the same namespace as the deployed runtime.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
 					"apiGroup": {
 						SchemaProps: spec.SchemaProps{
-							Description: "APIGroup of the runtime being referenced. Defaults to `trainer.kubeflow.org`.",
+							Description: "apiGroup of the runtime being referenced. Defaults to `trainer.kubeflow.org`.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
 					"kind": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Kind of the runtime being referenced. Defaults to ClusterTrainingRuntime.",
+							Description: "kind of the runtime being referenced. Defaults to ClusterTrainingRuntime.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -1172,21 +1255,21 @@ func schema_pkg_apis_trainer_v1alpha1_TorchElasticPolicy(ref common.ReferenceCal
 				Properties: map[string]spec.Schema{
 					"maxRestarts": {
 						SchemaProps: spec.SchemaProps{
-							Description: "How many times the training job can be restarted. This value is inserted into the `--max-restarts` argument of the `torchrun` CLI and the `.spec.failurePolicy.maxRestarts` parameter of the training Job.",
+							Description: "maxRestarts defines how many times the training job can be restarted. This value is inserted into the `--max-restarts` argument of the `torchrun` CLI and the `.spec.failurePolicy.maxRestarts` parameter of the training Job.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"minNodes": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Lower limit for the number of nodes to which training job can scale down.",
+							Description: "minNodes is the lower limit for the number of nodes to which training job can scale down.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"maxNodes": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Upper limit for the number of nodes to which training job can scale up.",
+							Description: "maxNodes is the upper limit for the number of nodes to which training job can scale up.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
@@ -1198,7 +1281,7 @@ func schema_pkg_apis_trainer_v1alpha1_TorchElasticPolicy(ref common.ReferenceCal
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Specification which are used to calculate the desired number of nodes. See the individual metric source types for more information about how each type of metric must respond. The HPA will be created to perform auto-scaling.",
+							Description: "metrics which are used to calculate the desired number of nodes. See the individual metric source types for more information about how each type of metric must respond. The HPA will be created to perform auto-scaling.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1227,13 +1310,13 @@ func schema_pkg_apis_trainer_v1alpha1_TorchMLPolicySource(ref common.ReferenceCa
 				Properties: map[string]spec.Schema{
 					"numProcPerNode": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Number of processes per node. This value is inserted into the `--nproc-per-node` argument of the `torchrun` CLI. Supported values: `auto`, `cpu`, `gpu`, or int value. Defaults to `auto`.",
+							Description: "numProcPerNode is the number of processes per node. This value is inserted into the `--nproc-per-node` argument of the `torchrun` CLI. Supported values: `auto`, `cpu`, `gpu`, or int value. Defaults to `auto`.",
 							Ref:         ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"),
 						},
 					},
 					"elasticPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Elastic policy for the PyTorch training.",
+							Description: "elasticPolicy defines the Elastic policy for the PyTorch training.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TorchElasticPolicy"),
 						},
 					},
@@ -1268,21 +1351,21 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJob(ref common.ReferenceCallback) com
 					},
 					"metadata": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Standard object's metadata.",
+							Description: "metadata of the TrainJob.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
 						},
 					},
 					"spec": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specification of the desired TrainJob.",
+							Description: "spec of the TrainJob.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TrainJobSpec"),
 						},
 					},
 					"status": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Current status of TrainJob.",
+							Description: "status of TrainJob.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TrainJobStatus"),
 						},
@@ -1355,26 +1438,26 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJobSpec(ref common.ReferenceCallback)
 				Properties: map[string]spec.Schema{
 					"runtimeRef": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Reference to the training runtime. The field is immutable.",
+							Description: "runtimeRef is the reference to the training runtime. The field is immutable.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.RuntimeRef"),
 						},
 					},
 					"initializer": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration of the initializer.",
+							Description: "initializer defines the configuration of the initializer.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.Initializer"),
 						},
 					},
 					"trainer": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration of the trainer.",
+							Description: "trainer defines the configuration of the trainer.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.Trainer"),
 						},
 					},
 					"labels": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Labels to apply for the derivative JobSet and Jobs. They will be merged with the TrainingRuntime values.",
+							Description: "labels to apply for the derivative JobSet and Jobs. They will be merged with the TrainingRuntime values.",
 							Type:        []string{"object"},
 							AdditionalProperties: &spec.SchemaOrBool{
 								Allows: true,
@@ -1390,7 +1473,7 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJobSpec(ref common.ReferenceCallback)
 					},
 					"annotations": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Annotations to apply for the derivative JobSet and Jobs. They will be merged with the TrainingRuntime values.",
+							Description: "annotations to apply for the derivative JobSet and Jobs. They will be merged with the TrainingRuntime values.",
 							Type:        []string{"object"},
 							AdditionalProperties: &spec.SchemaOrBool{
 								Allows: true,
@@ -1404,20 +1487,20 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJobSpec(ref common.ReferenceCallback)
 							},
 						},
 					},
-					"podSpecOverrides": {
+					"podTemplateOverrides": {
 						VendorExtensible: spec.VendorExtensible{
 							Extensions: spec.Extensions{
 								"x-kubernetes-list-type": "atomic",
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Custom overrides for the training runtime.",
+							Description: "podTemplateOverrides define the PodTemplateOverrides for the training runtime. When multiple overrides apply to the same targetJob, later entries in the slice override earlier field values.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
 									SchemaProps: spec.SchemaProps{
 										Default: map[string]interface{}{},
-										Ref:     ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodSpecOverride"),
+										Ref:     ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateOverride"),
 									},
 								},
 							},
@@ -1425,14 +1508,14 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJobSpec(ref common.ReferenceCallback)
 					},
 					"suspend": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Whether the controller should suspend the running TrainJob. Defaults to false.",
+							Description: "suspend defines whether to suspend the running TrainJob. Defaults to false.",
 							Type:        []string{"boolean"},
 							Format:      "",
 						},
 					},
 					"managedBy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "ManagedBy is used to indicate the controller or entity that manages a TrainJob. The value must be either an empty, `trainer.kubeflow.org/trainjob-controller` or `kueue.x-k8s.io/multikueue`. The built-in TrainJob controller reconciles TrainJob which don't have this field at all or the field value is the reserved string `trainer.kubeflow.org/trainjob-controller`, but delegates reconciling TrainJobs with a 'kueue.x-k8s.io/multikueue' to the Kueue. The field is immutable. Defaults to `trainer.kubeflow.org/trainjob-controller`",
+							Description: "managedBy is used to indicate the controller or entity that manages a TrainJob. The value must be either an empty, `trainer.kubeflow.org/trainjob-controller` or `kueue.x-k8s.io/multikueue`. The built-in TrainJob controller reconciles TrainJob which don't have this field at all or the field value is the reserved string `trainer.kubeflow.org/trainjob-controller`, but delegates reconciling TrainJobs with a 'kueue.x-k8s.io/multikueue' to the Kueue. The field is immutable. Defaults to `trainer.kubeflow.org/trainjob-controller`",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -1442,7 +1525,7 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJobSpec(ref common.ReferenceCallback)
 			},
 		},
 		Dependencies: []string{
-			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.Initializer", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodSpecOverride", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.RuntimeRef", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.Trainer"},
+			"github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.Initializer", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodTemplateOverride", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.RuntimeRef", "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.Trainer"},
 	}
 }
 
@@ -1459,13 +1542,11 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJobStatus(ref common.ReferenceCallbac
 								"x-kubernetes-list-map-keys": []interface{}{
 									"type",
 								},
-								"x-kubernetes-list-type":       "map",
-								"x-kubernetes-patch-merge-key": "type",
-								"x-kubernetes-patch-strategy":  "merge",
+								"x-kubernetes-list-type": "map",
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Conditions for the TrainJob.",
+							Description: "conditions for the TrainJob.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1487,7 +1568,7 @@ func schema_pkg_apis_trainer_v1alpha1_TrainJobStatus(ref common.ReferenceCallbac
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "JobsStatus tracks the child Jobs in TrainJob.",
+							Description: "jobsStatus tracks the child Jobs in TrainJob.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1516,7 +1597,7 @@ func schema_pkg_apis_trainer_v1alpha1_Trainer(ref common.ReferenceCallback) comm
 				Properties: map[string]spec.Schema{
 					"image": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Docker image for the training container.",
+							Description: "image is the container image for the training container.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -1528,7 +1609,7 @@ func schema_pkg_apis_trainer_v1alpha1_Trainer(ref common.ReferenceCallback) comm
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Entrypoint commands for the training container.",
+							Description: "command for the entrypoint of the training container.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1548,7 +1629,7 @@ func schema_pkg_apis_trainer_v1alpha1_Trainer(ref common.ReferenceCallback) comm
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Arguments to the entrypoint for the training container.",
+							Description: "args for the entrypoint for the training container.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1571,7 +1652,7 @@ func schema_pkg_apis_trainer_v1alpha1_Trainer(ref common.ReferenceCallback) comm
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of environment variables to set in the training container. These values will be merged with the TrainingRuntime's trainer environments.",
+							Description: "env is the list of environment variables to set in the training container. These values will be merged with the TrainingRuntime's trainer environments.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1585,20 +1666,20 @@ func schema_pkg_apis_trainer_v1alpha1_Trainer(ref common.ReferenceCallback) comm
 					},
 					"numNodes": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Number of training nodes.",
+							Description: "numNodes is the number of training nodes.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"resourcesPerNode": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Compute resources for each training node.",
+							Description: "resourcesPerNode defines the compute resources for each training node.",
 							Ref:         ref("k8s.io/api/core/v1.ResourceRequirements"),
 						},
 					},
 					"numProcPerNode": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Number of processes/workers/slots on every training node. For the Torch runtime: `auto`, `cpu`, `gpu`, or int value can be set. For the MPI runtime only int value can be set.",
+							Description: "numProcPerNode is the number of processes/workers/slots on every training node. For the Torch runtime: `auto`, `cpu`, `gpu`, or int value can be set. For the MPI runtime only int value can be set.",
 							Ref:         ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"),
 						},
 					},
@@ -1633,14 +1714,14 @@ func schema_pkg_apis_trainer_v1alpha1_TrainingRuntime(ref common.ReferenceCallba
 					},
 					"metadata": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Standard object's metadata.",
+							Description: "metadata of the TrainingRuntime.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
 						},
 					},
 					"spec": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specification of the desired TrainingRuntime.",
+							Description: "spec of the TrainingRuntime.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.TrainingRuntimeSpec"),
 						},
@@ -1713,25 +1794,24 @@ func schema_pkg_apis_trainer_v1alpha1_TrainingRuntimeSpec(ref common.ReferenceCa
 				Properties: map[string]spec.Schema{
 					"mlPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration for the model training with ML-specific parameters.",
+							Description: "mlPolicy provides the ML-specific parameters for the model training.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.MLPolicy"),
 						},
 					},
 					"podGroupPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Configuration for the PodGroup to enable gang-scheduling via supported plugins.",
+							Description: "podGroupPolicy defines the configuration for the PodGroup to enable gang-scheduling via supported plugins.",
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.PodGroupPolicy"),
 						},
 					},
 					"template": {
 						SchemaProps: spec.SchemaProps{
-							Description: "JobSet template which will be used by TrainJob.",
+							Description: "template for the JobSet which will be used by TrainJob.",
 							Default:     map[string]interface{}{},
 							Ref:         ref("github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1.JobSetTemplateSpec"),
 						},
 					},
 				},
-				Required: []string{"template"},
 			},
 		},
 		Dependencies: []string{
@@ -1739,6 +1819,27 @@ func schema_pkg_apis_trainer_v1alpha1_TrainingRuntimeSpec(ref common.ReferenceCa
 	}
 }
 
+func schema_pkg_apis_trainer_v1alpha1_VolcanoPodGroupPolicySource(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "VolcanoPodGroupPolicySource represents configuration for the Volcano gang-scheduler.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"networkTopology": {
+						SchemaProps: spec.SchemaProps{
+							Description: "networkTopology defines the NetworkTopology config, this field works in conjunction with network topology feature and hyperNode CRD.",
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.NetworkTopologySpec"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"volcano.sh/apis/pkg/apis/scheduling/v1beta1.NetworkTopologySpec"},
+	}
+}
+
 func schema_k8sio_api_autoscaling_v2_ContainerResourceMetricSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -1956,7 +2057,7 @@ func schema_k8sio_api_autoscaling_v2_HPAScalingRules(ref common.ReferenceCallbac
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "HPAScalingRules configures the scaling behavior for one direction. These Rules are applied after calculating DesiredReplicas from metrics for the HPA. They can limit the scaling velocity by specifying scaling policies. They can prevent flapping by specifying the stabilization window, so that the number of replicas is not set instantly, instead, the safest value from the stabilization window is chosen.",
+				Description: "HPAScalingRules configures the scaling behavior for one direction via scaling Policy Rules and a configurable metric tolerance.\n\nScaling Policy Rules are applied after calculating DesiredReplicas from metrics for the HPA. They can limit the scaling velocity by specifying scaling policies. They can prevent flapping by specifying the stabilization window, so that the number of replicas is not set instantly, instead, the safest value from the stabilization window is chosen.\n\nThe tolerance is applied to the metric values and prevents scaling too eagerly for small metric variations. (Note that setting a tolerance requires enabling the alpha HPAConfigurableTolerance feature gate.)",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"stabilizationWindowSeconds": {
@@ -1980,7 +2081,7 @@ func schema_k8sio_api_autoscaling_v2_HPAScalingRules(ref common.ReferenceCallbac
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "policies is a list of potential scaling polices which can be used during scaling. At least one policy must be specified, otherwise the HPAScalingRules will be discarded as invalid",
+							Description: "policies is a list of potential scaling polices which can be used during scaling. If not set, use the default values: - For scale up: allow doubling the number of pods, or an absolute change of 4 pods in a 15s window. - For scale down: allow all pods to be removed in a 15s window.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -1992,11 +2093,17 @@ func schema_k8sio_api_autoscaling_v2_HPAScalingRules(ref common.ReferenceCallbac
 							},
 						},
 					},
+					"tolerance": {
+						SchemaProps: spec.SchemaProps{
+							Description: "tolerance is the tolerance on the ratio between the current and desired metric value under which no updates are made to the desired number of replicas (e.g. 0.01 for 1%). Must be greater than or equal to zero. If not set, the default cluster-wide tolerance is applied (by default 10%).\n\nFor example, if autoscaling is configured with a memory consumption target of 100Mi, and scale-down and scale-up tolerances of 5% and 1% respectively, scaling will be triggered when the actual consumption falls below 95Mi or exceeds 101Mi.\n\nThis is an alpha field and requires enabling the HPAConfigurableTolerance feature gate.",
+							Ref:         ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/autoscaling/v2.HPAScalingPolicy"},
+			"k8s.io/api/autoscaling/v2.HPAScalingPolicy", "k8s.io/apimachinery/pkg/api/resource.Quantity"},
 	}
 }
 
@@ -3157,27 +3264,27 @@ func schema_k8sio_api_batch_v1_JobSpec(ref common.ReferenceCallback) common.Open
 					},
 					"successPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "successPolicy specifies the policy when the Job can be declared as succeeded. If empty, the default behavior applies - the Job is declared as succeeded only when the number of succeeded pods equals to the completions. When the field is specified, it must be immutable and works only for the Indexed Jobs. Once the Job meets the SuccessPolicy, the lingering pods are terminated.\n\nThis field is beta-level. To use this field, you must enable the `JobSuccessPolicy` feature gate (enabled by default).",
+							Description: "successPolicy specifies the policy when the Job can be declared as succeeded. If empty, the default behavior applies - the Job is declared as succeeded only when the number of succeeded pods equals to the completions. When the field is specified, it must be immutable and works only for the Indexed Jobs. Once the Job meets the SuccessPolicy, the lingering pods are terminated.",
 							Ref:         ref("k8s.io/api/batch/v1.SuccessPolicy"),
 						},
 					},
 					"backoffLimit": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specifies the number of retries before marking this job failed. Defaults to 6",
+							Description: "Specifies the number of retries before marking this job failed. Defaults to 6, unless backoffLimitPerIndex (only Indexed Job) is specified. When backoffLimitPerIndex is specified, backoffLimit defaults to 2147483647.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"backoffLimitPerIndex": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specifies the limit for the number of retries within an index before marking this index as failed. When enabled the number of failures per index is kept in the pod's batch.kubernetes.io/job-index-failure-count annotation. It can only be set when Job's completionMode=Indexed, and the Pod's restart policy is Never. The field is immutable. This field is beta-level. It can be used when the `JobBackoffLimitPerIndex` feature gate is enabled (enabled by default).",
+							Description: "Specifies the limit for the number of retries within an index before marking this index as failed. When enabled the number of failures per index is kept in the pod's batch.kubernetes.io/job-index-failure-count annotation. It can only be set when Job's completionMode=Indexed, and the Pod's restart policy is Never. The field is immutable.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
 					},
 					"maxFailedIndexes": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specifies the maximal number of failed indexes before marking the Job as failed, when backoffLimitPerIndex is set. Once the number of failed indexes exceeds this number the entire Job is marked as Failed and its execution is terminated. When left as null the job continues execution of all of its indexes and is marked with the `Complete` Job condition. It can only be specified when backoffLimitPerIndex is set. It can be null or up to completions. It is required and must be less than or equal to 10^4 when is completions greater than 10^5. This field is beta-level. It can be used when the `JobBackoffLimitPerIndex` feature gate is enabled (enabled by default).",
+							Description: "Specifies the maximal number of failed indexes before marking the Job as failed, when backoffLimitPerIndex is set. Once the number of failed indexes exceeds this number the entire Job is marked as Failed and its execution is terminated. When left as null the job continues execution of all of its indexes and is marked with the `Complete` Job condition. It can only be specified when backoffLimitPerIndex is set. It can be null or up to completions. It is required and must be less than or equal to 10^4 when is completions greater than 10^5.",
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
@@ -3226,7 +3333,7 @@ func schema_k8sio_api_batch_v1_JobSpec(ref common.ReferenceCallback) common.Open
 					},
 					"podReplacementPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods\n  when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n  Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. This is on by default.\n\nPossible enum values:\n - `\"Failed\"` means to wait until a previously created Pod is fully terminated (has phase Failed or Succeeded) before creating a replacement Pod.\n - `\"TerminatingOrFailed\"` means that we recreate pods when they are terminating (has a metadata.deletionTimestamp) or failed.",
+							Description: "podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods\n  when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n  Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use.\n\nPossible enum values:\n - `\"Failed\"` means to wait until a previously created Pod is fully terminated (has phase Failed or Succeeded) before creating a replacement Pod.\n - `\"TerminatingOrFailed\"` means that we recreate pods when they are terminating (has a metadata.deletionTimestamp) or failed.",
 							Type:        []string{"string"},
 							Format:      "",
 							Enum:        []interface{}{"Failed", "TerminatingOrFailed"},
@@ -3325,7 +3432,7 @@ func schema_k8sio_api_batch_v1_JobStatus(ref common.ReferenceCallback) common.Op
 					},
 					"failedIndexes": {
 						SchemaProps: spec.SchemaProps{
-							Description: "FailedIndexes holds the failed indexes when spec.backoffLimitPerIndex is set. The indexes are represented in the text format analogous as for the `completedIndexes` field, ie. they are kept as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the failed indexes are 1, 3, 4, 5 and 7, they are represented as \"1,3-5,7\". The set of failed indexes cannot overlap with the set of completed indexes.\n\nThis field is beta-level. It can be used when the `JobBackoffLimitPerIndex` feature gate is enabled (enabled by default).",
+							Description: "FailedIndexes holds the failed indexes when spec.backoffLimitPerIndex is set. The indexes are represented in the text format analogous as for the `completedIndexes` field, ie. they are kept as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the failed indexes are 1, 3, 4, 5 and 7, they are represented as \"1,3-5,7\". The set of failed indexes cannot overlap with the set of completed indexes.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -3504,7 +3611,7 @@ func schema_k8sio_api_batch_v1_PodFailurePolicyRule(ref common.ReferenceCallback
 				Properties: map[string]spec.Schema{
 					"action": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are:\n\n- FailJob: indicates that the pod's job is marked as Failed and all\n  running pods are terminated.\n- FailIndex: indicates that the pod's index is marked as Failed and will\n  not be restarted.\n  This value is beta-level. It can be used when the\n  `JobBackoffLimitPerIndex` feature gate is enabled (enabled by default).\n- Ignore: indicates that the counter towards the .backoffLimit is not\n  incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n  counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule.\n\nPossible enum values:\n - `\"Count\"` This is an action which might be taken on a pod failure - the pod failure is handled in the default way - the counter towards .backoffLimit, represented by the job's .status.failed field, is incremented.\n - `\"FailIndex\"` This is an action which might be taken on a pod failure - mark the Job's index as failed to avoid restarts within this index. This action can only be used when backoffLimitPerIndex is set. This value is beta-level.\n - `\"FailJob\"` This is an action which might be taken on a pod failure - mark the pod's job as Failed and terminate all running pods.\n - `\"Ignore\"` This is an action which might be taken on a pod failure - the counter towards .backoffLimit, represented by the job's .status.failed field, is not incremented and a replacement pod is created.",
+							Description: "Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are:\n\n- FailJob: indicates that the pod's job is marked as Failed and all\n  running pods are terminated.\n- FailIndex: indicates that the pod's index is marked as Failed and will\n  not be restarted.\n- Ignore: indicates that the counter towards the .backoffLimit is not\n  incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n  counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule.\n\nPossible enum values:\n - `\"Count\"` This is an action which might be taken on a pod failure - the pod failure is handled in the default way - the counter towards .backoffLimit, represented by the job's .status.failed field, is incremented.\n - `\"FailIndex\"` This is an action which might be taken on a pod failure - mark the Job's index as failed to avoid restarts within this index. This action can only be used when backoffLimitPerIndex is set.\n - `\"FailJob\"` This is an action which might be taken on a pod failure - mark the pod's job as Failed and terminate all running pods.\n - `\"Ignore\"` This is an action which might be taken on a pod failure - the counter towards .backoffLimit, represented by the job's .status.failed field, is not incremented and a replacement pod is created.",
 							Default:     "",
 							Type:        []string{"string"},
 							Format:      "",
@@ -3559,7 +3666,7 @@ func schema_k8sio_api_batch_v1_SuccessPolicy(ref common.ReferenceCallback) commo
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "rules represents the list of alternative rules for the declaring the Jobs as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, the \"SucceededCriteriaMet\" condition is added, and the lingering pods are removed. The terminal state for such a Job has the \"Complete\" condition. Additionally, these rules are evaluated in order; Once the Job meets one of the rules, other rules are ignored. At most 20 elements are allowed.",
+							Description: "rules represents the list of alternative rules for the declaring the Jobs as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, the \"SuccessCriteriaMet\" condition is added, and the lingering pods are removed. The terminal state for such a Job has the \"Complete\" condition. Additionally, these rules are evaluated in order; Once the Job meets one of the rules, other rules are ignored. At most 20 elements are allowed.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -5143,7 +5250,7 @@ func schema_k8sio_api_core_v1_Container(ref common.ReferenceCallback) common.Ope
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
+							Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -5207,11 +5314,30 @@ func schema_k8sio_api_core_v1_Container(ref common.ReferenceCallback) common.Ope
 					},
 					"restartPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.",
+							Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
+					"restartPolicyRules": {
+						VendorExtensible: spec.VendorExtensible{
+							Extensions: spec.Extensions{
+								"x-kubernetes-list-type": "atomic",
+							},
+						},
+						SchemaProps: spec.SchemaProps{
+							Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("k8s.io/api/core/v1.ContainerRestartRule"),
+									},
+								},
+							},
+						},
+					},
 					"volumeMounts": {
 						VendorExtensible: spec.VendorExtensible{
 							Extensions: spec.Extensions{
@@ -5339,7 +5465,45 @@ func schema_k8sio_api_core_v1_Container(ref common.ReferenceCallback) common.Ope
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"},
+			"k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"},
+	}
+}
+
+func schema_k8sio_api_core_v1_ContainerExtendedResourceRequest(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "ContainerExtendedResourceRequest has the mapping of container name, extended resource name to the device request name.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"containerName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The name of the container requesting resources.",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"resourceName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The name of the extended resource in that container which gets backed by DRA.",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"requestName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The name of the request in the special ResourceClaim which corresponds to the extended resource.",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+				},
+				Required: []string{"containerName", "resourceName", "requestName"},
+			},
+		},
 	}
 }
 
@@ -5465,6 +5629,76 @@ func schema_k8sio_api_core_v1_ContainerResizePolicy(ref common.ReferenceCallback
 	}
 }
 
+func schema_k8sio_api_core_v1_ContainerRestartRule(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "ContainerRestartRule describes how a container exit is handled.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"action": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Specifies the action taken on a container exit if the requirements are satisfied. The only possible value is \"Restart\" to restart the container.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"exitCodes": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Represents the exit codes to check on container exits.",
+							Ref:         ref("k8s.io/api/core/v1.ContainerRestartRuleOnExitCodes"),
+						},
+					},
+				},
+				Required: []string{"action"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/api/core/v1.ContainerRestartRuleOnExitCodes"},
+	}
+}
+
+func schema_k8sio_api_core_v1_ContainerRestartRuleOnExitCodes(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "ContainerRestartRuleOnExitCodes describes the condition for handling an exited container based on its exit codes.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"operator": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Represents the relationship between the container exit code(s) and the specified values. Possible values are: - In: the requirement is satisfied if the container exit code is in the\n  set of specified values.\n- NotIn: the requirement is satisfied if the container exit code is\n  not in the set of specified values.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"values": {
+						VendorExtensible: spec.VendorExtensible{
+							Extensions: spec.Extensions{
+								"x-kubernetes-list-type": "set",
+							},
+						},
+						SchemaProps: spec.SchemaProps{
+							Description: "Specifies the set of values to check for container exit codes. At most 255 elements are allowed.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: 0,
+										Type:    []string{"integer"},
+										Format:  "int32",
+									},
+								},
+							},
+						},
+					},
+				},
+				Required: []string{"operator"},
+			},
+		},
+	}
+}
+
 func schema_k8sio_api_core_v1_ContainerState(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -5759,6 +5993,14 @@ func schema_k8sio_api_core_v1_ContainerStatus(ref common.ReferenceCallback) comm
 							},
 						},
 					},
+					"stopSignal": {
+						SchemaProps: spec.SchemaProps{
+							Description: "StopSignal reports the effective stop signal for this container\n\nPossible enum values:\n - `\"SIGABRT\"`\n - `\"SIGALRM\"`\n - `\"SIGBUS\"`\n - `\"SIGCHLD\"`\n - `\"SIGCLD\"`\n - `\"SIGCONT\"`\n - `\"SIGFPE\"`\n - `\"SIGHUP\"`\n - `\"SIGILL\"`\n - `\"SIGINT\"`\n - `\"SIGIO\"`\n - `\"SIGIOT\"`\n - `\"SIGKILL\"`\n - `\"SIGPIPE\"`\n - `\"SIGPOLL\"`\n - `\"SIGPROF\"`\n - `\"SIGPWR\"`\n - `\"SIGQUIT\"`\n - `\"SIGRTMAX\"`\n - `\"SIGRTMAX-1\"`\n - `\"SIGRTMAX-10\"`\n - `\"SIGRTMAX-11\"`\n - `\"SIGRTMAX-12\"`\n - `\"SIGRTMAX-13\"`\n - `\"SIGRTMAX-14\"`\n - `\"SIGRTMAX-2\"`\n - `\"SIGRTMAX-3\"`\n - `\"SIGRTMAX-4\"`\n - `\"SIGRTMAX-5\"`\n - `\"SIGRTMAX-6\"`\n - `\"SIGRTMAX-7\"`\n - `\"SIGRTMAX-8\"`\n - `\"SIGRTMAX-9\"`\n - `\"SIGRTMIN\"`\n - `\"SIGRTMIN+1\"`\n - `\"SIGRTMIN+10\"`\n - `\"SIGRTMIN+11\"`\n - `\"SIGRTMIN+12\"`\n - `\"SIGRTMIN+13\"`\n - `\"SIGRTMIN+14\"`\n - `\"SIGRTMIN+15\"`\n - `\"SIGRTMIN+2\"`\n - `\"SIGRTMIN+3\"`\n - `\"SIGRTMIN+4\"`\n - `\"SIGRTMIN+5\"`\n - `\"SIGRTMIN+6\"`\n - `\"SIGRTMIN+7\"`\n - `\"SIGRTMIN+8\"`\n - `\"SIGRTMIN+9\"`\n - `\"SIGSEGV\"`\n - `\"SIGSTKFLT\"`\n - `\"SIGSTOP\"`\n - `\"SIGSYS\"`\n - `\"SIGTERM\"`\n - `\"SIGTRAP\"`\n - `\"SIGTSTP\"`\n - `\"SIGTTIN\"`\n - `\"SIGTTOU\"`\n - `\"SIGURG\"`\n - `\"SIGUSR1\"`\n - `\"SIGUSR2\"`\n - `\"SIGVTALRM\"`\n - `\"SIGWINCH\"`\n - `\"SIGXCPU\"`\n - `\"SIGXFSZ\"`",
+							Type:        []string{"string"},
+							Format:      "",
+							Enum:        []interface{}{"SIGABRT", "SIGALRM", "SIGBUS", "SIGCHLD", "SIGCLD", "SIGCONT", "SIGFPE", "SIGHUP", "SIGILL", "SIGINT", "SIGIO", "SIGIOT", "SIGKILL", "SIGPIPE", "SIGPOLL", "SIGPROF", "SIGPWR", "SIGQUIT", "SIGRTMAX", "SIGRTMAX-1", "SIGRTMAX-10", "SIGRTMAX-11", "SIGRTMAX-12", "SIGRTMAX-13", "SIGRTMAX-14", "SIGRTMAX-2", "SIGRTMAX-3", "SIGRTMAX-4", "SIGRTMAX-5", "SIGRTMAX-6", "SIGRTMAX-7", "SIGRTMAX-8", "SIGRTMAX-9", "SIGRTMIN", "SIGRTMIN+1", "SIGRTMIN+10", "SIGRTMIN+11", "SIGRTMIN+12", "SIGRTMIN+13", "SIGRTMIN+14", "SIGRTMIN+15", "SIGRTMIN+2", "SIGRTMIN+3", "SIGRTMIN+4", "SIGRTMIN+5", "SIGRTMIN+6", "SIGRTMIN+7", "SIGRTMIN+8", "SIGRTMIN+9", "SIGSEGV", "SIGSTKFLT", "SIGSTOP", "SIGSYS", "SIGTERM", "SIGTRAP", "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGUSR1", "SIGUSR2", "SIGVTALRM", "SIGWINCH", "SIGXCPU", "SIGXFSZ"},
+						},
+					},
 				},
 				Required: []string{"name", "ready", "restartCount", "image", "imageID"},
 			},
@@ -5961,7 +6203,7 @@ func schema_k8sio_api_core_v1_EndpointAddress(ref common.ReferenceCallback) comm
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "EndpointAddress is a tuple that describes single IP address.",
+				Description: "EndpointAddress is a tuple that describes single IP address. Deprecated: This API is deprecated in v1.33+.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"ip": {
@@ -6010,7 +6252,7 @@ func schema_k8sio_api_core_v1_EndpointPort(ref common.ReferenceCallback) common.
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "EndpointPort is a tuple that describes a single port.",
+				Description: "EndpointPort is a tuple that describes a single port. Deprecated: This API is deprecated in v1.33+.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"name": {
@@ -6059,7 +6301,7 @@ func schema_k8sio_api_core_v1_EndpointSubset(ref common.ReferenceCallback) commo
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "EndpointSubset is a group of addresses with a common set of ports. The expanded set of endpoints is the Cartesian product of Addresses x Ports. For example, given:\n\n\t{\n\t  Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n\t  Ports:     [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n\t}\n\nThe resulting set of endpoints can be viewed as:\n\n\ta: [ 10.10.1.1:8675, 10.10.2.2:8675 ],\n\tb: [ 10.10.1.1:309, 10.10.2.2:309 ]",
+				Description: "EndpointSubset is a group of addresses with a common set of ports. The expanded set of endpoints is the Cartesian product of Addresses x Ports. For example, given:\n\n\t{\n\t  Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n\t  Ports:     [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n\t}\n\nThe resulting set of endpoints can be viewed as:\n\n\ta: [ 10.10.1.1:8675, 10.10.2.2:8675 ],\n\tb: [ 10.10.1.1:309, 10.10.2.2:309 ]\n\nDeprecated: This API is deprecated in v1.33+.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"addresses": {
@@ -6131,7 +6373,7 @@ func schema_k8sio_api_core_v1_Endpoints(ref common.ReferenceCallback) common.Ope
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "Endpoints is a collection of endpoints that implement the actual service. Example:\n\n\t Name: \"mysvc\",\n\t Subsets: [\n\t   {\n\t     Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n\t     Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n\t   },\n\t   {\n\t     Addresses: [{\"ip\": \"10.10.3.3\"}],\n\t     Ports: [{\"name\": \"a\", \"port\": 93}, {\"name\": \"b\", \"port\": 76}]\n\t   },\n\t]",
+				Description: "Endpoints is a collection of endpoints that implement the actual service. Example:\n\n\t Name: \"mysvc\",\n\t Subsets: [\n\t   {\n\t     Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n\t     Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n\t   },\n\t   {\n\t     Addresses: [{\"ip\": \"10.10.3.3\"}],\n\t     Ports: [{\"name\": \"a\", \"port\": 93}, {\"name\": \"b\", \"port\": 76}]\n\t   },\n\t]\n\nEndpoints is a legacy API and does not contain information about all Service features. Use discoveryv1.EndpointSlice for complete information about Service endpoints.\n\nDeprecated: This API is deprecated in v1.33+. Use discoveryv1.EndpointSlice.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"kind": {
@@ -6186,7 +6428,7 @@ func schema_k8sio_api_core_v1_EndpointsList(ref common.ReferenceCallback) common
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "EndpointsList is a list of endpoints.",
+				Description: "EndpointsList is a list of endpoints. Deprecated: This API is deprecated in v1.33+.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"kind": {
@@ -6237,12 +6479,12 @@ func schema_k8sio_api_core_v1_EnvFromSource(ref common.ReferenceCallback) common
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "EnvFromSource represents the source of a set of ConfigMaps",
+				Description: "EnvFromSource represents the source of a set of ConfigMaps or Secrets",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"prefix": {
 						SchemaProps: spec.SchemaProps{
-							Description: "An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.",
+							Description: "Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -6276,7 +6518,7 @@ func schema_k8sio_api_core_v1_EnvVar(ref common.ReferenceCallback) common.OpenAP
 				Properties: map[string]spec.Schema{
 					"name": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Name of the environment variable. Must be a C_IDENTIFIER.",
+							Description: "Name of the environment variable. May consist of any printable ASCII characters except '='.",
 							Default:     "",
 							Type:        []string{"string"},
 							Format:      "",
@@ -6335,11 +6577,17 @@ func schema_k8sio_api_core_v1_EnvVarSource(ref common.ReferenceCallback) common.
 							Ref:         ref("k8s.io/api/core/v1.SecretKeySelector"),
 						},
 					},
+					"fileKeyRef": {
+						SchemaProps: spec.SchemaProps{
+							Description: "FileKeyRef selects a key of the env file. Requires the EnvFiles feature gate to be enabled.",
+							Ref:         ref("k8s.io/api/core/v1.FileKeySelector"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ConfigMapKeySelector", "k8s.io/api/core/v1.ObjectFieldSelector", "k8s.io/api/core/v1.ResourceFieldSelector", "k8s.io/api/core/v1.SecretKeySelector"},
+			"k8s.io/api/core/v1.ConfigMapKeySelector", "k8s.io/api/core/v1.FileKeySelector", "k8s.io/api/core/v1.ObjectFieldSelector", "k8s.io/api/core/v1.ResourceFieldSelector", "k8s.io/api/core/v1.SecretKeySelector"},
 	}
 }
 
@@ -6444,7 +6692,7 @@ func schema_k8sio_api_core_v1_EphemeralContainer(ref common.ReferenceCallback) c
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
+							Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -6508,11 +6756,30 @@ func schema_k8sio_api_core_v1_EphemeralContainer(ref common.ReferenceCallback) c
 					},
 					"restartPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Restart policy for the container to manage the restart behavior of each container within a pod. This may only be set for init containers. You cannot set this field on ephemeral containers.",
+							Description: "Restart policy for the container to manage the restart behavior of each container within a pod. You cannot set this field on ephemeral containers.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
+					"restartPolicyRules": {
+						VendorExtensible: spec.VendorExtensible{
+							Extensions: spec.Extensions{
+								"x-kubernetes-list-type": "atomic",
+							},
+						},
+						SchemaProps: spec.SchemaProps{
+							Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. You cannot set this field on ephemeral containers.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("k8s.io/api/core/v1.ContainerRestartRule"),
+									},
+								},
+							},
+						},
+					},
 					"volumeMounts": {
 						VendorExtensible: spec.VendorExtensible{
 							Extensions: spec.Extensions{
@@ -6647,7 +6914,7 @@ func schema_k8sio_api_core_v1_EphemeralContainer(ref common.ReferenceCallback) c
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"},
+			"k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"},
 	}
 }
 
@@ -6752,7 +7019,7 @@ func schema_k8sio_api_core_v1_EphemeralContainerCommon(ref common.ReferenceCallb
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
+							Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -6816,15 +7083,34 @@ func schema_k8sio_api_core_v1_EphemeralContainerCommon(ref common.ReferenceCallb
 					},
 					"restartPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Restart policy for the container to manage the restart behavior of each container within a pod. This may only be set for init containers. You cannot set this field on ephemeral containers.",
+							Description: "Restart policy for the container to manage the restart behavior of each container within a pod. You cannot set this field on ephemeral containers.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
-					"volumeMounts": {
+					"restartPolicyRules": {
 						VendorExtensible: spec.VendorExtensible{
 							Extensions: spec.Extensions{
-								"x-kubernetes-list-map-keys": []interface{}{
+								"x-kubernetes-list-type": "atomic",
+							},
+						},
+						SchemaProps: spec.SchemaProps{
+							Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. You cannot set this field on ephemeral containers.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("k8s.io/api/core/v1.ContainerRestartRule"),
+									},
+								},
+							},
+						},
+					},
+					"volumeMounts": {
+						VendorExtensible: spec.VendorExtensible{
+							Extensions: spec.Extensions{
+								"x-kubernetes-list-map-keys": []interface{}{
 									"mountPath",
 								},
 								"x-kubernetes-list-type":       "map",
@@ -6948,7 +7234,7 @@ func schema_k8sio_api_core_v1_EphemeralContainerCommon(ref common.ReferenceCallb
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"},
+			"k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"},
 	}
 }
 
@@ -7318,6 +7604,57 @@ func schema_k8sio_api_core_v1_FCVolumeSource(ref common.ReferenceCallback) commo
 	}
 }
 
+func schema_k8sio_api_core_v1_FileKeySelector(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "FileKeySelector selects a key of the env file.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"volumeName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The name of the volume mount containing the env file.",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"path": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The path within the volume from which to select the file. Must be relative and may not contain the '..' path or start with '..'.",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"key": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The key within the env file. An invalid key will prevent the pod from starting. The keys defined within a source may consist of any printable ASCII characters except '='. During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"optional": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Specify whether the file or its key must be defined. If the file or key does not exist, then the env var is not published. If optional is set to true and the specified key does not exist, the environment variable will not be set in the Pod's containers.\n\nIf optional is set to false and the specified key does not exist, an error will be returned during Pod creation.",
+							Default:     false,
+							Type:        []string{"boolean"},
+							Format:      "",
+						},
+					},
+				},
+				Required: []string{"volumeName", "path", "key"},
+			},
+			VendorExtensible: spec.VendorExtensible{
+				Extensions: spec.Extensions{
+					"x-kubernetes-map-type": "atomic",
+				},
+			},
+		},
+	}
+}
+
 func schema_k8sio_api_core_v1_FlexPersistentVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -7627,7 +7964,7 @@ func schema_k8sio_api_core_v1_GlusterfsVolumeSource(ref common.ReferenceCallback
 				Properties: map[string]spec.Schema{
 					"endpoints": {
 						SchemaProps: spec.SchemaProps{
-							Description: "endpoints is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod",
+							Description: "endpoints is the endpoint name that details Glusterfs topology.",
 							Default:     "",
 							Type:        []string{"string"},
 							Format:      "",
@@ -8144,6 +8481,14 @@ func schema_k8sio_api_core_v1_Lifecycle(ref common.ReferenceCallback) common.Ope
 							Ref:         ref("k8s.io/api/core/v1.LifecycleHandler"),
 						},
 					},
+					"stopSignal": {
+						SchemaProps: spec.SchemaProps{
+							Description: "StopSignal defines which signal will be sent to a container when it is being stopped. If not specified, the default is defined by the container runtime in use. StopSignal can only be set for Pods with a non-empty .spec.os.name\n\nPossible enum values:\n - `\"SIGABRT\"`\n - `\"SIGALRM\"`\n - `\"SIGBUS\"`\n - `\"SIGCHLD\"`\n - `\"SIGCLD\"`\n - `\"SIGCONT\"`\n - `\"SIGFPE\"`\n - `\"SIGHUP\"`\n - `\"SIGILL\"`\n - `\"SIGINT\"`\n - `\"SIGIO\"`\n - `\"SIGIOT\"`\n - `\"SIGKILL\"`\n - `\"SIGPIPE\"`\n - `\"SIGPOLL\"`\n - `\"SIGPROF\"`\n - `\"SIGPWR\"`\n - `\"SIGQUIT\"`\n - `\"SIGRTMAX\"`\n - `\"SIGRTMAX-1\"`\n - `\"SIGRTMAX-10\"`\n - `\"SIGRTMAX-11\"`\n - `\"SIGRTMAX-12\"`\n - `\"SIGRTMAX-13\"`\n - `\"SIGRTMAX-14\"`\n - `\"SIGRTMAX-2\"`\n - `\"SIGRTMAX-3\"`\n - `\"SIGRTMAX-4\"`\n - `\"SIGRTMAX-5\"`\n - `\"SIGRTMAX-6\"`\n - `\"SIGRTMAX-7\"`\n - `\"SIGRTMAX-8\"`\n - `\"SIGRTMAX-9\"`\n - `\"SIGRTMIN\"`\n - `\"SIGRTMIN+1\"`\n - `\"SIGRTMIN+10\"`\n - `\"SIGRTMIN+11\"`\n - `\"SIGRTMIN+12\"`\n - `\"SIGRTMIN+13\"`\n - `\"SIGRTMIN+14\"`\n - `\"SIGRTMIN+15\"`\n - `\"SIGRTMIN+2\"`\n - `\"SIGRTMIN+3\"`\n - `\"SIGRTMIN+4\"`\n - `\"SIGRTMIN+5\"`\n - `\"SIGRTMIN+6\"`\n - `\"SIGRTMIN+7\"`\n - `\"SIGRTMIN+8\"`\n - `\"SIGRTMIN+9\"`\n - `\"SIGSEGV\"`\n - `\"SIGSTKFLT\"`\n - `\"SIGSTOP\"`\n - `\"SIGSYS\"`\n - `\"SIGTERM\"`\n - `\"SIGTRAP\"`\n - `\"SIGTSTP\"`\n - `\"SIGTTIN\"`\n - `\"SIGTTOU\"`\n - `\"SIGURG\"`\n - `\"SIGUSR1\"`\n - `\"SIGUSR2\"`\n - `\"SIGVTALRM\"`\n - `\"SIGWINCH\"`\n - `\"SIGXCPU\"`\n - `\"SIGXFSZ\"`",
+							Type:        []string{"string"},
+							Format:      "",
+							Enum:        []interface{}{"SIGABRT", "SIGALRM", "SIGBUS", "SIGCHLD", "SIGCLD", "SIGCONT", "SIGFPE", "SIGHUP", "SIGILL", "SIGINT", "SIGIO", "SIGIOT", "SIGKILL", "SIGPIPE", "SIGPOLL", "SIGPROF", "SIGPWR", "SIGQUIT", "SIGRTMAX", "SIGRTMAX-1", "SIGRTMAX-10", "SIGRTMAX-11", "SIGRTMAX-12", "SIGRTMAX-13", "SIGRTMAX-14", "SIGRTMAX-2", "SIGRTMAX-3", "SIGRTMAX-4", "SIGRTMAX-5", "SIGRTMAX-6", "SIGRTMAX-7", "SIGRTMAX-8", "SIGRTMAX-9", "SIGRTMIN", "SIGRTMIN+1", "SIGRTMIN+10", "SIGRTMIN+11", "SIGRTMIN+12", "SIGRTMIN+13", "SIGRTMIN+14", "SIGRTMIN+15", "SIGRTMIN+2", "SIGRTMIN+3", "SIGRTMIN+4", "SIGRTMIN+5", "SIGRTMIN+6", "SIGRTMIN+7", "SIGRTMIN+8", "SIGRTMIN+9", "SIGSEGV", "SIGSTKFLT", "SIGSTOP", "SIGSYS", "SIGTERM", "SIGTRAP", "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGUSR1", "SIGUSR2", "SIGVTALRM", "SIGWINCH", "SIGXCPU", "SIGXFSZ"},
+						},
+					},
 				},
 			},
 		},
@@ -9820,6 +10165,26 @@ func schema_k8sio_api_core_v1_NodeStatus(ref common.ReferenceCallback) common.Op
 	}
 }
 
+func schema_k8sio_api_core_v1_NodeSwapStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "NodeSwapStatus represents swap memory information.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"capacity": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Total amount of swap memory in bytes.",
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
+				},
+			},
+		},
+	}
+}
+
 func schema_k8sio_api_core_v1_NodeSystemInfo(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -9907,10 +10272,18 @@ func schema_k8sio_api_core_v1_NodeSystemInfo(ref common.ReferenceCallback) commo
 							Format:      "",
 						},
 					},
+					"swap": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Swap Info reported by the node.",
+							Ref:         ref("k8s.io/api/core/v1.NodeSwapStatus"),
+						},
+					},
 				},
 				Required: []string{"machineID", "systemUUID", "bootID", "kernelVersion", "osImage", "containerRuntimeVersion", "kubeletVersion", "kubeProxyVersion", "operatingSystem", "architecture"},
 			},
 		},
+		Dependencies: []string{
+			"k8s.io/api/core/v1.NodeSwapStatus"},
 	}
 }
 
@@ -10301,7 +10674,7 @@ func schema_k8sio_api_core_v1_PersistentVolumeClaimSpec(ref common.ReferenceCall
 					},
 					"volumeAttributesClassName": {
 						SchemaProps: spec.SchemaProps{
-							Description: "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default).",
+							Description: "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -10426,14 +10799,14 @@ func schema_k8sio_api_core_v1_PersistentVolumeClaimStatus(ref common.ReferenceCa
 					},
 					"currentVolumeAttributesClassName": {
 						SchemaProps: spec.SchemaProps{
-							Description: "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is a beta field and requires enabling VolumeAttributesClass feature (off by default).",
+							Description: "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim",
 							Type:        []string{"string"},
 							Format:      "",
 						},
 					},
 					"modifyVolumeStatus": {
 						SchemaProps: spec.SchemaProps{
-							Description: "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is a beta field and requires enabling VolumeAttributesClass feature (off by default).",
+							Description: "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted.",
 							Ref:         ref("k8s.io/api/core/v1.ModifyVolumeStatus"),
 						},
 					},
@@ -10938,7 +11311,7 @@ func schema_k8sio_api_core_v1_PersistentVolumeSpec(ref common.ReferenceCallback)
 					},
 					"volumeAttributesClassName": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is a beta field and requires enabling VolumeAttributesClass feature (off by default).",
+							Description: "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -11180,7 +11553,7 @@ func schema_k8sio_api_core_v1_PodAffinityTerm(ref common.ReferenceCallback) comm
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
+							Description: "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -11200,7 +11573,7 @@ func schema_k8sio_api_core_v1_PodAffinityTerm(ref common.ReferenceCallback) comm
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
+							Description: "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -11255,7 +11628,7 @@ func schema_k8sio_api_core_v1_PodAntiAffinity(ref common.ReferenceCallback) comm
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.",
+							Description: "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting \"weight\" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -11337,6 +11710,62 @@ func schema_k8sio_api_core_v1_PodAttachOptions(ref common.ReferenceCallback) com
 	}
 }
 
+func schema_k8sio_api_core_v1_PodCertificateProjection(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodCertificateProjection provides a private key and X.509 certificate in the pod filesystem.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"signerName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kubelet's generated CSRs will be addressed to this signer.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"keyType": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The type of keypair Kubelet will generate for the pod.\n\nValid values are \"RSA3072\", \"RSA4096\", \"ECDSAP256\", \"ECDSAP384\", \"ECDSAP521\", and \"ED25519\".",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"maxExpirationSeconds": {
+						SchemaProps: spec.SchemaProps{
+							Description: "maxExpirationSeconds is the maximum lifetime permitted for the certificate.\n\nKubelet copies this value verbatim into the PodCertificateRequests it generates for this projection.\n\nIf omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver will reject values shorter than 3600 (1 hour).  The maximum allowable value is 7862400 (91 days).\n\nThe signer implementation is then free to issue a certificate with any lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 seconds (1 hour).  This constraint is enforced by kube-apiserver. `kubernetes.io` signers will never issue certificates with a lifetime longer than 24 hours.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"credentialBundlePath": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Write the credential bundle at this path in the projected volume.\n\nThe credential bundle is a single file that contains multiple PEM blocks. The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private key.\n\nThe remaining blocks are CERTIFICATE blocks, containing the issued certificate chain from the signer (leaf and any intermediates).\n\nUsing credentialBundlePath lets your Pod's application code make a single atomic read that retrieves a consistent key and certificate chain.  If you project them to separate files, your application code will need to additionally check that the leaf certificate was issued to the key.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"keyPath": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Write the key at this path in the projected volume.\n\nMost applications should use credentialBundlePath.  When using keyPath and certificateChainPath, your application needs to check that the key and leaf certificate are consistent, because it is possible to read the files mid-rotation.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"certificateChainPath": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Write the certificate chain at this path in the projected volume.\n\nMost applications should use credentialBundlePath.  When using keyPath and certificateChainPath, your application needs to check that the key and leaf certificate are consistent, because it is possible to read the files mid-rotation.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+				},
+				Required: []string{"signerName", "keyType"},
+			},
+		},
+	}
+}
+
 func schema_k8sio_api_core_v1_PodCondition(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -11352,6 +11781,13 @@ func schema_k8sio_api_core_v1_PodCondition(ref common.ReferenceCallback) common.
 							Format:      "",
 						},
 					},
+					"observedGeneration": {
+						SchemaProps: spec.SchemaProps{
+							Description: "If set, this represents the .metadata.generation that the pod condition was set based upon. This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.",
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
 					"status": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Status is the status of the condition. Can be True, False, Unknown. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions",
@@ -11579,6 +12015,49 @@ func schema_k8sio_api_core_v1_PodExecOptions(ref common.ReferenceCallback) commo
 	}
 }
 
+func schema_k8sio_api_core_v1_PodExtendedResourceClaimStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodExtendedResourceClaimStatus is stored in the PodStatus for the extended resource requests backed by DRA. It stores the generated name for the corresponding special ResourceClaim created by the scheduler.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"requestMappings": {
+						VendorExtensible: spec.VendorExtensible{
+							Extensions: spec.Extensions{
+								"x-kubernetes-list-type": "atomic",
+							},
+						},
+						SchemaProps: spec.SchemaProps{
+							Description: "RequestMappings identifies the mapping of <container, extended resource backed by DRA> to  device request in the generated ResourceClaim.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("k8s.io/api/core/v1.ContainerExtendedResourceRequest"),
+									},
+								},
+							},
+						},
+					},
+					"resourceClaimName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "ResourceClaimName is the name of the ResourceClaim that was generated for the Pod in the namespace of the Pod.",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+				},
+				Required: []string{"requestMappings", "resourceClaimName"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/api/core/v1.ContainerExtendedResourceRequest"},
+	}
+}
+
 func schema_k8sio_api_core_v1_PodIP(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -12155,7 +12634,7 @@ func schema_k8sio_api_core_v1_PodSpec(ref common.ReferenceCallback) common.OpenA
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/",
+							Description: "List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -12296,7 +12775,7 @@ func schema_k8sio_api_core_v1_PodSpec(ref common.ReferenceCallback) common.OpenA
 					},
 					"hostNetwork": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.",
+							Description: "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.",
 							Type:        []string{"boolean"},
 							Format:      "",
 						},
@@ -12531,7 +13010,7 @@ func schema_k8sio_api_core_v1_PodSpec(ref common.ReferenceCallback) common.OpenA
 					},
 					"os": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup",
+							Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup",
 							Ref:         ref("k8s.io/api/core/v1.PodOS"),
 						},
 					},
@@ -12592,10 +13071,17 @@ func schema_k8sio_api_core_v1_PodSpec(ref common.ReferenceCallback) common.OpenA
 					},
 					"resources": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.",
+							Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.",
 							Ref:         ref("k8s.io/api/core/v1.ResourceRequirements"),
 						},
 					},
+					"hostnameOverride": {
+						SchemaProps: spec.SchemaProps{
+							Description: "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
 				},
 				Required: []string{"containers"},
 			},
@@ -12612,6 +13098,13 @@ func schema_k8sio_api_core_v1_PodStatus(ref common.ReferenceCallback) common.Ope
 				Description: "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
+					"observedGeneration": {
+						SchemaProps: spec.SchemaProps{
+							Description: "If set, this represents the .metadata.generation that the pod status was set based upon. This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.",
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
 					"phase": {
 						SchemaProps: spec.SchemaProps{
 							Description: "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase\n\nPossible enum values:\n - `\"Failed\"` means that all containers in the pod have terminated, and at least one container has terminated in a failure (exited with a non-zero exit code or was stopped by the system).\n - `\"Pending\"` means the pod has been accepted by the system, but one or more of the containers has not been started. This includes time before being bound to a node, as well as time spent pulling images onto the host.\n - `\"Running\"` means the pod has been bound to a node and all of the containers have been started. At least one container is still running or is in the process of being restarted.\n - `\"Succeeded\"` means that all containers in the pod have voluntarily terminated with a container exit code of 0, and the system is not going to restart any of these containers.\n - `\"Unknown\"` means that for some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod. Deprecated: It isn't being set since 2015 (74da3b14b0c0f658b3bb8d2def5094686d0e9095)",
@@ -12797,7 +13290,7 @@ func schema_k8sio_api_core_v1_PodStatus(ref common.ReferenceCallback) common.Ope
 					},
 					"resize": {
 						SchemaProps: spec.SchemaProps{
-							Description: "Status of resources resize desired for pod's containers. It is empty if no resources resize is pending. Any changes to container resources will automatically set this to \"Proposed\"",
+							Description: "Status of resources resize desired for pod's containers. It is empty if no resources resize is pending. Any changes to container resources will automatically set this to \"Proposed\" Deprecated: Resize status is moved to two pod conditions PodResizePending and PodResizeInProgress. PodResizePending will track states where the spec has been resized, but the Kubelet has not yet allocated the resources. PodResizeInProgress will track in-progress resizes, and should be present whenever allocated resources != acknowledged resources.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -12826,11 +13319,17 @@ func schema_k8sio_api_core_v1_PodStatus(ref common.ReferenceCallback) common.Ope
 							},
 						},
 					},
+					"extendedResourceClaimStatus": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Status of extended resource claim backed by DRA.",
+							Ref:         ref("k8s.io/api/core/v1.PodExtendedResourceClaimStatus"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ContainerStatus", "k8s.io/api/core/v1.HostIP", "k8s.io/api/core/v1.PodCondition", "k8s.io/api/core/v1.PodIP", "k8s.io/api/core/v1.PodResourceClaimStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
+			"k8s.io/api/core/v1.ContainerStatus", "k8s.io/api/core/v1.HostIP", "k8s.io/api/core/v1.PodCondition", "k8s.io/api/core/v1.PodExtendedResourceClaimStatus", "k8s.io/api/core/v1.PodIP", "k8s.io/api/core/v1.PodResourceClaimStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
 	}
 }
 
@@ -13758,6 +14257,7 @@ func schema_k8sio_api_core_v1_ReplicationControllerSpec(ref common.ReferenceCall
 					"replicas": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller",
+							Default:     1,
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
@@ -13765,6 +14265,7 @@ func schema_k8sio_api_core_v1_ReplicationControllerSpec(ref common.ReferenceCall
 					"minReadySeconds": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)",
+							Default:     0,
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
@@ -14117,7 +14618,7 @@ func schema_k8sio_api_core_v1_ResourceQuotaSpec(ref common.ReferenceCallback) co
 										Default: "",
 										Type:    []string{"string"},
 										Format:  "",
-										Enum:    []interface{}{"BestEffort", "CrossNamespacePodAffinity", "NotBestEffort", "NotTerminating", "PriorityClass", "Terminating"},
+										Enum:    []interface{}{"BestEffort", "CrossNamespacePodAffinity", "NotBestEffort", "NotTerminating", "PriorityClass", "Terminating", "VolumeAttributesClass"},
 									},
 								},
 							},
@@ -14225,7 +14726,7 @@ func schema_k8sio_api_core_v1_ResourceRequirements(ref common.ReferenceCallback)
 							},
 						},
 						SchemaProps: spec.SchemaProps{
-							Description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container.\n\nThis is an alpha field and requires enabling the DynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.",
+							Description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container.\n\nThis field depends on the DynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -14558,11 +15059,11 @@ func schema_k8sio_api_core_v1_ScopedResourceSelectorRequirement(ref common.Refer
 				Properties: map[string]spec.Schema{
 					"scopeName": {
 						SchemaProps: spec.SchemaProps{
-							Description: "The name of the scope that the selector applies to.\n\nPossible enum values:\n - `\"BestEffort\"` Match all pod objects that have best effort quality of service\n - `\"CrossNamespacePodAffinity\"` Match all pod objects that have cross-namespace pod (anti)affinity mentioned.\n - `\"NotBestEffort\"` Match all pod objects that do not have best effort quality of service\n - `\"NotTerminating\"` Match all pod objects where spec.activeDeadlineSeconds is nil\n - `\"PriorityClass\"` Match all pod objects that have priority class mentioned\n - `\"Terminating\"` Match all pod objects where spec.activeDeadlineSeconds >=0",
+							Description: "The name of the scope that the selector applies to.\n\nPossible enum values:\n - `\"BestEffort\"` Match all pod objects that have best effort quality of service\n - `\"CrossNamespacePodAffinity\"` Match all pod objects that have cross-namespace pod (anti)affinity mentioned.\n - `\"NotBestEffort\"` Match all pod objects that do not have best effort quality of service\n - `\"NotTerminating\"` Match all pod objects where spec.activeDeadlineSeconds is nil\n - `\"PriorityClass\"` Match all pod objects that have priority class mentioned\n - `\"Terminating\"` Match all pod objects where spec.activeDeadlineSeconds >=0\n - `\"VolumeAttributesClass\"` Match all pvc objects that have volume attributes class mentioned.",
 							Default:     "",
 							Type:        []string{"string"},
 							Format:      "",
-							Enum:        []interface{}{"BestEffort", "CrossNamespacePodAffinity", "NotBestEffort", "NotTerminating", "PriorityClass", "Terminating"},
+							Enum:        []interface{}{"BestEffort", "CrossNamespacePodAffinity", "NotBestEffort", "NotTerminating", "PriorityClass", "Terminating", "VolumeAttributesClass"},
 						},
 					},
 					"operator": {
@@ -15711,7 +16212,7 @@ func schema_k8sio_api_core_v1_ServiceSpec(ref common.ReferenceCallback) common.O
 					},
 					"trafficDistribution": {
 						SchemaProps: spec.SchemaProps{
-							Description: "TrafficDistribution offers a way to express preferences for how traffic is distributed to Service endpoints. Implementations can use this field as a hint, but are not required to guarantee strict adherence. If the field is not set, the implementation will apply its default routing strategy. If set to \"PreferClose\", implementations should prioritize endpoints that are topologically close (e.g., same zone). This is a beta field and requires enabling ServiceTrafficDistribution feature.",
+							Description: "TrafficDistribution offers a way to express preferences for how traffic is distributed to Service endpoints. Implementations can use this field as a hint, but are not required to guarantee strict adherence. If the field is not set, the implementation will apply its default routing strategy. If set to \"PreferClose\", implementations should prioritize endpoints that are in the same zone.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -16003,7 +16504,7 @@ func schema_k8sio_api_core_v1_Taint(ref common.ReferenceCallback) common.OpenAPI
 					},
 					"timeAdded": {
 						SchemaProps: spec.SchemaProps{
-							Description: "TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints.",
+							Description: "TimeAdded represents the time at which the taint was added.",
 							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"),
 						},
 					},
@@ -16194,7 +16695,7 @@ func schema_k8sio_api_core_v1_TopologySpreadConstraint(ref common.ReferenceCallb
 					},
 					"nodeAffinityPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n\nPossible enum values:\n - `\"Honor\"` means use this scheduling directive when calculating pod topology spread skew.\n - `\"Ignore\"` means ignore this scheduling directive when calculating pod topology spread skew.",
+							Description: "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy.\n\nPossible enum values:\n - `\"Honor\"` means use this scheduling directive when calculating pod topology spread skew.\n - `\"Ignore\"` means ignore this scheduling directive when calculating pod topology spread skew.",
 							Type:        []string{"string"},
 							Format:      "",
 							Enum:        []interface{}{"Honor", "Ignore"},
@@ -16202,7 +16703,7 @@ func schema_k8sio_api_core_v1_TopologySpreadConstraint(ref common.ReferenceCallb
 					},
 					"nodeTaintsPolicy": {
 						SchemaProps: spec.SchemaProps{
-							Description: "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n\nPossible enum values:\n - `\"Honor\"` means use this scheduling directive when calculating pod topology spread skew.\n - `\"Ignore\"` means ignore this scheduling directive when calculating pod topology spread skew.",
+							Description: "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy.\n\nPossible enum values:\n - `\"Honor\"` means use this scheduling directive when calculating pod topology spread skew.\n - `\"Ignore\"` means ignore this scheduling directive when calculating pod topology spread skew.",
 							Type:        []string{"string"},
 							Format:      "",
 							Enum:        []interface{}{"Honor", "Ignore"},
@@ -16382,13 +16883,13 @@ func schema_k8sio_api_core_v1_Volume(ref common.ReferenceCallback) common.OpenAP
 					},
 					"iscsi": {
 						SchemaProps: spec.SchemaProps{
-							Description: "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md",
+							Description: "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi",
 							Ref:         ref("k8s.io/api/core/v1.ISCSIVolumeSource"),
 						},
 					},
 					"glusterfs": {
 						SchemaProps: spec.SchemaProps{
-							Description: "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. More info: https://examples.k8s.io/volumes/glusterfs/README.md",
+							Description: "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported.",
 							Ref:         ref("k8s.io/api/core/v1.GlusterfsVolumeSource"),
 						},
 					},
@@ -16400,7 +16901,7 @@ func schema_k8sio_api_core_v1_Volume(ref common.ReferenceCallback) common.OpenAP
 					},
 					"rbd": {
 						SchemaProps: spec.SchemaProps{
-							Description: "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. More info: https://examples.k8s.io/volumes/rbd/README.md",
+							Description: "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported.",
 							Ref:         ref("k8s.io/api/core/v1.RBDVolumeSource"),
 						},
 					},
@@ -16514,7 +17015,7 @@ func schema_k8sio_api_core_v1_Volume(ref common.ReferenceCallback) common.OpenAP
 					},
 					"image": {
 						SchemaProps: spec.SchemaProps{
-							Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
+							Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
 							Ref:         ref("k8s.io/api/core/v1.ImageVolumeSource"),
 						},
 					},
@@ -16725,11 +17226,17 @@ func schema_k8sio_api_core_v1_VolumeProjection(ref common.ReferenceCallback) com
 							Ref:         ref("k8s.io/api/core/v1.ClusterTrustBundleProjection"),
 						},
 					},
+					"podCertificate": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Projects an auto-rotating credential bundle (private key and certificate chain) that the pod can use either as a TLS client or server.\n\nKubelet generates a private key and uses it to send a PodCertificateRequest to the named signer.  Once the signer approves the request and issues a certificate chain, Kubelet writes the key and certificate chain to the pod filesystem.  The pod does not start until certificates have been issued for each podCertificate projected volume source in its spec.\n\nKubelet will begin trying to rotate the certificate at the time indicated by the signer using the PodCertificateRequest.Status.BeginRefreshAt timestamp.\n\nKubelet can write a single file, indicated by the credentialBundlePath field, or separate files, indicated by the keyPath and certificateChainPath fields.\n\nThe credential bundle is a single file in PEM format.  The first PEM entry is the private key (in PKCS#8 format), and the remaining PEM entries are the certificate chain issued by the signer (typically, signers will return their certificate chain in leaf-to-root order).\n\nPrefer using the credential bundle format, since your application code can read it atomically.  If you use keyPath and certificateChainPath, your application must make two separate file reads. If these coincide with a certificate rotation, it is possible that the private key and leaf certificate you read may not correspond to each other.  Your application will need to check for this condition, and re-read until they are consistent.\n\nThe named signer controls chooses the format of the certificate it issues; consult the signer implementation's documentation to learn how to use the certificates it issues.",
+							Ref:         ref("k8s.io/api/core/v1.PodCertificateProjection"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ClusterTrustBundleProjection", "k8s.io/api/core/v1.ConfigMapProjection", "k8s.io/api/core/v1.DownwardAPIProjection", "k8s.io/api/core/v1.SecretProjection", "k8s.io/api/core/v1.ServiceAccountTokenProjection"},
+			"k8s.io/api/core/v1.ClusterTrustBundleProjection", "k8s.io/api/core/v1.ConfigMapProjection", "k8s.io/api/core/v1.DownwardAPIProjection", "k8s.io/api/core/v1.PodCertificateProjection", "k8s.io/api/core/v1.SecretProjection", "k8s.io/api/core/v1.ServiceAccountTokenProjection"},
 	}
 }
 
@@ -16827,13 +17334,13 @@ func schema_k8sio_api_core_v1_VolumeSource(ref common.ReferenceCallback) common.
 					},
 					"iscsi": {
 						SchemaProps: spec.SchemaProps{
-							Description: "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md",
+							Description: "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi",
 							Ref:         ref("k8s.io/api/core/v1.ISCSIVolumeSource"),
 						},
 					},
 					"glusterfs": {
 						SchemaProps: spec.SchemaProps{
-							Description: "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. More info: https://examples.k8s.io/volumes/glusterfs/README.md",
+							Description: "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported.",
 							Ref:         ref("k8s.io/api/core/v1.GlusterfsVolumeSource"),
 						},
 					},
@@ -16845,7 +17352,7 @@ func schema_k8sio_api_core_v1_VolumeSource(ref common.ReferenceCallback) common.
 					},
 					"rbd": {
 						SchemaProps: spec.SchemaProps{
-							Description: "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. More info: https://examples.k8s.io/volumes/rbd/README.md",
+							Description: "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported.",
 							Ref:         ref("k8s.io/api/core/v1.RBDVolumeSource"),
 						},
 					},
@@ -16959,7 +17466,7 @@ func schema_k8sio_api_core_v1_VolumeSource(ref common.ReferenceCallback) common.
 					},
 					"image": {
 						SchemaProps: spec.SchemaProps{
-							Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
+							Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
 							Ref:         ref("k8s.io/api/core/v1.ImageVolumeSource"),
 						},
 					},
@@ -19785,7 +20292,7 @@ func schema_jobset_api_jobset_v1alpha2_FailurePolicyRule(ref common.ReferenceCal
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Description: "FailurePolicyRule defines a FailurePolicyAction to be executed if a child job fails due to a reason listed in OnJobFailureReasons.",
+				Description: "FailurePolicyRule defines a FailurePolicyAction to be executed if a child job fails due to a reason listed in OnJobFailureReasons and a message pattern listed in OnJobFailureMessagePatterns. The rule must match both the job failure reason and the job failure message. The rules are evaluated in order and the first matching rule is executed.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"name": {
@@ -19806,7 +20313,22 @@ func schema_jobset_api_jobset_v1alpha2_FailurePolicyRule(ref common.ReferenceCal
 					},
 					"onJobFailureReasons": {
 						SchemaProps: spec.SchemaProps{
-							Description: "The requirement on the job failure reasons. The requirement is satisfied if at least one reason matches the list. The rules are evaluated in order, and the first matching rule is executed. An empty list applies the rule to any job failure reason.",
+							Description: "The requirement on the job failure reasons. The requirement is satisfied if at least one reason matches the list. An empty list matches any job failure reason.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+					"onJobFailureMessagePatterns": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The requirement on the job failure message. The requirement is satisfied if at least one pattern (regex) matches the job failure message. An empty list matches any job failure message. The syntax of the regular expressions accepted is the same general syntax used by Perl, Python, and other languages. More precisely, it is the syntax accepted by RE2 and described at https://golang.org/s/re2syntax, except for \\C. For an overview of the syntax, see https://pkg.go.dev/regexp/syntax.",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
@@ -20061,6 +20583,7 @@ func schema_jobset_api_jobset_v1alpha2_JobSetStatus(ref common.ReferenceCallback
 					"restarts": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Restarts tracks the number of times the JobSet has restarted (i.e. recreated in case of RecreateAll policy).",
+							Default:     0,
 							Type:        []string{"integer"},
 							Format:      "int32",
 						},
@@ -20074,7 +20597,7 @@ func schema_jobset_api_jobset_v1alpha2_JobSetStatus(ref common.ReferenceCallback
 					},
 					"terminalState": {
 						SchemaProps: spec.SchemaProps{
-							Description: "TerminalState the state of the JobSet when it finishes execution. It can be either Complete or Failed. Otherwise, it is empty by default.",
+							Description: "TerminalState the state of the JobSet when it finishes execution. It can be either Completed or Failed. Otherwise, it is empty by default.",
 							Type:        []string{"string"},
 							Format:      "",
 						},
@@ -20156,6 +20679,13 @@ func schema_jobset_api_jobset_v1alpha2_ReplicatedJob(ref common.ReferenceCallbac
 							Format:      "",
 						},
 					},
+					"groupName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "GroupName defines the name of the group this ReplicatedJob belongs to. Defaults to \"default\"",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
 					"template": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Template defines the template of the Job that will be created.",
@@ -20324,3 +20854,815 @@ func schema_jobset_api_jobset_v1alpha2_SuccessPolicy(ref common.ReferenceCallbac
 		},
 	}
 }
+
+func schema_pkg_apis_scheduling_v1beta1_Affinity(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "Affinity is a group of affinity scheduling rules.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"nodeGroupAffinity": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Describes nodegroup affinity scheduling rules for the queue(e.g. putting pods of the queue in the nodes of the nodegroup)",
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.NodeGroupAffinity"),
+						},
+					},
+					"nodeGroupAntiAffinity": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Describes nodegroup anti-affinity scheduling rules for the queue(e.g. avoid putting pods of the queue in the nodes of the nodegroup).",
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.NodeGroupAntiAffinity"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"volcano.sh/apis/pkg/apis/scheduling/v1beta1.NodeGroupAffinity", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.NodeGroupAntiAffinity"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_Cluster(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "CluterSpec represents the template of Cluster",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"name": {
+						SchemaProps: spec.SchemaProps{
+							Type:   []string{"string"},
+							Format: "",
+						},
+					},
+					"weight": {
+						SchemaProps: spec.SchemaProps{
+							Type:   []string{"integer"},
+							Format: "int32",
+						},
+					},
+					"capacity": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/api/resource.Quantity"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_Guarantee(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "Guarantee represents configuration of queue resource reservation",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"resource": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The amount of cluster resource reserved for queue. Just set either `percentage` or `resource`",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/api/resource.Quantity"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_NetworkTopologySpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"mode": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Mode specifies the mode of the network topology constrain.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"highestTierAllowed": {
+						SchemaProps: spec.SchemaProps{
+							Description: "HighestTierAllowed specifies the highest tier that a job allowed to cross when scheduling.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+				},
+			},
+		},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_NodeGroupAffinity(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"requiredDuringSchedulingIgnoredDuringExecution": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+					"preferredDuringSchedulingIgnoredDuringExecution": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_NodeGroupAntiAffinity(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"requiredDuringSchedulingIgnoredDuringExecution": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+					"preferredDuringSchedulingIgnoredDuringExecution": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_PodGroup(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodGroup is a collection of Pod; used for batch workload.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+						},
+					},
+					"spec": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Specification of the desired behavior of the pod group. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status",
+							Default:     map[string]interface{}{},
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupSpec"),
+						},
+					},
+					"status": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Status represents the current information about a pod group. This data may not be up to date.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupStatus"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupSpec", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupStatus"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_PodGroupCondition(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodGroupCondition contains details for the current state of this pod group.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"type": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Type is the type of the condition",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"status": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Status is the status of the condition.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"transitionID": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The ID of condition transition.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"lastTransitionTime": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Last time the phase transitioned from another to current phase.",
+							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"),
+						},
+					},
+					"reason": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Unique, one-word, CamelCase reason for the phase's last transition.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"message": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Human-readable message indicating details about last transition.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.Time"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_PodGroupList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodGroupList is a collection of pod groups.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata",
+							Default:     map[string]interface{}{},
+							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+						},
+					},
+					"items": {
+						SchemaProps: spec.SchemaProps{
+							Description: "items is the list of PodGroup",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroup"),
+									},
+								},
+							},
+						},
+					},
+				},
+				Required: []string{"items"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroup"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_PodGroupSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodGroupSpec represents the template of a pod group.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"minMember": {
+						SchemaProps: spec.SchemaProps{
+							Description: "MinMember defines the minimal number of members/tasks to run the pod group; if there's not enough resources to start all tasks, the scheduler will not start anyone.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"minTaskMember": {
+						SchemaProps: spec.SchemaProps{
+							Description: "MinTaskMember defines the minimal number of pods to run each task in the pod group; if there's not enough resources to start each task, the scheduler will not start anyone.",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: 0,
+										Type:    []string{"integer"},
+										Format:  "int32",
+									},
+								},
+							},
+						},
+					},
+					"queue": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Queue defines the queue to allocate resource for PodGroup; if queue does not exist, the PodGroup will not be scheduled. Defaults to `default` Queue with the lowest weight.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"priorityClassName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "If specified, indicates the PodGroup's priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the PodGroup priority will be default or zero if there is no default.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"minResources": {
+						SchemaProps: spec.SchemaProps{
+							Description: "MinResources defines the minimal resource of members/tasks to run the pod group; if there's not enough resources to start all tasks, the scheduler will not start anyone.",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+									},
+								},
+							},
+						},
+					},
+					"networkTopology": {
+						SchemaProps: spec.SchemaProps{
+							Description: "NetworkTopology defines the NetworkTopology config, this field works in conjunction with network topology feature and hyperNode CRD.",
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.NetworkTopologySpec"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/api/resource.Quantity", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.NetworkTopologySpec"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_PodGroupStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PodGroupStatus represents the current state of a pod group.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"phase": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Current phase of PodGroup.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"conditions": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The conditions of PodGroup.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupCondition"),
+									},
+								},
+							},
+						},
+					},
+					"running": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of actively running pods.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"succeeded": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of pods which reached phase Succeeded.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"failed": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of pods which reached phase Failed.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"volcano.sh/apis/pkg/apis/scheduling/v1beta1.PodGroupCondition"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_Queue(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "Queue is a queue of PodGroup.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+						},
+					},
+					"spec": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Specification of the desired behavior of the queue. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status",
+							Default:     map[string]interface{}{},
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.QueueSpec"),
+						},
+					},
+					"status": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The status of queue.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.QueueStatus"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.QueueSpec", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.QueueStatus"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_QueueList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "QueueList is a collection of queues.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata",
+							Default:     map[string]interface{}{},
+							Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+						},
+					},
+					"items": {
+						SchemaProps: spec.SchemaProps{
+							Description: "items is the list of PodGroup",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.Queue"),
+									},
+								},
+							},
+						},
+					},
+				},
+				Required: []string{"items"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.Queue"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_QueueSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "QueueSpec represents the template of Queue.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"weight": {
+						SchemaProps: spec.SchemaProps{
+							Type:   []string{"integer"},
+							Format: "int32",
+						},
+					},
+					"capability": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+									},
+								},
+							},
+						},
+					},
+					"reclaimable": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Reclaimable indicate whether the queue can be reclaimed by other queue",
+							Type:        []string{"boolean"},
+							Format:      "",
+						},
+					},
+					"extendClusters": {
+						SchemaProps: spec.SchemaProps{
+							Description: "extendCluster indicate the jobs in this Queue will be dispatched to these clusters.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.Cluster"),
+									},
+								},
+							},
+						},
+					},
+					"guarantee": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Guarantee indicate configuration about resource reservation",
+							Default:     map[string]interface{}{},
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.Guarantee"),
+						},
+					},
+					"affinity": {
+						SchemaProps: spec.SchemaProps{
+							Description: "If specified, the pod owned by the queue will be scheduled with constraint",
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.Affinity"),
+						},
+					},
+					"type": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Type define the type of queue",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"parent": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Parent define the parent of queue",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"deserved": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The amount of resources configured by the user. This part of resource can be shared with other queues and reclaimed back.",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+									},
+								},
+							},
+						},
+					},
+					"priority": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Priority define the priority of queue. Higher values are prioritized for scheduling and considered later during reclamation.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/api/resource.Quantity", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.Affinity", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.Cluster", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.Guarantee"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_QueueStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "QueueStatus represents the status of Queue.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"state": {
+						SchemaProps: spec.SchemaProps{
+							Description: "State is state of queue",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"unknown": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of 'Unknown' PodGroup in this queue.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"pending": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of 'Pending' PodGroup in this queue.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"running": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of 'Running' PodGroup in this queue.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"inqueue": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of `Inqueue` PodGroup in this queue.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"completed": {
+						SchemaProps: spec.SchemaProps{
+							Description: "The number of `Completed` PodGroup in this queue.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"reservation": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Reservation is the profile of resource reservation for queue",
+							Default:     map[string]interface{}{},
+							Ref:         ref("volcano.sh/apis/pkg/apis/scheduling/v1beta1.Reservation"),
+						},
+					},
+					"allocated": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Allocated is allocated resources in queue",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/api/resource.Quantity", "volcano.sh/apis/pkg/apis/scheduling/v1beta1.Reservation"},
+	}
+}
+
+func schema_pkg_apis_scheduling_v1beta1_Reservation(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "Reservation represents current condition about resource reservation",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"nodes": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Nodes are Locked nodes for queue",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
+					"resource": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Resource is a list of total idle resource in locked nodes.",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"),
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/api/resource.Quantity"},
+	}
+}
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/apply/apply.go b/vendor/github.com/kubeflow/trainer/v2/pkg/apply/apply.go
index 4f4655fcb..933dba354 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/apply/apply.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/apply/apply.go
@@ -34,12 +34,6 @@ var (
 	errorRequestedFieldPathNotFound = errors.New("requested field path not found")
 )
 
-func UpsertEnvVar(envVars *[]corev1ac.EnvVarApplyConfiguration, envVar ...corev1ac.EnvVarApplyConfiguration) {
-	for _, e := range envVar {
-		upsert(envVars, e, byEnvVarName)
-	}
-}
-
 func UpsertEnvVars(envVars *[]corev1ac.EnvVarApplyConfiguration, upEnvVars ...corev1ac.EnvVarApplyConfiguration) {
 	for _, e := range upEnvVars {
 		upsert(envVars, e, byEnvVarName)
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/constants/constants.go b/vendor/github.com/kubeflow/trainer/v2/pkg/constants/constants.go
index b2523cdd0..19b4a1dae 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/constants/constants.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/constants/constants.go
@@ -24,6 +24,15 @@ const (
 	// trainer.kubeflow.org/trainjob-ancestor-step: trainer              - trainJob.spec.trainer
 	LabelTrainJobAncestor string = "trainer.kubeflow.org/trainjob-ancestor-step"
 
+	// LabelSupport indicates support status for a runtime, e.g. "deprecated".
+	LabelSupport string = "trainer.kubeflow.org/support"
+
+	// SupportDeprecated indicates the runtime is deprecated when used with LabelSupport.
+	SupportDeprecated string = "deprecated"
+
+	// RuntimeDeprecationPolicyURL is the URL to the runtime deprecation policy documentation.
+	RuntimeDeprecationPolicyURL string = "https://www.kubeflow.org/docs/components/trainer/operator-guides/runtime/#runtime-deprecation-policy"
+
 	// DatasetInitializer is the name of the Job, volume mount, container, and label value for the dataset initializer.
 	DatasetInitializer string = "dataset-initializer"
 
@@ -146,12 +155,42 @@ const (
 	// TorchTuneFullFinetuneMultiNodesConfigSuffix is the config suffix for the multi node distributed full finetune.
 	TorchTuneFullFinetuneMultiNodesConfigSuffix string = "_full_multinode"
 
+	// TorchTuneLoRAFinetuneSingleDevice Recipe is the recipe for the single device LoRA finetune.
+	TorchTuneLoRAFinetuneSingleDevice string = "lora_finetune_single_device"
+
+	// TorchTuneLoRAFinetuneSingleDeviceConfigSuffix is the config suffix for the single device LoRA finetune.
+	TorchTuneLoRAFinetuneSingleDeviceConfigSuffix string = "_lora_single_device"
+
+	// TorchTuneQLoRAFinetuneSingleDeviceConfigSuffix is the config suffix for the single device QLoRA finetune.
+	TorchTuneQLoRAFinetuneSingleDeviceConfigSuffix string = "_qlora_single_device"
+
+	// TorchTuneLoRAFinetuneDistributed Recipe is the recipe for the distributed LoRA finetune.
+	TorchTuneLoRAFinetuneDistributed string = "lora_finetune_distributed"
+
+	// TorchTuneLoRAFinetuneDistributedConfigSuffix is the config suffix for the distributed LoRA finetune.
+	TorchTuneLoRAFinetuneDistributedConfigSuffix string = "_lora"
+
+	// TorchTuneQLoRAFinetuneDistributedConfigSuffix is the config suffix for the distributed QLoRA finetune.
+	TorchTuneQLoRAFinetuneDistributedConfigSuffix string = "_qlora"
+
+	// TorchTuneLoraAttnModules is the config item name for the LoRA attention modules.
+	TorchTuneLoraAttnModules string = "model.lora_attn_modules"
+
+	// TorchTuneQuantizeBase is the config item name for the quantization base.
+	TorchTuneQuantizeBase string = "model.quantize_base"
+
+	// TorchTuneUseDora is the config item name for using DoRA.
+	TorchTuneUseDora string = "model.use_dora"
+
 	// TorchTuneModelOutputDir is the config item name for the model output directory.
 	TorchTuneModelOutputDir string = "output_dir"
 
 	// TorchTuneTokenizerPath is the config item name for the tokenizer path.
 	TorchTuneTokenizerPath string = "tokenizer.path"
 
+	// TorchTuneTokenizerMergeFile is the config item name for the tokenizer merge file.
+	TorchTuneTokenizerMergeFile string = "tokenizer.merges_file"
+
 	// TorchTuneCheckpointerDir is the config item name for the checkpointer directory.
 	TorchTuneCheckpointDir string = "checkpointer.checkpoint_dir"
 )
@@ -160,11 +199,14 @@ const (
 	// TORCHTUNE_MODEL_LLAMA3_2_1B is the model name for the Llama3.2 1B Instruct model.
 	TORCHTUNE_MODEL_LLAMA3_2_1B = "llama3_2/1B"
 
-	// TORCHTUNE_MODEL_LLAMA3_2_7B is the model name for the Llama3.2 7B Instruct model.
-	TORCHTUNE_MODEL_LLAMA3_2_7B = "llama3_2/7B"
+	// TORCHTUNE_MODEL_LLAMA3_2_3B is the model name for the Llama3.2 3B Instruct model.
+	TORCHTUNE_MODEL_LLAMA3_2_3B = "llama3_2/3B"
 
 	// TORCHTUNE_MODEL_LLAMA3_3_70B is the model name for the Llama3.3 70B Instruct model.
 	TORCHTUNE_MODEL_LLAMA3_3_70B = "llama3_3/70B"
+
+	// TORCHTUNE_MODEL_QWEN2_1.5B is the model name for the Qwen2.5 1.5B model.
+	TORCHTUNE_MODEL_QWEN2_5_1_5B = "qwen2_5/1.5B"
 )
 
 var (
@@ -178,11 +220,11 @@ var (
 	ResourceInUseFinalizer = fmt.Sprintf("%s/resource-in-use", trainer.GroupVersion.Group)
 
 	// TorchTuneSupportedPretrainedModels supported pretrained models for TorchTune Trainer.
-	TorchTuneSupportedPretrainedModels = sets.New(TORCHTUNE_MODEL_LLAMA3_2_1B, TORCHTUNE_MODEL_LLAMA3_2_7B, TORCHTUNE_MODEL_LLAMA3_3_70B)
+	TorchTuneSupportedPretrainedModels = sets.New(TORCHTUNE_MODEL_LLAMA3_2_1B, TORCHTUNE_MODEL_LLAMA3_2_3B, TORCHTUNE_MODEL_LLAMA3_3_70B, TORCHTUNE_MODEL_QWEN2_5_1_5B)
 
 	// TorchTuneEntrypoint is the entrypoint for the torchtune.
 	TorchTuneEntrypoint = []string{"tune", "run"}
 
 	// TorchTuneImmutableConfigs is the set of immutable configs for the TorchTune Trainer.
-	TorchTuneImmutableConfigs = sets.New(TorchTuneModelOutputDir, TorchTuneTokenizerPath, TorchTuneCheckpointDir)
+	TorchTuneImmutableConfigs = sets.New(TorchTuneModelOutputDir, TorchTuneTokenizerPath, TorchTuneCheckpointDir, TorchTuneTokenizerMergeFile)
 )
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/clustertrainingruntime.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/clustertrainingruntime.go
index 16214203e..2e3c653e7 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/clustertrainingruntime.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/clustertrainingruntime.go
@@ -21,14 +21,15 @@ import (
 	"errors"
 	"fmt"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
 	trainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
+	"github.com/kubeflow/trainer/v2/pkg/constants"
 	"github.com/kubeflow/trainer/v2/pkg/runtime"
+	trainingruntime "github.com/kubeflow/trainer/v2/pkg/util/trainingruntime"
 )
 
 var (
@@ -71,8 +72,8 @@ func (r *ClusterTrainingRuntime) RuntimeInfo(
 	return r.TrainingRuntime.RuntimeInfo(trainJob, runtimeTemplateSpec, mlPolicy, podGroupPolicy)
 }
 
-func (r *ClusterTrainingRuntime) TerminalCondition(ctx context.Context, trainJob *trainer.TrainJob) (*metav1.Condition, error) {
-	return r.TrainingRuntime.TerminalCondition(ctx, trainJob)
+func (r *ClusterTrainingRuntime) TrainJobStatus(ctx context.Context, trainJob *trainer.TrainJob) (*trainer.TrainJobStatus, error) {
+	return r.TrainingRuntime.TrainJobStatus(ctx, trainJob)
 }
 
 func (r *ClusterTrainingRuntime) EventHandlerRegistrars() []runtime.ReconcilerBuilder {
@@ -89,6 +90,18 @@ func (r *ClusterTrainingRuntime) ValidateObjects(ctx context.Context, old, new *
 				fmt.Sprintf("%v: specified clusterTrainingRuntime must be created before the TrainJob is created", err)),
 		}
 	}
+	var warnings admission.Warnings
+	if trainingruntime.IsSupportDeprecated(clusterTrainingRuntime.Labels) {
+		warnings = append(warnings, fmt.Sprintf(
+			"Referenced ClusterTrainingRuntime \"%s\" is deprecated and will be removed in a future release of Kubeflow Trainer. See runtime deprecation policy: %s",
+			clusterTrainingRuntime.Name,
+			constants.RuntimeDeprecationPolicyURL,
+		))
+	}
 	info, _ := r.newRuntimeInfo(new, clusterTrainingRuntime.Spec.Template, clusterTrainingRuntime.Spec.MLPolicy, clusterTrainingRuntime.Spec.PodGroupPolicy)
-	return r.framework.RunCustomValidationPlugins(ctx, info, old, new)
+	fwWarnings, errs := r.framework.RunCustomValidationPlugins(ctx, info, old, new)
+	if len(fwWarnings) != 0 {
+		warnings = append(warnings, fwWarnings...)
+	}
+	return warnings, errs
 }
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/trainingruntime.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/trainingruntime.go
index 89ffac2a7..0f03d467e 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/trainingruntime.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/core/trainingruntime.go
@@ -138,7 +138,7 @@ func (r *TrainingRuntime) newRuntimeInfo(
 		// The JobSetTemplateSpec annotations are overridden by the TrainJob Annotations (.spec.annotations).
 		propagationAnnotations[k] = v
 	}
-	err := r.mergePodSpecOverrides(trainJob, &jobSetTemplateSpec)
+	err := r.mergePodTemplateOverrides(trainJob, &jobSetTemplateSpec)
 	if err != nil {
 		return nil, err
 	}
@@ -187,32 +187,51 @@ func (r *TrainingRuntime) newRuntimeInfo(
 	return runtime.NewInfo(opts...), nil
 }
 
-func (r *TrainingRuntime) mergePodSpecOverrides(trainJob *trainer.TrainJob, jobSetTemplateSpec *trainer.JobSetTemplateSpec) error {
-	for _, podSpecOverride := range trainJob.Spec.PodSpecOverrides {
+func (r *TrainingRuntime) mergePodTemplateOverrides(trainJob *trainer.TrainJob, jobSetTemplateSpec *trainer.JobSetTemplateSpec) error {
+	for _, podTemplateOverride := range trainJob.Spec.PodTemplateOverrides {
 		for i, job := range jobSetTemplateSpec.Spec.ReplicatedJobs {
-			if !slices.ContainsFunc(podSpecOverride.TargetJobs, func(targetJob trainer.PodSpecOverrideTargetJob) bool {
+			if !slices.ContainsFunc(podTemplateOverride.TargetJobs, func(targetJob trainer.PodTemplateOverrideTargetJob) bool {
 				return targetJob.Name == job.Name
 			}) {
 				continue
 			}
-			patch, err := json.Marshal(podSpecOverride)
+
+			podTemplatePatch := map[string]any{}
+			if podTemplateOverride.Metadata != nil {
+				metadata := map[string]any{}
+				if podTemplateOverride.Metadata.Labels != nil {
+					metadata["labels"] = podTemplateOverride.Metadata.Labels
+				}
+				if podTemplateOverride.Metadata.Annotations != nil {
+					metadata["annotations"] = podTemplateOverride.Metadata.Annotations
+				}
+				if len(metadata) > 0 {
+					podTemplatePatch["metadata"] = metadata
+				}
+			}
+
+			if podTemplateOverride.Spec != nil {
+				podTemplatePatch["spec"] = podTemplateOverride.Spec
+			}
+
+			// Apply a strategic merge patch against the full PodTemplateSpec
+			source, err := json.Marshal(job.Template.Spec.Template)
 			if err != nil {
 				return err
 			}
-			source, err := json.Marshal(job.Template.Spec.Template.Spec)
+			patch, err := json.Marshal(podTemplatePatch)
 			if err != nil {
 				return err
 			}
-			merged, err := strategicpatch.StrategicMergePatch(source, patch, corev1.PodSpec{})
+			merged, err := strategicpatch.StrategicMergePatch(source, patch, corev1.PodTemplateSpec{})
 			if err != nil {
 				return err
 			}
-			spec := corev1.PodSpec{}
-			err = json.Unmarshal(merged, &spec)
-			if err != nil {
+			mergedTemplate := corev1.PodTemplateSpec{}
+			if err := json.Unmarshal(merged, &mergedTemplate); err != nil {
 				return err
 			}
-			jobSetTemplateSpec.Spec.ReplicatedJobs[i].Template.Spec.Template.Spec = spec
+			jobSetTemplateSpec.Spec.ReplicatedJobs[i].Template.Spec.Template = mergedTemplate
 		}
 	}
 	return nil
@@ -230,7 +249,7 @@ func syncPodSets(info *runtime.Info) {
 		}
 		apply.UpsertVolumes(&jsSpec.ReplicatedJobs[psIdx].Template.Spec.Template.Spec.Volumes, ps.Volumes...)
 		for containerIdx, container := range ps.Containers {
-			apply.UpsertEnvVar(
+			apply.UpsertEnvVars(
 				&jsSpec.ReplicatedJobs[psIdx].Template.Spec.Template.Spec.Containers[containerIdx].Env,
 				container.Env...,
 			)
@@ -246,8 +265,8 @@ func syncPodSets(info *runtime.Info) {
 	}
 }
 
-func (r *TrainingRuntime) TerminalCondition(ctx context.Context, trainJob *trainer.TrainJob) (*metav1.Condition, error) {
-	return r.framework.RunTerminalConditionPlugins(ctx, trainJob)
+func (r *TrainingRuntime) TrainJobStatus(ctx context.Context, trainJob *trainer.TrainJob) (*trainer.TrainJobStatus, error) {
+	return r.framework.RunTrainJobStatusPlugin(ctx, trainJob)
 }
 
 func (r *TrainingRuntime) EventHandlerRegistrars() []runtime.ReconcilerBuilder {
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/core/framework.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/core/framework.go
index 551164e36..dc654d3ae 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/core/framework.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/core/framework.go
@@ -20,7 +20,6 @@ import (
 	"context"
 	"errors"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
@@ -29,9 +28,10 @@ import (
 	"github.com/kubeflow/trainer/v2/pkg/runtime"
 	"github.com/kubeflow/trainer/v2/pkg/runtime/framework"
 	fwkplugins "github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins"
+	index "github.com/kubeflow/trainer/v2/pkg/runtime/indexer"
 )
 
-var errorTooManyTerminalConditionPlugin = errors.New("too many TerminalCondition plugins are registered")
+var errorTooManyTrainJobStatusPlugin = errors.New("too many TrainJobStatus plugins are registered")
 
 type Framework struct {
 	registry                     fwkplugins.Registry
@@ -42,7 +42,7 @@ type Framework struct {
 	watchExtensionPlugins        []framework.WatchExtensionPlugin
 	podNetworkPlugins            []framework.PodNetworkPlugin
 	componentBuilderPlugins      []framework.ComponentBuilderPlugin
-	terminalConditionPlugins     []framework.TerminalConditionPlugin
+	trainJobStatusPlugin         framework.TrainJobStatusPlugin
 }
 
 func New(ctx context.Context, c client.Client, r fwkplugins.Registry, indexer client.FieldIndexer) (*Framework, error) {
@@ -50,6 +50,9 @@ func New(ctx context.Context, c client.Client, r fwkplugins.Registry, indexer cl
 		registry: r,
 	}
 	plugins := make(map[string]framework.Plugin, len(r))
+	if err := f.SetupRuntimeClassIndexer(ctx, indexer); err != nil {
+		return nil, err
+	}
 
 	for name, factory := range r {
 		plugin, err := factory(ctx, c, indexer)
@@ -75,8 +78,11 @@ func New(ctx context.Context, c client.Client, r fwkplugins.Registry, indexer cl
 		if p, ok := plugin.(framework.ComponentBuilderPlugin); ok {
 			f.componentBuilderPlugins = append(f.componentBuilderPlugins, p)
 		}
-		if p, ok := plugin.(framework.TerminalConditionPlugin); ok {
-			f.terminalConditionPlugins = append(f.terminalConditionPlugins, p)
+		if p, ok := plugin.(framework.TrainJobStatusPlugin); ok {
+			if f.trainJobStatusPlugin != nil {
+				return nil, errorTooManyTrainJobStatusPlugin
+			}
+			f.trainJobStatusPlugin = p
 		}
 	}
 	f.plugins = plugins
@@ -137,13 +143,9 @@ func (f *Framework) RunComponentBuilderPlugins(ctx context.Context, info *runtim
 	return objs, nil
 }
 
-func (f *Framework) RunTerminalConditionPlugins(ctx context.Context, trainJob *trainer.TrainJob) (*metav1.Condition, error) {
-	// TODO (tenzen-y): Once we provide the Configuration API, we should validate which plugin should have terminalCondition execution points.
-	if len(f.terminalConditionPlugins) > 1 {
-		return nil, errorTooManyTerminalConditionPlugin
-	}
-	if len(f.terminalConditionPlugins) != 0 {
-		return f.terminalConditionPlugins[0].TerminalCondition(ctx, trainJob)
+func (f *Framework) RunTrainJobStatusPlugin(ctx context.Context, trainJob *trainer.TrainJob) (*trainer.TrainJobStatus, error) {
+	if f.trainJobStatusPlugin != nil {
+		return f.trainJobStatusPlugin.Status(ctx, trainJob)
 	}
 	return nil, nil
 }
@@ -151,3 +153,17 @@ func (f *Framework) RunTerminalConditionPlugins(ctx context.Context, trainJob *t
 func (f *Framework) WatchExtensionPlugins() []framework.WatchExtensionPlugin {
 	return f.watchExtensionPlugins
 }
+
+func (f *Framework) SetupRuntimeClassIndexer(ctx context.Context, indexer client.FieldIndexer) error {
+	if err := indexer.IndexField(ctx, &trainer.TrainingRuntime{},
+		index.TrainingRuntimeContainerRuntimeClassKey,
+		index.IndexTrainingRuntimeContainerRuntimeClass); err != nil {
+		return index.ErrorCanNotSetupTrainingRuntimeRuntimeClassIndexer
+	}
+	if err := indexer.IndexField(ctx, &trainer.ClusterTrainingRuntime{},
+		index.ClusterTrainingRuntimeContainerRuntimeClassKey,
+		index.IndexClusterTrainingRuntimeContainerRuntimeClass); err != nil {
+		return index.ErrorCanNotSetupClusterTrainingRuntimeRuntimeClassIndexer
+	}
+	return nil
+}
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/interface.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/interface.go
index 676548ebe..703379c1f 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/interface.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/interface.go
@@ -19,7 +19,6 @@ package framework
 import (
 	"context"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
@@ -61,7 +60,7 @@ type ComponentBuilderPlugin interface {
 	Build(ctx context.Context, info *runtime.Info, trainJob *trainer.TrainJob) ([]any, error)
 }
 
-type TerminalConditionPlugin interface {
+type TrainJobStatusPlugin interface {
 	Plugin
-	TerminalCondition(ctx context.Context, trainJob *trainer.TrainJob) (*metav1.Condition, error)
+	Status(ctx context.Context, trainJob *trainer.TrainJob) (*trainer.TrainJobStatus, error)
 }
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/coscheduling/coscheduling.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/coscheduling/coscheduling.go
index d2a130560..abcfd4634 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/coscheduling/coscheduling.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/coscheduling/coscheduling.go
@@ -18,8 +18,6 @@ package coscheduling
 
 import (
 	"context"
-	"errors"
-	"fmt"
 	"slices"
 
 	"github.com/go-logr/logr"
@@ -47,6 +45,7 @@ import (
 	trainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
 	"github.com/kubeflow/trainer/v2/pkg/runtime"
 	"github.com/kubeflow/trainer/v2/pkg/runtime/framework"
+	index "github.com/kubeflow/trainer/v2/pkg/runtime/indexer"
 	runtimeindexer "github.com/kubeflow/trainer/v2/pkg/runtime/indexer"
 )
 
@@ -61,24 +60,13 @@ var _ framework.EnforcePodGroupPolicyPlugin = (*CoScheduling)(nil)
 var _ framework.WatchExtensionPlugin = (*CoScheduling)(nil)
 var _ framework.ComponentBuilderPlugin = (*CoScheduling)(nil)
 
-var (
-	ErrorCanNotSetupTrainingRuntimeRuntimeClassIndexer        = errors.New("setting index on runtimeClass for TrainingRuntime")
-	ErrorCanNotSetupClusterTrainingRuntimeRuntimeClassIndexer = errors.New("setting index on runtimeClass for ClusterTrainingRuntime")
-)
-
 const Name = "CoScheduling"
 
 // +kubebuilder:rbac:groups=scheduling.x-k8s.io,resources=podgroups,verbs=create;get;list;watch;update;patch
+// +kubebuilder:rbac:groups=node.k8s.io,resources=runtimeclasses,verbs=get;list;watch
+// +kubebuilder:rbac:groups="",resources=limitranges,verbs=get;list;watch
 
-func New(ctx context.Context, client client.Client, indexer client.FieldIndexer) (framework.Plugin, error) {
-	if err := indexer.IndexField(ctx, &trainer.TrainingRuntime{}, TrainingRuntimeContainerRuntimeClassKey,
-		IndexTrainingRuntimeContainerRuntimeClass); err != nil {
-		return nil, fmt.Errorf("%w: %w", ErrorCanNotSetupTrainingRuntimeRuntimeClassIndexer, err)
-	}
-	if err := indexer.IndexField(ctx, &trainer.ClusterTrainingRuntime{}, ClusterTrainingRuntimeContainerRuntimeClassKey,
-		IndexClusterTrainingRuntimeContainerRuntimeClass); err != nil {
-		return nil, fmt.Errorf("%w: %w", ErrorCanNotSetupClusterTrainingRuntimeRuntimeClassIndexer, err)
-	}
+func New(_ context.Context, client client.Client, _ client.FieldIndexer) (framework.Plugin, error) {
 	return &CoScheduling{
 		client:     client,
 		restMapper: client.RESTMapper(),
@@ -91,7 +79,7 @@ func (c *CoScheduling) Name() string {
 }
 
 func (c *CoScheduling) EnforcePodGroupPolicy(info *runtime.Info, trainJob *trainer.TrainJob) error {
-	if info == nil || info.RuntimePolicy.PodGroupPolicy == nil || trainJob == nil {
+	if info == nil || info.RuntimePolicy.PodGroupPolicy == nil || info.RuntimePolicy.PodGroupPolicy.Coscheduling == nil || trainJob == nil {
 		return nil
 	}
 
@@ -185,11 +173,11 @@ func (h *PodGroupRuntimeClassHandler) Generic(context.Context, event.TypedGeneri
 
 func (h *PodGroupRuntimeClassHandler) queueSuspendedTrainJobs(ctx context.Context, runtimeClass *nodev1.RuntimeClass, q workqueue.TypedRateLimitingInterface[reconcile.Request]) error {
 	var trainingRuntimes trainer.TrainingRuntimeList
-	if err := h.client.List(ctx, &trainingRuntimes, client.MatchingFields{TrainingRuntimeContainerRuntimeClassKey: runtimeClass.Name}); err != nil {
+	if err := h.client.List(ctx, &trainingRuntimes, client.MatchingFields{index.TrainingRuntimeContainerRuntimeClassKey: runtimeClass.Name}); err != nil {
 		return err
 	}
 	var clusterTrainingRuntimes trainer.ClusterTrainingRuntimeList
-	if err := h.client.List(ctx, &clusterTrainingRuntimes, client.MatchingFields{ClusterTrainingRuntimeContainerRuntimeClassKey: runtimeClass.Name}); err != nil {
+	if err := h.client.List(ctx, &clusterTrainingRuntimes, client.MatchingFields{index.ClusterTrainingRuntimeContainerRuntimeClassKey: runtimeClass.Name}); err != nil {
 		return err
 	}
 
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/coscheduling/indexer.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/coscheduling/indexer.go
deleted file mode 100644
index 846d8cd47..000000000
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/coscheduling/indexer.go
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-Copyright 2024 The Kubeflow Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package coscheduling
-
-import (
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	trainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
-)
-
-var (
-	TrainingRuntimeContainerRuntimeClassKey        = ".trainingRuntimeSpec.jobSetTemplateSpec.replicatedJobs.podTemplateSpec.runtimeClassName"
-	ClusterTrainingRuntimeContainerRuntimeClassKey = ".clusterTrainingRuntimeSpec.jobSetTemplateSpec.replicatedJobs.podTemplateSpec.runtimeClassName"
-)
-
-func IndexTrainingRuntimeContainerRuntimeClass(obj client.Object) []string {
-	runtime, ok := obj.(*trainer.TrainingRuntime)
-	if !ok {
-		return nil
-	}
-	var runtimeClasses []string
-	for _, rJob := range runtime.Spec.Template.Spec.ReplicatedJobs {
-		if rJob.Template.Spec.Template.Spec.RuntimeClassName != nil {
-			runtimeClasses = append(runtimeClasses, *rJob.Template.Spec.Template.Spec.RuntimeClassName)
-		}
-	}
-	return runtimeClasses
-}
-
-func IndexClusterTrainingRuntimeContainerRuntimeClass(obj client.Object) []string {
-	clRuntime, ok := obj.(*trainer.ClusterTrainingRuntime)
-	if !ok {
-		return nil
-	}
-	var runtimeClasses []string
-	for _, rJob := range clRuntime.Spec.Template.Spec.ReplicatedJobs {
-		if rJob.Template.Spec.Template.Spec.RuntimeClassName != nil {
-			runtimeClasses = append(runtimeClasses, *rJob.Template.Spec.Template.Spec.RuntimeClassName)
-		}
-	}
-	return runtimeClasses
-}
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/builder.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/builder.go
index e3cf615a1..d5d8e1ca8 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/builder.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/builder.go
@@ -56,7 +56,7 @@ func (b *Builder) Initializer(trainJob *trainer.TrainJob) *Builder {
 					env := &b.Spec.ReplicatedJobs[i].Template.Spec.Template.Spec.Containers[j].Env
 					// Update the dataset initializer envs.
 					if storageUri := trainJob.Spec.Initializer.Dataset.StorageUri; storageUri != nil {
-						apply.UpsertEnvVar(env, *corev1ac.EnvVar().
+						apply.UpsertEnvVars(env, *corev1ac.EnvVar().
 							WithName(jobsetplgconsts.InitializerEnvStorageUri).
 							WithValue(*storageUri))
 					}
@@ -82,7 +82,7 @@ func (b *Builder) Initializer(trainJob *trainer.TrainJob) *Builder {
 					env := &b.Spec.ReplicatedJobs[i].Template.Spec.Template.Spec.Containers[j].Env
 					// Update the model initializer envs.
 					if storageUri := trainJob.Spec.Initializer.Model.StorageUri; storageUri != nil {
-						apply.UpsertEnvVar(env, *corev1ac.EnvVar().
+						apply.UpsertEnvVars(env, *corev1ac.EnvVar().
 							WithName(jobsetplgconsts.InitializerEnvStorageUri).
 							WithValue(*storageUri))
 					}
@@ -101,21 +101,26 @@ func (b *Builder) Initializer(trainJob *trainer.TrainJob) *Builder {
 	return b
 }
 
+// isRunLauncherAsNode returns true if runLauncherAsNode is set to true in the MPI policy.
+func (b *Builder) isRunLauncherAsNode(info *runtime.Info) bool {
+	return info.RuntimePolicy.MLPolicySource != nil &&
+		info.RuntimePolicy.MLPolicySource.MPI != nil &&
+		info.RuntimePolicy.MLPolicySource.MPI.RunLauncherAsNode != nil &&
+		*info.RuntimePolicy.MLPolicySource.MPI.RunLauncherAsNode
+}
+
 // Trainer updates JobSet values for the trainer Job.
 func (b *Builder) Trainer(info *runtime.Info, trainJob *trainer.TrainJob) *Builder {
 	for i, rJob := range b.Spec.ReplicatedJobs {
+		ancestor := ""
 		jobMetadata := rJob.Template.ObjectMetaApplyConfiguration
-		if jobMetadata == nil || jobMetadata.Labels == nil {
-			continue
+		if jobMetadata != nil && jobMetadata.Labels != nil {
+			ancestor = jobMetadata.Labels[constants.LabelTrainJobAncestor]
 		}
-		if ancestor, ok := jobMetadata.Labels[constants.LabelTrainJobAncestor]; ok && ancestor == constants.AncestorTrainer {
+		if ancestor == constants.AncestorTrainer {
 			// TODO: Support multiple replicas ('.template.spec.replicatedJobs[*].replicas') for replicated Jobs.
 			// REF: https://github.com/kubeflow/trainer/issues/2318
 			b.Spec.ReplicatedJobs[i].Replicas = ptr.To[int32](1)
-			// Update the Parallelism and Completions values for the Trainer Job.
-			b.Spec.ReplicatedJobs[i].Template.Spec.Parallelism = info.FindPodSetByAncestor(constants.AncestorTrainer).Count
-			b.Spec.ReplicatedJobs[i].Template.Spec.Completions = info.FindPodSetByAncestor(constants.AncestorTrainer).Count
-
 			// Update values for the Trainer container.
 			for j, container := range rJob.Template.Spec.Template.Spec.Containers {
 				if *container.Name == constants.Node {
@@ -130,6 +135,16 @@ func (b *Builder) Trainer(info *runtime.Info, trainJob *trainer.TrainJob) *Build
 						if args := jobTrainer.Args; args != nil {
 							b.Spec.ReplicatedJobs[i].Template.Spec.Template.Spec.Containers[j].Args = args
 						}
+					}
+				}
+			}
+		}
+		if ancestor == constants.AncestorTrainer || b.isRunLauncherAsNode(info) && *rJob.Name == constants.Node {
+			// TODO (andreyvelich): For MPI we should apply container resources to the Node ReplicatedJob also.
+			// Eventually, we should find better way to propagate resources from TrainJob to JobSet.
+			for j, container := range rJob.Template.Spec.Template.Spec.Containers {
+				if *container.Name == constants.Node {
+					if jobTrainer := trainJob.Spec.Trainer; jobTrainer != nil {
 						if resourcesPerNode := jobTrainer.ResourcesPerNode; resourcesPerNode != nil &&
 							(resourcesPerNode.Limits != nil || resourcesPerNode.Requests != nil) {
 							requirements := corev1ac.ResourceRequirements()
@@ -163,6 +178,13 @@ func (b *Builder) PodLabels(labels map[string]string) *Builder {
 	return b
 }
 
+func (b *Builder) PodAnnotations(annotations map[string]string) *Builder {
+	for i := range b.Spec.ReplicatedJobs {
+		b.Spec.ReplicatedJobs[i].Template.Spec.Template.WithAnnotations(annotations)
+	}
+	return b
+}
+
 func (b *Builder) Suspend(suspend *bool) *Builder {
 	b.Spec.Suspend = suspend
 	return b
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/jobset.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/jobset.go
index 0e57bfb98..982e8d0af 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/jobset.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/jobset.go
@@ -48,8 +48,8 @@ import (
 )
 
 var (
-	runtimeRefPath      = field.NewPath("spec").Child("runtimeRef")
-	podSpecOverridePath = field.NewPath("spec").Child("podSpecOverrides")
+	runtimeRefPath          = field.NewPath("spec").Child("runtimeRef")
+	podTemplateOverridePath = field.NewPath("spec").Child("podTemplateOverrides")
 )
 
 type JobSet struct {
@@ -62,7 +62,7 @@ type JobSet struct {
 var _ framework.WatchExtensionPlugin = (*JobSet)(nil)
 var _ framework.PodNetworkPlugin = (*JobSet)(nil)
 var _ framework.ComponentBuilderPlugin = (*JobSet)(nil)
-var _ framework.TerminalConditionPlugin = (*JobSet)(nil)
+var _ framework.TrainJobStatusPlugin = (*JobSet)(nil)
 var _ framework.CustomValidationPlugin = (*JobSet)(nil)
 
 const Name = constants.JobSetKind
@@ -118,45 +118,39 @@ func (j *JobSet) Validate(ctx context.Context, info *runtime.Info, oldObj, newOb
 		}
 	}
 
-	allErrs = append(allErrs, j.checkPodSpecOverridesImmutability(ctx, oldObj, newObj)...)
+	allErrs = append(allErrs, j.checkPodTemplateOverridesImmutability(ctx, oldObj, newObj)...)
 
 	// TODO (andreyvelich): Validate Volumes, VolumeMounts, and Tolerations.
-	targetJobNames := sets.New[string]()
-	for _, podSpecOverride := range newObj.Spec.PodSpecOverrides {
-		// Validate that there are no duplicate target job names within the same PodSpecOverride
-		for _, targetJob := range podSpecOverride.TargetJobs {
-			if targetJobNames.Has(targetJob.Name) {
-				allErrs = append(allErrs, field.Duplicate(podSpecOverridePath, targetJob.Name))
-			}
-			targetJobNames.Insert(targetJob.Name)
-		}
-
-		for _, targetJob := range podSpecOverride.TargetJobs {
+	for _, podTemplateOverride := range newObj.Spec.PodTemplateOverrides {
+		for _, targetJob := range podTemplateOverride.TargetJobs {
 			containers, ok := rJobContainerNames[targetJob.Name]
 			if !ok {
-				allErrs = append(allErrs, field.Invalid(podSpecOverridePath, newObj.Spec.PodSpecOverrides, "must not have targetJob that doesn't exist in the runtime job template"))
+				allErrs = append(allErrs, field.Invalid(podTemplateOverridePath, newObj.Spec.PodTemplateOverrides, "must not have targetJob that doesn't exist in the runtime job template"))
 			}
-			for _, overrideContainer := range podSpecOverride.InitContainers {
-				if !containers.Has(overrideContainer.Name) {
-					allErrs = append(allErrs, field.Invalid(podSpecOverridePath, newObj.Spec.PodSpecOverrides, fmt.Sprintf("must not have initContainer that doesn't exist in the runtime job %s", targetJob.Name)))
+			if podTemplateOverride.Spec != nil {
+				for _, overrideContainer := range podTemplateOverride.Spec.InitContainers {
+					if !containers.Has(overrideContainer.Name) {
+						allErrs = append(allErrs, field.Invalid(podTemplateOverridePath, newObj.Spec.PodTemplateOverrides, fmt.Sprintf("must not have initContainer that doesn't exist in the runtime job %s", targetJob.Name)))
+					}
 				}
-			}
-			for _, overrideContainer := range podSpecOverride.Containers {
-				if !containers.Has(overrideContainer.Name) {
-					allErrs = append(allErrs, field.Invalid(podSpecOverridePath, newObj.Spec.PodSpecOverrides, fmt.Sprintf("must not have container that doesn't exist in the runtime job %s", targetJob.Name)))
-					// Trainer and Initializer APIs should be used to set TrainJob envs for the reserved containers.
-				} else if len(overrideContainer.Env) > 0 && (overrideContainer.Name == constants.DatasetInitializer || overrideContainer.Name == constants.ModelInitializer || overrideContainer.Name == constants.Node) {
-					allErrs = append(allErrs, field.Invalid(podSpecOverridePath, newObj.Spec.PodSpecOverrides,
-						fmt.Sprintf("must not have envs for the %s, %s, %s containers", constants.DatasetInitializer, constants.ModelInitializer, constants.Node)))
+				for _, overrideContainer := range podTemplateOverride.Spec.Containers {
+					if !containers.Has(overrideContainer.Name) {
+						allErrs = append(allErrs, field.Invalid(podTemplateOverridePath, newObj.Spec.PodTemplateOverrides, fmt.Sprintf("must not have container that doesn't exist in the runtime job %s", targetJob.Name)))
+						// Trainer and Initializer APIs should be used to set TrainJob envs for the reserved containers.
+					} else if len(overrideContainer.Env) > 0 && (overrideContainer.Name == constants.DatasetInitializer || overrideContainer.Name == constants.ModelInitializer || overrideContainer.Name == constants.Node) {
+						allErrs = append(allErrs, field.Invalid(podTemplateOverridePath, newObj.Spec.PodTemplateOverrides,
+							fmt.Sprintf("must not have envs for the %s, %s, %s containers", constants.DatasetInitializer, constants.ModelInitializer, constants.Node)))
+					}
 				}
 			}
 		}
+
 	}
 
 	return nil, allErrs
 }
 
-func (j *JobSet) checkPodSpecOverridesImmutability(ctx context.Context, oldObj, newObj *trainer.TrainJob) field.ErrorList {
+func (j *JobSet) checkPodTemplateOverridesImmutability(ctx context.Context, oldObj, newObj *trainer.TrainJob) field.ErrorList {
 	var allErrs field.ErrorList
 
 	if oldObj == nil {
@@ -165,13 +159,13 @@ func (j *JobSet) checkPodSpecOverridesImmutability(ctx context.Context, oldObj,
 	}
 
 	jobSet := &jobsetv1alpha2.JobSet{}
-	changed := !equality.Semantic.DeepEqual(oldObj.Spec.PodSpecOverrides, newObj.Spec.PodSpecOverrides)
+	changed := !equality.Semantic.DeepEqual(oldObj.Spec.PodTemplateOverrides, newObj.Spec.PodTemplateOverrides)
 	suspended := ptr.Equal(newObj.Spec.Suspend, ptr.To(true))
 	if changed {
 		if !suspended {
-			allErrs = append(allErrs, field.Forbidden(podSpecOverridePath, "PodSpecOverrides can only be modified when the TrainJob is suspended"))
+			allErrs = append(allErrs, field.Forbidden(podTemplateOverridePath, "PodTemplateOverrides can only be modified when the TrainJob is suspended"))
 		} else if err := j.client.Get(ctx, client.ObjectKeyFromObject(newObj), jobSet); client.IgnoreNotFound(err) != nil {
-			allErrs = append(allErrs, field.InternalError(podSpecOverridePath, err))
+			allErrs = append(allErrs, field.InternalError(podTemplateOverridePath, err))
 		} else {
 			// If the JobSet exists, check whether it's inactive
 			// so changes won't have side effects on the JobSet's Pods
@@ -180,8 +174,8 @@ func (j *JobSet) checkPodSpecOverridesImmutability(ctx context.Context, oldObj,
 			// from unsuspended state.
 			for _, replicatedJob := range jobSet.Status.ReplicatedJobsStatus {
 				if replicatedJob.Active > 0 {
-					allErrs = append(allErrs, field.Forbidden(podSpecOverridePath,
-						fmt.Sprintf("PodSpecOverrides cannot be modified when the JobSet's ReplicatedJob %s is still active", replicatedJob.Name)))
+					allErrs = append(allErrs, field.Forbidden(podTemplateOverridePath,
+						fmt.Sprintf("PodTemplateOverrides cannot be modified when the JobSet's ReplicatedJob %s is still active", replicatedJob.Name)))
 				}
 			}
 		}
@@ -275,6 +269,7 @@ func (j *JobSet) Build(ctx context.Context, info *runtime.Info, trainJob *traine
 		Initializer(trainJob).
 		Trainer(info, trainJob).
 		PodLabels(info.Scheduler.PodLabels).
+		PodAnnotations(info.Scheduler.PodAnnotations).
 		Suspend(trainJob.Spec.Suspend).
 		Build().
 		WithOwnerReferences(metav1ac.OwnerReference().
@@ -288,18 +283,34 @@ func (j *JobSet) Build(ctx context.Context, info *runtime.Info, trainJob *traine
 	return []any{jobSet}, nil
 }
 
-func (j *JobSet) TerminalCondition(ctx context.Context, trainJob *trainer.TrainJob) (*metav1.Condition, error) {
+func (j *JobSet) Status(ctx context.Context, trainJob *trainer.TrainJob) (*trainer.TrainJobStatus, error) {
 	jobSet := &jobsetv1alpha2.JobSet{}
 	if err := j.client.Get(ctx, client.ObjectKeyFromObject(trainJob), jobSet); err != nil {
 		return nil, err
 	}
+	status := trainJob.Status.DeepCopy()
+
 	if completed := meta.FindStatusCondition(jobSet.Status.Conditions, string(jobsetv1alpha2.JobSetCompleted)); completed != nil && completed.Status == metav1.ConditionTrue {
 		completed.Type = trainer.TrainJobComplete
-		return completed, nil
+		meta.SetStatusCondition(&status.Conditions, *completed)
 	}
 	if failed := meta.FindStatusCondition(jobSet.Status.Conditions, string(jobsetv1alpha2.JobSetFailed)); failed != nil && failed.Status == metav1.ConditionTrue {
 		failed.Type = trainer.TrainJobFailed
-		return failed, nil
+		meta.SetStatusCondition(&status.Conditions, *failed)
+	}
+
+	var statuses []trainer.JobStatus
+	for _, status := range jobSet.Status.ReplicatedJobsStatus {
+		statuses = append(statuses, trainer.JobStatus{
+			Name:      status.Name,
+			Ready:     &status.Ready,
+			Succeeded: &status.Succeeded,
+			Failed:    &status.Failed,
+			Active:    &status.Active,
+			Suspended: &status.Suspended,
+		})
 	}
-	return nil, nil
+	status.JobsStatus = statuses
+
+	return status, nil
 }
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/mpi/mpi.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/mpi/mpi.go
index ed32344da..053fd38e9 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/mpi/mpi.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/mpi/mpi.go
@@ -113,8 +113,6 @@ func (m *MPI) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob) er
 	if trainJob.Spec.Trainer != nil && trainJob.Spec.Trainer.NumNodes != nil {
 		if node := info.FindPodSetByName(constants.Node); node != nil && node.Count != nil {
 			if ptr.Deref(info.RuntimePolicy.MLPolicySource.MPI.RunLauncherAsNode, false) {
-				// TODO: We should implement more strong validations for the MPIRuntime with runLauncherAsNode.
-				// REF: https://github.com/kubeflow/trainer/issues/2550
 				// When runLauncherAsNode is enabled, 1 nodes should be allocated to launcher.
 				*node.Count = max(*trainJob.Spec.Trainer.NumNodes-1, 1)
 			} else {
@@ -125,6 +123,15 @@ func (m *MPI) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob) er
 
 	if trainJob.Spec.Trainer != nil && trainJob.Spec.Trainer.NumProcPerNode != nil {
 		info.RuntimePolicy.MLPolicySource.MPI.NumProcPerNode = ptr.To(int32(trainJob.Spec.Trainer.NumProcPerNode.IntValue()))
+		// If numProcPerNode is set to 1 in runtime, we make it equal to number of GPUs.
+	} else if *info.RuntimePolicy.MLPolicySource.MPI.NumProcPerNode == 1 {
+		resourcesPerNode := ptr.Deref(runtime.ExtractResourcePerNodeFromRuntime(info), corev1.ResourceRequirements{})
+		if jobTrainer := trainJob.Spec.Trainer; jobTrainer != nil && jobTrainer.ResourcesPerNode != nil {
+			resourcesPerNode = ptr.Deref(jobTrainer.ResourcesPerNode, corev1.ResourceRequirements{})
+		}
+		if gpuQ := runtime.GetNumGPUPerNode(&resourcesPerNode); gpuQ > 1 {
+			info.RuntimePolicy.MLPolicySource.MPI.NumProcPerNode = ptr.To(int32(gpuQ))
+		}
 	}
 
 	// Add Secret and ConfigMap volumes to the Info object
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/registry.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/registry.go
index 3944a63a6..64445abad 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/registry.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/registry.go
@@ -27,6 +27,7 @@ import (
 	"github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/mpi"
 	"github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/plainml"
 	"github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch"
+	"github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/volcano"
 )
 
 type Registry map[string]func(ctx context.Context, client client.Client, indexer client.FieldIndexer) (framework.Plugin, error)
@@ -34,6 +35,7 @@ type Registry map[string]func(ctx context.Context, client client.Client, indexer
 func NewRegistry() Registry {
 	return Registry{
 		coscheduling.Name: coscheduling.New,
+		volcano.Name:      volcano.New,
 		mpi.Name:          mpi.New,
 		plainml.Name:      plainml.New,
 		torch.Name:        torch.New,
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch/torch.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch/torch.go
index d096f3485..0aef2c759 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch/torch.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch/torch.go
@@ -20,7 +20,6 @@ import (
 	"context"
 	"fmt"
 	"slices"
-	"strings"
 
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
@@ -30,7 +29,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
-	jobsetv1alpha2ac "sigs.k8s.io/jobset/client-go/applyconfiguration/jobset/v1alpha2"
 
 	trainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
 	"github.com/kubeflow/trainer/v2/pkg/apply"
@@ -88,21 +86,10 @@ func (t *Torch) Validate(_ context.Context, runtimeInfo *runtime.Info, _, newObj
 		// Check supported pretrained models for torchtune.
 		// TODO(Electronic-Waste): Add more validation for torchtune when we support more arguments.
 		if slices.Equal(newObj.Spec.Trainer.Command, constants.TorchTuneEntrypoint) {
-			runtimeRefNamePath := specPath.Child("runtimeRef").Child("name")
-			model := getModelFromRuntimeRef(newObj.Spec.RuntimeRef.Name)
-
-			if !constants.TorchTuneSupportedPretrainedModels.Has(model) {
-				allErrs = append(allErrs, field.Invalid(runtimeRefNamePath, newObj.Spec.RuntimeRef.Name, fmt.Sprintf("must have a supported pretrained model, invalid model configured: %v", model)))
-			}
-
-			numNodesRefPath := specPath.Child("trainer").Child("numNodes")
-			numNodes := *newObj.Spec.Trainer.NumNodes
-			if numNodes > 1 && model != constants.TORCHTUNE_MODEL_LLAMA3_3_70B {
-				allErrs = append(allErrs, field.Invalid(numNodesRefPath, numNodes, fmt.Sprintf("must be 1 for %v model", model)))
-			}
+			_, torchTuneErrs := validateTorchTune(runtimeInfo, newObj)
+			allErrs = append(allErrs, torchTuneErrs...)
 		}
 	}
-
 	return nil, allErrs
 }
 
@@ -123,37 +110,15 @@ func (t *Torch) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob)
 		numProcPerNode = ptr.Deref(trainJob.Spec.Trainer.NumProcPerNode, intstr.FromString("auto"))
 	}
 
+	// Determine numProcPerNode based on the resourcesPerNode.
+	resourcesPerNode := ptr.Deref(runtime.ExtractResourcePerNodeFromRuntime(info), corev1.ResourceRequirements{})
 	if jobTrainer := trainJob.Spec.Trainer; jobTrainer != nil && jobTrainer.ResourcesPerNode != nil {
-		var (
-			shouldUseCPU           func(resources corev1.ResourceList) bool
-			fallbackNumProcPerNode intstr.IntOrString
-		)
-		switch numProcPerNode.String() {
-		case "auto":
-			shouldUseCPU = func(resources corev1.ResourceList) bool {
-				for resName := range resources {
-					if strings.Contains(strings.ToLower(resName.String()), "gpu") {
-						return false
-					}
-				}
-				return true
-			}
-			fallbackNumProcPerNode = intstr.FromString("auto")
-		case "cpu":
-			shouldUseCPU = func(resources corev1.ResourceList) bool {
-				_, ok := resources[corev1.ResourceCPU]
-				return ok
-			}
-			fallbackNumProcPerNode = intstr.FromInt32(1)
-		default:
-			shouldUseCPU = func(corev1.ResourceList) bool { return false }
-			fallbackNumProcPerNode = numProcPerNode
-		}
-		nppNode, usedCPU := calculateNumProcPerNode(fallbackNumProcPerNode, jobTrainer.ResourcesPerNode.Limits, shouldUseCPU)
-		if !usedCPU {
-			nppNode, _ = calculateNumProcPerNode(fallbackNumProcPerNode, jobTrainer.ResourcesPerNode.Requests, shouldUseCPU)
-		}
-		numProcPerNode = nppNode
+		resourcesPerNode = ptr.Deref(jobTrainer.ResourcesPerNode, corev1.ResourceRequirements{})
+	}
+	gpuQ := runtime.GetNumGPUPerNode(&resourcesPerNode)
+	// If numProcPerNode is "cpu" or no GPU is set in resource, we calculate numProcPerNode based on CPU.
+	if numProcPerNode.String() == "cpu" || numProcPerNode.String() == "auto" && gpuQ == 0 {
+		numProcPerNode = intstr.FromInt(max(1, getNumCPUPerNode(&resourcesPerNode)))
 	}
 
 	// Update envs for Info object.
@@ -167,7 +132,7 @@ func (t *Torch) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob)
 		// Add PyTorch distributed "PET_" values for torchrun and torchtune.
 		// TODO (andreyvelich): We should validate that envs from different plugins don't conflict with each other.
 		// Ref: https://github.com/kubeflow/trainer/pull/2308#discussion_r1823229940
-		apply.UpsertEnvVar(&trainerContainer.Env,
+		apply.UpsertEnvVars(&trainerContainer.Env,
 			*corev1ac.EnvVar().
 				WithName(constants.TorchEnvNumNodes).
 				WithValue(fmt.Sprintf("%d", ptr.Deref(ptr.Deref(trainerPS, runtime.PodSet{}).Count, 1))),
@@ -183,7 +148,7 @@ func (t *Torch) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob)
 
 		if !slices.Equal(trainJob.Spec.Trainer.Command, constants.TorchTuneEntrypoint) {
 			// Add PET_MASTER_ADDR and PET_MASTER_PORT envs for torchrun.
-			apply.UpsertEnvVar(&trainerContainer.Env,
+			apply.UpsertEnvVars(&trainerContainer.Env,
 				*corev1ac.EnvVar().
 					WithName(constants.TorchEnvMasterAddr).
 					WithValue(fmt.Sprintf("%s-%s-0-0.%s", trainJob.Name, constants.Node, trainJob.Name)),
@@ -198,7 +163,7 @@ func (t *Torch) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob)
 			// Rendezvous backend is only enabled for multi-nodes or multi-devices training.
 			var newCommand []string
 			numNodes := ptr.Deref(ptr.Deref(trainerPS, runtime.PodSet{}).Count, 1)
-			if numNodes > 1 || !(numProcPerNode.Type == intstr.Int && numProcPerNode.IntVal == 1) {
+			if numNodes > 1 || numProcPerNode.Type == intstr.Int && numProcPerNode.IntVal > 1 || numProcPerNode.Type == intstr.String && gpuQ > 1 {
 				newCommand = append(newCommand,
 					fmt.Sprintf("%s=%s-%s-0-0.%s:%d",
 						constants.TorchTuneArgRdzvEndpoint,
@@ -208,12 +173,7 @@ func (t *Torch) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob)
 			}
 
 			// 2. Get the recipe and config from old args and append them to newCommand.
-			recipe, config := getRecipeAndConfig(
-				numNodes,
-				numProcPerNode,
-				getModelFromRuntimeRef(trainJob.Spec.RuntimeRef.Name),
-				trainJob.Spec.Trainer.Args,
-			)
+			recipe, config := getRecipeAndConfig(numNodes, numProcPerNode, gpuQ, trainJob)
 			newCommand = append(newCommand, recipe, constants.TorchTuneArgConfig, config)
 
 			// 3. Extract output directory, tokenizer path and model mount path from (Cluster)TrainingRuntime.
@@ -228,71 +188,17 @@ func (t *Torch) EnforceMLPolicy(info *runtime.Info, trainJob *trainer.TrainJob)
 	return nil
 }
 
-// calculateNumProcPerNode calculates the number of processes per node based on the provided resources.
-// It returns the calculated number of processes per node and a boolean indicating whether CPU resources were used.
-func calculateNumProcPerNode(
-	fallbackNumProcPerNode intstr.IntOrString, resources corev1.ResourceList, shouldUseCPU func(resources corev1.ResourceList) bool,
-) (intstr.IntOrString, bool) {
-	var defaultCPU int32 = 1
-	if resources != nil {
-		if shouldUseCPU(resources) {
-			cpuQ := resources[corev1.ResourceCPU]
-			return intstr.FromInt32(max(defaultCPU, int32(cpuQ.Value()))), true
-		}
-		return fallbackNumProcPerNode, false
-	}
-	return intstr.FromInt32(defaultCPU), false
-}
-
-// getRecipeAndConfig returns the recipe and config file name based on the number of nodes,
-// number of processes per node, model name, and command line arguments.
-func getRecipeAndConfig(numNodes int32, numProcPerNode intstr.IntOrString, model string, _ []string) (string, string) {
-	recipe := constants.TorchTuneFullFinetuneDistributed
-	suffix := constants.TorchTuneFullFinetuneMultiDevicesConfigSuffix
-	if numNodes == 1 && numProcPerNode.Type == intstr.Int && numProcPerNode.IntVal == 1 {
-		recipe = constants.TorchTuneFullFinetuneSingleDevice
-		suffix = constants.TorchTuneFullFinetuneSingleDeviceConfigSuffix
-	} else if numNodes > 1 {
-		suffix = constants.TorchTuneFullFinetuneMultiNodesConfigSuffix
+// getNumCPUPerNode calculates the number of CPU processes per node based on the provided resources.
+func getNumCPUPerNode(res *corev1.ResourceRequirements) int {
+	if res == nil {
+		return 0
 	}
-
-	return recipe, fmt.Sprintf("%s%s", model, suffix)
-}
-
-// extractOverridesFromRuntime extracts overrides from the TorchTune Trainer Node.
-func extractOverridesFromRuntime(info *runtime.Info) []string {
-	overrides := []string{}
-	jobSetSpec, ok := runtime.TemplateSpecApply[jobsetv1alpha2ac.JobSetSpecApplyConfiguration](info)
-	if !ok {
-		return overrides
-	}
-
-	for _, rJob := range jobSetSpec.ReplicatedJobs {
-		jobMetadata := rJob.Template.ObjectMetaApplyConfiguration
-		if jobMetadata == nil || jobMetadata.Labels == nil {
-			continue
-		}
-		if ancestor, ok := jobMetadata.Labels[constants.LabelTrainJobAncestor]; ok && ancestor == constants.AncestorTrainer {
-			for _, container := range rJob.Template.Spec.Template.Spec.Containers {
-				if container.Name != nil && *container.Name == constants.Node {
-					for _, command := range container.Command {
-						if constants.TorchTuneImmutableConfigs.Has(strings.Split(command, "=")[0]) {
-							overrides = append(overrides, command)
-						}
-					}
-				}
-			}
+	limitCpuQ, requestCpuQ := res.Limits.Cpu(), res.Requests.Cpu()
+	if requestCpuQ == nil || requestCpuQ.IsZero() {
+		if limitCpuQ != nil {
+			return int(limitCpuQ.Value())
 		}
+		return 0
 	}
-
-	return overrides
-}
-
-func getModelFromRuntimeRef(runtimeRefName string) string {
-	fields := strings.Split(runtimeRefName, "-")
-	if len(fields) != 3 {
-		return ""
-	}
-
-	return fmt.Sprintf("%s/%s", strings.ReplaceAll(fields[1], ".", "_"), strings.ToUpper(fields[2]))
+	return int(requestCpuQ.Value())
 }
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch/torchtune.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch/torchtune.go
new file mode 100644
index 000000000..87d69a295
--- /dev/null
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch/torchtune.go
@@ -0,0 +1,164 @@
+/*
+Copyright 2025 The Kubeflow Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package torch
+
+import (
+	"fmt"
+	"strings"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/util/intstr"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
+	jobsetv1alpha2ac "sigs.k8s.io/jobset/client-go/applyconfiguration/jobset/v1alpha2"
+
+	trainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
+	"github.com/kubeflow/trainer/v2/pkg/constants"
+	"github.com/kubeflow/trainer/v2/pkg/runtime"
+)
+
+func validateTorchTune(runtimeInfo *runtime.Info, newObj *trainer.TrainJob) (admission.Warnings, field.ErrorList) {
+	var allErrs field.ErrorList
+	specPath := field.NewPath("spec")
+
+	runtimeRefNamePath := specPath.Child("runtimeRef").Child("name")
+	model := getModelFromRuntimeRef(newObj.Spec.RuntimeRef.Name)
+
+	if !constants.TorchTuneSupportedPretrainedModels.Has(model) {
+		allErrs = append(allErrs, field.Invalid(runtimeRefNamePath, newObj.Spec.RuntimeRef.Name, fmt.Sprintf("must have a supported pretrained model, invalid model configured: %v", model)))
+	}
+
+	numNodesRefPath := specPath.Child("trainer").Child("numNodes")
+	numNodes := *newObj.Spec.Trainer.NumNodes
+	if numNodes > 1 && model != constants.TORCHTUNE_MODEL_LLAMA3_3_70B {
+		allErrs = append(allErrs, field.Invalid(numNodesRefPath, numNodes, fmt.Sprintf("must be 1 for %v model", model)))
+	}
+
+	numProcPerNodeRefPath := specPath.Child("trainer").Child("numProcPerNode")
+	numProcPerNode := *newObj.Spec.Trainer.NumProcPerNode
+	resourcesPerNode := ptr.Deref(runtime.ExtractResourcePerNodeFromRuntime(runtimeInfo), corev1.ResourceRequirements{})
+	if jobTrainer := newObj.Spec.Trainer; jobTrainer != nil && jobTrainer.ResourcesPerNode != nil {
+		resourcesPerNode = ptr.Deref(jobTrainer.ResourcesPerNode, corev1.ResourceRequirements{})
+	}
+	_, config := getRecipeAndConfig(numNodes, numProcPerNode, runtime.GetNumGPUPerNode(&resourcesPerNode), newObj)
+	if strings.Contains(config, constants.TorchTuneQLoRAFinetuneDistributedConfigSuffix) {
+		if model == constants.TORCHTUNE_MODEL_QWEN2_5_1_5B {
+			allErrs = append(allErrs, field.Invalid(runtimeRefNamePath, newObj.Spec.RuntimeRef.Name, fmt.Sprintf("QLoRA is not supported for %v model", model)))
+		}
+		resourcePerNodeRefPath := specPath.Child("trainer").Child("resourcesPerNode")
+		if !strings.Contains(config, constants.TorchTuneQLoRAFinetuneSingleDeviceConfigSuffix) &&
+			(model == constants.TORCHTUNE_MODEL_LLAMA3_2_1B || model == constants.TORCHTUNE_MODEL_LLAMA3_2_3B) {
+			allErrs = append(
+				allErrs,
+				field.Invalid(numProcPerNodeRefPath, numProcPerNode, fmt.Sprintf("must be auto or 1 for %v model when using QLoRA", model)),
+				field.Invalid(resourcePerNodeRefPath, newObj.Spec.Trainer.ResourcesPerNode, fmt.Sprintf("must have gpu resource with value 1 for %v model when using QLoRA", model)),
+			)
+		}
+	}
+	return nil, allErrs
+}
+
+// getRecipeAndConfig returns the recipe and config file name based on the number of nodes,
+// number of processes per node, gpu count, resource per node, model name, and command line arguments.
+func getRecipeAndConfig(numNodes int32, numProcPerNode intstr.IntOrString, gpuQ int, trainJob *trainer.TrainJob) (string, string) {
+	recipe := constants.TorchTuneFullFinetuneDistributed
+	suffix := constants.TorchTuneFullFinetuneMultiDevicesConfigSuffix
+	if numNodes == 1 && (numProcPerNode.Type == intstr.Int && numProcPerNode.IntVal == 1 || gpuQ == 1) {
+		if isUseQLoraFinetune(trainJob.Spec.Trainer.Args) {
+			recipe = constants.TorchTuneLoRAFinetuneSingleDevice
+			suffix = constants.TorchTuneQLoRAFinetuneSingleDeviceConfigSuffix
+		} else if isLoraConfigEnabled(trainJob.Spec.Trainer.Args) {
+			recipe = constants.TorchTuneLoRAFinetuneSingleDevice
+			suffix = constants.TorchTuneLoRAFinetuneSingleDeviceConfigSuffix
+		} else {
+			recipe = constants.TorchTuneFullFinetuneSingleDevice
+			suffix = constants.TorchTuneFullFinetuneSingleDeviceConfigSuffix
+		}
+	} else if numNodes == 1 && isUseQLoraFinetune(trainJob.Spec.Trainer.Args) {
+		recipe = constants.TorchTuneLoRAFinetuneDistributed
+		suffix = constants.TorchTuneQLoRAFinetuneDistributedConfigSuffix
+	} else if numNodes == 1 && isLoraConfigEnabled(trainJob.Spec.Trainer.Args) {
+		recipe = constants.TorchTuneLoRAFinetuneDistributed
+		suffix = constants.TorchTuneLoRAFinetuneDistributedConfigSuffix
+	} else if numNodes > 1 {
+		suffix = constants.TorchTuneFullFinetuneMultiNodesConfigSuffix
+	}
+
+	return recipe, fmt.Sprintf("%s%s", getModelFromRuntimeRef(trainJob.Spec.RuntimeRef.Name), suffix)
+}
+
+// isLoraConfigEnabled checks if we enables LoraConfig.
+func isLoraConfigEnabled(args []string) bool {
+	for _, arg := range args {
+		if strings.Contains(arg, constants.TorchTuneLoraAttnModules) {
+			return true
+		}
+	}
+	return false
+}
+
+// isUseQLoraFinetune checks if QLoRA fine-tuning should be used.
+func isUseQLoraFinetune(args []string) bool {
+	hasQuantizeBase := false
+	for _, arg := range args {
+		switch {
+		case strings.Contains(arg, constants.TorchTuneUseDora):
+			// If Dora is enabled, no need to continue
+			return false
+		case strings.Contains(arg, constants.TorchTuneQuantizeBase):
+			hasQuantizeBase = true
+		}
+	}
+	return hasQuantizeBase
+}
+
+// extractOverridesFromRuntime extracts overrides from the TorchTune Trainer Node.
+func extractOverridesFromRuntime(info *runtime.Info) []string {
+	overrides := []string{}
+	jobSetSpec, ok := runtime.TemplateSpecApply[jobsetv1alpha2ac.JobSetSpecApplyConfiguration](info)
+	if !ok {
+		return overrides
+	}
+
+	for _, rJob := range jobSetSpec.ReplicatedJobs {
+		jobMetadata := rJob.Template.ObjectMetaApplyConfiguration
+		if jobMetadata == nil || jobMetadata.Labels == nil {
+			continue
+		}
+		if ancestor, ok := jobMetadata.Labels[constants.LabelTrainJobAncestor]; ok && ancestor == constants.AncestorTrainer {
+			for _, container := range rJob.Template.Spec.Template.Spec.Containers {
+				if container.Name != nil && *container.Name == constants.Node {
+					for _, command := range container.Command {
+						if constants.TorchTuneImmutableConfigs.Has(strings.Split(command, "=")[0]) {
+							overrides = append(overrides, command)
+						}
+					}
+				}
+			}
+		}
+	}
+	return overrides
+}
+
+func getModelFromRuntimeRef(runtimeRefName string) string {
+	fields := strings.Split(runtimeRefName, "-")
+	if len(fields) != 3 {
+		return ""
+	}
+	return fmt.Sprintf("%s/%s", strings.ReplaceAll(fields[1], ".", "_"), strings.ToUpper(fields[2]))
+}
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/volcano/volcano.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/volcano/volcano.go
new file mode 100644
index 000000000..376e6515a
--- /dev/null
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/volcano/volcano.go
@@ -0,0 +1,359 @@
+/*
+Copyright 2025 The Kubeflow Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package volcano
+
+import (
+	"context"
+	"fmt"
+	"slices"
+
+	"github.com/go-logr/logr"
+	corev1 "k8s.io/api/core/v1"
+	nodev1 "k8s.io/api/node/v1"
+	schedulingv1 "k8s.io/api/scheduling/v1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	apiruntime "k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	metav1ac "k8s.io/client-go/applyconfigurations/meta/v1"
+	"k8s.io/client-go/util/workqueue"
+	"k8s.io/klog/v2"
+	"k8s.io/utils/ptr"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/builder"
+	"sigs.k8s.io/controller-runtime/pkg/cache"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/event"
+	"sigs.k8s.io/controller-runtime/pkg/handler"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/source"
+	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
+	"sigs.k8s.io/jobset/client-go/applyconfiguration/jobset/v1alpha2"
+	volcanov1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
+	volcanov1beta1ac "volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1"
+
+	trainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
+	"github.com/kubeflow/trainer/v2/pkg/runtime"
+	"github.com/kubeflow/trainer/v2/pkg/runtime/framework"
+	index "github.com/kubeflow/trainer/v2/pkg/runtime/indexer"
+	runtimeindexer "github.com/kubeflow/trainer/v2/pkg/runtime/indexer"
+)
+
+type Volcano struct {
+	client     client.Client
+	restMapper meta.RESTMapper
+	scheme     *apiruntime.Scheme
+	logger     logr.Logger
+}
+
+var _ framework.EnforcePodGroupPolicyPlugin = (*Volcano)(nil)
+var _ framework.ComponentBuilderPlugin = (*Volcano)(nil)
+var _ framework.WatchExtensionPlugin = (*Volcano)(nil)
+
+const Name = "Volcano"
+
+// +kubebuilder:rbac:groups=scheduling.volcano.sh,resources=podgroups,verbs=create;get;list;watch;update;patch
+// +kubebuilder:rbac:groups=node.k8s.io,resources=runtimeclasses,verbs=get;list;watch
+// +kubebuilder:rbac:groups="",resources=limitranges,verbs=get;list;watch
+
+func New(_ context.Context, client client.Client, _ client.FieldIndexer) (framework.Plugin, error) {
+	return &Volcano{
+		client:     client,
+		restMapper: client.RESTMapper(),
+		scheme:     client.Scheme(),
+	}, nil
+}
+
+func (v *Volcano) Name() string {
+	return Name
+}
+
+func (v *Volcano) Validate(ctx context.Context, info *runtime.Info, _, newObj *trainer.TrainJob) (admission.Warnings, field.ErrorList) {
+	var allErrs field.ErrorList
+
+	if info == nil || info.RuntimePolicy.PodGroupPolicy == nil || info.RuntimePolicy.PodGroupPolicy.Volcano == nil || newObj == nil {
+		return nil, allErrs
+	}
+
+	specPath := field.NewPath("spec")
+
+	// Validate queue (must not be empty if explicitly set)
+	if queue, ok := info.Annotations[volcanov1beta1.QueueNameAnnotationKey]; ok {
+		if queue == "" {
+			allErrs = append(allErrs, field.Invalid(specPath.Child("annotations").Key(volcanov1beta1.QueueNameAnnotationKey),
+				queue, "Volcano queue name must not be empty"))
+		}
+	}
+
+	// Validate priorityClassName from the Pod template
+	jobSetSpec, ok := runtime.TemplateSpecApply[v1alpha2.JobSetSpecApplyConfiguration](info)
+	if ok && jobSetSpec != nil {
+		for _, rj := range jobSetSpec.ReplicatedJobs {
+			if rj.Template != nil && rj.Template.Spec != nil && rj.Template.Spec.Template != nil && rj.Template.Spec.Template.Spec != nil {
+				priorityClassName := rj.Template.Spec.Template.Spec.PriorityClassName
+				if priorityClassName != nil {
+					pcName := *priorityClassName
+					// Skip two special keywords which indicate the highest priorities
+					if pcName == "system-cluster-critical" || pcName == "system-node-critical" {
+						return nil, allErrs
+					}
+					// Any other name must be defined by creating a PriorityClass object with that name.
+					var pc schedulingv1.PriorityClass
+					if err := v.client.Get(ctx, types.NamespacedName{Name: pcName}, &pc); err != nil {
+						allErrs = append(allErrs, field.Invalid(specPath.Child("templateSpec").Child("priorityClassName"),
+							pcName, fmt.Sprintf("PriorityClass %q doesn't exist: %v", pcName, err)))
+					}
+				}
+			}
+		}
+	}
+
+	return nil, allErrs
+}
+
+func (v *Volcano) EnforcePodGroupPolicy(info *runtime.Info, trainJob *trainer.TrainJob) error {
+	if info == nil || info.RuntimePolicy.PodGroupPolicy == nil || trainJob == nil || info.RuntimePolicy.PodGroupPolicy.Volcano == nil {
+		return nil
+	}
+	if info.Scheduler.PodAnnotations == nil {
+		info.Scheduler.PodAnnotations = map[string]string{}
+	}
+	info.Scheduler.PodAnnotations[volcanov1beta1.KubeGroupNameAnnotationKey] = trainJob.Name
+	return nil
+}
+
+func (v *Volcano) Build(ctx context.Context, info *runtime.Info, trainJob *trainer.TrainJob) ([]any, error) {
+	if info == nil || info.RuntimePolicy.PodGroupPolicy == nil || info.RuntimePolicy.PodGroupPolicy.Volcano == nil || trainJob == nil {
+		return nil, nil
+	}
+
+	// Do not update the PodGroup if it already exists and the TrainJob is not suspended
+	oldPodGroup := &volcanov1beta1.PodGroup{}
+	if err := v.client.Get(ctx, client.ObjectKeyFromObject(trainJob), oldPodGroup); err != nil {
+		if !apierrors.IsNotFound(err) {
+			return nil, err
+		}
+		oldPodGroup = nil
+	}
+	if oldPodGroup != nil && !ptr.Deref(trainJob.Spec.Suspend, false) {
+		return nil, nil
+	}
+
+	volcanoSpec := info.RuntimePolicy.PodGroupPolicy.Volcano
+
+	// Aggregate pod resource requests
+	var totalMembers int32
+	totalResources := make(corev1.ResourceList)
+	for _, ps := range info.TemplateSpec.PodSets {
+		count := *ps.Count
+		totalMembers += count
+		for resName, quantity := range ps.SinglePodRequests {
+			quantity.Mul(int64(count))
+			current := totalResources[resName]
+			current.Add(quantity)
+			totalResources[resName] = current
+		}
+	}
+	pg := volcanov1beta1ac.PodGroup(trainJob.Name, trainJob.Namespace).
+		WithSpec(volcanov1beta1ac.PodGroupSpec().
+			WithMinMember(totalMembers).
+			WithMinResources(totalResources))
+
+	// Configure queue via annotations `scheduling.volcano.sh/queue-name`.
+	// The field is initially set in TrainingRuntime, but can be overridden by the TrainJob.
+	if queue, ok := info.Annotations[volcanov1beta1.QueueNameAnnotationKey]; ok {
+		pg.Spec.WithQueue(queue)
+	}
+
+	// Configure priorityClassName from the Pod template
+	jobSetSpec, ok := runtime.TemplateSpecApply[v1alpha2.JobSetSpecApplyConfiguration](info)
+	if ok && jobSetSpec != nil {
+		for _, rj := range jobSetSpec.ReplicatedJobs {
+			if rj.Template != nil && rj.Template.Spec != nil && rj.Template.Spec.Template != nil && rj.Template.Spec.Template.Spec != nil {
+				priorityClassName := rj.Template.Spec.Template.Spec.PriorityClassName
+				if priorityClassName != nil {
+					pg.Spec.WithPriorityClassName(*priorityClassName)
+				}
+			}
+		}
+	}
+
+	if volcanoSpec.NetworkTopology != nil {
+		pg.Spec.WithNetworkTopology(volcanov1beta1ac.NetworkTopologySpec().
+			WithMode(volcanoSpec.NetworkTopology.Mode).
+			WithHighestTierAllowed(*volcanoSpec.NetworkTopology.HighestTierAllowed))
+	}
+
+	pg.WithOwnerReferences(metav1ac.OwnerReference().
+		WithAPIVersion(trainer.GroupVersion.String()).
+		WithKind(trainer.TrainJobKind).
+		WithName(trainJob.Name).
+		WithUID(trainJob.UID).
+		WithController(true).
+		WithBlockOwnerDeletion(true))
+
+	return []any{pg}, nil
+}
+
+type PodGroupRuntimeClassHandler struct {
+	client client.Client
+}
+
+var _ handler.TypedEventHandler[*nodev1.RuntimeClass, reconcile.Request] = (*PodGroupRuntimeClassHandler)(nil)
+
+func (h *PodGroupRuntimeClassHandler) Create(ctx context.Context, e event.TypedCreateEvent[*nodev1.RuntimeClass], q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+	containerRuntimeClass := e.Object
+	log := ctrl.LoggerFrom(ctx).WithValues("runtimeClass", klog.KObj(containerRuntimeClass))
+	if err := h.queueSuspendedTrainJobs(ctx, containerRuntimeClass, q); err != nil {
+		log.Error(err, "could not queue suspended TrainJob to reconcile queue")
+	}
+}
+
+func (h *PodGroupRuntimeClassHandler) Update(ctx context.Context, e event.TypedUpdateEvent[*nodev1.RuntimeClass], q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+	newContainerRuntimeClass := e.ObjectNew
+	log := ctrl.LoggerFrom(ctx).WithValues("runtimeClass", klog.KObj(newContainerRuntimeClass))
+	if err := h.queueSuspendedTrainJobs(ctx, newContainerRuntimeClass, q); err != nil {
+		log.Error(err, "could not queue suspended TrainJob to reconcile queue")
+	}
+}
+
+func (h *PodGroupRuntimeClassHandler) Delete(ctx context.Context, e event.TypedDeleteEvent[*nodev1.RuntimeClass], q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+	containerRuntimeClass := e.Object
+	log := ctrl.LoggerFrom(ctx).WithValues("runtimeClass", klog.KObj(containerRuntimeClass))
+	if err := h.queueSuspendedTrainJobs(ctx, containerRuntimeClass, q); err != nil {
+		log.Error(err, "could not queue suspended TrainJob to reconcile queue")
+	}
+}
+
+func (h *PodGroupRuntimeClassHandler) Generic(context.Context, event.TypedGenericEvent[*nodev1.RuntimeClass], workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+}
+
+func (h *PodGroupRuntimeClassHandler) queueSuspendedTrainJobs(ctx context.Context, runtimeClass *nodev1.RuntimeClass, q workqueue.TypedRateLimitingInterface[reconcile.Request]) error {
+	var trainingRuntimes trainer.TrainingRuntimeList
+	if err := h.client.List(ctx, &trainingRuntimes, client.MatchingFields{index.TrainingRuntimeContainerRuntimeClassKey: runtimeClass.Name}); err != nil {
+		return err
+	}
+	var clusterTrainingRuntimes trainer.ClusterTrainingRuntimeList
+	if err := h.client.List(ctx, &clusterTrainingRuntimes, client.MatchingFields{index.ClusterTrainingRuntimeContainerRuntimeClassKey: runtimeClass.Name}); err != nil {
+		return err
+	}
+
+	var trainJobs []trainer.TrainJob
+	for _, trainingRuntime := range trainingRuntimes.Items {
+		var trainJobsWithTrainingRuntime trainer.TrainJobList
+		err := h.client.List(ctx, &trainJobsWithTrainingRuntime, client.MatchingFields{runtimeindexer.TrainJobRuntimeRefKey: trainingRuntime.Name})
+		if err != nil {
+			return err
+		}
+		trainJobs = append(trainJobs, trainJobsWithTrainingRuntime.Items...)
+	}
+	for _, clusterTrainingRuntime := range clusterTrainingRuntimes.Items {
+		var trainJobsWithClTrainingRuntime trainer.TrainJobList
+		err := h.client.List(ctx, &trainJobsWithClTrainingRuntime, client.MatchingFields{runtimeindexer.TrainJobClusterRuntimeRefKey: clusterTrainingRuntime.Name})
+		if err != nil {
+			return err
+		}
+		trainJobs = append(trainJobs, trainJobsWithClTrainingRuntime.Items...)
+	}
+	trainJobs = slices.CompactFunc(trainJobs, func(a, b trainer.TrainJob) bool {
+		return a.Name == b.Name
+	})
+	for _, trainJob := range trainJobs {
+		if ptr.Deref(trainJob.Spec.Suspend, false) {
+			q.Add(reconcile.Request{NamespacedName: client.ObjectKeyFromObject(&trainJob)})
+		}
+	}
+	return nil
+}
+
+type PodGroupLimitRangeHandler struct {
+	client client.Client
+}
+
+var _ handler.TypedEventHandler[*corev1.LimitRange, reconcile.Request] = (*PodGroupLimitRangeHandler)(nil)
+
+func (h *PodGroupLimitRangeHandler) Create(ctx context.Context, e event.TypedCreateEvent[*corev1.LimitRange], q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+	limitRange := e.Object
+	log := ctrl.LoggerFrom(ctx).WithValues("limitRange", klog.KObj(limitRange))
+	if err := h.queueSuspendedTrainJob(ctx, limitRange.Namespace, q); err != nil {
+		log.Error(err, "could not queue suspended TrainJob to reconcile queue")
+	}
+}
+
+func (h *PodGroupLimitRangeHandler) Update(ctx context.Context, e event.TypedUpdateEvent[*corev1.LimitRange], q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+	newLimitRange := e.ObjectNew
+	log := ctrl.LoggerFrom(ctx).WithValues("limitRange", klog.KObj(newLimitRange))
+	if err := h.queueSuspendedTrainJob(ctx, newLimitRange.Namespace, q); err != nil {
+		log.Error(err, "could not queue suspended TrainJob to reconcile queue")
+	}
+}
+
+func (h *PodGroupLimitRangeHandler) Delete(ctx context.Context, e event.TypedDeleteEvent[*corev1.LimitRange], q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+	limitRange := e.Object
+	log := ctrl.LoggerFrom(ctx).WithValues("limitRange", klog.KObj(limitRange))
+	if err := h.queueSuspendedTrainJob(ctx, limitRange.Namespace, q); err != nil {
+		log.Error(err, "could not queue suspended TrainJob to reconcile queue")
+	}
+}
+
+func (h *PodGroupLimitRangeHandler) Generic(context.Context, event.TypedGenericEvent[*corev1.LimitRange], workqueue.TypedRateLimitingInterface[reconcile.Request]) {
+}
+
+func (h *PodGroupLimitRangeHandler) queueSuspendedTrainJob(ctx context.Context, ns string, q workqueue.TypedRateLimitingInterface[reconcile.Request]) error {
+	var trainJobs trainer.TrainJobList
+	if err := h.client.List(ctx, &trainJobs, client.InNamespace(ns)); err != nil {
+		return err
+	}
+	for _, trainJob := range trainJobs.Items {
+		if ptr.Deref(trainJob.Spec.Suspend, false) {
+			q.Add(reconcile.Request{NamespacedName: client.ObjectKeyFromObject(&trainJob)})
+		}
+	}
+	return nil
+}
+
+func (v *Volcano) ReconcilerBuilders() []runtime.ReconcilerBuilder {
+	if _, err := v.restMapper.RESTMapping(
+		schema.GroupKind{Group: volcanov1beta1.SchemeGroupVersion.Group, Kind: "PodGroup"},
+		volcanov1beta1.SchemeGroupVersion.Version,
+	); err != nil {
+		v.logger.Error(err, "PodGroup CRDs must be installed in advance")
+		return nil
+	}
+	return []runtime.ReconcilerBuilder{
+		func(b *builder.Builder, cl client.Client, cache cache.Cache) *builder.Builder {
+			return b.Watches(
+				&volcanov1beta1.PodGroup{},
+				handler.EnqueueRequestForOwner(
+					v.client.Scheme(), v.client.RESTMapper(), &trainer.TrainJob{}, handler.OnlyControllerOwner(),
+				),
+			)
+		},
+		func(b *builder.Builder, cl client.Client, cache cache.Cache) *builder.Builder {
+			return b.WatchesRawSource(source.TypedKind[*corev1.LimitRange, reconcile.Request](cache, &corev1.LimitRange{}, &PodGroupLimitRangeHandler{
+				client: cl,
+			}))
+		},
+		func(b *builder.Builder, cl client.Client, cache cache.Cache) *builder.Builder {
+			return b.WatchesRawSource(source.TypedKind[*nodev1.RuntimeClass, reconcile.Request](cache, &nodev1.RuntimeClass{}, &PodGroupRuntimeClassHandler{
+				client: cl,
+			}))
+		},
+	}
+}
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/indexer/indexer.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/indexer/indexer.go
index 036b75f9a..b421708a4 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/indexer/indexer.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/indexer/indexer.go
@@ -17,6 +17,8 @@ limitations under the License.
 package indexer
 
 import (
+	"errors"
+
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
@@ -29,6 +31,41 @@ const (
 	TrainJobClusterRuntimeRefKey = ".spec.runtimeRef.kind=clusterTrainingRuntime"
 )
 
+var (
+	TrainingRuntimeContainerRuntimeClassKey                   = ".trainingRuntimeSpec.jobSetTemplateSpec.replicatedJobs.podTemplateSpec.runtimeClassName"
+	ClusterTrainingRuntimeContainerRuntimeClassKey            = ".clusterTrainingRuntimeSpec.jobSetTemplateSpec.replicatedJobs.podTemplateSpec.runtimeClassName"
+	ErrorCanNotSetupTrainingRuntimeRuntimeClassIndexer        = errors.New("setting index on runtimeClass for TrainingRuntime")
+	ErrorCanNotSetupClusterTrainingRuntimeRuntimeClassIndexer = errors.New("setting index on runtimeClass for ClusterTrainingRuntime")
+)
+
+func IndexTrainingRuntimeContainerRuntimeClass(obj client.Object) []string {
+	runtime, ok := obj.(*trainer.TrainingRuntime)
+	if !ok {
+		return nil
+	}
+	var runtimeClasses []string
+	for _, rJob := range runtime.Spec.Template.Spec.ReplicatedJobs {
+		if rJob.Template.Spec.Template.Spec.RuntimeClassName != nil {
+			runtimeClasses = append(runtimeClasses, *rJob.Template.Spec.Template.Spec.RuntimeClassName)
+		}
+	}
+	return runtimeClasses
+}
+
+func IndexClusterTrainingRuntimeContainerRuntimeClass(obj client.Object) []string {
+	clRuntime, ok := obj.(*trainer.ClusterTrainingRuntime)
+	if !ok {
+		return nil
+	}
+	var runtimeClasses []string
+	for _, rJob := range clRuntime.Spec.Template.Spec.ReplicatedJobs {
+		if rJob.Template.Spec.Template.Spec.RuntimeClassName != nil {
+			runtimeClasses = append(runtimeClasses, *rJob.Template.Spec.Template.Spec.RuntimeClassName)
+		}
+	}
+	return runtimeClasses
+}
+
 func IndexTrainJobTrainingRuntime(obj client.Object) []string {
 	trainJob, ok := obj.(*trainer.TrainJob)
 	if !ok {
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/interface.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/interface.go
index 6f49bace3..3e831b8fa 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/interface.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/interface.go
@@ -19,7 +19,6 @@ package runtime
 import (
 	"context"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"sigs.k8s.io/controller-runtime/pkg/builder"
 	"sigs.k8s.io/controller-runtime/pkg/cache"
@@ -38,7 +37,7 @@ type Runtime interface {
 
 	NewObjects(ctx context.Context, trainJob *trainer.TrainJob) ([]any, error)
 	RuntimeInfo(trainJob *trainer.TrainJob, runtimeTemplateSpec any, mlPolicy *trainer.MLPolicy, podGroupPolicy *trainer.PodGroupPolicy) (*Info, error)
-	TerminalCondition(ctx context.Context, trainJob *trainer.TrainJob) (*metav1.Condition, error)
+	TrainJobStatus(ctx context.Context, trainJob *trainer.TrainJob) (*trainer.TrainJobStatus, error)
 	EventHandlerRegistrars() []ReconcilerBuilder
 	ValidateObjects(ctx context.Context, old, new *trainer.TrainJob) (admission.Warnings, field.ErrorList)
 }
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/runtime.go b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/runtime.go
index 71b5c533f..ec7ed3bdd 100644
--- a/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/runtime.go
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/runtime/runtime.go
@@ -20,14 +20,17 @@ import (
 	"iter"
 	"maps"
 	"slices"
+	"strings"
 
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	corev1ac "k8s.io/client-go/applyconfigurations/core/v1"
 	resourcehelpers "k8s.io/component-helpers/resource"
 	"k8s.io/utils/ptr"
+	jobsetv1alpha2ac "sigs.k8s.io/jobset/client-go/applyconfiguration/jobset/v1alpha2"
 
 	trainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
+	"github.com/kubeflow/trainer/v2/pkg/constants"
 )
 
 var (
@@ -87,7 +90,8 @@ type Container struct {
 
 // TODO (andreyvelich): Potentially, we can add ScheduleTimeoutSeconds to the Scheduler for consistency.
 type Scheduler struct {
-	PodLabels map[string]string
+	PodLabels      map[string]string
+	PodAnnotations map[string]string
 }
 
 type InfoOptions struct {
@@ -239,3 +243,50 @@ func RuntimeRefToRuntimeRegistryKey(runtimeRef trainer.RuntimeRef) string {
 		Kind:  ptr.Deref(runtimeRef.Kind, ""),
 	}.String()
 }
+
+// ExtractResourcePerNodeFromRuntime extracts the Trainer resource per node from the Info object.
+func ExtractResourcePerNodeFromRuntime(info *Info) *corev1.ResourceRequirements {
+	if jobSetSpec, ok := TemplateSpecApply[jobsetv1alpha2ac.JobSetSpecApplyConfiguration](info); ok {
+		for _, rJob := range jobSetSpec.ReplicatedJobs {
+			if rJob.Name != nil && *rJob.Name == constants.Node || rJob.Template.Labels[constants.LabelTrainJobAncestor] == constants.AncestorTrainer {
+				for _, container := range rJob.Template.Spec.Template.Spec.Containers {
+					if container.Name != nil && *container.Name == constants.Node && container.Resources != nil {
+						res := &corev1.ResourceRequirements{
+							Limits:   corev1.ResourceList{},
+							Requests: corev1.ResourceList{},
+						}
+						if container.Resources.Limits != nil {
+							res.Limits = *container.Resources.Limits
+						}
+						if container.Resources.Requests != nil {
+							res.Requests = *container.Resources.Requests
+						}
+						return res
+					}
+				}
+			}
+		}
+	}
+	return nil
+}
+
+// GetNumGPUPerNode returns the GPU count if found in container resources.
+func GetNumGPUPerNode(res *corev1.ResourceRequirements) int {
+	if res == nil {
+		return 0
+	}
+	gpuQ := numGPU(res.Requests)
+	if limitGpuQ := numGPU(res.Limits); gpuQ == 0 && limitGpuQ > 0 {
+		gpuQ = limitGpuQ
+	}
+	return gpuQ
+}
+
+func numGPU(resourcePerNode corev1.ResourceList) int {
+	for resName, resQ := range resourcePerNode {
+		if strings.Contains(strings.ToLower(resName.String()), "gpu") {
+			return int(resQ.Value())
+		}
+	}
+	return 0
+}
diff --git a/vendor/github.com/kubeflow/trainer/v2/pkg/util/trainingruntime/trainingruntime.go b/vendor/github.com/kubeflow/trainer/v2/pkg/util/trainingruntime/trainingruntime.go
new file mode 100644
index 000000000..84d5d61a6
--- /dev/null
+++ b/vendor/github.com/kubeflow/trainer/v2/pkg/util/trainingruntime/trainingruntime.go
@@ -0,0 +1,12 @@
+package trainingruntime
+
+import "github.com/kubeflow/trainer/v2/pkg/constants"
+
+// IsSupportDeprecated returns true if TrainingRuntime labels indicate support=deprecated.
+func IsSupportDeprecated(labels map[string]string) bool {
+	if labels == nil {
+		return false
+	}
+	val, ok := labels[constants.LabelSupport]
+	return ok && val == constants.SupportDeprecated
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 3b555377a..0844ea8db 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -193,7 +193,7 @@ github.com/json-iterator/go
 # github.com/kubeflow/mpi-operator v0.6.0
 ## explicit; go 1.23
 github.com/kubeflow/mpi-operator/pkg/apis/kubeflow/v2beta1
-# github.com/kubeflow/trainer/v2 v2.0.1
+# github.com/kubeflow/trainer/v2 v2.1.0-rc.0
 ## explicit; go 1.24.0
 github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1
 github.com/kubeflow/trainer/v2/pkg/apply
@@ -209,7 +209,9 @@ github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/jobset/constants
 github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/mpi
 github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/plainml
 github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/torch
+github.com/kubeflow/trainer/v2/pkg/runtime/framework/plugins/volcano
 github.com/kubeflow/trainer/v2/pkg/runtime/indexer
+github.com/kubeflow/trainer/v2/pkg/util/trainingruntime
 github.com/kubeflow/trainer/v2/pkg/util/trainjob
 # github.com/kubeflow/training-operator v1.9.3
 ## explicit; go 1.23
@@ -1755,3 +1757,8 @@ sigs.k8s.io/structured-merge-diff/v6/value
 ## explicit; go 1.22
 sigs.k8s.io/yaml
 sigs.k8s.io/yaml/kyaml
+# volcano.sh/apis v1.12.2
+## explicit; go 1.23.0
+volcano.sh/apis/pkg/apis/scheduling
+volcano.sh/apis/pkg/apis/scheduling/v1beta1
+volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1
diff --git a/vendor/volcano.sh/apis/LICENSE b/vendor/volcano.sh/apis/LICENSE
new file mode 100644
index 000000000..261eeb9e9
--- /dev/null
+++ b/vendor/volcano.sh/apis/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/doc.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/doc.go
new file mode 100644
index 000000000..4bad97492
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/doc.go
@@ -0,0 +1,17 @@
+/*
+Copyright 2019 The Volcano Authors.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// +k8s:deepcopy-gen=package
+
+// Package scheduling is the internal version of the API.
+package scheduling
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/register.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/register.go
new file mode 100644
index 000000000..5eaaa8325
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/register.go
@@ -0,0 +1,42 @@
+/*
+Copyright 2019 The Volcano Authors.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package scheduling
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+var (
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+	AddToScheme   = SchemeBuilder.AddToScheme
+)
+
+// GroupName is the group name used in this package.
+const GroupName = "scheduling.volcano.sh"
+
+// SchemeGroupVersion is the group version used to register these objects.
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal}
+
+// addKnownTypes adds the set of types defined in this package to the supplied scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&PodGroup{},
+		&PodGroupList{},
+		&Queue{},
+		&QueueList{},
+	)
+
+	return nil
+}
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/types.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/types.go
new file mode 100644
index 000000000..d275d21b2
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/types.go
@@ -0,0 +1,405 @@
+/*
+Copyright 2019 The Volcano Authors.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package scheduling
+
+import (
+	v1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// PodGroupPhase is the phase of a pod group at the current time.
+type PodGroupPhase string
+
+// QueueState is state type of queue.
+type QueueState string
+
+const (
+	// QueueStateOpen indicate `Open` state of queue
+	QueueStateOpen QueueState = "Open"
+	// QueueStateClosed indicate `Closed` state of queue
+	QueueStateClosed QueueState = "Closed"
+	// QueueStateClosing indicate `Closing` state of queue
+	QueueStateClosing QueueState = "Closing"
+	// QueueStateUnknown indicate `Unknown` state of queue
+	QueueStateUnknown QueueState = "Unknown"
+)
+
+// These are the valid phase of podGroups.
+const (
+	// PodGroupPending means the pod group has been accepted by the system, but scheduler can not allocate
+	// enough resources to it.
+	PodGroupPending PodGroupPhase = "Pending"
+
+	// PodGroupRunning means `spec.minMember` pods of PodGroup has been in running phase.
+	PodGroupRunning PodGroupPhase = "Running"
+
+	// PodGroupUnknown means part of `spec.minMember` pods are running but the other part can not
+	// be scheduled, e.g. not enough resource; scheduler will wait for related controller to recover it.
+	PodGroupUnknown PodGroupPhase = "Unknown"
+
+	// PodGroupInqueue means controllers can start to create pods,
+	// is a new state between PodGroupPending and PodGroupRunning
+	PodGroupInqueue PodGroupPhase = "Inqueue"
+
+	// PodGroupCompleted means all the pods of PodGroup are completed
+	PodGroupCompleted PodGroupPhase = "Completed"
+)
+
+type PodGroupConditionType string
+
+const (
+	// PodGroupUnschedulableType is Unschedulable event type
+	PodGroupUnschedulableType PodGroupConditionType = "Unschedulable"
+
+	// PodGroupScheduled is scheduled event type
+	PodGroupScheduled PodGroupConditionType = "Scheduled"
+)
+
+type PodGroupConditionDetail string
+
+const (
+	// PodGroupReady is that PodGroup has reached scheduling restriction
+	PodGroupReady PodGroupConditionDetail = "pod group is ready"
+	// PodGroupNotReady is that PodGroup has not yet reached the scheduling restriction
+	PodGroupNotReady PodGroupConditionDetail = "pod group is not ready"
+)
+
+// PodGroupCondition contains details for the current state of this pod group.
+type PodGroupCondition struct {
+	// Type is the type of the condition
+	Type PodGroupConditionType
+
+	// Status is the status of the condition.
+	Status v1.ConditionStatus
+
+	// The ID of condition transition.
+	TransitionID string
+
+	// Last time the phase transitioned from another to current phase.
+	// +optional
+	LastTransitionTime metav1.Time
+
+	// Unique, one-word, CamelCase reason for the phase's last transition.
+	// +optional
+	Reason string
+
+	// Human-readable message indicating details about last transition.
+	// +optional
+	Message string
+}
+
+const (
+	// PodFailedReason is probed if pod of PodGroup failed
+	PodFailedReason string = "PodFailed"
+
+	// PodDeletedReason is probed if pod of PodGroup deleted
+	PodDeletedReason string = "PodDeleted"
+
+	// NotEnoughResourcesReason is probed if there're not enough resources to schedule pods
+	NotEnoughResourcesReason string = "NotEnoughResources"
+
+	// NotEnoughPodsReason is probed if there're not enough tasks compared to `spec.minMember`
+	NotEnoughPodsReason string = "NotEnoughTasks"
+)
+
+// QueueEvent represent the phase of queue.
+type QueueEvent string
+
+const (
+	// QueueOutOfSyncEvent is triggered if PodGroup/Queue were updated
+	QueueOutOfSyncEvent QueueEvent = "OutOfSync"
+	// QueueCommandIssuedEvent is triggered if a command is raised by user
+	QueueCommandIssuedEvent QueueEvent = "CommandIssued"
+)
+
+// QueueAction is the action that queue controller will take according to the event.
+type QueueAction string
+
+const (
+	// SyncQueueAction is the action to sync queue status.
+	SyncQueueAction QueueAction = "SyncQueue"
+	// OpenQueueAction is the action to open queue
+	OpenQueueAction QueueAction = "OpenQueue"
+	// CloseQueueAction is the action to close queue
+	CloseQueueAction QueueAction = "CloseQueue"
+)
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodGroup is a collection of Pod; used for batch workload.
+// +kubebuilder:printcolumn:name="STATUS",type=string,JSONPath=`.status.phase`
+// +kubebuilder:printcolumn:name="minMember",type=integer,JSONPath=`.spec.minMember`
+// +kubebuilder:printcolumn:name="RUNNINGS",type=integer,JSONPath=`.status.running`
+// +kubebuilder:printcolumn:name="AGE",type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:printcolumn:name="QUEUE",type=string,priority=1,JSONPath=`.spec.queue`
+type PodGroup struct {
+	metav1.TypeMeta
+	// Standard object's metadata.
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
+	// +optional
+	metav1.ObjectMeta
+
+	// Specification of the desired behavior of the pod group.
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
+	// +optional
+	Spec PodGroupSpec
+
+	// Status represents the current information about a pod group.
+	// This data may not be up to date.
+	// +optional
+	Status PodGroupStatus
+}
+
+// PodGroupSpec represents the template of a pod group.
+type PodGroupSpec struct {
+	// MinMember defines the minimal number of members/tasks to run the pod group;
+	// if there's not enough resources to start all tasks, the scheduler
+	// will not start anyone.
+	MinMember int32
+
+	// MinTaskMember defines the minimal number of pods to run for each task in the pod group;
+	// if there's not enough resources to start each task, the scheduler
+	// will not start anyone.
+	MinTaskMember map[string]int32
+
+	// Queue defines the queue to allocate resource for PodGroup; if queue does not exist,
+	// the PodGroup will not be scheduled.
+	// +kubebuilder:default:="default"
+	Queue string
+
+	// If specified, indicates the PodGroup's priority. "system-node-critical" and
+	// "system-cluster-critical" are two special keywords which indicate the
+	// highest priorities with the former being the highest priority. Any other
+	// name must be defined by creating a PriorityClass object with that name.
+	// If not specified, the PodGroup priority will be default or zero if there is no
+	// default.
+	// +optional
+	PriorityClassName string
+
+	// MinResources defines the minimal resource of members/tasks to run the pod group;
+	// if there's not enough resources to start all tasks, the scheduler
+	// will not start anyone.
+	MinResources *v1.ResourceList
+
+	// NetworkTopology defines the NetworkTopology config, this field works in conjunction with network topology feature and hyperNode CRD.
+	// +optional
+	NetworkTopology *NetworkTopologySpec
+}
+
+// NetworkTopologyMode represents the networkTopology mode, valid values are "hard" and "soft".
+// +kubebuilder:validation:Enum=hard;soft
+type NetworkTopologyMode string
+
+const (
+	// HardNetworkTopologyMode represents a strict network topology constraint that jobs must adhere to.
+	HardNetworkTopologyMode NetworkTopologyMode = "hard"
+
+	// SoftNetworkTopologyMode represents a flexible network topology constraint that
+	// allows jobs to cross network boundaries under certain conditions.
+	SoftNetworkTopologyMode NetworkTopologyMode = "soft"
+)
+
+type NetworkTopologySpec struct {
+	// Mode specifies the mode of the network topology constrain.
+	// +kubebuilder:default=hard
+	// +optional
+	Mode NetworkTopologyMode
+
+	// HighestTierAllowed specifies the highest tier that a job allowed to cross when scheduling.
+	// +kubebuilder:default=1
+	// +optional
+	HighestTierAllowed *int
+}
+
+// PodGroupStatus represents the current state of a pod group.
+type PodGroupStatus struct {
+	// Current phase of PodGroup.
+	Phase PodGroupPhase
+
+	// The conditions of PodGroup.
+	// +optional
+	Conditions []PodGroupCondition
+
+	// The number of actively running pods.
+	// +optional
+	Running int32
+
+	// The number of pods which reached phase Succeeded.
+	// +optional
+	Succeeded int32
+
+	// The number of pods which reached phase Failed.
+	// +optional
+	Failed int32
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodGroupList is a collection of pod groups.
+type PodGroupList struct {
+	metav1.TypeMeta
+	// Standard list metadata
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
+	// +optional
+	metav1.ListMeta
+
+	// items is the list of PodGroup
+	Items []PodGroup
+}
+
+// +genclient
+// +genclient:nonNamespaced
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Queue is a queue of PodGroup.
+type Queue struct {
+	metav1.TypeMeta
+	// Standard object's metadata.
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
+	// +optional
+	metav1.ObjectMeta
+
+	// Specification of the desired behavior of the queue.
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
+	// +optional
+	Spec QueueSpec
+
+	// The status of queue.
+	// +optional
+	Status QueueStatus
+}
+
+// Guarantee represents configuration of queue resource reservation
+type Guarantee struct {
+	// The amount of cluster resource reserved for queue. Just set either `percentage` or `resource`
+	// +optional
+	Resource v1.ResourceList `json:"resource,omitempty" protobuf:"bytes,3,opt,name=resource"`
+}
+
+// Reservation represents current condition about resource reservation
+type Reservation struct {
+	// Nodes are Locked nodes for queue
+	// +optional
+	Nodes []string `json:"nodes,omitempty" protobuf:"bytes,1,opt,name=nodes"`
+	// Resource is a list of total idle resource in locked nodes.
+	// +optional
+	Resource v1.ResourceList `json:"resource,omitempty" protobuf:"bytes,2,opt,name=resource"`
+}
+
+// QueueStatus represents the status of Queue.
+type QueueStatus struct {
+	// State is status of queue
+	State QueueState
+
+	// The number of 'Unknown' PodGroup in this queue.
+	Unknown int32
+	// The number of 'Pending' PodGroup in this queue.
+	Pending int32
+	// The number of 'Running' PodGroup in this queue.
+	Running int32
+	// The number of `Inqueue` PodGroup in this queue.
+	Inqueue int32
+	// The number of `Completed` PodGroup in this queue.
+	Completed int32
+
+	// Reservation is the profile of resource reservation for queue
+	Reservation Reservation
+
+	// Allocated is allocated resources in queue
+	// +optional
+	Allocated v1.ResourceList
+}
+
+// CluterSpec represents the template of Cluster
+type Cluster struct {
+	Name     string
+	Weight   int32
+	Capacity v1.ResourceList
+}
+
+// Affinity is a group of affinity scheduling rules.
+type Affinity struct {
+	// Describes nodegroup affinity scheduling rules for the queue.
+	// +optional
+	NodeGroupAffinity *NodeGroupAffinity `json:"nodeGroupAffinity,omitempty" protobuf:"bytes,1,opt,name=nodeGroupAffinity"`
+
+	// Describes nodegroup affinity scheduling rules for the queue.
+	// +optional
+	NodeGroupAntiAffinity *NodeGroupAntiAffinity `json:"nodeGroupAntiAffinity,omitempty" protobuf:"bytes,2,opt,name=nodeGroupAntiAffinity"`
+}
+
+type NodeGroupAffinity struct {
+	// +optional
+	RequiredDuringSchedulingIgnoredDuringExecution []string `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,1,opt,name=requiredDuringSchedulingIgnoredDuringExecution"`
+	// +optional
+	PreferredDuringSchedulingIgnoredDuringExecution []string `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,2,rep,name=preferredDuringSchedulingIgnoredDuringExecution"`
+}
+
+type NodeGroupAntiAffinity struct {
+	// +optional
+	RequiredDuringSchedulingIgnoredDuringExecution []string `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,1,opt,name=requiredDuringSchedulingIgnoredDuringExecution"`
+	// +optional
+	PreferredDuringSchedulingIgnoredDuringExecution []string `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,2,rep,name=preferredDuringSchedulingIgnoredDuringExecution"`
+}
+
+// QueueSpec represents the template of Queue.
+type QueueSpec struct {
+	Weight     int32
+	Capability v1.ResourceList
+
+	// Depreicated: replaced by status.State
+	State QueueState
+	// Reclaimable indicate whether the queue can be reclaimed by other queue
+	Reclaimable *bool
+
+	// extendCluster indicate the jobs in this Queue will be dispatched to these clusters.
+	ExtendClusters []Cluster
+
+	// Guarantee indicate configuration about resource reservation
+	Guarantee Guarantee `json:"guarantee,omitempty" protobuf:"bytes,4,opt,name=guarantee"`
+
+	// If specified, the queue's scheduling constraints
+	// +optional
+	Affinity *Affinity `json:"affinity,omitempty" protobuf:"bytes,6,opt,name=affinity"`
+
+	// Type define the type of queue
+	Type string `json:"type,omitempty" protobuf:"bytes,7,opt,name=type"`
+
+	// Parent define the parent of queue
+	// +optional
+	Parent string `json:"parent,omitempty" protobuf:"bytes,8,opt,name=parent"`
+
+	// The amount of resources configured by the user. This part of resource can be shared with other queues and reclaimed back.
+	// +optional
+	Deserved v1.ResourceList `json:"deserved,omitempty" protobuf:"bytes,9,opt,name=deserved"`
+
+	// Priority define the priority of queue. Higher values are prioritized for scheduling and considered later during reclamation.
+	// +optional
+	Priority int32 `json:"priority,omitempty" protobuf:"bytes,10,opt,name=priority"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// QueueList is a collection of queues.
+type QueueList struct {
+	metav1.TypeMeta
+	// Standard list metadata
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
+	// +optional
+	metav1.ListMeta
+
+	// items is the list of PodGroup
+	Items []Queue
+}
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/conversion.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/conversion.go
new file mode 100644
index 000000000..e903517bd
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/conversion.go
@@ -0,0 +1,34 @@
+/*
+Copyright 2020 The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	unsafe "unsafe"
+
+	v1 "k8s.io/api/core/v1"
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	scheduling "volcano.sh/apis/pkg/apis/scheduling"
+)
+
+func Convert_scheduling_QueueSpec_To_v1beta1_QueueSpec(in *scheduling.QueueSpec, out *QueueSpec, s conversion.Scope) error {
+	out.Weight = in.Weight
+	out.Capability = *(*v1.ResourceList)(unsafe.Pointer(&in.Capability))
+	out.Reclaimable = (*bool)(unsafe.Pointer(in.Reclaimable))
+	out.Parent = in.Parent
+
+	return nil
+}
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/doc.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/doc.go
new file mode 100644
index 000000000..620c13774
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/doc.go
@@ -0,0 +1,24 @@
+/*
+Copyright 2019 The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Package v1beta1 contains API Schema definitions for the scheduling v1beta1 API group
+// +kubebuilder:object:generate=true
+// +groupName=scheduling.volcano.sh
+// +k8s:deepcopy-gen=package
+// +k8s:openapi-gen=true
+// +k8s:conversion-gen=volcano.sh/apis/pkg/apis/scheduling
+
+package v1beta1
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/labels.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/labels.go
new file mode 100644
index 000000000..02ffe6ba3
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/labels.go
@@ -0,0 +1,73 @@
+/*
+Copyright 2019 The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+// AnnotationPrefix is the key prefix to pick annotations from upper resource to podgroup
+const AnnotationPrefix = "volcano.sh/"
+
+// JobWaitingTime is the key of sla plugin to set maximum waiting time
+// that a job could stay Pending in service level agreement
+const JobWaitingTime = "volcano.sh/sla-waiting-time"
+
+const KubeHierarchyAnnotationKey = "volcano.sh/hierarchy"
+
+const KubeHierarchyWeightAnnotationKey = "volcano.sh/hierarchy-weights"
+
+// KubeGroupNameAnnotationKey is the annotation key of Pod to identify
+// which PodGroup it belongs to.
+const KubeGroupNameAnnotationKey = "scheduling.k8s.io/group-name"
+
+// VolcanoGroupNameAnnotationKey is the annotation key of Pod to identify
+// which PodGroup it belongs to.
+const VolcanoGroupNameAnnotationKey = GroupName + "/group-name"
+
+// VolcanoGroupMinMemberAnnotationKey is the annotation key of Pod controllers (e.g. Deployment) to identify
+// the minimum member of PodGroup.
+const VolcanoGroupMinMemberAnnotationKey = GroupName + "/group-min-member"
+
+// VolcanoGroupMinResourcesAnnotationKey is the annotation key of PodGroup's PodGroup.Spec.MinResources
+// which PodGroup it belongs to.
+const VolcanoGroupMinResourcesAnnotationKey = GroupName + "/group-min-resources"
+
+// QueueNameAnnotationKey is the annotation key of Pod to identify
+// which queue it belongs to.
+const QueueNameAnnotationKey = GroupName + "/queue-name"
+
+// PodPreemptable is the key of preemptable
+const PodPreemptable = "volcano.sh/preemptable"
+
+// CooldownTime is the key of cooldown-time, value's format "600s","10m"
+// Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
+const CooldownTime = "volcano.sh/cooldown-time"
+
+// RevocableZone is the key of revocable-zone
+const RevocableZone = "volcano.sh/revocable-zone"
+
+// JDBMinAvailable is the key of min available pod number
+const JDBMinAvailable = "volcano.sh/jdb-min-available"
+
+// JDBMaxUnavailable is the key of max unavailable pod number
+const JDBMaxUnavailable = "volcano.sh/jdb-max-unavailable"
+
+// NumaPolicyKey is the key of pod numa-topology policy
+const NumaPolicyKey = "volcano.sh/numa-topology-policy"
+
+// TopologyDecisionAnnotation is the key of topology decision about pod request resource
+const TopologyDecisionAnnotation = "volcano.sh/topology-decision"
+
+// PodQosLevel is the key of pod qos level
+const PodQosLevel = "volcano.sh/qos-level"
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/register.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/register.go
new file mode 100644
index 000000000..43b6a435e
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/register.go
@@ -0,0 +1,58 @@
+/*
+Copyright 2019 The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+var (
+	SchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)
+	localSchemeBuilder = &SchemeBuilder
+	AddToScheme        = SchemeBuilder.AddToScheme
+)
+
+const (
+	// GroupName is the group name used in this package.
+	GroupName = "scheduling.volcano.sh"
+
+	// GroupVersion is the version of scheduling group
+	GroupVersion = "v1beta1"
+)
+
+// SchemeGroupVersion is the group version used to register these objects.
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: GroupVersion}
+
+// Resource takes an unqualified resource and returns a Group-qualified GroupResource.
+func Resource(resource string) schema.GroupResource {
+	return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+// addKnownTypes adds the set of types defined in this package to the supplied scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&PodGroup{},
+		&PodGroupList{},
+		&Queue{},
+		&QueueList{},
+	)
+
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+	return nil
+}
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/types.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/types.go
new file mode 100644
index 000000000..5d9146a0e
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/types.go
@@ -0,0 +1,428 @@
+/*
+Copyright 2019 The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// QueueState is state type of queue.
+type QueueState string
+
+const (
+	// QueueStateOpen indicate `Open` state of queue
+	QueueStateOpen QueueState = "Open"
+	// QueueStateClosed indicate `Closed` state of queue
+	QueueStateClosed QueueState = "Closed"
+	// QueueStateClosing indicate `Closing` state of queue
+	QueueStateClosing QueueState = "Closing"
+	// QueueStateUnknown indicate `Unknown` state of queue
+	QueueStateUnknown QueueState = "Unknown"
+)
+
+// PodGroupPhase is the phase of a pod group at the current time.
+type PodGroupPhase string
+
+// These are the valid phase of podGroups.
+const (
+	// PodGroupPending means the pod group has been accepted by the system, but scheduler can not allocate
+	// enough resources to it.
+	PodGroupPending PodGroupPhase = "Pending"
+
+	// PodGroupRunning means `spec.minMember` pods of PodGroup has been in running phase.
+	PodGroupRunning PodGroupPhase = "Running"
+
+	// PodGroupUnknown means part of `spec.minMember` pods are running but the other part can not
+	// be scheduled, e.g. not enough resource; scheduler will wait for related controller to recover it.
+	PodGroupUnknown PodGroupPhase = "Unknown"
+
+	// PodGroupInqueue means controllers can start to create pods,
+	// is a new state between PodGroupPending and PodGroupRunning
+	PodGroupInqueue PodGroupPhase = "Inqueue"
+
+	// PodGroupCompleted means all the pods of PodGroup are completed
+	PodGroupCompleted PodGroupPhase = "Completed"
+)
+
+type PodGroupConditionType string
+
+const (
+	// PodGroupUnschedulableType is Unschedulable event type
+	PodGroupUnschedulableType PodGroupConditionType = "Unschedulable"
+
+	// PodGroupScheduled is scheduled event type
+	PodGroupScheduled PodGroupConditionType = "Scheduled"
+)
+
+type PodGroupConditionDetail string
+
+const (
+	// PodGroupReady is that PodGroup has reached scheduling restriction
+	PodGroupReady PodGroupConditionDetail = "pod group is ready"
+	// PodGroupNotReady is that PodGroup has not yet reached the scheduling restriction
+	PodGroupNotReady PodGroupConditionDetail = "pod group is not ready"
+)
+
+// PodGroupCondition contains details for the current state of this pod group.
+type PodGroupCondition struct {
+	// Type is the type of the condition
+	Type PodGroupConditionType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type"`
+
+	// Status is the status of the condition.
+	Status v1.ConditionStatus `json:"status,omitempty" protobuf:"bytes,2,opt,name=status"`
+
+	// The ID of condition transition.
+	TransitionID string `json:"transitionID,omitempty" protobuf:"bytes,3,opt,name=transitionID"`
+
+	// Last time the phase transitioned from another to current phase.
+	// +optional
+	LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,4,opt,name=lastTransitionTime"`
+
+	// Unique, one-word, CamelCase reason for the phase's last transition.
+	// +optional
+	Reason string `json:"reason,omitempty" protobuf:"bytes,5,opt,name=reason"`
+
+	// Human-readable message indicating details about last transition.
+	// +optional
+	Message string `json:"message,omitempty" protobuf:"bytes,6,opt,name=message"`
+}
+
+const (
+	// PodFailedReason is probed if pod of PodGroup failed
+	PodFailedReason string = "PodFailed"
+
+	// PodDeletedReason is probed if pod of PodGroup deleted
+	PodDeletedReason string = "PodDeleted"
+
+	// NotEnoughResourcesReason is probed if there're not enough resources to schedule pods
+	NotEnoughResourcesReason string = "NotEnoughResources"
+
+	// NotEnoughPodsReason is probed if there're not enough tasks compared to `spec.minMember`
+	NotEnoughPodsReason string = "NotEnoughTasks"
+
+	// NotEnoughPodsOfTaskReason is probed if there're not enough pods of task compared to `spec.minTaskMember`
+	NotEnoughPodsOfTaskReason string = "NotEnoughPodsOfTask"
+)
+
+// QueueEvent represent the phase of queue.
+type QueueEvent string
+
+const (
+	// QueueOutOfSyncEvent is triggered if PodGroup/Queue were updated
+	QueueOutOfSyncEvent QueueEvent = "OutOfSync"
+	// QueueCommandIssuedEvent is triggered if a command is raised by user
+	QueueCommandIssuedEvent QueueEvent = "CommandIssued"
+)
+
+// QueueAction is the action that queue controller will take according to the event.
+type QueueAction string
+
+const (
+	// SyncQueueAction is the action to sync queue status.
+	SyncQueueAction QueueAction = "SyncQueue"
+	// OpenQueueAction is the action to open queue
+	OpenQueueAction QueueAction = "OpenQueue"
+	// CloseQueueAction is the action to close queue
+	CloseQueueAction QueueAction = "CloseQueue"
+)
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+// +kubebuilder:object:root=true
+// +kubebuilder:resource:path=podgroups,shortName=pg;podgroup-v1beta1
+// +kubebuilder:printcolumn:name="STATUS",type=string,JSONPath=`.status.phase`
+// +kubebuilder:printcolumn:name="minMember",type=integer,JSONPath=`.spec.minMember`
+// +kubebuilder:printcolumn:name="RUNNINGS",type=integer,JSONPath=`.status.running`
+// +kubebuilder:printcolumn:name="AGE",type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:printcolumn:name="QUEUE",type=string,priority=1,JSONPath=`.spec.queue`
+
+// PodGroup is a collection of Pod; used for batch workload.
+type PodGroup struct {
+	metav1.TypeMeta `json:",inline"`
+
+	// +optional
+	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// Specification of the desired behavior of the pod group.
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
+	// +optional
+	Spec PodGroupSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
+
+	// Status represents the current information about a pod group.
+	// This data may not be up to date.
+	// +optional
+	Status PodGroupStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
+}
+
+// PodGroupSpec represents the template of a pod group.
+type PodGroupSpec struct {
+	// MinMember defines the minimal number of members/tasks to run the pod group;
+	// if there's not enough resources to start all tasks, the scheduler
+	// will not start anyone.
+	MinMember int32 `json:"minMember,omitempty" protobuf:"bytes,1,opt,name=minMember"`
+
+	// MinTaskMember defines the minimal number of pods to run each task in the pod group;
+	// if there's not enough resources to start each task, the scheduler
+	// will not start anyone.
+	MinTaskMember map[string]int32 `json:"minTaskMember,omitempty" protobuf:"bytes,1,opt,name=minTaskMember"`
+
+	// Queue defines the queue to allocate resource for PodGroup; if queue does not exist,
+	// the PodGroup will not be scheduled. Defaults to `default` Queue with the lowest weight.
+	// +optional
+	// +kubebuilder:default:="default"
+	Queue string `json:"queue,omitempty" protobuf:"bytes,2,opt,name=queue"`
+
+	// If specified, indicates the PodGroup's priority. "system-node-critical" and
+	// "system-cluster-critical" are two special keywords which indicate the
+	// highest priorities with the former being the highest priority. Any other
+	// name must be defined by creating a PriorityClass object with that name.
+	// If not specified, the PodGroup priority will be default or zero if there is no
+	// default.
+	// +optional
+	PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,3,opt,name=priorityClassName"`
+
+	// MinResources defines the minimal resource of members/tasks to run the pod group;
+	// if there's not enough resources to start all tasks, the scheduler
+	// will not start anyone.
+	MinResources *v1.ResourceList `json:"minResources,omitempty" protobuf:"bytes,4,opt,name=minResources"`
+
+	// NetworkTopology defines the NetworkTopology config, this field works in conjunction with network topology feature and hyperNode CRD.
+	// +optional
+	NetworkTopology *NetworkTopologySpec `json:"networkTopology,omitempty" protobuf:"bytes,5,opt,name=networkTopology"`
+}
+
+type NetworkTopologyMode string
+
+const (
+	// HardNetworkTopologyMode represents a strict network topology constraint that jobs must adhere to.
+	HardNetworkTopologyMode NetworkTopologyMode = "hard"
+
+	// SoftNetworkTopologyMode represents a flexible network topology constraint that allows jobs
+	// to cross network boundaries under certain conditions.
+	SoftNetworkTopologyMode NetworkTopologyMode = "soft"
+)
+
+type NetworkTopologySpec struct {
+	// Mode specifies the mode of the network topology constrain.
+	// +kubebuilder:validation:Enum=hard;soft
+	// +kubebuilder:default=hard
+	// +optional
+	Mode NetworkTopologyMode `json:"mode,omitempty" protobuf:"bytes,1,opt,name=mode"`
+
+	// HighestTierAllowed specifies the highest tier that a job allowed to cross when scheduling.
+	// +kubebuilder:default=1
+	// +optional
+	HighestTierAllowed *int `json:"highestTierAllowed,omitempty" protobuf:"bytes,2,opt,name=highestTierAllowed"`
+}
+
+// PodGroupStatus represents the current state of a pod group.
+type PodGroupStatus struct {
+	// Current phase of PodGroup.
+	Phase PodGroupPhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase"`
+
+	// The conditions of PodGroup.
+	// +optional
+	Conditions []PodGroupCondition `json:"conditions,omitempty" protobuf:"bytes,2,opt,name=conditions"`
+
+	// The number of actively running pods.
+	// +optional
+	Running int32 `json:"running,omitempty" protobuf:"bytes,3,opt,name=running"`
+
+	// The number of pods which reached phase Succeeded.
+	// +optional
+	Succeeded int32 `json:"succeeded,omitempty" protobuf:"bytes,4,opt,name=succeeded"`
+
+	// The number of pods which reached phase Failed.
+	// +optional
+	Failed int32 `json:"failed,omitempty" protobuf:"bytes,5,opt,name=failed"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+// +kubebuilder:object:root=true
+
+// PodGroupList is a collection of pod groups.
+type PodGroupList struct {
+	metav1.TypeMeta `json:",inline"`
+	// Standard list metadata
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
+	// +optional
+	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// items is the list of PodGroup
+	Items []PodGroup `json:"items" protobuf:"bytes,2,rep,name=items"`
+}
+
+const (
+	// DefaultQueue constant stores the name of the queue as "default"
+	DefaultQueue = "default"
+)
+
+// +genclient
+// +genclient:nonNamespaced
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+// +kubebuilder:object:root=true
+// +kubebuilder:resource:path=queues,scope=Cluster,shortName=q;queue-v1beta1
+// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name="PARENT",type=string,JSONPath=`.spec.parent`
+
+// Queue is a queue of PodGroup.
+type Queue struct {
+	metav1.TypeMeta `json:",inline"`
+
+	// +optional
+	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// Specification of the desired behavior of the queue.
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
+	// +optional
+	Spec QueueSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
+
+	// The status of queue.
+	// +optional
+	Status QueueStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
+}
+
+// Guarantee represents configuration of queue resource reservation
+type Guarantee struct {
+	// The amount of cluster resource reserved for queue. Just set either `percentage` or `resource`
+	// +optional
+	Resource v1.ResourceList `json:"resource,omitempty" protobuf:"bytes,3,opt,name=resource"`
+}
+
+// Reservation represents current condition about resource reservation
+type Reservation struct {
+	// Nodes are Locked nodes for queue
+	// +optional
+	Nodes []string `json:"nodes,omitempty" protobuf:"bytes,1,opt,name=nodes"`
+	// Resource is a list of total idle resource in locked nodes.
+	// +optional
+	Resource v1.ResourceList `json:"resource,omitempty" protobuf:"bytes,2,opt,name=resource"`
+}
+
+// QueueStatus represents the status of Queue.
+type QueueStatus struct {
+	// State is state of queue
+	State QueueState `json:"state,omitempty" protobuf:"bytes,1,opt,name=state"`
+
+	// The number of 'Unknown' PodGroup in this queue.
+	Unknown int32 `json:"unknown,omitempty" protobuf:"bytes,2,opt,name=unknown"`
+	// The number of 'Pending' PodGroup in this queue.
+	Pending int32 `json:"pending,omitempty" protobuf:"bytes,3,opt,name=pending"`
+	// The number of 'Running' PodGroup in this queue.
+	Running int32 `json:"running,omitempty" protobuf:"bytes,4,opt,name=running"`
+	// The number of `Inqueue` PodGroup in this queue.
+	Inqueue int32 `json:"inqueue,omitempty" protobuf:"bytes,5,opt,name=inqueue"`
+	// The number of `Completed` PodGroup in this queue.
+	Completed int32 `json:"completed,omitempty" protobuf:"bytes,6,opt,name=completed"`
+
+	// Reservation is the profile of resource reservation for queue
+	Reservation Reservation `json:"reservation,omitempty" protobuf:"bytes,7,opt,name=reservation"`
+
+	// Allocated is allocated resources in queue
+	// +optional
+	Allocated v1.ResourceList `json:"allocated" protobuf:"bytes,8,opt,name=allocated"`
+}
+
+// CluterSpec represents the template of Cluster
+type Cluster struct {
+	// +optional
+	Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`
+	// +optional
+	Weight int32 `json:"weight,omitempty" protobuf:"bytes,2,opt,name=weight"`
+	// +optional
+	Capacity v1.ResourceList `json:"capacity,omitempty" protobuf:"bytes,3,opt,name=capacity"`
+}
+
+// Affinity is a group of affinity scheduling rules.
+type Affinity struct {
+	// Describes nodegroup affinity scheduling rules for the queue(e.g. putting pods of the queue in the nodes of the nodegroup)
+	// +optional
+	NodeGroupAffinity *NodeGroupAffinity `json:"nodeGroupAffinity,omitempty" protobuf:"bytes,1,opt,name=nodeGroupAffinity"`
+
+	// Describes nodegroup anti-affinity scheduling rules for the queue(e.g. avoid putting pods of the queue in the nodes of the nodegroup).
+	// +optional
+	NodeGroupAntiAffinity *NodeGroupAntiAffinity `json:"nodeGroupAntiAffinity,omitempty" protobuf:"bytes,2,opt,name=nodeGroupAntiAffinity"`
+}
+
+type NodeGroupAffinity struct {
+	// +optional
+	RequiredDuringSchedulingIgnoredDuringExecution []string `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,1,opt,name=requiredDuringSchedulingIgnoredDuringExecution"`
+	// +optional
+	PreferredDuringSchedulingIgnoredDuringExecution []string `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,2,rep,name=preferredDuringSchedulingIgnoredDuringExecution"`
+}
+
+type NodeGroupAntiAffinity struct {
+	// +optional
+	RequiredDuringSchedulingIgnoredDuringExecution []string `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,1,opt,name=requiredDuringSchedulingIgnoredDuringExecution"`
+	// +optional
+	PreferredDuringSchedulingIgnoredDuringExecution []string `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,2,rep,name=preferredDuringSchedulingIgnoredDuringExecution"`
+}
+
+// QueueSpec represents the template of Queue.
+type QueueSpec struct {
+	// +optional
+	// +kubebuilder:default:=1
+	// +kubebuilder:validation:Minimum=1
+	// +kubebuilder:validation:Maximum=65535
+	Weight int32 `json:"weight,omitempty" protobuf:"bytes,1,opt,name=weight"`
+
+	// +optional
+	Capability v1.ResourceList `json:"capability,omitempty" protobuf:"bytes,2,opt,name=capability"`
+
+	// Reclaimable indicate whether the queue can be reclaimed by other queue
+	Reclaimable *bool `json:"reclaimable,omitempty" protobuf:"bytes,3,opt,name=reclaimable"`
+
+	// extendCluster indicate the jobs in this Queue will be dispatched to these clusters.
+	ExtendClusters []Cluster `json:"extendClusters,omitempty" protobuf:"bytes,4,opt,name=extendClusters"`
+
+	// Guarantee indicate configuration about resource reservation
+	Guarantee Guarantee `json:"guarantee,omitempty" protobuf:"bytes,5,opt,name=guarantee"`
+
+	// If specified, the pod owned by the queue will be scheduled with constraint
+	// +optional
+	Affinity *Affinity `json:"affinity,omitempty" protobuf:"bytes,6,opt,name=affinity"`
+
+	// Type define the type of queue
+	Type string `json:"type,omitempty" protobuf:"bytes,7,opt,name=type"`
+	// Parent define the parent of queue
+	// +optional
+	Parent string `json:"parent,omitempty" protobuf:"bytes,8,opt,name=parent"`
+
+	// The amount of resources configured by the user. This part of resource can be shared with other queues and reclaimed back.
+	// +optional
+	Deserved v1.ResourceList `json:"deserved,omitempty" protobuf:"bytes,9,opt,name=deserved"`
+
+	// Priority define the priority of queue. Higher values are prioritized for scheduling and considered later during reclamation.
+	// +optional
+	Priority int32 `json:"priority,omitempty" protobuf:"bytes,10,opt,name=priority"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+// +kubebuilder:object:root=true
+
+// QueueList is a collection of queues.
+type QueueList struct {
+	metav1.TypeMeta `json:",inline"`
+	// Standard list metadata
+	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
+	// +optional
+	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// items is the list of PodGroup
+	Items []Queue `json:"items" protobuf:"bytes,2,rep,name=items"`
+}
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/zz_generated.conversion.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/zz_generated.conversion.go
new file mode 100644
index 000000000..b4260c6a3
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/zz_generated.conversion.go
@@ -0,0 +1,646 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	unsafe "unsafe"
+
+	v1 "k8s.io/api/core/v1"
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	scheduling "volcano.sh/apis/pkg/apis/scheduling"
+)
+
+func init() {
+	localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(s *runtime.Scheme) error {
+	if err := s.AddGeneratedConversionFunc((*Affinity)(nil), (*scheduling.Affinity)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Affinity_To_scheduling_Affinity(a.(*Affinity), b.(*scheduling.Affinity), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.Affinity)(nil), (*Affinity)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_Affinity_To_v1beta1_Affinity(a.(*scheduling.Affinity), b.(*Affinity), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*Cluster)(nil), (*scheduling.Cluster)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Cluster_To_scheduling_Cluster(a.(*Cluster), b.(*scheduling.Cluster), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.Cluster)(nil), (*Cluster)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_Cluster_To_v1beta1_Cluster(a.(*scheduling.Cluster), b.(*Cluster), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*Guarantee)(nil), (*scheduling.Guarantee)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Guarantee_To_scheduling_Guarantee(a.(*Guarantee), b.(*scheduling.Guarantee), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.Guarantee)(nil), (*Guarantee)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_Guarantee_To_v1beta1_Guarantee(a.(*scheduling.Guarantee), b.(*Guarantee), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*NetworkTopologySpec)(nil), (*scheduling.NetworkTopologySpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_NetworkTopologySpec_To_scheduling_NetworkTopologySpec(a.(*NetworkTopologySpec), b.(*scheduling.NetworkTopologySpec), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.NetworkTopologySpec)(nil), (*NetworkTopologySpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_NetworkTopologySpec_To_v1beta1_NetworkTopologySpec(a.(*scheduling.NetworkTopologySpec), b.(*NetworkTopologySpec), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*NodeGroupAffinity)(nil), (*scheduling.NodeGroupAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_NodeGroupAffinity_To_scheduling_NodeGroupAffinity(a.(*NodeGroupAffinity), b.(*scheduling.NodeGroupAffinity), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.NodeGroupAffinity)(nil), (*NodeGroupAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_NodeGroupAffinity_To_v1beta1_NodeGroupAffinity(a.(*scheduling.NodeGroupAffinity), b.(*NodeGroupAffinity), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*NodeGroupAntiAffinity)(nil), (*scheduling.NodeGroupAntiAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_NodeGroupAntiAffinity_To_scheduling_NodeGroupAntiAffinity(a.(*NodeGroupAntiAffinity), b.(*scheduling.NodeGroupAntiAffinity), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.NodeGroupAntiAffinity)(nil), (*NodeGroupAntiAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_NodeGroupAntiAffinity_To_v1beta1_NodeGroupAntiAffinity(a.(*scheduling.NodeGroupAntiAffinity), b.(*NodeGroupAntiAffinity), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PodGroup)(nil), (*scheduling.PodGroup)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PodGroup_To_scheduling_PodGroup(a.(*PodGroup), b.(*scheduling.PodGroup), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.PodGroup)(nil), (*PodGroup)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_PodGroup_To_v1beta1_PodGroup(a.(*scheduling.PodGroup), b.(*PodGroup), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PodGroupCondition)(nil), (*scheduling.PodGroupCondition)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PodGroupCondition_To_scheduling_PodGroupCondition(a.(*PodGroupCondition), b.(*scheduling.PodGroupCondition), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.PodGroupCondition)(nil), (*PodGroupCondition)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_PodGroupCondition_To_v1beta1_PodGroupCondition(a.(*scheduling.PodGroupCondition), b.(*PodGroupCondition), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PodGroupList)(nil), (*scheduling.PodGroupList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PodGroupList_To_scheduling_PodGroupList(a.(*PodGroupList), b.(*scheduling.PodGroupList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.PodGroupList)(nil), (*PodGroupList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_PodGroupList_To_v1beta1_PodGroupList(a.(*scheduling.PodGroupList), b.(*PodGroupList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PodGroupSpec)(nil), (*scheduling.PodGroupSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PodGroupSpec_To_scheduling_PodGroupSpec(a.(*PodGroupSpec), b.(*scheduling.PodGroupSpec), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.PodGroupSpec)(nil), (*PodGroupSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_PodGroupSpec_To_v1beta1_PodGroupSpec(a.(*scheduling.PodGroupSpec), b.(*PodGroupSpec), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PodGroupStatus)(nil), (*scheduling.PodGroupStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PodGroupStatus_To_scheduling_PodGroupStatus(a.(*PodGroupStatus), b.(*scheduling.PodGroupStatus), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.PodGroupStatus)(nil), (*PodGroupStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_PodGroupStatus_To_v1beta1_PodGroupStatus(a.(*scheduling.PodGroupStatus), b.(*PodGroupStatus), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*Queue)(nil), (*scheduling.Queue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Queue_To_scheduling_Queue(a.(*Queue), b.(*scheduling.Queue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.Queue)(nil), (*Queue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_Queue_To_v1beta1_Queue(a.(*scheduling.Queue), b.(*Queue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*QueueList)(nil), (*scheduling.QueueList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_QueueList_To_scheduling_QueueList(a.(*QueueList), b.(*scheduling.QueueList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.QueueList)(nil), (*QueueList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_QueueList_To_v1beta1_QueueList(a.(*scheduling.QueueList), b.(*QueueList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*QueueSpec)(nil), (*scheduling.QueueSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_QueueSpec_To_scheduling_QueueSpec(a.(*QueueSpec), b.(*scheduling.QueueSpec), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*QueueStatus)(nil), (*scheduling.QueueStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_QueueStatus_To_scheduling_QueueStatus(a.(*QueueStatus), b.(*scheduling.QueueStatus), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.QueueStatus)(nil), (*QueueStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_QueueStatus_To_v1beta1_QueueStatus(a.(*scheduling.QueueStatus), b.(*QueueStatus), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*Reservation)(nil), (*scheduling.Reservation)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_Reservation_To_scheduling_Reservation(a.(*Reservation), b.(*scheduling.Reservation), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*scheduling.Reservation)(nil), (*Reservation)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_Reservation_To_v1beta1_Reservation(a.(*scheduling.Reservation), b.(*Reservation), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddConversionFunc((*scheduling.QueueSpec)(nil), (*QueueSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_scheduling_QueueSpec_To_v1beta1_QueueSpec(a.(*scheduling.QueueSpec), b.(*QueueSpec), scope)
+	}); err != nil {
+		return err
+	}
+	return nil
+}
+
+func autoConvert_v1beta1_Affinity_To_scheduling_Affinity(in *Affinity, out *scheduling.Affinity, s conversion.Scope) error {
+	out.NodeGroupAffinity = (*scheduling.NodeGroupAffinity)(unsafe.Pointer(in.NodeGroupAffinity))
+	out.NodeGroupAntiAffinity = (*scheduling.NodeGroupAntiAffinity)(unsafe.Pointer(in.NodeGroupAntiAffinity))
+	return nil
+}
+
+// Convert_v1beta1_Affinity_To_scheduling_Affinity is an autogenerated conversion function.
+func Convert_v1beta1_Affinity_To_scheduling_Affinity(in *Affinity, out *scheduling.Affinity, s conversion.Scope) error {
+	return autoConvert_v1beta1_Affinity_To_scheduling_Affinity(in, out, s)
+}
+
+func autoConvert_scheduling_Affinity_To_v1beta1_Affinity(in *scheduling.Affinity, out *Affinity, s conversion.Scope) error {
+	out.NodeGroupAffinity = (*NodeGroupAffinity)(unsafe.Pointer(in.NodeGroupAffinity))
+	out.NodeGroupAntiAffinity = (*NodeGroupAntiAffinity)(unsafe.Pointer(in.NodeGroupAntiAffinity))
+	return nil
+}
+
+// Convert_scheduling_Affinity_To_v1beta1_Affinity is an autogenerated conversion function.
+func Convert_scheduling_Affinity_To_v1beta1_Affinity(in *scheduling.Affinity, out *Affinity, s conversion.Scope) error {
+	return autoConvert_scheduling_Affinity_To_v1beta1_Affinity(in, out, s)
+}
+
+func autoConvert_v1beta1_Cluster_To_scheduling_Cluster(in *Cluster, out *scheduling.Cluster, s conversion.Scope) error {
+	out.Name = in.Name
+	out.Weight = in.Weight
+	out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
+	return nil
+}
+
+// Convert_v1beta1_Cluster_To_scheduling_Cluster is an autogenerated conversion function.
+func Convert_v1beta1_Cluster_To_scheduling_Cluster(in *Cluster, out *scheduling.Cluster, s conversion.Scope) error {
+	return autoConvert_v1beta1_Cluster_To_scheduling_Cluster(in, out, s)
+}
+
+func autoConvert_scheduling_Cluster_To_v1beta1_Cluster(in *scheduling.Cluster, out *Cluster, s conversion.Scope) error {
+	out.Name = in.Name
+	out.Weight = in.Weight
+	out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
+	return nil
+}
+
+// Convert_scheduling_Cluster_To_v1beta1_Cluster is an autogenerated conversion function.
+func Convert_scheduling_Cluster_To_v1beta1_Cluster(in *scheduling.Cluster, out *Cluster, s conversion.Scope) error {
+	return autoConvert_scheduling_Cluster_To_v1beta1_Cluster(in, out, s)
+}
+
+func autoConvert_v1beta1_Guarantee_To_scheduling_Guarantee(in *Guarantee, out *scheduling.Guarantee, s conversion.Scope) error {
+	out.Resource = *(*v1.ResourceList)(unsafe.Pointer(&in.Resource))
+	return nil
+}
+
+// Convert_v1beta1_Guarantee_To_scheduling_Guarantee is an autogenerated conversion function.
+func Convert_v1beta1_Guarantee_To_scheduling_Guarantee(in *Guarantee, out *scheduling.Guarantee, s conversion.Scope) error {
+	return autoConvert_v1beta1_Guarantee_To_scheduling_Guarantee(in, out, s)
+}
+
+func autoConvert_scheduling_Guarantee_To_v1beta1_Guarantee(in *scheduling.Guarantee, out *Guarantee, s conversion.Scope) error {
+	out.Resource = *(*v1.ResourceList)(unsafe.Pointer(&in.Resource))
+	return nil
+}
+
+// Convert_scheduling_Guarantee_To_v1beta1_Guarantee is an autogenerated conversion function.
+func Convert_scheduling_Guarantee_To_v1beta1_Guarantee(in *scheduling.Guarantee, out *Guarantee, s conversion.Scope) error {
+	return autoConvert_scheduling_Guarantee_To_v1beta1_Guarantee(in, out, s)
+}
+
+func autoConvert_v1beta1_NetworkTopologySpec_To_scheduling_NetworkTopologySpec(in *NetworkTopologySpec, out *scheduling.NetworkTopologySpec, s conversion.Scope) error {
+	out.Mode = scheduling.NetworkTopologyMode(in.Mode)
+	out.HighestTierAllowed = (*int)(unsafe.Pointer(in.HighestTierAllowed))
+	return nil
+}
+
+// Convert_v1beta1_NetworkTopologySpec_To_scheduling_NetworkTopologySpec is an autogenerated conversion function.
+func Convert_v1beta1_NetworkTopologySpec_To_scheduling_NetworkTopologySpec(in *NetworkTopologySpec, out *scheduling.NetworkTopologySpec, s conversion.Scope) error {
+	return autoConvert_v1beta1_NetworkTopologySpec_To_scheduling_NetworkTopologySpec(in, out, s)
+}
+
+func autoConvert_scheduling_NetworkTopologySpec_To_v1beta1_NetworkTopologySpec(in *scheduling.NetworkTopologySpec, out *NetworkTopologySpec, s conversion.Scope) error {
+	out.Mode = NetworkTopologyMode(in.Mode)
+	out.HighestTierAllowed = (*int)(unsafe.Pointer(in.HighestTierAllowed))
+	return nil
+}
+
+// Convert_scheduling_NetworkTopologySpec_To_v1beta1_NetworkTopologySpec is an autogenerated conversion function.
+func Convert_scheduling_NetworkTopologySpec_To_v1beta1_NetworkTopologySpec(in *scheduling.NetworkTopologySpec, out *NetworkTopologySpec, s conversion.Scope) error {
+	return autoConvert_scheduling_NetworkTopologySpec_To_v1beta1_NetworkTopologySpec(in, out, s)
+}
+
+func autoConvert_v1beta1_NodeGroupAffinity_To_scheduling_NodeGroupAffinity(in *NodeGroupAffinity, out *scheduling.NodeGroupAffinity, s conversion.Scope) error {
+	out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+	out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+	return nil
+}
+
+// Convert_v1beta1_NodeGroupAffinity_To_scheduling_NodeGroupAffinity is an autogenerated conversion function.
+func Convert_v1beta1_NodeGroupAffinity_To_scheduling_NodeGroupAffinity(in *NodeGroupAffinity, out *scheduling.NodeGroupAffinity, s conversion.Scope) error {
+	return autoConvert_v1beta1_NodeGroupAffinity_To_scheduling_NodeGroupAffinity(in, out, s)
+}
+
+func autoConvert_scheduling_NodeGroupAffinity_To_v1beta1_NodeGroupAffinity(in *scheduling.NodeGroupAffinity, out *NodeGroupAffinity, s conversion.Scope) error {
+	out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+	out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+	return nil
+}
+
+// Convert_scheduling_NodeGroupAffinity_To_v1beta1_NodeGroupAffinity is an autogenerated conversion function.
+func Convert_scheduling_NodeGroupAffinity_To_v1beta1_NodeGroupAffinity(in *scheduling.NodeGroupAffinity, out *NodeGroupAffinity, s conversion.Scope) error {
+	return autoConvert_scheduling_NodeGroupAffinity_To_v1beta1_NodeGroupAffinity(in, out, s)
+}
+
+func autoConvert_v1beta1_NodeGroupAntiAffinity_To_scheduling_NodeGroupAntiAffinity(in *NodeGroupAntiAffinity, out *scheduling.NodeGroupAntiAffinity, s conversion.Scope) error {
+	out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+	out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+	return nil
+}
+
+// Convert_v1beta1_NodeGroupAntiAffinity_To_scheduling_NodeGroupAntiAffinity is an autogenerated conversion function.
+func Convert_v1beta1_NodeGroupAntiAffinity_To_scheduling_NodeGroupAntiAffinity(in *NodeGroupAntiAffinity, out *scheduling.NodeGroupAntiAffinity, s conversion.Scope) error {
+	return autoConvert_v1beta1_NodeGroupAntiAffinity_To_scheduling_NodeGroupAntiAffinity(in, out, s)
+}
+
+func autoConvert_scheduling_NodeGroupAntiAffinity_To_v1beta1_NodeGroupAntiAffinity(in *scheduling.NodeGroupAntiAffinity, out *NodeGroupAntiAffinity, s conversion.Scope) error {
+	out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+	out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]string)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+	return nil
+}
+
+// Convert_scheduling_NodeGroupAntiAffinity_To_v1beta1_NodeGroupAntiAffinity is an autogenerated conversion function.
+func Convert_scheduling_NodeGroupAntiAffinity_To_v1beta1_NodeGroupAntiAffinity(in *scheduling.NodeGroupAntiAffinity, out *NodeGroupAntiAffinity, s conversion.Scope) error {
+	return autoConvert_scheduling_NodeGroupAntiAffinity_To_v1beta1_NodeGroupAntiAffinity(in, out, s)
+}
+
+func autoConvert_v1beta1_PodGroup_To_scheduling_PodGroup(in *PodGroup, out *scheduling.PodGroup, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_v1beta1_PodGroupSpec_To_scheduling_PodGroupSpec(&in.Spec, &out.Spec, s); err != nil {
+		return err
+	}
+	if err := Convert_v1beta1_PodGroupStatus_To_scheduling_PodGroupStatus(&in.Status, &out.Status, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_v1beta1_PodGroup_To_scheduling_PodGroup is an autogenerated conversion function.
+func Convert_v1beta1_PodGroup_To_scheduling_PodGroup(in *PodGroup, out *scheduling.PodGroup, s conversion.Scope) error {
+	return autoConvert_v1beta1_PodGroup_To_scheduling_PodGroup(in, out, s)
+}
+
+func autoConvert_scheduling_PodGroup_To_v1beta1_PodGroup(in *scheduling.PodGroup, out *PodGroup, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_scheduling_PodGroupSpec_To_v1beta1_PodGroupSpec(&in.Spec, &out.Spec, s); err != nil {
+		return err
+	}
+	if err := Convert_scheduling_PodGroupStatus_To_v1beta1_PodGroupStatus(&in.Status, &out.Status, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_scheduling_PodGroup_To_v1beta1_PodGroup is an autogenerated conversion function.
+func Convert_scheduling_PodGroup_To_v1beta1_PodGroup(in *scheduling.PodGroup, out *PodGroup, s conversion.Scope) error {
+	return autoConvert_scheduling_PodGroup_To_v1beta1_PodGroup(in, out, s)
+}
+
+func autoConvert_v1beta1_PodGroupCondition_To_scheduling_PodGroupCondition(in *PodGroupCondition, out *scheduling.PodGroupCondition, s conversion.Scope) error {
+	out.Type = scheduling.PodGroupConditionType(in.Type)
+	out.Status = v1.ConditionStatus(in.Status)
+	out.TransitionID = in.TransitionID
+	out.LastTransitionTime = in.LastTransitionTime
+	out.Reason = in.Reason
+	out.Message = in.Message
+	return nil
+}
+
+// Convert_v1beta1_PodGroupCondition_To_scheduling_PodGroupCondition is an autogenerated conversion function.
+func Convert_v1beta1_PodGroupCondition_To_scheduling_PodGroupCondition(in *PodGroupCondition, out *scheduling.PodGroupCondition, s conversion.Scope) error {
+	return autoConvert_v1beta1_PodGroupCondition_To_scheduling_PodGroupCondition(in, out, s)
+}
+
+func autoConvert_scheduling_PodGroupCondition_To_v1beta1_PodGroupCondition(in *scheduling.PodGroupCondition, out *PodGroupCondition, s conversion.Scope) error {
+	out.Type = PodGroupConditionType(in.Type)
+	out.Status = v1.ConditionStatus(in.Status)
+	out.TransitionID = in.TransitionID
+	out.LastTransitionTime = in.LastTransitionTime
+	out.Reason = in.Reason
+	out.Message = in.Message
+	return nil
+}
+
+// Convert_scheduling_PodGroupCondition_To_v1beta1_PodGroupCondition is an autogenerated conversion function.
+func Convert_scheduling_PodGroupCondition_To_v1beta1_PodGroupCondition(in *scheduling.PodGroupCondition, out *PodGroupCondition, s conversion.Scope) error {
+	return autoConvert_scheduling_PodGroupCondition_To_v1beta1_PodGroupCondition(in, out, s)
+}
+
+func autoConvert_v1beta1_PodGroupList_To_scheduling_PodGroupList(in *PodGroupList, out *scheduling.PodGroupList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]scheduling.PodGroup)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta1_PodGroupList_To_scheduling_PodGroupList is an autogenerated conversion function.
+func Convert_v1beta1_PodGroupList_To_scheduling_PodGroupList(in *PodGroupList, out *scheduling.PodGroupList, s conversion.Scope) error {
+	return autoConvert_v1beta1_PodGroupList_To_scheduling_PodGroupList(in, out, s)
+}
+
+func autoConvert_scheduling_PodGroupList_To_v1beta1_PodGroupList(in *scheduling.PodGroupList, out *PodGroupList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]PodGroup)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_scheduling_PodGroupList_To_v1beta1_PodGroupList is an autogenerated conversion function.
+func Convert_scheduling_PodGroupList_To_v1beta1_PodGroupList(in *scheduling.PodGroupList, out *PodGroupList, s conversion.Scope) error {
+	return autoConvert_scheduling_PodGroupList_To_v1beta1_PodGroupList(in, out, s)
+}
+
+func autoConvert_v1beta1_PodGroupSpec_To_scheduling_PodGroupSpec(in *PodGroupSpec, out *scheduling.PodGroupSpec, s conversion.Scope) error {
+	out.MinMember = in.MinMember
+	out.MinTaskMember = *(*map[string]int32)(unsafe.Pointer(&in.MinTaskMember))
+	out.Queue = in.Queue
+	out.PriorityClassName = in.PriorityClassName
+	out.MinResources = (*v1.ResourceList)(unsafe.Pointer(in.MinResources))
+	out.NetworkTopology = (*scheduling.NetworkTopologySpec)(unsafe.Pointer(in.NetworkTopology))
+	return nil
+}
+
+// Convert_v1beta1_PodGroupSpec_To_scheduling_PodGroupSpec is an autogenerated conversion function.
+func Convert_v1beta1_PodGroupSpec_To_scheduling_PodGroupSpec(in *PodGroupSpec, out *scheduling.PodGroupSpec, s conversion.Scope) error {
+	return autoConvert_v1beta1_PodGroupSpec_To_scheduling_PodGroupSpec(in, out, s)
+}
+
+func autoConvert_scheduling_PodGroupSpec_To_v1beta1_PodGroupSpec(in *scheduling.PodGroupSpec, out *PodGroupSpec, s conversion.Scope) error {
+	out.MinMember = in.MinMember
+	out.MinTaskMember = *(*map[string]int32)(unsafe.Pointer(&in.MinTaskMember))
+	out.Queue = in.Queue
+	out.PriorityClassName = in.PriorityClassName
+	out.MinResources = (*v1.ResourceList)(unsafe.Pointer(in.MinResources))
+	out.NetworkTopology = (*NetworkTopologySpec)(unsafe.Pointer(in.NetworkTopology))
+	return nil
+}
+
+// Convert_scheduling_PodGroupSpec_To_v1beta1_PodGroupSpec is an autogenerated conversion function.
+func Convert_scheduling_PodGroupSpec_To_v1beta1_PodGroupSpec(in *scheduling.PodGroupSpec, out *PodGroupSpec, s conversion.Scope) error {
+	return autoConvert_scheduling_PodGroupSpec_To_v1beta1_PodGroupSpec(in, out, s)
+}
+
+func autoConvert_v1beta1_PodGroupStatus_To_scheduling_PodGroupStatus(in *PodGroupStatus, out *scheduling.PodGroupStatus, s conversion.Scope) error {
+	out.Phase = scheduling.PodGroupPhase(in.Phase)
+	out.Conditions = *(*[]scheduling.PodGroupCondition)(unsafe.Pointer(&in.Conditions))
+	out.Running = in.Running
+	out.Succeeded = in.Succeeded
+	out.Failed = in.Failed
+	return nil
+}
+
+// Convert_v1beta1_PodGroupStatus_To_scheduling_PodGroupStatus is an autogenerated conversion function.
+func Convert_v1beta1_PodGroupStatus_To_scheduling_PodGroupStatus(in *PodGroupStatus, out *scheduling.PodGroupStatus, s conversion.Scope) error {
+	return autoConvert_v1beta1_PodGroupStatus_To_scheduling_PodGroupStatus(in, out, s)
+}
+
+func autoConvert_scheduling_PodGroupStatus_To_v1beta1_PodGroupStatus(in *scheduling.PodGroupStatus, out *PodGroupStatus, s conversion.Scope) error {
+	out.Phase = PodGroupPhase(in.Phase)
+	out.Conditions = *(*[]PodGroupCondition)(unsafe.Pointer(&in.Conditions))
+	out.Running = in.Running
+	out.Succeeded = in.Succeeded
+	out.Failed = in.Failed
+	return nil
+}
+
+// Convert_scheduling_PodGroupStatus_To_v1beta1_PodGroupStatus is an autogenerated conversion function.
+func Convert_scheduling_PodGroupStatus_To_v1beta1_PodGroupStatus(in *scheduling.PodGroupStatus, out *PodGroupStatus, s conversion.Scope) error {
+	return autoConvert_scheduling_PodGroupStatus_To_v1beta1_PodGroupStatus(in, out, s)
+}
+
+func autoConvert_v1beta1_Queue_To_scheduling_Queue(in *Queue, out *scheduling.Queue, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_v1beta1_QueueSpec_To_scheduling_QueueSpec(&in.Spec, &out.Spec, s); err != nil {
+		return err
+	}
+	if err := Convert_v1beta1_QueueStatus_To_scheduling_QueueStatus(&in.Status, &out.Status, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_v1beta1_Queue_To_scheduling_Queue is an autogenerated conversion function.
+func Convert_v1beta1_Queue_To_scheduling_Queue(in *Queue, out *scheduling.Queue, s conversion.Scope) error {
+	return autoConvert_v1beta1_Queue_To_scheduling_Queue(in, out, s)
+}
+
+func autoConvert_scheduling_Queue_To_v1beta1_Queue(in *scheduling.Queue, out *Queue, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_scheduling_QueueSpec_To_v1beta1_QueueSpec(&in.Spec, &out.Spec, s); err != nil {
+		return err
+	}
+	if err := Convert_scheduling_QueueStatus_To_v1beta1_QueueStatus(&in.Status, &out.Status, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_scheduling_Queue_To_v1beta1_Queue is an autogenerated conversion function.
+func Convert_scheduling_Queue_To_v1beta1_Queue(in *scheduling.Queue, out *Queue, s conversion.Scope) error {
+	return autoConvert_scheduling_Queue_To_v1beta1_Queue(in, out, s)
+}
+
+func autoConvert_v1beta1_QueueList_To_scheduling_QueueList(in *QueueList, out *scheduling.QueueList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]scheduling.Queue, len(*in))
+		for i := range *in {
+			if err := Convert_v1beta1_Queue_To_scheduling_Queue(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
+	return nil
+}
+
+// Convert_v1beta1_QueueList_To_scheduling_QueueList is an autogenerated conversion function.
+func Convert_v1beta1_QueueList_To_scheduling_QueueList(in *QueueList, out *scheduling.QueueList, s conversion.Scope) error {
+	return autoConvert_v1beta1_QueueList_To_scheduling_QueueList(in, out, s)
+}
+
+func autoConvert_scheduling_QueueList_To_v1beta1_QueueList(in *scheduling.QueueList, out *QueueList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Queue, len(*in))
+		for i := range *in {
+			if err := Convert_scheduling_Queue_To_v1beta1_Queue(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
+	return nil
+}
+
+// Convert_scheduling_QueueList_To_v1beta1_QueueList is an autogenerated conversion function.
+func Convert_scheduling_QueueList_To_v1beta1_QueueList(in *scheduling.QueueList, out *QueueList, s conversion.Scope) error {
+	return autoConvert_scheduling_QueueList_To_v1beta1_QueueList(in, out, s)
+}
+
+func autoConvert_v1beta1_QueueSpec_To_scheduling_QueueSpec(in *QueueSpec, out *scheduling.QueueSpec, s conversion.Scope) error {
+	out.Weight = in.Weight
+	out.Capability = *(*v1.ResourceList)(unsafe.Pointer(&in.Capability))
+	out.Reclaimable = (*bool)(unsafe.Pointer(in.Reclaimable))
+	out.ExtendClusters = *(*[]scheduling.Cluster)(unsafe.Pointer(&in.ExtendClusters))
+	if err := Convert_v1beta1_Guarantee_To_scheduling_Guarantee(&in.Guarantee, &out.Guarantee, s); err != nil {
+		return err
+	}
+	out.Affinity = (*scheduling.Affinity)(unsafe.Pointer(in.Affinity))
+	out.Type = in.Type
+	out.Parent = in.Parent
+	out.Deserved = *(*v1.ResourceList)(unsafe.Pointer(&in.Deserved))
+	out.Priority = in.Priority
+	return nil
+}
+
+// Convert_v1beta1_QueueSpec_To_scheduling_QueueSpec is an autogenerated conversion function.
+func Convert_v1beta1_QueueSpec_To_scheduling_QueueSpec(in *QueueSpec, out *scheduling.QueueSpec, s conversion.Scope) error {
+	return autoConvert_v1beta1_QueueSpec_To_scheduling_QueueSpec(in, out, s)
+}
+
+func autoConvert_scheduling_QueueSpec_To_v1beta1_QueueSpec(in *scheduling.QueueSpec, out *QueueSpec, s conversion.Scope) error {
+	out.Weight = in.Weight
+	out.Capability = *(*v1.ResourceList)(unsafe.Pointer(&in.Capability))
+	// WARNING: in.State requires manual conversion: does not exist in peer-type
+	out.Reclaimable = (*bool)(unsafe.Pointer(in.Reclaimable))
+	out.ExtendClusters = *(*[]Cluster)(unsafe.Pointer(&in.ExtendClusters))
+	if err := Convert_scheduling_Guarantee_To_v1beta1_Guarantee(&in.Guarantee, &out.Guarantee, s); err != nil {
+		return err
+	}
+	out.Affinity = (*Affinity)(unsafe.Pointer(in.Affinity))
+	out.Type = in.Type
+	out.Parent = in.Parent
+	out.Deserved = *(*v1.ResourceList)(unsafe.Pointer(&in.Deserved))
+	out.Priority = in.Priority
+	return nil
+}
+
+func autoConvert_v1beta1_QueueStatus_To_scheduling_QueueStatus(in *QueueStatus, out *scheduling.QueueStatus, s conversion.Scope) error {
+	out.State = scheduling.QueueState(in.State)
+	out.Unknown = in.Unknown
+	out.Pending = in.Pending
+	out.Running = in.Running
+	out.Inqueue = in.Inqueue
+	out.Completed = in.Completed
+	if err := Convert_v1beta1_Reservation_To_scheduling_Reservation(&in.Reservation, &out.Reservation, s); err != nil {
+		return err
+	}
+	out.Allocated = *(*v1.ResourceList)(unsafe.Pointer(&in.Allocated))
+	return nil
+}
+
+// Convert_v1beta1_QueueStatus_To_scheduling_QueueStatus is an autogenerated conversion function.
+func Convert_v1beta1_QueueStatus_To_scheduling_QueueStatus(in *QueueStatus, out *scheduling.QueueStatus, s conversion.Scope) error {
+	return autoConvert_v1beta1_QueueStatus_To_scheduling_QueueStatus(in, out, s)
+}
+
+func autoConvert_scheduling_QueueStatus_To_v1beta1_QueueStatus(in *scheduling.QueueStatus, out *QueueStatus, s conversion.Scope) error {
+	out.State = QueueState(in.State)
+	out.Unknown = in.Unknown
+	out.Pending = in.Pending
+	out.Running = in.Running
+	out.Inqueue = in.Inqueue
+	out.Completed = in.Completed
+	if err := Convert_scheduling_Reservation_To_v1beta1_Reservation(&in.Reservation, &out.Reservation, s); err != nil {
+		return err
+	}
+	out.Allocated = *(*v1.ResourceList)(unsafe.Pointer(&in.Allocated))
+	return nil
+}
+
+// Convert_scheduling_QueueStatus_To_v1beta1_QueueStatus is an autogenerated conversion function.
+func Convert_scheduling_QueueStatus_To_v1beta1_QueueStatus(in *scheduling.QueueStatus, out *QueueStatus, s conversion.Scope) error {
+	return autoConvert_scheduling_QueueStatus_To_v1beta1_QueueStatus(in, out, s)
+}
+
+func autoConvert_v1beta1_Reservation_To_scheduling_Reservation(in *Reservation, out *scheduling.Reservation, s conversion.Scope) error {
+	out.Nodes = *(*[]string)(unsafe.Pointer(&in.Nodes))
+	out.Resource = *(*v1.ResourceList)(unsafe.Pointer(&in.Resource))
+	return nil
+}
+
+// Convert_v1beta1_Reservation_To_scheduling_Reservation is an autogenerated conversion function.
+func Convert_v1beta1_Reservation_To_scheduling_Reservation(in *Reservation, out *scheduling.Reservation, s conversion.Scope) error {
+	return autoConvert_v1beta1_Reservation_To_scheduling_Reservation(in, out, s)
+}
+
+func autoConvert_scheduling_Reservation_To_v1beta1_Reservation(in *scheduling.Reservation, out *Reservation, s conversion.Scope) error {
+	out.Nodes = *(*[]string)(unsafe.Pointer(&in.Nodes))
+	out.Resource = *(*v1.ResourceList)(unsafe.Pointer(&in.Resource))
+	return nil
+}
+
+// Convert_scheduling_Reservation_To_v1beta1_Reservation is an autogenerated conversion function.
+func Convert_scheduling_Reservation_To_v1beta1_Reservation(in *scheduling.Reservation, out *Reservation, s conversion.Scope) error {
+	return autoConvert_scheduling_Reservation_To_v1beta1_Reservation(in, out, s)
+}
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/zz_generated.deepcopy.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/zz_generated.deepcopy.go
new file mode 100644
index 000000000..996c5f56b
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/v1beta1/zz_generated.deepcopy.go
@@ -0,0 +1,473 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+	resource "k8s.io/apimachinery/pkg/api/resource"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Affinity) DeepCopyInto(out *Affinity) {
+	*out = *in
+	if in.NodeGroupAffinity != nil {
+		in, out := &in.NodeGroupAffinity, &out.NodeGroupAffinity
+		*out = new(NodeGroupAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.NodeGroupAntiAffinity != nil {
+		in, out := &in.NodeGroupAntiAffinity, &out.NodeGroupAntiAffinity
+		*out = new(NodeGroupAntiAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Affinity.
+func (in *Affinity) DeepCopy() *Affinity {
+	if in == nil {
+		return nil
+	}
+	out := new(Affinity)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Cluster) DeepCopyInto(out *Cluster) {
+	*out = *in
+	if in.Capacity != nil {
+		in, out := &in.Capacity, &out.Capacity
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Cluster.
+func (in *Cluster) DeepCopy() *Cluster {
+	if in == nil {
+		return nil
+	}
+	out := new(Cluster)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Guarantee) DeepCopyInto(out *Guarantee) {
+	*out = *in
+	if in.Resource != nil {
+		in, out := &in.Resource, &out.Resource
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Guarantee.
+func (in *Guarantee) DeepCopy() *Guarantee {
+	if in == nil {
+		return nil
+	}
+	out := new(Guarantee)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NetworkTopologySpec) DeepCopyInto(out *NetworkTopologySpec) {
+	*out = *in
+	if in.HighestTierAllowed != nil {
+		in, out := &in.HighestTierAllowed, &out.HighestTierAllowed
+		*out = new(int)
+		**out = **in
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkTopologySpec.
+func (in *NetworkTopologySpec) DeepCopy() *NetworkTopologySpec {
+	if in == nil {
+		return nil
+	}
+	out := new(NetworkTopologySpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeGroupAffinity) DeepCopyInto(out *NodeGroupAffinity) {
+	*out = *in
+	if in.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeGroupAffinity.
+func (in *NodeGroupAffinity) DeepCopy() *NodeGroupAffinity {
+	if in == nil {
+		return nil
+	}
+	out := new(NodeGroupAffinity)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeGroupAntiAffinity) DeepCopyInto(out *NodeGroupAntiAffinity) {
+	*out = *in
+	if in.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeGroupAntiAffinity.
+func (in *NodeGroupAntiAffinity) DeepCopy() *NodeGroupAntiAffinity {
+	if in == nil {
+		return nil
+	}
+	out := new(NodeGroupAntiAffinity)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroup) DeepCopyInto(out *PodGroup) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroup.
+func (in *PodGroup) DeepCopy() *PodGroup {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroup)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodGroup) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupCondition) DeepCopyInto(out *PodGroupCondition) {
+	*out = *in
+	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupCondition.
+func (in *PodGroupCondition) DeepCopy() *PodGroupCondition {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupCondition)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupList) DeepCopyInto(out *PodGroupList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]PodGroup, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupList.
+func (in *PodGroupList) DeepCopy() *PodGroupList {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodGroupList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupSpec) DeepCopyInto(out *PodGroupSpec) {
+	*out = *in
+	if in.MinTaskMember != nil {
+		in, out := &in.MinTaskMember, &out.MinTaskMember
+		*out = make(map[string]int32, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.MinResources != nil {
+		in, out := &in.MinResources, &out.MinResources
+		*out = new(v1.ResourceList)
+		if **in != nil {
+			in, out := *in, *out
+			*out = make(map[v1.ResourceName]resource.Quantity, len(*in))
+			for key, val := range *in {
+				(*out)[key] = val.DeepCopy()
+			}
+		}
+	}
+	if in.NetworkTopology != nil {
+		in, out := &in.NetworkTopology, &out.NetworkTopology
+		*out = new(NetworkTopologySpec)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupSpec.
+func (in *PodGroupSpec) DeepCopy() *PodGroupSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupStatus) DeepCopyInto(out *PodGroupStatus) {
+	*out = *in
+	if in.Conditions != nil {
+		in, out := &in.Conditions, &out.Conditions
+		*out = make([]PodGroupCondition, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupStatus.
+func (in *PodGroupStatus) DeepCopy() *PodGroupStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Queue) DeepCopyInto(out *Queue) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Queue.
+func (in *Queue) DeepCopy() *Queue {
+	if in == nil {
+		return nil
+	}
+	out := new(Queue)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Queue) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QueueList) DeepCopyInto(out *QueueList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Queue, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueList.
+func (in *QueueList) DeepCopy() *QueueList {
+	if in == nil {
+		return nil
+	}
+	out := new(QueueList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *QueueList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QueueSpec) DeepCopyInto(out *QueueSpec) {
+	*out = *in
+	if in.Capability != nil {
+		in, out := &in.Capability, &out.Capability
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	if in.Reclaimable != nil {
+		in, out := &in.Reclaimable, &out.Reclaimable
+		*out = new(bool)
+		**out = **in
+	}
+	if in.ExtendClusters != nil {
+		in, out := &in.ExtendClusters, &out.ExtendClusters
+		*out = make([]Cluster, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	in.Guarantee.DeepCopyInto(&out.Guarantee)
+	if in.Affinity != nil {
+		in, out := &in.Affinity, &out.Affinity
+		*out = new(Affinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Deserved != nil {
+		in, out := &in.Deserved, &out.Deserved
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueSpec.
+func (in *QueueSpec) DeepCopy() *QueueSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(QueueSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QueueStatus) DeepCopyInto(out *QueueStatus) {
+	*out = *in
+	in.Reservation.DeepCopyInto(&out.Reservation)
+	if in.Allocated != nil {
+		in, out := &in.Allocated, &out.Allocated
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueStatus.
+func (in *QueueStatus) DeepCopy() *QueueStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(QueueStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Reservation) DeepCopyInto(out *Reservation) {
+	*out = *in
+	if in.Nodes != nil {
+		in, out := &in.Nodes, &out.Nodes
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Resource != nil {
+		in, out := &in.Resource, &out.Resource
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Reservation.
+func (in *Reservation) DeepCopy() *Reservation {
+	if in == nil {
+		return nil
+	}
+	out := new(Reservation)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/vendor/volcano.sh/apis/pkg/apis/scheduling/zz_generated.deepcopy.go b/vendor/volcano.sh/apis/pkg/apis/scheduling/zz_generated.deepcopy.go
new file mode 100644
index 000000000..2e0e999e1
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/apis/scheduling/zz_generated.deepcopy.go
@@ -0,0 +1,473 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package scheduling
+
+import (
+	v1 "k8s.io/api/core/v1"
+	resource "k8s.io/apimachinery/pkg/api/resource"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Affinity) DeepCopyInto(out *Affinity) {
+	*out = *in
+	if in.NodeGroupAffinity != nil {
+		in, out := &in.NodeGroupAffinity, &out.NodeGroupAffinity
+		*out = new(NodeGroupAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.NodeGroupAntiAffinity != nil {
+		in, out := &in.NodeGroupAntiAffinity, &out.NodeGroupAntiAffinity
+		*out = new(NodeGroupAntiAffinity)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Affinity.
+func (in *Affinity) DeepCopy() *Affinity {
+	if in == nil {
+		return nil
+	}
+	out := new(Affinity)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Cluster) DeepCopyInto(out *Cluster) {
+	*out = *in
+	if in.Capacity != nil {
+		in, out := &in.Capacity, &out.Capacity
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Cluster.
+func (in *Cluster) DeepCopy() *Cluster {
+	if in == nil {
+		return nil
+	}
+	out := new(Cluster)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Guarantee) DeepCopyInto(out *Guarantee) {
+	*out = *in
+	if in.Resource != nil {
+		in, out := &in.Resource, &out.Resource
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Guarantee.
+func (in *Guarantee) DeepCopy() *Guarantee {
+	if in == nil {
+		return nil
+	}
+	out := new(Guarantee)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NetworkTopologySpec) DeepCopyInto(out *NetworkTopologySpec) {
+	*out = *in
+	if in.HighestTierAllowed != nil {
+		in, out := &in.HighestTierAllowed, &out.HighestTierAllowed
+		*out = new(int)
+		**out = **in
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkTopologySpec.
+func (in *NetworkTopologySpec) DeepCopy() *NetworkTopologySpec {
+	if in == nil {
+		return nil
+	}
+	out := new(NetworkTopologySpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeGroupAffinity) DeepCopyInto(out *NodeGroupAffinity) {
+	*out = *in
+	if in.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeGroupAffinity.
+func (in *NodeGroupAffinity) DeepCopy() *NodeGroupAffinity {
+	if in == nil {
+		return nil
+	}
+	out := new(NodeGroupAffinity)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeGroupAntiAffinity) DeepCopyInto(out *NodeGroupAntiAffinity) {
+	*out = *in
+	if in.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+		in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeGroupAntiAffinity.
+func (in *NodeGroupAntiAffinity) DeepCopy() *NodeGroupAntiAffinity {
+	if in == nil {
+		return nil
+	}
+	out := new(NodeGroupAntiAffinity)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroup) DeepCopyInto(out *PodGroup) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroup.
+func (in *PodGroup) DeepCopy() *PodGroup {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroup)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodGroup) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupCondition) DeepCopyInto(out *PodGroupCondition) {
+	*out = *in
+	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupCondition.
+func (in *PodGroupCondition) DeepCopy() *PodGroupCondition {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupCondition)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupList) DeepCopyInto(out *PodGroupList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]PodGroup, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupList.
+func (in *PodGroupList) DeepCopy() *PodGroupList {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodGroupList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupSpec) DeepCopyInto(out *PodGroupSpec) {
+	*out = *in
+	if in.MinTaskMember != nil {
+		in, out := &in.MinTaskMember, &out.MinTaskMember
+		*out = make(map[string]int32, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.MinResources != nil {
+		in, out := &in.MinResources, &out.MinResources
+		*out = new(v1.ResourceList)
+		if **in != nil {
+			in, out := *in, *out
+			*out = make(map[v1.ResourceName]resource.Quantity, len(*in))
+			for key, val := range *in {
+				(*out)[key] = val.DeepCopy()
+			}
+		}
+	}
+	if in.NetworkTopology != nil {
+		in, out := &in.NetworkTopology, &out.NetworkTopology
+		*out = new(NetworkTopologySpec)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupSpec.
+func (in *PodGroupSpec) DeepCopy() *PodGroupSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodGroupStatus) DeepCopyInto(out *PodGroupStatus) {
+	*out = *in
+	if in.Conditions != nil {
+		in, out := &in.Conditions, &out.Conditions
+		*out = make([]PodGroupCondition, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGroupStatus.
+func (in *PodGroupStatus) DeepCopy() *PodGroupStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(PodGroupStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Queue) DeepCopyInto(out *Queue) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Queue.
+func (in *Queue) DeepCopy() *Queue {
+	if in == nil {
+		return nil
+	}
+	out := new(Queue)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Queue) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QueueList) DeepCopyInto(out *QueueList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Queue, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueList.
+func (in *QueueList) DeepCopy() *QueueList {
+	if in == nil {
+		return nil
+	}
+	out := new(QueueList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *QueueList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QueueSpec) DeepCopyInto(out *QueueSpec) {
+	*out = *in
+	if in.Capability != nil {
+		in, out := &in.Capability, &out.Capability
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	if in.Reclaimable != nil {
+		in, out := &in.Reclaimable, &out.Reclaimable
+		*out = new(bool)
+		**out = **in
+	}
+	if in.ExtendClusters != nil {
+		in, out := &in.ExtendClusters, &out.ExtendClusters
+		*out = make([]Cluster, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	in.Guarantee.DeepCopyInto(&out.Guarantee)
+	if in.Affinity != nil {
+		in, out := &in.Affinity, &out.Affinity
+		*out = new(Affinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Deserved != nil {
+		in, out := &in.Deserved, &out.Deserved
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueSpec.
+func (in *QueueSpec) DeepCopy() *QueueSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(QueueSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QueueStatus) DeepCopyInto(out *QueueStatus) {
+	*out = *in
+	in.Reservation.DeepCopyInto(&out.Reservation)
+	if in.Allocated != nil {
+		in, out := &in.Allocated, &out.Allocated
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueStatus.
+func (in *QueueStatus) DeepCopy() *QueueStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(QueueStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Reservation) DeepCopyInto(out *Reservation) {
+	*out = *in
+	if in.Nodes != nil {
+		in, out := &in.Nodes, &out.Nodes
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Resource != nil {
+		in, out := &in.Resource, &out.Resource
+		*out = make(v1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Reservation.
+func (in *Reservation) DeepCopy() *Reservation {
+	if in == nil {
+		return nil
+	}
+	out := new(Reservation)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/affinity.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/affinity.go
new file mode 100644
index 000000000..5d141a9e7
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/affinity.go
@@ -0,0 +1,47 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+// AffinityApplyConfiguration represents a declarative configuration of the Affinity type for use
+// with apply.
+type AffinityApplyConfiguration struct {
+	NodeGroupAffinity     *NodeGroupAffinityApplyConfiguration     `json:"nodeGroupAffinity,omitempty"`
+	NodeGroupAntiAffinity *NodeGroupAntiAffinityApplyConfiguration `json:"nodeGroupAntiAffinity,omitempty"`
+}
+
+// AffinityApplyConfiguration constructs a declarative configuration of the Affinity type for use with
+// apply.
+func Affinity() *AffinityApplyConfiguration {
+	return &AffinityApplyConfiguration{}
+}
+
+// WithNodeGroupAffinity sets the NodeGroupAffinity field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the NodeGroupAffinity field is set to the value of the last call.
+func (b *AffinityApplyConfiguration) WithNodeGroupAffinity(value *NodeGroupAffinityApplyConfiguration) *AffinityApplyConfiguration {
+	b.NodeGroupAffinity = value
+	return b
+}
+
+// WithNodeGroupAntiAffinity sets the NodeGroupAntiAffinity field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the NodeGroupAntiAffinity field is set to the value of the last call.
+func (b *AffinityApplyConfiguration) WithNodeGroupAntiAffinity(value *NodeGroupAntiAffinityApplyConfiguration) *AffinityApplyConfiguration {
+	b.NodeGroupAntiAffinity = value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/cluster.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/cluster.go
new file mode 100644
index 000000000..1594d0f65
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/cluster.go
@@ -0,0 +1,60 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+)
+
+// ClusterApplyConfiguration represents a declarative configuration of the Cluster type for use
+// with apply.
+type ClusterApplyConfiguration struct {
+	Name     *string          `json:"name,omitempty"`
+	Weight   *int32           `json:"weight,omitempty"`
+	Capacity *v1.ResourceList `json:"capacity,omitempty"`
+}
+
+// ClusterApplyConfiguration constructs a declarative configuration of the Cluster type for use with
+// apply.
+func Cluster() *ClusterApplyConfiguration {
+	return &ClusterApplyConfiguration{}
+}
+
+// WithName sets the Name field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Name field is set to the value of the last call.
+func (b *ClusterApplyConfiguration) WithName(value string) *ClusterApplyConfiguration {
+	b.Name = &value
+	return b
+}
+
+// WithWeight sets the Weight field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Weight field is set to the value of the last call.
+func (b *ClusterApplyConfiguration) WithWeight(value int32) *ClusterApplyConfiguration {
+	b.Weight = &value
+	return b
+}
+
+// WithCapacity sets the Capacity field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Capacity field is set to the value of the last call.
+func (b *ClusterApplyConfiguration) WithCapacity(value v1.ResourceList) *ClusterApplyConfiguration {
+	b.Capacity = &value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/guarantee.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/guarantee.go
new file mode 100644
index 000000000..5efa54ec9
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/guarantee.go
@@ -0,0 +1,42 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+)
+
+// GuaranteeApplyConfiguration represents a declarative configuration of the Guarantee type for use
+// with apply.
+type GuaranteeApplyConfiguration struct {
+	Resource *v1.ResourceList `json:"resource,omitempty"`
+}
+
+// GuaranteeApplyConfiguration constructs a declarative configuration of the Guarantee type for use with
+// apply.
+func Guarantee() *GuaranteeApplyConfiguration {
+	return &GuaranteeApplyConfiguration{}
+}
+
+// WithResource sets the Resource field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Resource field is set to the value of the last call.
+func (b *GuaranteeApplyConfiguration) WithResource(value v1.ResourceList) *GuaranteeApplyConfiguration {
+	b.Resource = &value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/networktopologyspec.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/networktopologyspec.go
new file mode 100644
index 000000000..887393ad3
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/networktopologyspec.go
@@ -0,0 +1,51 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
+)
+
+// NetworkTopologySpecApplyConfiguration represents a declarative configuration of the NetworkTopologySpec type for use
+// with apply.
+type NetworkTopologySpecApplyConfiguration struct {
+	Mode               *v1beta1.NetworkTopologyMode `json:"mode,omitempty"`
+	HighestTierAllowed *int                         `json:"highestTierAllowed,omitempty"`
+}
+
+// NetworkTopologySpecApplyConfiguration constructs a declarative configuration of the NetworkTopologySpec type for use with
+// apply.
+func NetworkTopologySpec() *NetworkTopologySpecApplyConfiguration {
+	return &NetworkTopologySpecApplyConfiguration{}
+}
+
+// WithMode sets the Mode field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Mode field is set to the value of the last call.
+func (b *NetworkTopologySpecApplyConfiguration) WithMode(value v1beta1.NetworkTopologyMode) *NetworkTopologySpecApplyConfiguration {
+	b.Mode = &value
+	return b
+}
+
+// WithHighestTierAllowed sets the HighestTierAllowed field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the HighestTierAllowed field is set to the value of the last call.
+func (b *NetworkTopologySpecApplyConfiguration) WithHighestTierAllowed(value int) *NetworkTopologySpecApplyConfiguration {
+	b.HighestTierAllowed = &value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/nodegroupaffinity.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/nodegroupaffinity.go
new file mode 100644
index 000000000..ddb9f1ab8
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/nodegroupaffinity.go
@@ -0,0 +1,51 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+// NodeGroupAffinityApplyConfiguration represents a declarative configuration of the NodeGroupAffinity type for use
+// with apply.
+type NodeGroupAffinityApplyConfiguration struct {
+	RequiredDuringSchedulingIgnoredDuringExecution  []string `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty"`
+	PreferredDuringSchedulingIgnoredDuringExecution []string `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty"`
+}
+
+// NodeGroupAffinityApplyConfiguration constructs a declarative configuration of the NodeGroupAffinity type for use with
+// apply.
+func NodeGroupAffinity() *NodeGroupAffinityApplyConfiguration {
+	return &NodeGroupAffinityApplyConfiguration{}
+}
+
+// WithRequiredDuringSchedulingIgnoredDuringExecution adds the given value to the RequiredDuringSchedulingIgnoredDuringExecution field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the RequiredDuringSchedulingIgnoredDuringExecution field.
+func (b *NodeGroupAffinityApplyConfiguration) WithRequiredDuringSchedulingIgnoredDuringExecution(values ...string) *NodeGroupAffinityApplyConfiguration {
+	for i := range values {
+		b.RequiredDuringSchedulingIgnoredDuringExecution = append(b.RequiredDuringSchedulingIgnoredDuringExecution, values[i])
+	}
+	return b
+}
+
+// WithPreferredDuringSchedulingIgnoredDuringExecution adds the given value to the PreferredDuringSchedulingIgnoredDuringExecution field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the PreferredDuringSchedulingIgnoredDuringExecution field.
+func (b *NodeGroupAffinityApplyConfiguration) WithPreferredDuringSchedulingIgnoredDuringExecution(values ...string) *NodeGroupAffinityApplyConfiguration {
+	for i := range values {
+		b.PreferredDuringSchedulingIgnoredDuringExecution = append(b.PreferredDuringSchedulingIgnoredDuringExecution, values[i])
+	}
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/nodegroupantiaffinity.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/nodegroupantiaffinity.go
new file mode 100644
index 000000000..6b4cca280
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/nodegroupantiaffinity.go
@@ -0,0 +1,51 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+// NodeGroupAntiAffinityApplyConfiguration represents a declarative configuration of the NodeGroupAntiAffinity type for use
+// with apply.
+type NodeGroupAntiAffinityApplyConfiguration struct {
+	RequiredDuringSchedulingIgnoredDuringExecution  []string `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty"`
+	PreferredDuringSchedulingIgnoredDuringExecution []string `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty"`
+}
+
+// NodeGroupAntiAffinityApplyConfiguration constructs a declarative configuration of the NodeGroupAntiAffinity type for use with
+// apply.
+func NodeGroupAntiAffinity() *NodeGroupAntiAffinityApplyConfiguration {
+	return &NodeGroupAntiAffinityApplyConfiguration{}
+}
+
+// WithRequiredDuringSchedulingIgnoredDuringExecution adds the given value to the RequiredDuringSchedulingIgnoredDuringExecution field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the RequiredDuringSchedulingIgnoredDuringExecution field.
+func (b *NodeGroupAntiAffinityApplyConfiguration) WithRequiredDuringSchedulingIgnoredDuringExecution(values ...string) *NodeGroupAntiAffinityApplyConfiguration {
+	for i := range values {
+		b.RequiredDuringSchedulingIgnoredDuringExecution = append(b.RequiredDuringSchedulingIgnoredDuringExecution, values[i])
+	}
+	return b
+}
+
+// WithPreferredDuringSchedulingIgnoredDuringExecution adds the given value to the PreferredDuringSchedulingIgnoredDuringExecution field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the PreferredDuringSchedulingIgnoredDuringExecution field.
+func (b *NodeGroupAntiAffinityApplyConfiguration) WithPreferredDuringSchedulingIgnoredDuringExecution(values ...string) *NodeGroupAntiAffinityApplyConfiguration {
+	for i := range values {
+		b.PreferredDuringSchedulingIgnoredDuringExecution = append(b.PreferredDuringSchedulingIgnoredDuringExecution, values[i])
+	}
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroup.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroup.go
new file mode 100644
index 000000000..37fef63dc
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroup.go
@@ -0,0 +1,224 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	v1 "k8s.io/client-go/applyconfigurations/meta/v1"
+)
+
+// PodGroupApplyConfiguration represents a declarative configuration of the PodGroup type for use
+// with apply.
+type PodGroupApplyConfiguration struct {
+	v1.TypeMetaApplyConfiguration    `json:",inline"`
+	*v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
+	Spec                             *PodGroupSpecApplyConfiguration   `json:"spec,omitempty"`
+	Status                           *PodGroupStatusApplyConfiguration `json:"status,omitempty"`
+}
+
+// PodGroup constructs a declarative configuration of the PodGroup type for use with
+// apply.
+func PodGroup(name, namespace string) *PodGroupApplyConfiguration {
+	b := &PodGroupApplyConfiguration{}
+	b.WithName(name)
+	b.WithNamespace(namespace)
+	b.WithKind("PodGroup")
+	b.WithAPIVersion("scheduling.volcano.sh/v1beta1")
+	return b
+}
+
+// WithKind sets the Kind field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Kind field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithKind(value string) *PodGroupApplyConfiguration {
+	b.TypeMetaApplyConfiguration.Kind = &value
+	return b
+}
+
+// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the APIVersion field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithAPIVersion(value string) *PodGroupApplyConfiguration {
+	b.TypeMetaApplyConfiguration.APIVersion = &value
+	return b
+}
+
+// WithName sets the Name field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Name field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithName(value string) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Name = &value
+	return b
+}
+
+// WithGenerateName sets the GenerateName field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the GenerateName field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithGenerateName(value string) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.GenerateName = &value
+	return b
+}
+
+// WithNamespace sets the Namespace field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Namespace field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithNamespace(value string) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Namespace = &value
+	return b
+}
+
+// WithUID sets the UID field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the UID field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithUID(value types.UID) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.UID = &value
+	return b
+}
+
+// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the ResourceVersion field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithResourceVersion(value string) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.ResourceVersion = &value
+	return b
+}
+
+// WithGeneration sets the Generation field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Generation field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithGeneration(value int64) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Generation = &value
+	return b
+}
+
+// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the CreationTimestamp field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.CreationTimestamp = &value
+	return b
+}
+
+// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the DeletionTimestamp field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionTimestamp = &value
+	return b
+}
+
+// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionGracePeriodSeconds = &value
+	return b
+}
+
+// WithLabels puts the entries into the Labels field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Labels field,
+// overwriting an existing map entries in Labels field with the same key.
+func (b *PodGroupApplyConfiguration) WithLabels(entries map[string]string) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Labels == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Labels = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Labels[k] = v
+	}
+	return b
+}
+
+// WithAnnotations puts the entries into the Annotations field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Annotations field,
+// overwriting an existing map entries in Annotations field with the same key.
+func (b *PodGroupApplyConfiguration) WithAnnotations(entries map[string]string) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Annotations == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Annotations = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Annotations[k] = v
+	}
+	return b
+}
+
+// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the OwnerReferences field.
+func (b *PodGroupApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithOwnerReferences")
+		}
+		b.ObjectMetaApplyConfiguration.OwnerReferences = append(b.ObjectMetaApplyConfiguration.OwnerReferences, *values[i])
+	}
+	return b
+}
+
+// WithFinalizers adds the given value to the Finalizers field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Finalizers field.
+func (b *PodGroupApplyConfiguration) WithFinalizers(values ...string) *PodGroupApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		b.ObjectMetaApplyConfiguration.Finalizers = append(b.ObjectMetaApplyConfiguration.Finalizers, values[i])
+	}
+	return b
+}
+
+func (b *PodGroupApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
+	if b.ObjectMetaApplyConfiguration == nil {
+		b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{}
+	}
+}
+
+// WithSpec sets the Spec field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Spec field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithSpec(value *PodGroupSpecApplyConfiguration) *PodGroupApplyConfiguration {
+	b.Spec = value
+	return b
+}
+
+// WithStatus sets the Status field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Status field is set to the value of the last call.
+func (b *PodGroupApplyConfiguration) WithStatus(value *PodGroupStatusApplyConfiguration) *PodGroupApplyConfiguration {
+	b.Status = value
+	return b
+}
+
+// GetName retrieves the value of the Name field in the declarative configuration.
+func (b *PodGroupApplyConfiguration) GetName() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Name
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupcondition.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupcondition.go
new file mode 100644
index 000000000..5b2de0a24
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupcondition.go
@@ -0,0 +1,89 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	schedulingv1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
+)
+
+// PodGroupConditionApplyConfiguration represents a declarative configuration of the PodGroupCondition type for use
+// with apply.
+type PodGroupConditionApplyConfiguration struct {
+	Type               *schedulingv1beta1.PodGroupConditionType `json:"type,omitempty"`
+	Status             *v1.ConditionStatus                      `json:"status,omitempty"`
+	TransitionID       *string                                  `json:"transitionID,omitempty"`
+	LastTransitionTime *metav1.Time                             `json:"lastTransitionTime,omitempty"`
+	Reason             *string                                  `json:"reason,omitempty"`
+	Message            *string                                  `json:"message,omitempty"`
+}
+
+// PodGroupConditionApplyConfiguration constructs a declarative configuration of the PodGroupCondition type for use with
+// apply.
+func PodGroupCondition() *PodGroupConditionApplyConfiguration {
+	return &PodGroupConditionApplyConfiguration{}
+}
+
+// WithType sets the Type field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Type field is set to the value of the last call.
+func (b *PodGroupConditionApplyConfiguration) WithType(value schedulingv1beta1.PodGroupConditionType) *PodGroupConditionApplyConfiguration {
+	b.Type = &value
+	return b
+}
+
+// WithStatus sets the Status field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Status field is set to the value of the last call.
+func (b *PodGroupConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *PodGroupConditionApplyConfiguration {
+	b.Status = &value
+	return b
+}
+
+// WithTransitionID sets the TransitionID field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the TransitionID field is set to the value of the last call.
+func (b *PodGroupConditionApplyConfiguration) WithTransitionID(value string) *PodGroupConditionApplyConfiguration {
+	b.TransitionID = &value
+	return b
+}
+
+// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the LastTransitionTime field is set to the value of the last call.
+func (b *PodGroupConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *PodGroupConditionApplyConfiguration {
+	b.LastTransitionTime = &value
+	return b
+}
+
+// WithReason sets the Reason field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Reason field is set to the value of the last call.
+func (b *PodGroupConditionApplyConfiguration) WithReason(value string) *PodGroupConditionApplyConfiguration {
+	b.Reason = &value
+	return b
+}
+
+// WithMessage sets the Message field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Message field is set to the value of the last call.
+func (b *PodGroupConditionApplyConfiguration) WithMessage(value string) *PodGroupConditionApplyConfiguration {
+	b.Message = &value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupspec.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupspec.go
new file mode 100644
index 000000000..95bcdb289
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupspec.go
@@ -0,0 +1,93 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+)
+
+// PodGroupSpecApplyConfiguration represents a declarative configuration of the PodGroupSpec type for use
+// with apply.
+type PodGroupSpecApplyConfiguration struct {
+	MinMember         *int32                                 `json:"minMember,omitempty"`
+	MinTaskMember     map[string]int32                       `json:"minTaskMember,omitempty"`
+	Queue             *string                                `json:"queue,omitempty"`
+	PriorityClassName *string                                `json:"priorityClassName,omitempty"`
+	MinResources      *v1.ResourceList                       `json:"minResources,omitempty"`
+	NetworkTopology   *NetworkTopologySpecApplyConfiguration `json:"networkTopology,omitempty"`
+}
+
+// PodGroupSpecApplyConfiguration constructs a declarative configuration of the PodGroupSpec type for use with
+// apply.
+func PodGroupSpec() *PodGroupSpecApplyConfiguration {
+	return &PodGroupSpecApplyConfiguration{}
+}
+
+// WithMinMember sets the MinMember field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the MinMember field is set to the value of the last call.
+func (b *PodGroupSpecApplyConfiguration) WithMinMember(value int32) *PodGroupSpecApplyConfiguration {
+	b.MinMember = &value
+	return b
+}
+
+// WithMinTaskMember puts the entries into the MinTaskMember field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the MinTaskMember field,
+// overwriting an existing map entries in MinTaskMember field with the same key.
+func (b *PodGroupSpecApplyConfiguration) WithMinTaskMember(entries map[string]int32) *PodGroupSpecApplyConfiguration {
+	if b.MinTaskMember == nil && len(entries) > 0 {
+		b.MinTaskMember = make(map[string]int32, len(entries))
+	}
+	for k, v := range entries {
+		b.MinTaskMember[k] = v
+	}
+	return b
+}
+
+// WithQueue sets the Queue field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Queue field is set to the value of the last call.
+func (b *PodGroupSpecApplyConfiguration) WithQueue(value string) *PodGroupSpecApplyConfiguration {
+	b.Queue = &value
+	return b
+}
+
+// WithPriorityClassName sets the PriorityClassName field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the PriorityClassName field is set to the value of the last call.
+func (b *PodGroupSpecApplyConfiguration) WithPriorityClassName(value string) *PodGroupSpecApplyConfiguration {
+	b.PriorityClassName = &value
+	return b
+}
+
+// WithMinResources sets the MinResources field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the MinResources field is set to the value of the last call.
+func (b *PodGroupSpecApplyConfiguration) WithMinResources(value v1.ResourceList) *PodGroupSpecApplyConfiguration {
+	b.MinResources = &value
+	return b
+}
+
+// WithNetworkTopology sets the NetworkTopology field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the NetworkTopology field is set to the value of the last call.
+func (b *PodGroupSpecApplyConfiguration) WithNetworkTopology(value *NetworkTopologySpecApplyConfiguration) *PodGroupSpecApplyConfiguration {
+	b.NetworkTopology = value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupstatus.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupstatus.go
new file mode 100644
index 000000000..acd9c96d7
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/podgroupstatus.go
@@ -0,0 +1,83 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	schedulingv1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
+)
+
+// PodGroupStatusApplyConfiguration represents a declarative configuration of the PodGroupStatus type for use
+// with apply.
+type PodGroupStatusApplyConfiguration struct {
+	Phase      *schedulingv1beta1.PodGroupPhase      `json:"phase,omitempty"`
+	Conditions []PodGroupConditionApplyConfiguration `json:"conditions,omitempty"`
+	Running    *int32                                `json:"running,omitempty"`
+	Succeeded  *int32                                `json:"succeeded,omitempty"`
+	Failed     *int32                                `json:"failed,omitempty"`
+}
+
+// PodGroupStatusApplyConfiguration constructs a declarative configuration of the PodGroupStatus type for use with
+// apply.
+func PodGroupStatus() *PodGroupStatusApplyConfiguration {
+	return &PodGroupStatusApplyConfiguration{}
+}
+
+// WithPhase sets the Phase field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Phase field is set to the value of the last call.
+func (b *PodGroupStatusApplyConfiguration) WithPhase(value schedulingv1beta1.PodGroupPhase) *PodGroupStatusApplyConfiguration {
+	b.Phase = &value
+	return b
+}
+
+// WithConditions adds the given value to the Conditions field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Conditions field.
+func (b *PodGroupStatusApplyConfiguration) WithConditions(values ...*PodGroupConditionApplyConfiguration) *PodGroupStatusApplyConfiguration {
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithConditions")
+		}
+		b.Conditions = append(b.Conditions, *values[i])
+	}
+	return b
+}
+
+// WithRunning sets the Running field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Running field is set to the value of the last call.
+func (b *PodGroupStatusApplyConfiguration) WithRunning(value int32) *PodGroupStatusApplyConfiguration {
+	b.Running = &value
+	return b
+}
+
+// WithSucceeded sets the Succeeded field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Succeeded field is set to the value of the last call.
+func (b *PodGroupStatusApplyConfiguration) WithSucceeded(value int32) *PodGroupStatusApplyConfiguration {
+	b.Succeeded = &value
+	return b
+}
+
+// WithFailed sets the Failed field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Failed field is set to the value of the last call.
+func (b *PodGroupStatusApplyConfiguration) WithFailed(value int32) *PodGroupStatusApplyConfiguration {
+	b.Failed = &value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queue.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queue.go
new file mode 100644
index 000000000..5d2b5bc19
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queue.go
@@ -0,0 +1,223 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	v1 "k8s.io/client-go/applyconfigurations/meta/v1"
+)
+
+// QueueApplyConfiguration represents a declarative configuration of the Queue type for use
+// with apply.
+type QueueApplyConfiguration struct {
+	v1.TypeMetaApplyConfiguration    `json:",inline"`
+	*v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
+	Spec                             *QueueSpecApplyConfiguration   `json:"spec,omitempty"`
+	Status                           *QueueStatusApplyConfiguration `json:"status,omitempty"`
+}
+
+// Queue constructs a declarative configuration of the Queue type for use with
+// apply.
+func Queue(name string) *QueueApplyConfiguration {
+	b := &QueueApplyConfiguration{}
+	b.WithName(name)
+	b.WithKind("Queue")
+	b.WithAPIVersion("scheduling.volcano.sh/v1beta1")
+	return b
+}
+
+// WithKind sets the Kind field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Kind field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithKind(value string) *QueueApplyConfiguration {
+	b.TypeMetaApplyConfiguration.Kind = &value
+	return b
+}
+
+// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the APIVersion field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithAPIVersion(value string) *QueueApplyConfiguration {
+	b.TypeMetaApplyConfiguration.APIVersion = &value
+	return b
+}
+
+// WithName sets the Name field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Name field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithName(value string) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Name = &value
+	return b
+}
+
+// WithGenerateName sets the GenerateName field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the GenerateName field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithGenerateName(value string) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.GenerateName = &value
+	return b
+}
+
+// WithNamespace sets the Namespace field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Namespace field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithNamespace(value string) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Namespace = &value
+	return b
+}
+
+// WithUID sets the UID field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the UID field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithUID(value types.UID) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.UID = &value
+	return b
+}
+
+// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the ResourceVersion field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithResourceVersion(value string) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.ResourceVersion = &value
+	return b
+}
+
+// WithGeneration sets the Generation field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Generation field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithGeneration(value int64) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Generation = &value
+	return b
+}
+
+// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the CreationTimestamp field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithCreationTimestamp(value metav1.Time) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.CreationTimestamp = &value
+	return b
+}
+
+// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the DeletionTimestamp field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionTimestamp = &value
+	return b
+}
+
+// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionGracePeriodSeconds = &value
+	return b
+}
+
+// WithLabels puts the entries into the Labels field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Labels field,
+// overwriting an existing map entries in Labels field with the same key.
+func (b *QueueApplyConfiguration) WithLabels(entries map[string]string) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Labels == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Labels = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Labels[k] = v
+	}
+	return b
+}
+
+// WithAnnotations puts the entries into the Annotations field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Annotations field,
+// overwriting an existing map entries in Annotations field with the same key.
+func (b *QueueApplyConfiguration) WithAnnotations(entries map[string]string) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Annotations == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Annotations = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Annotations[k] = v
+	}
+	return b
+}
+
+// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the OwnerReferences field.
+func (b *QueueApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithOwnerReferences")
+		}
+		b.ObjectMetaApplyConfiguration.OwnerReferences = append(b.ObjectMetaApplyConfiguration.OwnerReferences, *values[i])
+	}
+	return b
+}
+
+// WithFinalizers adds the given value to the Finalizers field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Finalizers field.
+func (b *QueueApplyConfiguration) WithFinalizers(values ...string) *QueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		b.ObjectMetaApplyConfiguration.Finalizers = append(b.ObjectMetaApplyConfiguration.Finalizers, values[i])
+	}
+	return b
+}
+
+func (b *QueueApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
+	if b.ObjectMetaApplyConfiguration == nil {
+		b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{}
+	}
+}
+
+// WithSpec sets the Spec field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Spec field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithSpec(value *QueueSpecApplyConfiguration) *QueueApplyConfiguration {
+	b.Spec = value
+	return b
+}
+
+// WithStatus sets the Status field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Status field is set to the value of the last call.
+func (b *QueueApplyConfiguration) WithStatus(value *QueueStatusApplyConfiguration) *QueueApplyConfiguration {
+	b.Status = value
+	return b
+}
+
+// GetName retrieves the value of the Name field in the declarative configuration.
+func (b *QueueApplyConfiguration) GetName() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Name
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queuespec.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queuespec.go
new file mode 100644
index 000000000..2282f05b6
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queuespec.go
@@ -0,0 +1,128 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+)
+
+// QueueSpecApplyConfiguration represents a declarative configuration of the QueueSpec type for use
+// with apply.
+type QueueSpecApplyConfiguration struct {
+	Weight         *int32                       `json:"weight,omitempty"`
+	Capability     *v1.ResourceList             `json:"capability,omitempty"`
+	Reclaimable    *bool                        `json:"reclaimable,omitempty"`
+	ExtendClusters []ClusterApplyConfiguration  `json:"extendClusters,omitempty"`
+	Guarantee      *GuaranteeApplyConfiguration `json:"guarantee,omitempty"`
+	Affinity       *AffinityApplyConfiguration  `json:"affinity,omitempty"`
+	Type           *string                      `json:"type,omitempty"`
+	Parent         *string                      `json:"parent,omitempty"`
+	Deserved       *v1.ResourceList             `json:"deserved,omitempty"`
+	Priority       *int32                       `json:"priority,omitempty"`
+}
+
+// QueueSpecApplyConfiguration constructs a declarative configuration of the QueueSpec type for use with
+// apply.
+func QueueSpec() *QueueSpecApplyConfiguration {
+	return &QueueSpecApplyConfiguration{}
+}
+
+// WithWeight sets the Weight field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Weight field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithWeight(value int32) *QueueSpecApplyConfiguration {
+	b.Weight = &value
+	return b
+}
+
+// WithCapability sets the Capability field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Capability field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithCapability(value v1.ResourceList) *QueueSpecApplyConfiguration {
+	b.Capability = &value
+	return b
+}
+
+// WithReclaimable sets the Reclaimable field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Reclaimable field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithReclaimable(value bool) *QueueSpecApplyConfiguration {
+	b.Reclaimable = &value
+	return b
+}
+
+// WithExtendClusters adds the given value to the ExtendClusters field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the ExtendClusters field.
+func (b *QueueSpecApplyConfiguration) WithExtendClusters(values ...*ClusterApplyConfiguration) *QueueSpecApplyConfiguration {
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithExtendClusters")
+		}
+		b.ExtendClusters = append(b.ExtendClusters, *values[i])
+	}
+	return b
+}
+
+// WithGuarantee sets the Guarantee field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Guarantee field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithGuarantee(value *GuaranteeApplyConfiguration) *QueueSpecApplyConfiguration {
+	b.Guarantee = value
+	return b
+}
+
+// WithAffinity sets the Affinity field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Affinity field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithAffinity(value *AffinityApplyConfiguration) *QueueSpecApplyConfiguration {
+	b.Affinity = value
+	return b
+}
+
+// WithType sets the Type field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Type field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithType(value string) *QueueSpecApplyConfiguration {
+	b.Type = &value
+	return b
+}
+
+// WithParent sets the Parent field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Parent field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithParent(value string) *QueueSpecApplyConfiguration {
+	b.Parent = &value
+	return b
+}
+
+// WithDeserved sets the Deserved field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Deserved field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithDeserved(value v1.ResourceList) *QueueSpecApplyConfiguration {
+	b.Deserved = &value
+	return b
+}
+
+// WithPriority sets the Priority field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Priority field is set to the value of the last call.
+func (b *QueueSpecApplyConfiguration) WithPriority(value int32) *QueueSpecApplyConfiguration {
+	b.Priority = &value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queuestatus.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queuestatus.go
new file mode 100644
index 000000000..615866dec
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/queuestatus.go
@@ -0,0 +1,106 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+	schedulingv1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
+)
+
+// QueueStatusApplyConfiguration represents a declarative configuration of the QueueStatus type for use
+// with apply.
+type QueueStatusApplyConfiguration struct {
+	State       *schedulingv1beta1.QueueState  `json:"state,omitempty"`
+	Unknown     *int32                         `json:"unknown,omitempty"`
+	Pending     *int32                         `json:"pending,omitempty"`
+	Running     *int32                         `json:"running,omitempty"`
+	Inqueue     *int32                         `json:"inqueue,omitempty"`
+	Completed   *int32                         `json:"completed,omitempty"`
+	Reservation *ReservationApplyConfiguration `json:"reservation,omitempty"`
+	Allocated   *v1.ResourceList               `json:"allocated,omitempty"`
+}
+
+// QueueStatusApplyConfiguration constructs a declarative configuration of the QueueStatus type for use with
+// apply.
+func QueueStatus() *QueueStatusApplyConfiguration {
+	return &QueueStatusApplyConfiguration{}
+}
+
+// WithState sets the State field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the State field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithState(value schedulingv1beta1.QueueState) *QueueStatusApplyConfiguration {
+	b.State = &value
+	return b
+}
+
+// WithUnknown sets the Unknown field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Unknown field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithUnknown(value int32) *QueueStatusApplyConfiguration {
+	b.Unknown = &value
+	return b
+}
+
+// WithPending sets the Pending field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Pending field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithPending(value int32) *QueueStatusApplyConfiguration {
+	b.Pending = &value
+	return b
+}
+
+// WithRunning sets the Running field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Running field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithRunning(value int32) *QueueStatusApplyConfiguration {
+	b.Running = &value
+	return b
+}
+
+// WithInqueue sets the Inqueue field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Inqueue field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithInqueue(value int32) *QueueStatusApplyConfiguration {
+	b.Inqueue = &value
+	return b
+}
+
+// WithCompleted sets the Completed field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Completed field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithCompleted(value int32) *QueueStatusApplyConfiguration {
+	b.Completed = &value
+	return b
+}
+
+// WithReservation sets the Reservation field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Reservation field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithReservation(value *ReservationApplyConfiguration) *QueueStatusApplyConfiguration {
+	b.Reservation = value
+	return b
+}
+
+// WithAllocated sets the Allocated field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Allocated field is set to the value of the last call.
+func (b *QueueStatusApplyConfiguration) WithAllocated(value v1.ResourceList) *QueueStatusApplyConfiguration {
+	b.Allocated = &value
+	return b
+}
diff --git a/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/reservation.go b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/reservation.go
new file mode 100644
index 000000000..cf1fc3f9e
--- /dev/null
+++ b/vendor/volcano.sh/apis/pkg/client/applyconfiguration/scheduling/v1beta1/reservation.go
@@ -0,0 +1,53 @@
+/*
+Copyright The Volcano Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/core/v1"
+)
+
+// ReservationApplyConfiguration represents a declarative configuration of the Reservation type for use
+// with apply.
+type ReservationApplyConfiguration struct {
+	Nodes    []string         `json:"nodes,omitempty"`
+	Resource *v1.ResourceList `json:"resource,omitempty"`
+}
+
+// ReservationApplyConfiguration constructs a declarative configuration of the Reservation type for use with
+// apply.
+func Reservation() *ReservationApplyConfiguration {
+	return &ReservationApplyConfiguration{}
+}
+
+// WithNodes adds the given value to the Nodes field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Nodes field.
+func (b *ReservationApplyConfiguration) WithNodes(values ...string) *ReservationApplyConfiguration {
+	for i := range values {
+		b.Nodes = append(b.Nodes, values[i])
+	}
+	return b
+}
+
+// WithResource sets the Resource field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Resource field is set to the value of the last call.
+func (b *ReservationApplyConfiguration) WithResource(value v1.ResourceList) *ReservationApplyConfiguration {
+	b.Resource = &value
+	return b
+}



Test patch:
diff --git a/apis/config/v1beta2/defaults_test.go b/apis/config/v1beta2/defaults_test.go
new file mode 100644
index 000000000..db28943f0
--- /dev/null
+++ b/apis/config/v1beta2/defaults_test.go
@@ -0,0 +1,663 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta2
+
+import (
+	"testing"
+	"time"
+
+	"github.com/google/go-cmp/cmp"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	componentconfigv1alpha1 "k8s.io/component-base/config/v1alpha1"
+	"k8s.io/utils/ptr"
+)
+
+const (
+	overwriteNamespace              = "kueue-tenant-a"
+	overwriteWebhookPort            = 9444
+	overwriteWebhookCertDir         = "/tmp/test"
+	overwriteMetricBindAddress      = ":38081"
+	overwriteHealthProbeBindAddress = ":38080"
+	overwriteLeaderElectionID       = "foo.kueue.x-k8s.io"
+)
+
+func TestSetDefaults_Configuration(t *testing.T) {
+	defaultCtrlManagerConfigurationSpec := ControllerManager{
+		LeaderElection: &componentconfigv1alpha1.LeaderElectionConfiguration{
+			LeaderElect:   ptr.To(true),
+			LeaseDuration: metav1.Duration{Duration: DefaultLeaderElectionLeaseDuration},
+			RenewDeadline: metav1.Duration{Duration: DefaultLeaderElectionRenewDeadline},
+			RetryPeriod:   metav1.Duration{Duration: DefaultLeaderElectionRetryPeriod},
+			ResourceLock:  "leases",
+			ResourceName:  "c1f6bfd2.kueue.x-k8s.io",
+		},
+		Webhook: ControllerWebhook{
+			Port:    ptr.To(DefaultWebhookPort),
+			CertDir: DefaultWebhookCertDir,
+		},
+		Metrics: ControllerMetrics{
+			BindAddress: DefaultMetricsBindAddress,
+		},
+		Health: ControllerHealth{
+			HealthProbeBindAddress: DefaultHealthProbeBindAddress,
+		},
+	}
+	defaultClientConnection := &ClientConnection{
+		QPS:   ptr.To(DefaultClientConnectionQPS),
+		Burst: ptr.To(DefaultClientConnectionBurst),
+	}
+	defaultIntegrations := &Integrations{
+		Frameworks: []string{defaultJobFrameworkName},
+	}
+	defaultManagedJobsNamespaceSelector := &metav1.LabelSelector{
+		MatchExpressions: []metav1.LabelSelectorRequirement{
+			{
+				Key:      corev1.LabelMetadataName,
+				Operator: metav1.LabelSelectorOpNotIn,
+				Values:   []string{"kube-system", "kueue-system"},
+			},
+		},
+	}
+
+	overwriteNamespaceIntegrations := &Integrations{
+		Frameworks: []string{defaultJobFrameworkName},
+	}
+
+	overwriteNamespaceSelector := &metav1.LabelSelector{
+		MatchExpressions: []metav1.LabelSelectorRequirement{
+			{
+				Key:      corev1.LabelMetadataName,
+				Operator: metav1.LabelSelectorOpNotIn,
+				Values:   []string{"kube-system", overwriteNamespace},
+			},
+		},
+	}
+
+	defaultMultiKueue := &MultiKueue{
+		GCInterval:        &metav1.Duration{Duration: DefaultMultiKueueGCInterval},
+		Origin:            ptr.To(DefaultMultiKueueOrigin),
+		WorkerLostTimeout: &metav1.Duration{Duration: DefaultMultiKueueWorkerLostTimeout},
+		DispatcherName:    ptr.To(MultiKueueDispatcherModeAllAtOnce),
+	}
+
+	podsReadyTimeout := metav1.Duration{Duration: defaultPodsReadyTimeout}
+	podsReadyTimeoutOverwrite := metav1.Duration{Duration: time.Minute}
+
+	testCases := map[string]struct {
+		original *Configuration
+		want     *Configuration
+	}{
+		"defaulting namespace": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"defaulting ControllerManager": {
+			original: &Configuration{
+				ControllerManager: ControllerManager{
+					LeaderElection: &componentconfigv1alpha1.LeaderElectionConfiguration{
+						LeaderElect: ptr.To(true),
+					},
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+			},
+			want: &Configuration{
+				Namespace: ptr.To(DefaultNamespace),
+				ControllerManager: ControllerManager{
+					Webhook: ControllerWebhook{
+						Port:    ptr.To(DefaultWebhookPort),
+						CertDir: DefaultWebhookCertDir,
+					},
+					Metrics: ControllerMetrics{
+						BindAddress: DefaultMetricsBindAddress,
+					},
+					Health: ControllerHealth{
+						HealthProbeBindAddress: DefaultHealthProbeBindAddress,
+					},
+					LeaderElection: &componentconfigv1alpha1.LeaderElectionConfiguration{
+						LeaderElect:   ptr.To(true),
+						LeaseDuration: metav1.Duration{Duration: DefaultLeaderElectionLeaseDuration},
+						RenewDeadline: metav1.Duration{Duration: DefaultLeaderElectionRenewDeadline},
+						RetryPeriod:   metav1.Duration{Duration: DefaultLeaderElectionRetryPeriod},
+						ResourceLock:  "leases",
+						ResourceName:  DefaultLeaderElectionID,
+					},
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"should not default ControllerManager": {
+			original: &Configuration{
+				ControllerManager: ControllerManager{
+					Webhook: ControllerWebhook{
+						Port:    ptr.To(overwriteWebhookPort),
+						CertDir: overwriteWebhookCertDir,
+					},
+					Metrics: ControllerMetrics{
+						BindAddress: overwriteMetricBindAddress,
+					},
+					Health: ControllerHealth{
+						HealthProbeBindAddress: overwriteHealthProbeBindAddress,
+					},
+					LeaderElection: &componentconfigv1alpha1.LeaderElectionConfiguration{
+						LeaderElect:   ptr.To(true),
+						LeaseDuration: metav1.Duration{Duration: DefaultLeaderElectionLeaseDuration},
+						RenewDeadline: metav1.Duration{Duration: DefaultLeaderElectionRenewDeadline},
+						RetryPeriod:   metav1.Duration{Duration: DefaultLeaderElectionRetryPeriod},
+						ResourceLock:  "leases",
+						ResourceName:  overwriteLeaderElectionID,
+					},
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				Integrations: defaultIntegrations,
+			},
+			want: &Configuration{
+				Namespace: ptr.To(DefaultNamespace),
+				ControllerManager: ControllerManager{
+					Webhook: ControllerWebhook{
+						Port:    ptr.To(overwriteWebhookPort),
+						CertDir: overwriteWebhookCertDir,
+					},
+					Metrics: ControllerMetrics{
+						BindAddress: overwriteMetricBindAddress,
+					},
+					Health: ControllerHealth{
+						HealthProbeBindAddress: overwriteHealthProbeBindAddress,
+					},
+					LeaderElection: &componentconfigv1alpha1.LeaderElectionConfiguration{
+						LeaderElect:   ptr.To(true),
+						LeaseDuration: metav1.Duration{Duration: DefaultLeaderElectionLeaseDuration},
+						RenewDeadline: metav1.Duration{Duration: DefaultLeaderElectionRenewDeadline},
+						RetryPeriod:   metav1.Duration{Duration: DefaultLeaderElectionRetryPeriod},
+						ResourceLock:  "leases",
+						ResourceName:  overwriteLeaderElectionID,
+					},
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"should not set LeaderElectionID": {
+			original: &Configuration{
+				ControllerManager: ControllerManager{
+					LeaderElection: &componentconfigv1alpha1.LeaderElectionConfiguration{
+						LeaderElect: ptr.To(false),
+					},
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+			},
+			want: &Configuration{
+				Namespace: ptr.To(DefaultNamespace),
+				ControllerManager: ControllerManager{
+					Webhook: ControllerWebhook{
+						Port:    ptr.To(DefaultWebhookPort),
+						CertDir: DefaultWebhookCertDir,
+					},
+					Metrics: ControllerMetrics{
+						BindAddress: DefaultMetricsBindAddress,
+					},
+					Health: ControllerHealth{
+						HealthProbeBindAddress: DefaultHealthProbeBindAddress,
+					},
+					LeaderElection: &componentconfigv1alpha1.LeaderElectionConfiguration{
+						LeaderElect:   ptr.To(false),
+						LeaseDuration: metav1.Duration{Duration: DefaultLeaderElectionLeaseDuration},
+						RenewDeadline: metav1.Duration{Duration: DefaultLeaderElectionRenewDeadline},
+						RetryPeriod:   metav1.Duration{Duration: DefaultLeaderElectionRetryPeriod},
+						ResourceLock:  "leases",
+						ResourceName:  "c1f6bfd2.kueue.x-k8s.io",
+					},
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"defaulting InternalCertManagement": {
+			original: &Configuration{
+				Namespace: ptr.To(overwriteNamespace),
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(overwriteNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable:             ptr.To(true),
+					WebhookServiceName: ptr.To(DefaultWebhookServiceName),
+					WebhookSecretName:  ptr.To(DefaultWebhookSecretName),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 overwriteNamespaceIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: overwriteNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"should not default InternalCertManagement": {
+			original: &Configuration{
+				Namespace: ptr.To(overwriteNamespace),
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(overwriteNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 overwriteNamespaceIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: overwriteNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"should not default values in custom ClientConnection": {
+			original: &Configuration{
+				Namespace: ptr.To(overwriteNamespace),
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection: &ClientConnection{
+					QPS:   ptr.To[float32](123.0),
+					Burst: ptr.To[int32](456),
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(overwriteNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection: &ClientConnection{
+					QPS:   ptr.To[float32](123.0),
+					Burst: ptr.To[int32](456),
+				},
+				Integrations:                 overwriteNamespaceIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: overwriteNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"should default empty custom ClientConnection": {
+			original: &Configuration{
+				Namespace: ptr.To(overwriteNamespace),
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection: &ClientConnection{},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(overwriteNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 overwriteNamespaceIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: overwriteNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"defaulting waitForPodsReady values": {
+			original: &Configuration{
+				WaitForPodsReady: &WaitForPodsReady{
+					Enable: true,
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+			},
+			want: &Configuration{
+				WaitForPodsReady: &WaitForPodsReady{
+					Enable:          true,
+					BlockAdmission:  ptr.To(true),
+					Timeout:         &podsReadyTimeout,
+					RecoveryTimeout: nil,
+					RequeuingStrategy: &RequeuingStrategy{
+						Timestamp:          ptr.To(EvictionTimestamp),
+						BackoffBaseSeconds: ptr.To[int32](DefaultRequeuingBackoffBaseSeconds),
+						BackoffMaxSeconds:  ptr.To[int32](DefaultRequeuingBackoffMaxSeconds),
+					},
+				},
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+			},
+		},
+		"set waitForPodsReady.blockAdmission to false, and waitForPodsReady.recoveryTimeout to nil when enable is false": {
+			original: &Configuration{
+				WaitForPodsReady: &WaitForPodsReady{
+					Enable: false,
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+			},
+			want: &Configuration{
+				WaitForPodsReady: &WaitForPodsReady{
+					Enable: false,
+				},
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+			},
+		},
+		"respecting provided waitForPodsReady values": {
+			original: &Configuration{
+				WaitForPodsReady: &WaitForPodsReady{
+					Enable:  true,
+					Timeout: &podsReadyTimeoutOverwrite,
+					RequeuingStrategy: &RequeuingStrategy{
+						Timestamp:          ptr.To(CreationTimestamp),
+						BackoffBaseSeconds: ptr.To[int32](63),
+						BackoffMaxSeconds:  ptr.To[int32](1800),
+					},
+					RecoveryTimeout: &metav1.Duration{Duration: time.Minute},
+				},
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+			},
+			want: &Configuration{
+				WaitForPodsReady: &WaitForPodsReady{
+					Enable:          true,
+					BlockAdmission:  ptr.To(true),
+					Timeout:         &podsReadyTimeoutOverwrite,
+					RecoveryTimeout: &metav1.Duration{Duration: time.Minute},
+					RequeuingStrategy: &RequeuingStrategy{
+						Timestamp:          ptr.To(CreationTimestamp),
+						BackoffBaseSeconds: ptr.To[int32](63),
+						BackoffMaxSeconds:  ptr.To[int32](1800),
+					},
+				},
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+			},
+		},
+		"integrations": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				Integrations: &Integrations{
+					Frameworks: []string{"a", "b"},
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection: defaultClientConnection,
+				Integrations: &Integrations{
+					Frameworks: []string{"a", "b"},
+				},
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"multiKueue": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				MultiKueue: &MultiKueue{
+					GCInterval:        &metav1.Duration{Duration: time.Second},
+					Origin:            ptr.To("multikueue-manager1"),
+					WorkerLostTimeout: &metav1.Duration{Duration: time.Minute},
+					DispatcherName:    ptr.To(MultiKueueDispatcherModeIncremental),
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection: defaultClientConnection,
+				Integrations:     defaultIntegrations,
+				MultiKueue: &MultiKueue{
+					GCInterval:        &metav1.Duration{Duration: time.Second},
+					Origin:            ptr.To("multikueue-manager1"),
+					WorkerLostTimeout: &metav1.Duration{Duration: time.Minute},
+					DispatcherName:    ptr.To(MultiKueueDispatcherModeIncremental),
+				},
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"multiKueue origin is an empty value": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				MultiKueue: &MultiKueue{
+					GCInterval:        &metav1.Duration{Duration: time.Second},
+					Origin:            ptr.To(""),
+					WorkerLostTimeout: &metav1.Duration{Duration: time.Minute},
+					DispatcherName:    defaultMultiKueue.DispatcherName,
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection: defaultClientConnection,
+				Integrations:     defaultIntegrations,
+				MultiKueue: &MultiKueue{
+					GCInterval:        &metav1.Duration{Duration: time.Second},
+					Origin:            ptr.To(DefaultMultiKueueOrigin),
+					WorkerLostTimeout: &metav1.Duration{Duration: time.Minute},
+					DispatcherName:    defaultMultiKueue.DispatcherName,
+				},
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"multiKueue GCInterval 0": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				MultiKueue: &MultiKueue{
+					GCInterval: &metav1.Duration{},
+					Origin:     ptr.To("multikueue-manager1"),
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection: defaultClientConnection,
+				Integrations:     defaultIntegrations,
+				MultiKueue: &MultiKueue{
+					GCInterval:        &metav1.Duration{},
+					Origin:            ptr.To("multikueue-manager1"),
+					WorkerLostTimeout: &metav1.Duration{Duration: 15 * time.Minute},
+					DispatcherName:    defaultMultiKueue.DispatcherName,
+				},
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				WaitForPodsReady:             &WaitForPodsReady{},
+			},
+		},
+		"add default fair sharing configuration when enabled": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				FairSharing: &FairSharing{
+					Enable: true,
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				FairSharing: &FairSharing{
+					Enable:               true,
+					PreemptionStrategies: []PreemptionStrategy{LessThanOrEqualToFinalShare, LessThanInitialShare},
+				},
+				WaitForPodsReady: &WaitForPodsReady{},
+			},
+		},
+		"set object retention policy for workloads": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ObjectRetentionPolicies: &ObjectRetentionPolicies{
+					Workloads: &WorkloadRetentionPolicy{
+						AfterFinished:           &metav1.Duration{Duration: 30 * time.Minute},
+						AfterDeactivatedByKueue: &metav1.Duration{Duration: 30 * time.Minute},
+					},
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				ObjectRetentionPolicies: &ObjectRetentionPolicies{
+					Workloads: &WorkloadRetentionPolicy{
+						AfterFinished:           &metav1.Duration{Duration: 30 * time.Minute},
+						AfterDeactivatedByKueue: &metav1.Duration{Duration: 30 * time.Minute},
+					},
+				},
+				WaitForPodsReady: &WaitForPodsReady{},
+			},
+		},
+		"resources.transformations strategy": {
+			original: &Configuration{
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				Resources: &Resources{
+					Transformations: []ResourceTransformation{
+						{Input: corev1.ResourceCPU},
+						{Input: corev1.ResourceMemory, Strategy: ptr.To(Replace)},
+						{Input: corev1.ResourceEphemeralStorage, Strategy: ptr.To[ResourceTransformationStrategy]("")},
+					},
+				},
+			},
+			want: &Configuration{
+				Namespace:         ptr.To(DefaultNamespace),
+				ControllerManager: defaultCtrlManagerConfigurationSpec,
+				InternalCertManagement: &InternalCertManagement{
+					Enable: ptr.To(false),
+				},
+				ClientConnection:             defaultClientConnection,
+				Integrations:                 defaultIntegrations,
+				MultiKueue:                   defaultMultiKueue,
+				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
+				Resources: &Resources{
+					Transformations: []ResourceTransformation{
+						{Input: corev1.ResourceCPU, Strategy: ptr.To(DefaultResourceTransformationStrategy)},
+						{Input: corev1.ResourceMemory, Strategy: ptr.To(Replace)},
+						{Input: corev1.ResourceEphemeralStorage, Strategy: ptr.To(DefaultResourceTransformationStrategy)},
+					},
+				},
+				WaitForPodsReady: &WaitForPodsReady{},
+			},
+		},
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			SetDefaults_Configuration(tc.original)
+			if diff := cmp.Diff(tc.want, tc.original); diff != "" {
+				t.Errorf("unexpected error (-want,+got):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/pkg/cache/queue/cluster_queue_test.go b/pkg/cache/queue/cluster_queue_test.go
index bc93ef9bf..115b0e106 100644
--- a/pkg/cache/queue/cluster_queue_test.go
+++ b/pkg/cache/queue/cluster_queue_test.go
@@ -30,7 +30,7 @@ import (
 	testingclock "k8s.io/utils/clock/testing"
 	"k8s.io/utils/ptr"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index bd62c1a51..1fc909c6c 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -42,7 +42,7 @@ import (
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 	"sigs.k8s.io/controller-runtime/pkg/webhook"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/job"
 
 	_ "sigs.k8s.io/kueue/pkg/controller/jobs"
@@ -94,7 +94,7 @@ func TestLoad(t *testing.T) {
 
 	namespaceOverWriteConfig := filepath.Join(tmpDir, "namespace-overwrite.yaml")
 	if err := os.WriteFile(namespaceOverWriteConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-tenant-a
 health:
@@ -112,7 +112,7 @@ webhook:
 
 	emptyConfig := filepath.Join(tmpDir, "empty-config.yaml")
 	if err := os.WriteFile(emptyConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 `), os.FileMode(0600)); err != nil {
 		t.Fatal(err)
@@ -120,7 +120,7 @@ kind: Configuration
 
 	ctrlManagerConfigSpecOverWriteConfig := filepath.Join(tmpDir, "ctrl-manager-config-spec-overwrite.yaml")
 	if err := os.WriteFile(ctrlManagerConfigSpecOverWriteConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 health:
@@ -138,7 +138,7 @@ webhook:
 
 	certOverWriteConfig := filepath.Join(tmpDir, "cert-overwrite.yaml")
 	if err := os.WriteFile(certOverWriteConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 health:
@@ -160,7 +160,7 @@ internalCertManagement:
 
 	disableCertOverWriteConfig := filepath.Join(tmpDir, "disable-cert-overwrite.yaml")
 	if err := os.WriteFile(disableCertOverWriteConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 health:
@@ -180,7 +180,7 @@ internalCertManagement:
 
 	leaderElectionDisabledConfig := filepath.Join(tmpDir, "leaderElection-disabled.yaml")
 	if err := os.WriteFile(leaderElectionDisabledConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 health:
@@ -197,7 +197,7 @@ webhook:
 
 	waitForPodsReadyEnabledConfig := filepath.Join(tmpDir, "waitForPodsReady-enabled.yaml")
 	if err := os.WriteFile(waitForPodsReadyEnabledConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 waitForPodsReady:
   enable: true
@@ -215,7 +215,7 @@ waitForPodsReady:
 
 	clientConnectionConfig := filepath.Join(tmpDir, "clientConnection.yaml")
 	if err := os.WriteFile(clientConnectionConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 health:
@@ -236,7 +236,7 @@ clientConnection:
 
 	fullControllerConfig := filepath.Join(tmpDir, "fullControllerConfig.yaml")
 	if err := os.WriteFile(fullControllerConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 health:
@@ -271,7 +271,7 @@ clientConnection:
 
 	integrationsConfig := filepath.Join(tmpDir, "integrations.yaml")
 	if err := os.WriteFile(integrationsConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 integrations:
   frameworks:
@@ -284,7 +284,7 @@ integrations:
 
 	podIntegrationOptionsConfig := filepath.Join(tmpDir, "podIntegrationOptions.yaml")
 	if err := os.WriteFile(podIntegrationOptionsConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 integrations:
   frameworks:
@@ -306,7 +306,7 @@ integrations:
 
 	multiKueueConfig := filepath.Join(tmpDir, "multiKueue.yaml")
 	if err := os.WriteFile(multiKueueConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 multiKueue:
@@ -320,7 +320,7 @@ multiKueue:
 
 	resourceTransformConfig := filepath.Join(tmpDir, "resourceXForm.yaml")
 	if err := os.WriteFile(resourceTransformConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 resources:
@@ -345,7 +345,7 @@ resources:
 
 	invalidConfig := filepath.Join(tmpDir, "invalid-config.yaml")
 	if err := os.WriteFile(invalidConfig, []byte(`
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespaces: kueue-system
 invalidField: invalidValue
@@ -363,7 +363,7 @@ webhook:
 	}
 
 	objectRetentionPoliciesConfig := filepath.Join(tmpDir, "objectRetentionPolicies.yaml")
-	if err := os.WriteFile(objectRetentionPoliciesConfig, []byte(`apiVersion: config.kueue.x-k8s.io/v1beta1
+	if err := os.WriteFile(objectRetentionPoliciesConfig, []byte(`apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 namespace: kueue-system
 objectRetentionPolicies:
@@ -1015,7 +1015,7 @@ func TestEncode(t *testing.T) {
 			scheme: testScheme,
 			cfg:    &configapi.Configuration{},
 			wantResult: map[string]any{
-				"apiVersion":                 "config.kueue.x-k8s.io/v1beta1",
+				"apiVersion":                 "config.kueue.x-k8s.io/v1beta2",
 				"kind":                       "Configuration",
 				"manageJobsWithoutQueueName": false,
 				"health":                     map[string]any{},
@@ -1028,7 +1028,7 @@ func TestEncode(t *testing.T) {
 			scheme: testScheme,
 			cfg:    defaultConfig,
 			wantResult: map[string]any{
-				"apiVersion": "config.kueue.x-k8s.io/v1beta1",
+				"apiVersion": "config.kueue.x-k8s.io/v1beta2",
 				"kind":       "Configuration",
 				"namespace":  configapi.DefaultNamespace,
 				"webhook": map[string]any{
diff --git a/pkg/config/validation_test.go b/pkg/config/validation_test.go
index 88dfad3eb..ee1c87a63 100644
--- a/pkg/config/validation_test.go
+++ b/pkg/config/validation_test.go
@@ -31,7 +31,7 @@ import (
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	"k8s.io/utils/ptr"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 func TestValidate(t *testing.T) {
diff --git a/pkg/controller/admissionchecks/multikueue/externalframeworks/config_test.go b/pkg/controller/admissionchecks/multikueue/externalframeworks/config_test.go
index 2c505fd96..5ce450464 100644
--- a/pkg/controller/admissionchecks/multikueue/externalframeworks/config_test.go
+++ b/pkg/controller/admissionchecks/multikueue/externalframeworks/config_test.go
@@ -22,7 +22,7 @@ import (
 
 	"k8s.io/apimachinery/pkg/runtime/schema"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 func TestNewAdapters(t *testing.T) {
diff --git a/pkg/controller/admissionchecks/multikueue/workload_test.go b/pkg/controller/admissionchecks/multikueue/workload_test.go
index 6453997bf..6064f1846 100644
--- a/pkg/controller/admissionchecks/multikueue/workload_test.go
+++ b/pkg/controller/admissionchecks/multikueue/workload_test.go
@@ -40,7 +40,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/pkg/controller/core/localqueue_controller_test.go b/pkg/controller/core/localqueue_controller_test.go
index f323bc8ca..ecf9f2230 100644
--- a/pkg/controller/core/localqueue_controller_test.go
+++ b/pkg/controller/core/localqueue_controller_test.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/core/workload_controller_test.go b/pkg/controller/core/workload_controller_test.go
index b3376d1bf..3e8c79fd9 100644
--- a/pkg/controller/core/workload_controller_test.go
+++ b/pkg/controller/core/workload_controller_test.go
@@ -20,6 +20,7 @@ import (
 	"context"
 	stderrors "errors"
 	"fmt"
+	"strings"
 	"testing"
 	"time"
 
@@ -38,7 +39,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -415,6 +416,7 @@ func TestReconcile(t *testing.T) {
 		wantWorkload              *kueue.Workload
 		wantWorkloadUseMergePatch *kueue.Workload // workload version to compensate for the difference between use of Apply and Merge patch in FakeClient
 		wantError                 error
+		wantErrorMsg              string
 		wantEvents                []utiltesting.EventRecord
 		wantResult                reconcile.Result
 		reconcilerOpts            []Option
@@ -574,8 +576,8 @@ func TestReconcile(t *testing.T) {
 				}
 				return wl
 			}(),
-			wantError:  dra.ErrDeviceClassNotMapped,
-			wantEvents: nil,
+			wantErrorMsg: "DeviceClass is not mapped in DRA configuration",
+			wantEvents:   nil,
 		},
 		"reconcile DRA ResourceClaimTemplate not found should return error": {
 			enableDRAFeature: true,
@@ -609,8 +611,8 @@ func TestReconcile(t *testing.T) {
 					Message: `failed to get claim spec for ResourceClaimTemplate missing-template in workload wlMissingTemplate podset main: failed to get claim spec: resourceclaimtemplates.resource.k8s.io "missing-template" not found`,
 				}).
 				Obj(),
-			wantError:  dra.ErrClaimSpecNotFound,
-			wantEvents: nil,
+			wantErrorMsg: "failed to get claim spec",
+			wantEvents:   nil,
 		},
 		"assign Admission Checks from ClusterQueue.spec.AdmissionCheckStrategy": {
 			workload: utiltestingapi.MakeWorkload("wl", "ns").
@@ -2485,13 +2487,20 @@ func TestReconcile(t *testing.T) {
 
 				gotResult, gotError := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: client.ObjectKeyFromObject(testWl)})
 
-				if tc.wantError != nil {
+				switch {
+				case tc.wantError != nil:
 					if gotError == nil {
 						t.Errorf("expected error %v, got nil", tc.wantError)
 					} else if !stderrors.Is(gotError, tc.wantError) {
 						t.Errorf("unexpected error type: want %v, got %v", tc.wantError, gotError)
 					}
-				} else if gotError != nil {
+				case tc.wantErrorMsg != "":
+					if gotError == nil {
+						t.Errorf("expected error containing %q, got nil", tc.wantErrorMsg)
+					} else if !strings.Contains(gotError.Error(), tc.wantErrorMsg) {
+						t.Errorf("expected error containing %q, got %v", tc.wantErrorMsg, gotError)
+					}
+				case gotError != nil:
 					t.Errorf("unexpected error: %v", gotError)
 				}
 
diff --git a/pkg/controller/jobframework/reconciler_test.go b/pkg/controller/jobframework/reconciler_test.go
index 7d4e3ae32..50e31eeef 100644
--- a/pkg/controller/jobframework/reconciler_test.go
+++ b/pkg/controller/jobframework/reconciler_test.go
@@ -37,7 +37,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	mocks "sigs.k8s.io/kueue/internal/mocks/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/controller/jobs/job/job_controller_test.go b/pkg/controller/jobs/job/job_controller_test.go
index 29574b599..76546cd6c 100644
--- a/pkg/controller/jobs/job/job_controller_test.go
+++ b/pkg/controller/jobs/job/job_controller_test.go
@@ -36,7 +36,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/controller/jobs/pod/pod_controller_test.go b/pkg/controller/jobs/pod/pod_controller_test.go
index bf98dec0c..685610ee5 100644
--- a/pkg/controller/jobs/pod/pod_controller_test.go
+++ b/pkg/controller/jobs/pod/pod_controller_test.go
@@ -39,7 +39,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/pkg/controller/jobs/pod/pod_webhook_test.go b/pkg/controller/jobs/pod/pod_webhook_test.go
index 2642f99e8..cfe3280df 100644
--- a/pkg/controller/jobs/pod/pod_webhook_test.go
+++ b/pkg/controller/jobs/pod/pod_webhook_test.go
@@ -35,7 +35,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/controller/jobs/trainjob/trainjob_controller_test.go b/pkg/controller/jobs/trainjob/trainjob_controller_test.go
index 68cdc7785..3753635b7 100644
--- a/pkg/controller/jobs/trainjob/trainjob_controller_test.go
+++ b/pkg/controller/jobs/trainjob/trainjob_controller_test.go
@@ -32,6 +32,7 @@ import (
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/podset"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -71,9 +72,9 @@ func TestRunWithPodsetsInfo(t *testing.T) {
 
 	// Create and refererence a fake ClusterTrainingRuntime
 	testTrainJob := testingtrainjob.MakeTrainJob("trainjob", "ns").RuntimeRef(kftrainerapi.RuntimeRef{
-		APIGroup: ptr.To("trainer.kubeflow.org"),
+		APIGroup: ptr.To(kftrainerapi.GroupVersion.Group),
 		Name:     "test",
-		Kind:     ptr.To("ClusterTrainingRuntime"),
+		Kind:     ptr.To(kftrainerapi.ClusterTrainingRuntimeKind),
 	})
 	testJobset := testingjobset.MakeJobSet("", "").ReplicatedJobs(
 		testingjobset.ReplicatedJobRequirements{
@@ -91,22 +92,39 @@ func TestRunWithPodsetsInfo(t *testing.T) {
 			trainJob: testTrainJob.Clone().Obj(),
 			podsetsInfo: []podset.PodSetInfo{
 				{
-					Name:            "node",
+					Name: "node",
+					Annotations: map[string]string{
+						"test-annotation": "test",
+					},
+					Labels: map[string]string{
+						controllerconsts.PodSetLabel: "node",
+						"test-label":                 "label",
+					},
 					NodeSelector:    map[string]string{"disktype": "ssd"},
 					Tolerations:     []corev1.Toleration{*toleration1.DeepCopy()},
 					SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-1"}},
 				},
 			},
 			wantTrainJob: testTrainJob.Clone().
-				Annotation(firstOverrideIdx, "0").
-				PodSpecOverrides([]kftrainerapi.PodSpecOverride{
+				PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "node"},
 						},
-						NodeSelector:    map[string]string{"disktype": "ssd"},
-						Tolerations:     []corev1.Toleration{*toleration1.DeepCopy()},
-						SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-1"}},
+						Metadata: &metav1.ObjectMeta{
+							Annotations: map[string]string{
+								"test-annotation": "test",
+							},
+							Labels: map[string]string{
+								controllerconsts.PodSetLabel: "node",
+								"test-label":                 "label",
+							},
+						},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector:    map[string]string{"disktype": "ssd"},
+							Tolerations:     []corev1.Toleration{*toleration1.DeepCopy()},
+							SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-1"}},
+						},
 					},
 				}).
 				Suspend(false).
@@ -115,42 +133,63 @@ func TestRunWithPodsetsInfo(t *testing.T) {
 		},
 		"should respect user provided PodSpecOverrides when adding PodSet info config to the trainjob": {
 			trainJob: testTrainJob.Clone().
-				PodSpecOverrides([]kftrainerapi.PodSpecOverride{
+				PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "node"},
 						},
-						NodeSelector:    map[string]string{"disktype": "sdd"},
-						Tolerations:     []corev1.Toleration{*toleration1.DeepCopy()},
-						SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-4"}},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector:    map[string]string{"disktype": "sdd"},
+							Tolerations:     []corev1.Toleration{*toleration1.DeepCopy()},
+							SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-4"}},
+						},
 					},
 				}).Obj(),
 			podsetsInfo: []podset.PodSetInfo{
 				{
-					Name:            "node",
+					Name: "node",
+					Annotations: map[string]string{
+						"test-annotation": "test",
+					},
+					Labels: map[string]string{
+						controllerconsts.PodSetLabel: "node",
+						"test-label":                 "label",
+					},
 					NodeSelector:    map[string]string{"gpu": "nvidia"},
 					Tolerations:     []corev1.Toleration{*toleration2.DeepCopy()},
 					SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-2"}},
 				},
 			},
 			wantTrainJob: testTrainJob.Clone().
-				Annotation(firstOverrideIdx, "1").
-				PodSpecOverrides([]kftrainerapi.PodSpecOverride{
+				PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "node"},
 						},
-						NodeSelector:    map[string]string{"disktype": "sdd"},
-						Tolerations:     []corev1.Toleration{*toleration1.DeepCopy()},
-						SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-4"}},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector:    map[string]string{"disktype": "sdd"},
+							Tolerations:     []corev1.Toleration{*toleration1.DeepCopy()},
+							SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-4"}},
+						},
 					},
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "node"},
 						},
-						NodeSelector:    map[string]string{"gpu": "nvidia"},
-						Tolerations:     []corev1.Toleration{*toleration2.DeepCopy()},
-						SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-2"}},
+						Metadata: &metav1.ObjectMeta{
+							Annotations: map[string]string{
+								"test-annotation": "test",
+							},
+							Labels: map[string]string{
+								controllerconsts.PodSetLabel: "node",
+								"test-label":                 "label",
+							},
+						},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector:    map[string]string{"gpu": "nvidia"},
+							Tolerations:     []corev1.Toleration{*toleration2.DeepCopy()},
+							SchedulingGates: []corev1.PodSchedulingGate{{Name: "test-scheduling-gate-2"}},
+						},
 					},
 				}).
 				Suspend(false).
@@ -224,64 +263,70 @@ func TestRestorePodSetsInfo(t *testing.T) {
 		wantTrainJob *kftrainerapi.TrainJob
 		wantReturn   bool
 	}{
-		"should not modify the trainjob if it doesn't have the first override index annotation": {
-			trainJob:     testTrainJob.Clone().Obj(),
-			wantTrainJob: testTrainJob.Clone().Obj(),
-			wantReturn:   true,
-		},
-		"should not modify the trainjob if it fails parsing the annotation": {
+		"should remove all the podTemplateOverrides added by kueue": {
 			trainJob: testTrainJob.Clone().
-				Annotation(firstOverrideIdx, "+").
-				Obj(),
-			wantTrainJob: testTrainJob.Clone().
-				Annotation(firstOverrideIdx, "+").
-				Obj(),
-			wantReturn: false,
-		},
-		"should remove all the podSpecOverrides starting from the index specified in the annotation": {
-			trainJob: testTrainJob.Clone().
-				Annotation(firstOverrideIdx, "2").
-				PodSpecOverrides([]kftrainerapi.PodSpecOverride{
+				PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "user-provided-1"},
 						},
-						NodeSelector: map[string]string{"disktype": "sdd"},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector: map[string]string{"disktype": "sdd"},
+						},
 					},
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "user-provided-2"},
 						},
-						NodeSelector: map[string]string{"disktype": "sdd"},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector: map[string]string{"disktype": "sdd"},
+						},
 					},
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "kueue-provided-1"},
 						},
-						NodeSelector: map[string]string{"disktype": "sdd"},
+						Metadata: &metav1.ObjectMeta{
+							Labels: map[string]string{
+								controllerconsts.PodSetLabel: "kueue-provided-1",
+							},
+						},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector: map[string]string{"disktype": "sdd"},
+						},
 					},
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "kueue-provided-2"},
 						},
-						NodeSelector: map[string]string{"disktype": "sdd"},
+						Metadata: &metav1.ObjectMeta{
+							Labels: map[string]string{
+								controllerconsts.PodSetLabel: "kueue-provided-2",
+							},
+						},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector: map[string]string{"disktype": "sdd"},
+						},
 					},
 				}).
 				Obj(),
 			wantTrainJob: testTrainJob.Clone().
-				Annotation(firstOverrideIdx, "2").
-				PodSpecOverrides([]kftrainerapi.PodSpecOverride{
+				PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "user-provided-1"},
 						},
-						NodeSelector: map[string]string{"disktype": "sdd"},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector: map[string]string{"disktype": "sdd"},
+						},
 					},
 					{
-						TargetJobs: []kftrainerapi.PodSpecOverrideTargetJob{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
 							{Name: "user-provided-2"},
 						},
-						NodeSelector: map[string]string{"disktype": "sdd"},
+						Spec: &kftrainerapi.PodTemplateSpecOverride{
+							NodeSelector: map[string]string{"disktype": "sdd"},
+						},
 					},
 				}).
 				Obj(),
@@ -306,9 +351,9 @@ func TestReconciler(t *testing.T) {
 	testNamespace := utiltesting.MakeNamespaceWrapper("ns").Label(corev1.LabelMetadataName, "ns").Obj()
 	// Create and refererence a fake ClusterTrainingRuntime
 	testTrainJob := testingtrainjob.MakeTrainJob("trainjob", "ns").RuntimeRef(kftrainerapi.RuntimeRef{
-		APIGroup: ptr.To("trainer.kubeflow.org"),
+		APIGroup: ptr.To(kftrainerapi.GroupVersion.Group),
 		Name:     "test",
-		Kind:     ptr.To("ClusterTrainingRuntime"),
+		Kind:     ptr.To(kftrainerapi.ClusterTrainingRuntimeKind),
 	})
 	testJobset := testingjobset.MakeJobSet("", "").ReplicatedJobs(
 		testingjobset.ReplicatedJobRequirements{
diff --git a/pkg/controller/jobs/trainjob/trainjob_multikueue_adapter_test.go b/pkg/controller/jobs/trainjob/trainjob_multikueue_adapter_test.go
index ad1c8ec0f..c73cfa371 100644
--- a/pkg/controller/jobs/trainjob/trainjob_multikueue_adapter_test.go
+++ b/pkg/controller/jobs/trainjob/trainjob_multikueue_adapter_test.go
@@ -87,16 +87,14 @@ func TestMultiKueueAdapter(t *testing.T) {
 					Label(constants.PrebuiltWorkloadLabel, "wl1").
 					Label(kueue.MultiKueueOriginLabel, "origin1").
 					JobsStatus(
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-1",
-							Ready:     1,
-							Succeeded: 1,
-						},
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-2",
-							Ready:     3,
-							Succeeded: 0,
-						},
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-1").
+							Ready(1).
+							Succeeded(1).
+							Obj(),
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-2").
+							Ready(3).
+							Succeeded(0).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -107,16 +105,14 @@ func TestMultiKueueAdapter(t *testing.T) {
 			wantManagersTrainJobs: []kftrainerapi.TrainJob{
 				*baseTrainJobManagedByKueueBuilder.Clone().
 					JobsStatus(
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-1",
-							Ready:     1,
-							Succeeded: 1,
-						},
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-2",
-							Ready:     3,
-							Succeeded: 0,
-						},
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-1").
+							Ready(1).
+							Succeeded(1).
+							Obj(),
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-2").
+							Ready(3).
+							Succeeded(0).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -125,16 +121,14 @@ func TestMultiKueueAdapter(t *testing.T) {
 					Label(constants.PrebuiltWorkloadLabel, "wl1").
 					Label(kueue.MultiKueueOriginLabel, "origin1").
 					JobsStatus(
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-1",
-							Ready:     1,
-							Succeeded: 1,
-						},
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-2",
-							Ready:     3,
-							Succeeded: 0,
-						},
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-1").
+							Ready(1).
+							Succeeded(1).
+							Obj(),
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-2").
+							Ready(3).
+							Succeeded(0).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -151,16 +145,14 @@ func TestMultiKueueAdapter(t *testing.T) {
 					Label(kueue.MultiKueueOriginLabel, "origin1").
 					Suspend(true).
 					JobsStatus(
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-1",
-							Ready:     1,
-							Succeeded: 1,
-						},
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-2",
-							Ready:     3,
-							Succeeded: 0,
-						},
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-1").
+							Ready(1).
+							Succeeded(1).
+							Obj(),
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-2").
+							Ready(3).
+							Succeeded(0).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -179,16 +171,14 @@ func TestMultiKueueAdapter(t *testing.T) {
 					Label(kueue.MultiKueueOriginLabel, "origin1").
 					Suspend(true).
 					JobsStatus(
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-1",
-							Ready:     1,
-							Succeeded: 1,
-						},
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-2",
-							Ready:     3,
-							Succeeded: 0,
-						},
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-1").
+							Ready(1).
+							Succeeded(1).
+							Obj(),
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-2").
+							Ready(3).
+							Succeeded(0).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -199,16 +189,14 @@ func TestMultiKueueAdapter(t *testing.T) {
 					Label(constants.PrebuiltWorkloadLabel, "wl1").
 					Label(kueue.MultiKueueOriginLabel, "origin1").
 					JobsStatus(
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-1",
-							Ready:     1,
-							Succeeded: 1,
-						},
-						kftrainerapi.JobStatus{
-							Name:      "replicated-job-2",
-							Ready:     3,
-							Succeeded: 0,
-						},
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-1").
+							Ready(1).
+							Succeeded(1).
+							Obj(),
+						testingtrainjob.MakeJobStatusWrapper("replicated-job-2").
+							Ready(3).
+							Succeeded(0).
+							Obj(),
 					).
 					Obj(),
 			},
diff --git a/pkg/controller/jobs/trainjob/trainjob_webhook_test.go b/pkg/controller/jobs/trainjob/trainjob_webhook_test.go
index 4392b3647..44c476e91 100644
--- a/pkg/controller/jobs/trainjob/trainjob_webhook_test.go
+++ b/pkg/controller/jobs/trainjob/trainjob_webhook_test.go
@@ -24,6 +24,9 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/client-go/tools/record"
+	"k8s.io/utils/ptr"
+	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
@@ -32,6 +35,7 @@ import (
 	"sigs.k8s.io/kueue/pkg/features"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
+	testingjobset "sigs.k8s.io/kueue/pkg/util/testingjobs/jobset"
 	testingtrainjob "sigs.k8s.io/kueue/pkg/util/testingjobs/trainjob"
 )
 
@@ -45,30 +49,144 @@ var (
 )
 
 func TestValidateCreate(t *testing.T) {
-	testTrainJob := testingtrainjob.MakeTrainJob("trainjob", "ns").Suspend(false)
+	testCtr := testingtrainjob.MakeClusterTrainingRuntime("testCtr",
+		testingjobset.MakeJobSet("", "").ReplicatedJobs(
+			testingjobset.ReplicatedJobRequirements{
+				Name:        "node",
+				Replicas:    1,
+				Parallelism: 1,
+			}).Obj().Spec)
+	testTrainJob := testingtrainjob.MakeTrainJob("trainjob", "ns").RuntimeRef(kftrainerapi.RuntimeRef{
+		APIGroup: ptr.To(kftrainerapi.GroupVersion.Group),
+		Name:     "testCtr",
+		Kind:     ptr.To(kftrainerapi.ClusterTrainingRuntimeKind),
+	}).Suspend(false)
 	testcases := map[string]struct {
-		name     string
-		trainJob *kftrainerapi.TrainJob
-		wantErr  error
+		clusterTrainingRuntime  *kftrainerapi.ClusterTrainingRuntime
+		trainJob                *kftrainerapi.TrainJob
+		wantErr                 error
+		topologyAwareScheduling bool
 	}{
 		"base": {
-			trainJob: testTrainJob.Clone().Queue("local-queue").Obj(),
-			wantErr:  nil,
+			clusterTrainingRuntime: testCtr,
+			trainJob:               testTrainJob.Clone().Queue("local-queue").Obj(),
+			wantErr:                nil,
 		},
 		"invalid queue-name label": {
-			trainJob: testTrainJob.Clone().Queue("queue_name").Obj(),
-			wantErr:  field.ErrorList{field.Invalid(queueNameLabelPath, "queue_name", invalidRFC1123Message)}.ToAggregate(),
+			clusterTrainingRuntime: testCtr,
+			trainJob:               testTrainJob.Clone().Queue("queue_name").Obj(),
+			wantErr:                field.ErrorList{field.Invalid(queueNameLabelPath, "queue_name", invalidRFC1123Message)}.ToAggregate(),
 		},
 		"with prebuilt workload": {
-			trainJob: testTrainJob.Clone().Queue("local-queue").Label(controllerconstants.PrebuiltWorkloadLabel, "prebuilt-workload").Obj(),
-			wantErr:  nil,
+			clusterTrainingRuntime: testCtr,
+			trainJob:               testTrainJob.Clone().Queue("local-queue").Label(controllerconstants.PrebuiltWorkloadLabel, "prebuilt-workload").Obj(),
+			wantErr:                nil,
+		},
+		"valid topology request in PodTemplateOverride": {
+			clusterTrainingRuntime: testCtr,
+			trainJob: testTrainJob.Clone().PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
+				{
+					TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
+						{Name: "node"},
+					},
+					Metadata: &metav1.ObjectMeta{
+						Annotations: map[string]string{
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+						},
+					},
+				},
+			}).Obj(),
+			topologyAwareScheduling: true,
+		},
+		"valid topology request in TrainingRuntime": {
+			clusterTrainingRuntime: testingtrainjob.MakeClusterTrainingRuntime("testCtr",
+				testingjobset.MakeJobSet("", "").ReplicatedJobs(
+					testingjobset.ReplicatedJobRequirements{
+						Name: "node",
+						PodAnnotations: map[string]string{
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+						},
+					}).Obj().Spec),
+			trainJob:                testTrainJob.Clone().Obj(),
+			topologyAwareScheduling: true,
+		},
+		"invalid topology request in TrainJob": {
+			clusterTrainingRuntime: testCtr,
+			trainJob: testTrainJob.Clone().PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
+				{
+					TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
+						{Name: "node"},
+					},
+					Metadata: &metav1.ObjectMeta{
+						Annotations: map[string]string{
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+						},
+					},
+				},
+			}).Obj(),
+			wantErr: field.ErrorList{field.Invalid(field.NewPath("job[node].annotations"),
+				field.OmitValueType{}, `must not contain more than one topology annotation: ["kueue.x-k8s.io/podset-required-topology", `+
+					`"kueue.x-k8s.io/podset-preferred-topology", "kueue.x-k8s.io/podset-unconstrained-topology"]`+
+					`. Adjust either the "TrainJob.spec.podTemplateOverrides" or the "TrainingRuntime.Template" annotations for the corresponding Job`),
+			}.ToAggregate(),
+			topologyAwareScheduling: true,
+		},
+		"invalid topology request in TrainingRuntime": {
+			clusterTrainingRuntime: testingtrainjob.MakeClusterTrainingRuntime("testCtr",
+				testingjobset.MakeJobSet("", "").ReplicatedJobs(
+					testingjobset.ReplicatedJobRequirements{
+						Name: "node",
+						PodAnnotations: map[string]string{
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+						},
+					}).Obj().Spec),
+			trainJob: testTrainJob.Clone().Obj(),
+			wantErr: field.ErrorList{field.Invalid(field.NewPath("job[node].annotations"),
+				field.OmitValueType{}, `must not contain more than one topology annotation: ["kueue.x-k8s.io/podset-required-topology", `+
+					`"kueue.x-k8s.io/podset-preferred-topology", "kueue.x-k8s.io/podset-unconstrained-topology"]`+
+					`. Adjust either the "TrainJob.spec.podTemplateOverrides" or the "TrainingRuntime.Template" annotations for the corresponding Job`),
+			}.ToAggregate(),
+			topologyAwareScheduling: true,
+		},
+		"invalid slice topology request - slice size larger than number of podsets": {
+			clusterTrainingRuntime: testCtr,
+			trainJob: testTrainJob.Clone().PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
+				{
+					TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
+						{Name: "node"},
+					},
+					Metadata: &metav1.ObjectMeta{
+						Annotations: map[string]string{
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "20",
+						},
+					},
+				},
+			}).Obj(),
+			wantErr: field.ErrorList{
+				field.Invalid(field.NewPath("job[node].annotations").
+					Key("kueue.x-k8s.io/podset-slice-size"), "20", "must not be greater than pod set count 1"+
+					`. Adjust either the "TrainJob.spec.podTemplateOverrides" or the "TrainingRuntime.Template" annotations for the corresponding Job`),
+			}.ToAggregate(),
+			topologyAwareScheduling: true,
 		},
 	}
 
-	for _, tc := range testcases {
-		t.Run(tc.name, func(t *testing.T) {
-			webhook := &TrainJobWebhook{}
+	for name, tc := range testcases {
+		t.Run(name, func(t *testing.T) {
 			ctx, _ := utiltesting.ContextWithLog(t)
+			webhook := &TrainJobWebhook{}
+			clientBuilder := utiltesting.NewClientBuilder(kftrainerapi.AddToScheme, jobsetapi.AddToScheme)
+			kClient := clientBuilder.WithObjects(tc.trainJob, tc.clusterTrainingRuntime).Build()
+			indexer := utiltesting.AsIndexer(clientBuilder)
+			if err := SetupIndexes(ctx, indexer); err != nil {
+				t.Fatalf("Could not setup indexes: %v", err)
+			}
+			recorder := record.NewBroadcaster().NewRecorder(kClient.Scheme(), corev1.EventSource{Component: "test"})
+			_, _ = NewReconciler(ctx, kClient, indexer, recorder)
 			_, gotErr := webhook.ValidateCreate(ctx, tc.trainJob)
 
 			if diff := cmp.Diff(tc.wantErr, gotErr); diff != "" {
diff --git a/pkg/controller/workloaddispatcher/incrementaldispatcher_test.go b/pkg/controller/workloaddispatcher/incrementaldispatcher_test.go
index c987269d5..73c222437 100644
--- a/pkg/controller/workloaddispatcher/incrementaldispatcher_test.go
+++ b/pkg/controller/workloaddispatcher/incrementaldispatcher_test.go
@@ -35,7 +35,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
-	kueueconfig "sigs.k8s.io/kueue/apis/config/v1beta1"
+	kueueconfig "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/admissioncheck"
 	utilmaps "sigs.k8s.io/kueue/pkg/util/maps"
diff --git a/pkg/dra/claims_test.go b/pkg/dra/claims_test.go
index 970784b21..7e7cce600 100644
--- a/pkg/dra/claims_test.go
+++ b/pkg/dra/claims_test.go
@@ -14,9 +14,10 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package dra_test
+package dra
 
 import (
+	"errors"
 	"reflect"
 	"testing"
 
@@ -27,9 +28,8 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
-	"sigs.k8s.io/kueue/pkg/dra"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 )
 
@@ -61,13 +61,25 @@ func Test_GetResourceRequests(t *testing.T) {
 		},
 	}
 
+	// Common lookup functions for reuse across test cases
+	defaultLookup := func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
+		if dc == "test-deviceclass-1" {
+			return "res-1", true
+		}
+		return "", false
+	}
+
+	noLookup := func(corev1.ResourceName) (corev1.ResourceName, bool) {
+		return "", false
+	}
+
 	tests := []struct {
 		name         string
 		modifyWL     func(w *kueue.Workload)
 		extraObjects []runtime.Object
 		lookup       func(corev1.ResourceName) (corev1.ResourceName, bool)
 		want         map[kueue.PodSetReference]corev1.ResourceList
-		wantErr      bool
+		wantErr      error
 	}{
 		{
 			name: "Single claim template with single device",
@@ -87,8 +99,8 @@ func Test_GetResourceRequests(t *testing.T) {
 		},
 		{
 			name:    "Unmapped DeviceClass returns error",
-			lookup:  func(corev1.ResourceName) (corev1.ResourceName, bool) { return "", false },
-			wantErr: true,
+			lookup:  noLookup,
+			wantErr: errDeviceClassNotMapped,
 		},
 		{
 			name: "Two containers each using different claim templates",
@@ -149,13 +161,8 @@ func Test_GetResourceRequests(t *testing.T) {
 					{Name: "req-a", ResourceClaimTemplateName: ptr.To("claim-tmpl-1")},
 				}
 			},
-			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
-				if dc == "test-deviceclass-1" {
-					return "res-1", true
-				}
-				return "", false
-			},
-			want: map[kueue.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
+			lookup: defaultLookup,
+			want:   map[kueue.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
 		},
 		{
 			name: "Single template requesting two devices",
@@ -178,13 +185,8 @@ func Test_GetResourceRequests(t *testing.T) {
 					{Name: "req-x", ResourceClaimTemplateName: ptr.To("claim-tmpl-3")},
 				}
 			},
-			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
-				if dc == "test-deviceclass-1" {
-					return "res-1", true
-				}
-				return "", false
-			},
-			want: map[kueue.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
+			lookup: defaultLookup,
+			want:   map[kueue.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
 		},
 		{
 			name: "Init and regular container sharing one template",
@@ -211,13 +213,104 @@ func Test_GetResourceRequests(t *testing.T) {
 					{Name: "rc", ResourceClaimTemplateName: ptr.To("claim-tmpl-1")},
 				}
 			},
-			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
-				if dc == "test-deviceclass-1" {
-					return "res-1", true
+			lookup: defaultLookup,
+			want:   map[kueue.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
+		},
+		{
+			name: "AllocationMode All returns error",
+			extraObjects: []runtime.Object{
+				utiltesting.MakeResourceClaimTemplate("claim-tmpl-all", "ns1").
+					DeviceRequest("device-request", "test-deviceclass-1", 0).
+					AllocationModeAll().
+					Obj(),
+			},
+			modifyWL: func(w *kueue.Workload) {
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-all", ResourceClaimTemplateName: ptr.To("claim-tmpl-all")},
 				}
-				return "", false
 			},
-			want: map[kueue.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
+			lookup:  defaultLookup,
+			wantErr: errUnsupportedDRAAllocationModeAll,
+		},
+		{
+			name: "CEL selectors returns error",
+			extraObjects: []runtime.Object{
+				utiltesting.MakeResourceClaimTemplate("claim-tmpl-cel", "ns1").
+					DeviceRequest("req", "test-deviceclass-1", 1).
+					WithCELSelectors("device.driver == \"test-driver\"").
+					Obj(),
+			},
+			modifyWL: func(w *kueue.Workload) {
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-cel", ResourceClaimTemplateName: ptr.To("claim-tmpl-cel")},
+				}
+			},
+			lookup:  defaultLookup,
+			wantErr: errUnsupportedDRACELSelectors,
+		},
+		{
+			name: "Device constraints returns error",
+			extraObjects: []runtime.Object{
+				utiltesting.MakeResourceClaimTemplate("claim-tmpl-constraints", "ns1").
+					DeviceRequest("gpu-1", "test-deviceclass-1", 1).
+					DeviceRequest("gpu-2", "test-deviceclass-1", 1).
+					WithDeviceConstraints([]string{"gpu-1", "gpu-2"}, "numa-node").
+					Obj(),
+			},
+			modifyWL: func(w *kueue.Workload) {
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-constraints", ResourceClaimTemplateName: ptr.To("claim-tmpl-constraints")},
+				}
+			},
+			lookup:  defaultLookup,
+			wantErr: errUnsupportedDRADeviceConstraints,
+		},
+		{
+			name: "FirstAvailable returns error",
+			extraObjects: []runtime.Object{
+				utiltesting.MakeResourceClaimTemplate("claim-tmpl-first", "ns1").
+					FirstAvailableRequest("req", "test-deviceclass-1").
+					Obj(),
+			},
+			modifyWL: func(w *kueue.Workload) {
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-first", ResourceClaimTemplateName: ptr.To("claim-tmpl-first")},
+				}
+			},
+			lookup:  defaultLookup,
+			wantErr: errUnsupportedDRAFirstAvailable,
+		},
+		{
+			name: "AdminAccess returns error",
+			extraObjects: []runtime.Object{
+				utiltesting.MakeResourceClaimTemplate("claim-tmpl-admin", "ns1").
+					DeviceRequest("req", "test-deviceclass-1", 1).
+					WithAdminAccess(true).
+					Obj(),
+			},
+			modifyWL: func(w *kueue.Workload) {
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-admin", ResourceClaimTemplateName: ptr.To("claim-tmpl-admin")},
+				}
+			},
+			lookup:  defaultLookup,
+			wantErr: errUnsupportedDRAAdminAccess,
+		},
+		{
+			name: "Device config returns error",
+			extraObjects: []runtime.Object{
+				utiltesting.MakeResourceClaimTemplate("claim-tmpl-config", "ns1").
+					DeviceRequest("req", "test-deviceclass-1", 1).
+					WithDeviceConfig("req", "", nil).
+					Obj(),
+			},
+			modifyWL: func(w *kueue.Workload) {
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-config", ResourceClaimTemplateName: ptr.To("claim-tmpl-config")},
+				}
+			},
+			lookup:  defaultLookup,
+			wantErr: errUnsupportedDRADeviceConfig,
 		},
 	}
 
@@ -237,7 +330,7 @@ func Test_GetResourceRequests(t *testing.T) {
 				if tc.name == "Unmapped DeviceClass returns error" {
 					mappings = []configapi.DeviceClassMapping{}
 				}
-				err := dra.CreateMapperFromConfiguration(mappings)
+				err := CreateMapperFromConfiguration(mappings)
 				if err != nil {
 					t.Fatalf("Failed to initialize DRA mapper: %v", err)
 				}
@@ -257,13 +350,19 @@ func Test_GetResourceRequests(t *testing.T) {
 			}
 
 			ctx, _ := utiltesting.ContextWithLog(t)
-			got, err := dra.GetResourceRequestsForResourceClaimTemplates(ctx, baseClient, wlCopy)
-			if (err != nil) != tc.wantErr {
-				t.Fatalf("unexpected error status: gotErr=%v wantErr=%v, err=%v", err != nil, tc.wantErr, err)
-			}
-			if tc.wantErr {
+			got, err := GetResourceRequestsForResourceClaimTemplates(ctx, baseClient, wlCopy)
+			if tc.wantErr != nil {
+				if err == nil {
+					t.Fatalf("expected error but got none")
+				}
+				if !errors.Is(err, tc.wantErr) {
+					t.Fatalf("unexpected error: got=%v, want=%v", err, tc.wantErr)
+				}
 				return
 			}
+			if err != nil {
+				t.Fatalf("unexpected error: %v", err)
+			}
 			if !reflect.DeepEqual(got, tc.want) {
 				t.Fatalf("unexpected result; got=%v want=%v", got, tc.want)
 			}
diff --git a/pkg/dra/mapper_test.go b/pkg/dra/mapper_test.go
index 183decd2b..9c4ad6736 100644
--- a/pkg/dra/mapper_test.go
+++ b/pkg/dra/mapper_test.go
@@ -21,7 +21,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 )
 
 func TestNewDRAResourceMapper(t *testing.T) {
diff --git a/pkg/scheduler/preemption/preemption_test.go b/pkg/scheduler/preemption/preemption_test.go
index dfe925d08..67b6871da 100644
--- a/pkg/scheduler/preemption/preemption_test.go
+++ b/pkg/scheduler/preemption/preemption_test.go
@@ -36,7 +36,7 @@ import (
 	clocktesting "k8s.io/utils/clock/testing"
 	"k8s.io/utils/ptr"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/scheduler/scheduler_afs_test.go b/pkg/scheduler/scheduler_afs_test.go
index eb4fe32b3..050473986 100644
--- a/pkg/scheduler/scheduler_afs_test.go
+++ b/pkg/scheduler/scheduler_afs_test.go
@@ -32,7 +32,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go
index cf70be31a..cb114f223 100644
--- a/pkg/scheduler/scheduler_test.go
+++ b/pkg/scheduler/scheduler_test.go
@@ -40,7 +40,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/pkg/util/testingjobs/pytorchjob/wrappers_pytorchjob.go b/pkg/util/testingjobs/pytorchjob/wrappers_pytorchjob.go
index e28bd1151..853989daa 100644
--- a/pkg/util/testingjobs/pytorchjob/wrappers_pytorchjob.go
+++ b/pkg/util/testingjobs/pytorchjob/wrappers_pytorchjob.go
@@ -75,7 +75,7 @@ func (j *PyTorchJobWrapper) PyTorchReplicaSpecs(replicaSpecs ...PyTorchReplicaSp
 	return j
 }
 
-func (j *PyTorchJobWrapper) PyTorchReplicaSpecsDefault() *PyTorchJobWrapper {
+func (j *PyTorchJobWrapper) PyTorchReplicaSpecsOnlyMasterDefault() *PyTorchJobWrapper {
 	j.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeMaster] = &kftraining.ReplicaSpec{
 		Replicas: ptr.To[int32](1),
 		Template: corev1.PodTemplateSpec{
@@ -97,6 +97,12 @@ func (j *PyTorchJobWrapper) PyTorchReplicaSpecsDefault() *PyTorchJobWrapper {
 		},
 	}
 
+	return j
+}
+
+func (j *PyTorchJobWrapper) PyTorchReplicaSpecsDefault() *PyTorchJobWrapper {
+	j.PyTorchReplicaSpecsOnlyMasterDefault()
+
 	j.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeWorker] = &kftraining.ReplicaSpec{
 		Replicas: ptr.To[int32](1),
 		Template: corev1.PodTemplateSpec{
diff --git a/pkg/util/testingjobs/trainjob/wrappers.go b/pkg/util/testingjobs/trainjob/wrappers.go
index 87484567e..2cde8015c 100644
--- a/pkg/util/testingjobs/trainjob/wrappers.go
+++ b/pkg/util/testingjobs/trainjob/wrappers.go
@@ -53,9 +53,9 @@ func (t *TrainJobWrapper) Clone() *TrainJobWrapper {
 	return &TrainJobWrapper{TrainJob: *t.DeepCopy()}
 }
 
-// PodSpecOverrides sets the custom pod spec overrides to be set to the TrainJob jobset jobs
-func (t *TrainJobWrapper) PodSpecOverrides(overrides []kftrainerapi.PodSpecOverride) *TrainJobWrapper {
-	t.Spec.PodSpecOverrides = overrides
+// PodTemplateOverrides sets the custom pod template overrides to be set to the TrainJob jobset jobs
+func (t *TrainJobWrapper) PodTemplateOverrides(overrides []kftrainerapi.PodTemplateOverride) *TrainJobWrapper {
+	t.Spec.PodTemplateOverrides = overrides
 	return t
 }
 
@@ -172,3 +172,35 @@ func MakeTrainingRuntime(name, ns string, jobsetSpec jobsetapi.JobSetSpec) *kftr
 		},
 	}
 }
+
+type JobStatusWrapper struct{ kftrainerapi.JobStatus }
+
+func MakeJobStatusWrapper(name string) *JobStatusWrapper {
+	return &JobStatusWrapper{kftrainerapi.JobStatus{
+		Name:      name,
+		Ready:     ptr.To(int32(0)),
+		Succeeded: ptr.To(int32(0)),
+		Failed:    ptr.To(int32(0)),
+		Active:    ptr.To(int32(0)),
+		Suspended: ptr.To(int32(0)),
+	}}
+}
+
+func (s *JobStatusWrapper) Active(v int32) *JobStatusWrapper {
+	s.JobStatus.Active = ptr.To(v)
+	return s
+}
+
+func (s *JobStatusWrapper) Ready(v int32) *JobStatusWrapper {
+	s.JobStatus.Ready = ptr.To(v)
+	return s
+}
+
+func (s *JobStatusWrapper) Succeeded(v int32) *JobStatusWrapper {
+	s.JobStatus.Succeeded = ptr.To(v)
+	return s
+}
+
+func (s *JobStatusWrapper) Obj() kftrainerapi.JobStatus {
+	return s.JobStatus
+}
diff --git a/pkg/workload/workload_test.go b/pkg/workload/workload_test.go
index 3797617a1..c05b11900 100644
--- a/pkg/workload/workload_test.go
+++ b/pkg/workload/workload_test.go
@@ -32,7 +32,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/resources"
diff --git a/test/e2e/config/certmanager/controller_manager_config.yaml b/test/e2e/config/certmanager/controller_manager_config.yaml
index e2415fc3b..7bbcc75c5 100644
--- a/test/e2e/config/certmanager/controller_manager_config.yaml
+++ b/test/e2e/config/certmanager/controller_manager_config.yaml
@@ -1,4 +1,4 @@
-apiVersion: config.kueue.x-k8s.io/v1beta1
+apiVersion: config.kueue.x-k8s.io/v1beta2
 kind: Configuration
 metrics:
   enableClusterQueueResources: true
diff --git a/test/e2e/config/certmanager/values.yaml b/test/e2e/config/certmanager/values.yaml
index 2f5a22b58..da13f7b91 100644
--- a/test/e2e/config/certmanager/values.yaml
+++ b/test/e2e/config/certmanager/values.yaml
@@ -30,7 +30,7 @@ controllerManager:
 kubernetesClusterDomain: cluster.local
 managerConfig:
   controllerManagerConfigYaml: |-
-    apiVersion: config.kueue.x-k8s.io/v1beta1
+    apiVersion: config.kueue.x-k8s.io/v1beta2
     kind: Configuration
     metrics:
       enableClusterQueueResources: true
diff --git a/test/e2e/customconfigs/managejobswithoutqueuename_test.go b/test/e2e/customconfigs/managejobswithoutqueuename_test.go
index ae4b205f8..27aea6603 100644
--- a/test/e2e/customconfigs/managejobswithoutqueuename_test.go
+++ b/test/e2e/customconfigs/managejobswithoutqueuename_test.go
@@ -30,7 +30,7 @@ import (
 	"sigs.k8s.io/jobset/api/jobset/v1alpha2"
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconstants "sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/test/e2e/customconfigs/objectretentionpolicies_test.go b/test/e2e/customconfigs/objectretentionpolicies_test.go
index bbc015cb2..dcb42dc79 100644
--- a/test/e2e/customconfigs/objectretentionpolicies_test.go
+++ b/test/e2e/customconfigs/objectretentionpolicies_test.go
@@ -26,7 +26,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/test/e2e/customconfigs/podintegrationautoenablement_test.go b/test/e2e/customconfigs/podintegrationautoenablement_test.go
index a1cf25b34..0ed80e324 100644
--- a/test/e2e/customconfigs/podintegrationautoenablement_test.go
+++ b/test/e2e/customconfigs/podintegrationautoenablement_test.go
@@ -24,7 +24,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	podconstants "sigs.k8s.io/kueue/pkg/controller/jobs/pod/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/statefulset"
diff --git a/test/e2e/customconfigs/reconcile_test.go b/test/e2e/customconfigs/reconcile_test.go
index 1790ef549..b72d16ad8 100644
--- a/test/e2e/customconfigs/reconcile_test.go
+++ b/test/e2e/customconfigs/reconcile_test.go
@@ -24,7 +24,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
diff --git a/test/e2e/customconfigs/suite_test.go b/test/e2e/customconfigs/suite_test.go
index 9c2f95c6d..d9672eee5 100644
--- a/test/e2e/customconfigs/suite_test.go
+++ b/test/e2e/customconfigs/suite_test.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/client-go/rest"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	"sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	"sigs.k8s.io/kueue/test/util"
 )
 
@@ -37,7 +37,7 @@ var (
 	cfg             *rest.Config
 	restClient      *rest.RESTClient
 	ctx             context.Context
-	defaultKueueCfg *v1beta1.Configuration
+	defaultKueueCfg *config.Configuration
 	kueueNS         = util.GetKueueNamespace()
 	kindClusterName = os.Getenv("KIND_CLUSTER_NAME")
 )
diff --git a/test/e2e/customconfigs/waitforpodsready_test.go b/test/e2e/customconfigs/waitforpodsready_test.go
index e98a02820..42c14262f 100644
--- a/test/e2e/customconfigs/waitforpodsready_test.go
+++ b/test/e2e/customconfigs/waitforpodsready_test.go
@@ -27,7 +27,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	"sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/test/e2e/multikueue/e2e_test.go b/test/e2e/multikueue/e2e_test.go
index 6419b0031..ebc3de37b 100644
--- a/test/e2e/multikueue/e2e_test.go
+++ b/test/e2e/multikueue/e2e_test.go
@@ -40,7 +40,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	kueueconfig "sigs.k8s.io/kueue/apis/config/v1beta1"
+	kueueconfig "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadaw "sigs.k8s.io/kueue/pkg/controller/jobs/appwrapper"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
@@ -674,18 +674,10 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 						ReplicaCount:  1,
 						RestartPolicy: "Never",
 					},
-					testingpytorchjob.PyTorchReplicaSpecRequirement{
-						ReplicaType:   kftraining.PyTorchJobReplicaTypeWorker,
-						ReplicaCount:  1,
-						RestartPolicy: "OnFailure",
-					},
 				).
-				RequestAndLimit(kftraining.PyTorchJobReplicaTypeMaster, corev1.ResourceCPU, "0.2").
-				RequestAndLimit(kftraining.PyTorchJobReplicaTypeMaster, corev1.ResourceMemory, "800M").
-				RequestAndLimit(kftraining.PyTorchJobReplicaTypeWorker, corev1.ResourceCPU, "0.5").
-				RequestAndLimit(kftraining.PyTorchJobReplicaTypeWorker, corev1.ResourceMemory, "800M").
+				RequestAndLimit(kftraining.PyTorchJobReplicaTypeMaster, corev1.ResourceCPU, "1").
+				RequestAndLimit(kftraining.PyTorchJobReplicaTypeMaster, corev1.ResourceMemory, "1600M").
 				Image(kftraining.PyTorchJobReplicaTypeMaster, util.GetAgnHostImage(), util.BehaviorExitFast).
-				Image(kftraining.PyTorchJobReplicaTypeWorker, util.GetAgnHostImage(), util.BehaviorExitFast).
 				Obj()
 
 			ginkgo.By("Creating the PyTorchJob", func() {
diff --git a/test/e2e/singlecluster/pytorchjob_test.go b/test/e2e/singlecluster/pytorchjob_test.go
index 00dfb0253..103969ad5 100644
--- a/test/e2e/singlecluster/pytorchjob_test.go
+++ b/test/e2e/singlecluster/pytorchjob_test.go
@@ -82,14 +82,10 @@ var _ = ginkgo.Describe("PyTorch integration", func() {
 				Queue(localQueueName).
 				Suspend(false).
 				SetTypeMeta().
-				PyTorchReplicaSpecsDefault().
-				Parallelism(2).
+				PyTorchReplicaSpecsOnlyMasterDefault().
 				Image(kftraining.PyTorchJobReplicaTypeMaster, util.GetAgnHostImage(), util.BehaviorWaitForDeletion).
 				Request(kftraining.PyTorchJobReplicaTypeMaster, corev1.ResourceCPU, "1").
 				Request(kftraining.PyTorchJobReplicaTypeMaster, corev1.ResourceMemory, "200Mi").
-				Image(kftraining.PyTorchJobReplicaTypeWorker, util.GetAgnHostImage(), util.BehaviorWaitForDeletion).
-				Request(kftraining.PyTorchJobReplicaTypeWorker, corev1.ResourceCPU, "1").
-				Request(kftraining.PyTorchJobReplicaTypeWorker, corev1.ResourceMemory, "200Mi").
 				Obj()
 
 			ginkgo.By("Create a PyTorch", func() {
@@ -107,12 +103,9 @@ var _ = ginkgo.Describe("PyTorch integration", func() {
 					// Check the worker replica status exists
 					masterReplicaStatus, ok := createdPyTorch.Status.ReplicaStatuses[kftraining.PyTorchJobReplicaTypeMaster]
 					g.Expect(ok).To(gomega.BeTrue(), "Master replica status not found in PyTorch status")
-					workerReplicaStatus, ok := createdPyTorch.Status.ReplicaStatuses[kftraining.PyTorchJobReplicaTypeWorker]
-					g.Expect(ok).To(gomega.BeTrue(), "Worker replica status not found in PyTorch status")
 
 					// Check the number of active replicas
 					g.Expect(masterReplicaStatus.Active).To(gomega.Equal(int32(1)), "Unexpected number of active %s replicas", kftraining.PyTorchJobReplicaTypeMaster)
-					g.Expect(workerReplicaStatus.Active).To(gomega.Equal(int32(2)), "Unexpected number of active %s replicas", kftraining.PyTorchJobReplicaTypeWorker)
 
 					// Ensure PyTorch job has "Running" condition with status "True"
 					g.Expect(createdPyTorch.Status.Conditions).To(gomega.ContainElements(
@@ -139,7 +132,7 @@ var _ = ginkgo.Describe("PyTorch integration", func() {
 
 			ginkgo.By("Check workload is finished", func() {
 				// Wait for active pods and terminate them
-				util.WaitForActivePodsAndTerminate(ctx, k8sClient, restClient, cfg, ns.Name, 3, 0, client.InNamespace(ns.Name))
+				util.WaitForActivePodsAndTerminate(ctx, k8sClient, restClient, cfg, ns.Name, 1, 0, client.InNamespace(ns.Name))
 
 				util.ExpectWorkloadToFinish(ctx, k8sClient, wlLookupKey)
 			})
diff --git a/test/e2e/singlecluster/tas_test.go b/test/e2e/singlecluster/tas_test.go
index c513c1f3c..bb933118c 100644
--- a/test/e2e/singlecluster/tas_test.go
+++ b/test/e2e/singlecluster/tas_test.go
@@ -19,9 +19,11 @@ package e2e
 import (
 	"fmt"
 
+	kftrainerapi "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
 	"github.com/onsi/ginkgo/v2"
 	"github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
@@ -31,11 +33,13 @@ import (
 	"sigs.k8s.io/kueue/pkg/controller/jobs/jobset"
 	podcontroller "sigs.k8s.io/kueue/pkg/controller/jobs/pod"
 	podconstants "sigs.k8s.io/kueue/pkg/controller/jobs/pod/constants"
+	workloadtrainjob "sigs.k8s.io/kueue/pkg/controller/jobs/trainjob"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
 	testingjob "sigs.k8s.io/kueue/pkg/util/testingjobs/job"
 	testingjobset "sigs.k8s.io/kueue/pkg/util/testingjobs/jobset"
 	testingpod "sigs.k8s.io/kueue/pkg/util/testingjobs/pod"
+	testingtrainjob "sigs.k8s.io/kueue/pkg/util/testingjobs/trainjob"
 	"sigs.k8s.io/kueue/pkg/workload"
 	"sigs.k8s.io/kueue/test/util"
 )
@@ -442,4 +446,118 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 			})
 		})
 	})
+
+	ginkgo.When("Creating a TrainJob requesting TAS", func() {
+		var (
+			topology     *kueue.Topology
+			onDemandRF   *kueue.ResourceFlavor
+			clusterQueue *kueue.ClusterQueue
+			localQueue   *kueue.LocalQueue
+		)
+		ginkgo.BeforeEach(func() {
+			topology = utiltestingapi.MakeDefaultOneLevelTopology("hostname")
+			util.MustCreate(ctx, k8sClient, topology)
+
+			onDemandRF = utiltestingapi.MakeResourceFlavor("on-demand").
+				NodeLabel("instance-type", "on-demand").
+				TopologyName(topology.Name).
+				Obj()
+
+			util.MustCreate(ctx, k8sClient, onDemandRF)
+			clusterQueue = utiltestingapi.MakeClusterQueue("cluster-queue").
+				ResourceGroup(
+					*utiltestingapi.MakeFlavorQuotas("on-demand").
+						Resource(corev1.ResourceCPU, "1").
+						Resource(corev1.ResourceMemory, "1Gi").
+						Obj(),
+				).
+				Obj()
+
+			util.MustCreate(ctx, k8sClient, clusterQueue)
+			util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
+
+			localQueue = utiltestingapi.MakeLocalQueue("main", ns.Name).ClusterQueue("cluster-queue").Obj()
+			util.MustCreate(ctx, k8sClient, localQueue)
+		})
+		ginkgo.AfterEach(func() {
+			gomega.Expect(util.DeleteAllTrainJobsInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+			// Force remove workloads to be sure that cluster queue can be removed.
+			gomega.Expect(util.DeleteWorkloadsInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+			gomega.Expect(util.DeleteObject(ctx, k8sClient, localQueue)).Should(gomega.Succeed())
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, clusterQueue, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, onDemandRF, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, topology, true)
+		})
+
+		ginkgo.It("should admit a TrainJob via TAS", func() {
+			trainjob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).
+				RuntimeRefName("torch-distributed").
+				Queue(localQueue.Name).
+				// Even if we override the image coming from the TrainingRuntime, we still need to set the command and args
+				TrainerImage(util.GetAgnHostImage(), []string{"/agnhost"}, util.BehaviorExitFast).
+				TrainerRequest(corev1.ResourceCPU, "500m").
+				TrainerRequest(corev1.ResourceMemory, "200Mi").
+				PodTemplateOverrides([]kftrainerapi.PodTemplateOverride{
+					{
+						TargetJobs: []kftrainerapi.PodTemplateOverrideTargetJob{
+							{Name: "node"},
+						},
+						Metadata: &metav1.ObjectMeta{
+							Annotations: map[string]string{kueue.PodSetRequiredTopologyAnnotation: corev1.LabelHostname},
+						},
+					},
+				}).
+				Obj()
+
+			ginkgo.By("Creating the TrainJob", func() {
+				util.MustCreate(ctx, k8sClient, trainjob)
+			})
+
+			ginkgo.By("waiting for the TrainJob to be unsuspended", func() {
+				trainjobKey := client.ObjectKeyFromObject(trainjob)
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, trainjobKey, trainjob)).To(gomega.Succeed())
+					g.Expect(trainjob.Spec.Suspend).Should(gomega.Equal(ptr.To(false)))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("verify the TrainJob has nodeSelector set", func() {
+				gomega.Expect(trainjob.Spec.PodTemplateOverrides).To(gomega.HaveLen(2))
+				gomega.Expect(trainjob.Spec.PodTemplateOverrides[1].Spec.NodeSelector).To(gomega.Equal(
+					map[string]string{
+						"instance-type": "on-demand",
+					},
+				))
+			})
+
+			wlLookupKey := types.NamespacedName{Name: workloadtrainjob.GetWorkloadNameForTrainJob(trainjob.Name, trainjob.UID), Namespace: ns.Name}
+			createdWorkload := &kueue.Workload{}
+
+			ginkgo.By(fmt.Sprintf("await for admission of workload %q and verify TopologyAssignment", wlLookupKey), func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlLookupKey, createdWorkload)).Should(gomega.Succeed())
+					g.Expect(createdWorkload.Status.Admission).ShouldNot(gomega.BeNil())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+				gomega.Expect(createdWorkload.Status.Admission).ShouldNot(gomega.BeNil())
+				gomega.Expect(createdWorkload.Status.Admission.PodSetAssignments).Should(gomega.HaveLen(1))
+				gomega.Expect(createdWorkload.Status.Admission.PodSetAssignments[0].TopologyAssignment).Should(gomega.BeComparableTo(
+					&kueue.TopologyAssignment{
+						Levels: []string{corev1.LabelHostname},
+						Domains: []kueue.TopologyDomainAssignment{{
+							Count:  1,
+							Values: []string{"kind-worker"},
+						}},
+					},
+				))
+			})
+
+			ginkgo.By(fmt.Sprintf("verify the workload %q gets finished", wlLookupKey), func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlLookupKey, createdWorkload)).Should(gomega.Succeed())
+					g.Expect(workload.HasQuotaReservation(createdWorkload)).Should(gomega.BeTrue())
+					g.Expect(createdWorkload.Status.Conditions).Should(testing.HaveConditionStatusTrue(kueue.WorkloadFinished))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+		})
+	})
 })
diff --git a/test/e2e/singlecluster/trainjob_test.go b/test/e2e/singlecluster/trainjob_test.go
index b7502e898..d2a29db07 100644
--- a/test/e2e/singlecluster/trainjob_test.go
+++ b/test/e2e/singlecluster/trainjob_test.go
@@ -185,7 +185,7 @@ var _ = ginkgo.Describe("TrainJob", func() {
 			})
 
 			ginkgo.By("Verify the trainjob has nodeSelector set", func() {
-				gomega.Expect(trainjob.Spec.PodSpecOverrides[0].NodeSelector).To(gomega.Equal(
+				gomega.Expect(trainjob.Spec.PodTemplateOverrides[0].Spec.NodeSelector).To(gomega.Equal(
 					map[string]string{
 						"instance-type": "on-demand",
 					},
diff --git a/test/e2e/tas/hotswap_test.go b/test/e2e/tas/hotswap_test.go
index 914e3fae8..90e22290c 100644
--- a/test/e2e/tas/hotswap_test.go
+++ b/test/e2e/tas/hotswap_test.go
@@ -25,7 +25,6 @@ import (
 	"github.com/onsi/gomega"
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
-	apimeta "k8s.io/apimachinery/pkg/api/meta"
 	"k8s.io/apimachinery/pkg/fields"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/utils/ptr"
@@ -256,13 +255,10 @@ var _ = ginkgo.Describe("Hotswap for Topology Aware Scheduling", ginkgo.Ordered,
 				nodeToRestore = node.DeepCopy()
 				gomega.Expect(k8sClient.Delete(ctx, node)).To(gomega.Succeed())
 			})
-			wl := &kueue.Workload{}
-			ginkgo.By("Check that the workload is evicted", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					g.Expect(k8sClient.Get(ctx, wlKey, wl)).To(gomega.Succeed())
-					g.Expect(wl.Status.Admission).To(gomega.BeNil())
-					g.Expect(apimeta.IsStatusConditionTrue(wl.Status.Conditions, kueue.WorkloadEvicted)).To(gomega.BeTrue())
-				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			ginkgo.By("Check that workload is rescheduled to a different rack", func() {
+				expectWorkloadTopologyAssignment(ctx, k8sClient, wlKey, numPods, []string{
+					"kind-worker3", "kind-worker4",
+				})
 			})
 		})
 	})
diff --git a/test/e2e/tas/trainjob_test.go b/test/e2e/tas/trainjob_test.go
new file mode 100644
index 000000000..42a8dffc9
--- /dev/null
+++ b/test/e2e/tas/trainjob_test.go
@@ -0,0 +1,314 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package tase2e
+
+import (
+	"fmt"
+
+	kftrainer "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
+	"github.com/onsi/ginkgo/v2"
+	"github.com/onsi/gomega"
+	batchv1 "k8s.io/api/batch/v1"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
+
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	"sigs.k8s.io/kueue/pkg/util/testing"
+	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
+	testingjobset "sigs.k8s.io/kueue/pkg/util/testingjobs/jobset"
+	testingtrainjob "sigs.k8s.io/kueue/pkg/util/testingjobs/trainjob"
+	"sigs.k8s.io/kueue/test/util"
+)
+
+var _ = ginkgo.Describe("TopologyAwareScheduling for TrainJob", func() {
+	var ns *corev1.Namespace
+	ginkgo.BeforeEach(func() {
+		ns = util.CreateNamespaceFromPrefixWithLog(ctx, k8sClient, "e2e-tas-jobset-")
+	})
+	ginkgo.AfterEach(func() {
+		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
+		util.ExpectAllPodsInNamespaceDeleted(ctx, k8sClient, ns)
+	})
+
+	ginkgo.When("Creating a TrainJob", func() {
+		var (
+			topology     *kueue.Topology
+			tasFlavor    *kueue.ResourceFlavor
+			localQueue   *kueue.LocalQueue
+			clusterQueue *kueue.ClusterQueue
+		)
+		ginkgo.BeforeEach(func() {
+			topology = utiltestingapi.MakeDefaultThreeLevelTopology("datacenter")
+			util.MustCreate(ctx, k8sClient, topology)
+
+			tasFlavor = utiltestingapi.MakeResourceFlavor("tas-flavor").
+				NodeLabel(tasNodeGroupLabel, instanceType).TopologyName(topology.Name).Obj()
+			util.MustCreate(ctx, k8sClient, tasFlavor)
+			clusterQueue = utiltestingapi.MakeClusterQueue("cluster-queue").
+				ResourceGroup(
+					*utiltestingapi.MakeFlavorQuotas("tas-flavor").
+						Resource(extraResource, "8").
+						Obj(),
+				).
+				Obj()
+			util.MustCreate(ctx, k8sClient, clusterQueue)
+			util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
+
+			localQueue = utiltestingapi.MakeLocalQueue("main", ns.Name).ClusterQueue("cluster-queue").Obj()
+			util.MustCreate(ctx, k8sClient, localQueue)
+		})
+		ginkgo.AfterEach(func() {
+			gomega.Expect(util.DeleteAllTrainJobsInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+			gomega.Expect(util.DeleteAllTrainingRuntimesInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+			// Force remove workloads to be sure that cluster queue can be removed.
+			gomega.Expect(util.DeleteWorkloadsInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, localQueue, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, clusterQueue, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, tasFlavor, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, topology, true)
+			util.ExpectAllPodsInNamespaceDeleted(ctx, k8sClient, ns)
+		})
+
+		ginkgo.It("Should place pods based on the ranks-ordering", func() {
+			replicas := 3
+			parallelism := 2
+			numPods := replicas * parallelism
+
+			trainingRuntime := testingtrainjob.MakeTrainingRuntime("test-trainingruntime", ns.Name, testingjobset.MakeJobSet("", "").
+				ReplicatedJobs(
+					testingjobset.ReplicatedJobRequirements{
+						Name:        "node",
+						Image:       util.GetAgnHostImage(),
+						Args:        util.BehaviorExitFast,
+						Replicas:    int32(replicas),
+						Parallelism: int32(parallelism),
+						Completions: int32(parallelism),
+						PodAnnotations: map[string]string{
+							kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+						},
+					}).
+				RequestAndLimit("node", extraResource, "1").Obj().Spec)
+
+			trainjob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).RuntimeRef(kftrainer.RuntimeRef{
+				APIGroup: ptr.To(kftrainer.GroupVersion.Group),
+				Name:     "test-trainingruntime",
+				Kind:     ptr.To(kftrainer.TrainingRuntimeKind),
+			}).
+				Queue(localQueue.Name).
+				Obj()
+
+			util.MustCreate(ctx, k8sClient, trainingRuntime)
+			util.MustCreate(ctx, k8sClient, trainjob)
+
+			ginkgo.By("JobSet is unsuspended", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(trainjob), trainjob)).To(gomega.Succeed())
+					g.Expect(trainjob.Spec.Suspend).Should(gomega.Equal(ptr.To(false)))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			pods := &corev1.PodList{}
+			ginkgo.By("ensure all pods are created", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name))).To(gomega.Succeed())
+					g.Expect(pods.Items).Should(gomega.HaveLen(numPods))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("ensure all pods are scheduled", func() {
+				listOpts := &client.ListOptions{
+					FieldSelector: fields.OneTermNotEqualSelector("spec.nodeName", ""),
+				}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name), listOpts)).To(gomega.Succeed())
+					g.Expect(pods.Items).Should(gomega.HaveLen(numPods))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("verify the assignment of pods are as expected with rank-based ordering", func() {
+				gomega.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name))).To(gomega.Succeed())
+				gotAssignment := readRankAssignmentsFromTrainJobPods(pods.Items)
+				wantAssignment := map[string]string{
+					"0/0": "kind-worker",
+					"0/1": "kind-worker2",
+					"1/0": "kind-worker3",
+					"1/1": "kind-worker4",
+					"2/0": "kind-worker5",
+					"2/1": "kind-worker6",
+				}
+				gomega.Expect(wantAssignment).Should(gomega.BeComparableTo(gotAssignment))
+			})
+		})
+
+		ginkgo.It("Should place pods in podset slices with two-level scheduling based on the ranks-ordering", func() {
+			replicas := 2
+			parallelism := 3
+			numPods := replicas * parallelism
+			trainingRuntime := testingtrainjob.MakeTrainingRuntime("test-trainingruntime", ns.Name, testingjobset.MakeJobSet("", "").
+				ReplicatedJobs(
+					testingjobset.ReplicatedJobRequirements{
+						Name:        "node",
+						Image:       util.GetAgnHostImage(),
+						Args:        util.BehaviorExitFast,
+						Replicas:    int32(replicas),
+						Parallelism: int32(parallelism),
+						Completions: int32(parallelism),
+						PodAnnotations: map[string]string{
+							kueue.PodSetPreferredTopologyAnnotation:     testing.DefaultBlockTopologyLevel,
+							kueue.PodSetSliceRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetSliceSizeAnnotation:             "3",
+						},
+					}).
+				RequestAndLimit("node", extraResource, "1").Obj().Spec)
+
+			trainjob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).RuntimeRef(kftrainer.RuntimeRef{
+				APIGroup: ptr.To(kftrainer.GroupVersion.Group),
+				Name:     "test-trainingruntime",
+				Kind:     ptr.To(kftrainer.TrainingRuntimeKind),
+			}).
+				Queue(localQueue.Name).
+				Obj()
+
+			util.MustCreate(ctx, k8sClient, trainingRuntime)
+			util.MustCreate(ctx, k8sClient, trainjob)
+
+			ginkgo.By("TrainJob is unsuspended", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(trainjob), trainjob)).To(gomega.Succeed())
+					g.Expect(trainjob.Spec.Suspend).Should(gomega.Equal(ptr.To(false)))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			pods := &corev1.PodList{}
+			ginkgo.By("ensure all pods are created", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name))).To(gomega.Succeed())
+					g.Expect(pods.Items).Should(gomega.HaveLen(numPods))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("ensure all pods are scheduled", func() {
+				listOpts := &client.ListOptions{
+					FieldSelector: fields.OneTermNotEqualSelector("spec.nodeName", ""),
+				}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name), listOpts)).To(gomega.Succeed())
+					g.Expect(pods.Items).Should(gomega.HaveLen(numPods))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("verify the assignment of pods are as expected with rank-based ordering", func() {
+				gomega.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name))).To(gomega.Succeed())
+				gotAssignment := readRankAssignmentsFromJobSetPods(pods.Items)
+				wantAssignment := map[string]string{
+					"0/0": "kind-worker",
+					"0/1": "kind-worker2",
+					"0/2": "kind-worker3",
+					"1/0": "kind-worker5",
+					"1/1": "kind-worker6",
+					"1/2": "kind-worker7",
+				}
+				gomega.Expect(wantAssignment).Should(gomega.BeComparableTo(gotAssignment))
+			})
+		})
+
+		ginkgo.It("Should place pods in podset slices with slice-only scheduling based on the ranks-ordering", func() {
+			replicas := 2
+			parallelism := 3
+			numPods := replicas * parallelism
+			trainingRuntime := testingtrainjob.MakeTrainingRuntime("test-trainingruntime", ns.Name, testingjobset.MakeJobSet("", "").
+				ReplicatedJobs(
+					testingjobset.ReplicatedJobRequirements{
+						Name:        "node",
+						Image:       util.GetAgnHostImage(),
+						Args:        util.BehaviorExitFast,
+						Replicas:    int32(replicas),
+						Parallelism: int32(parallelism),
+						Completions: int32(parallelism),
+						PodAnnotations: map[string]string{
+							kueue.PodSetSliceRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetSliceSizeAnnotation:             "3",
+						},
+					}).
+				RequestAndLimit("node", extraResource, "1").Obj().Spec)
+
+			trainjob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).RuntimeRef(kftrainer.RuntimeRef{
+				APIGroup: ptr.To(kftrainer.GroupVersion.Group),
+				Name:     "test-trainingruntime",
+				Kind:     ptr.To(kftrainer.TrainingRuntimeKind),
+			}).
+				Queue(localQueue.Name).
+				Obj()
+
+			util.MustCreate(ctx, k8sClient, trainingRuntime)
+			util.MustCreate(ctx, k8sClient, trainjob)
+
+			ginkgo.By("TrainJob is unsuspended", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(trainjob), trainjob)).To(gomega.Succeed())
+					g.Expect(trainjob.Spec.Suspend).Should(gomega.Equal(ptr.To(false)))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			pods := &corev1.PodList{}
+			ginkgo.By("ensure all pods are created", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name))).To(gomega.Succeed())
+					g.Expect(pods.Items).Should(gomega.HaveLen(numPods))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("ensure all pods are scheduled", func() {
+				listOpts := &client.ListOptions{
+					FieldSelector: fields.OneTermNotEqualSelector("spec.nodeName", ""),
+				}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name), listOpts)).To(gomega.Succeed())
+					g.Expect(pods.Items).Should(gomega.HaveLen(numPods))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("verify the assignment of pods are as expected with rank-based ordering", func() {
+				gomega.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name))).To(gomega.Succeed())
+				gotAssignment := readRankAssignmentsFromJobSetPods(pods.Items)
+				wantAssignment := map[string]string{
+					"0/0": "kind-worker",
+					"0/1": "kind-worker2",
+					"0/2": "kind-worker3",
+					"1/0": "kind-worker5",
+					"1/1": "kind-worker6",
+					"1/2": "kind-worker7",
+				}
+				gomega.Expect(wantAssignment).Should(gomega.BeComparableTo(gotAssignment))
+			})
+		})
+	})
+})
+
+func readRankAssignmentsFromTrainJobPods(pods []corev1.Pod) map[string]string {
+	assignment := make(map[string]string, len(pods))
+	for _, pod := range pods {
+		podIndex := pod.Labels[batchv1.JobCompletionIndexAnnotation]
+		jobIndex := pod.Labels[jobset.JobIndexKey]
+		key := fmt.Sprintf("%v/%v", jobIndex, podIndex)
+		assignment[key] = pod.Spec.NodeName
+	}
+	return assignment
+}
diff --git a/test/integration/framework/framework.go b/test/integration/framework/framework.go
index 3af92c5bb..2d98e0f07 100644
--- a/test/integration/framework/framework.go
+++ b/test/integration/framework/framework.go
@@ -49,7 +49,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook"
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	kueuev1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	"sigs.k8s.io/kueue/client-go/clientset/versioned/scheme"
diff --git a/test/integration/multikueue/dispatcher_test.go b/test/integration/multikueue/dispatcher_test.go
index 2d4749864..9ddee6b0e 100644
--- a/test/integration/multikueue/dispatcher_test.go
+++ b/test/integration/multikueue/dispatcher_test.go
@@ -31,7 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/test/integration/multikueue/enabled_integration_test.go b/test/integration/multikueue/enabled_integration_test.go
index a493efd26..200edaff5 100644
--- a/test/integration/multikueue/enabled_integration_test.go
+++ b/test/integration/multikueue/enabled_integration_test.go
@@ -35,7 +35,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	workloadmpijob "sigs.k8s.io/kueue/pkg/controller/jobs/mpijob"
diff --git a/test/integration/multikueue/external_job_test.go b/test/integration/multikueue/external_job_test.go
index ac2cd90d7..b90c0785a 100644
--- a/test/integration/multikueue/external_job_test.go
+++ b/test/integration/multikueue/external_job_test.go
@@ -30,7 +30,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
diff --git a/test/integration/multikueue/jobs_test.go b/test/integration/multikueue/jobs_test.go
index cf81e0f1c..83e1514e3 100644
--- a/test/integration/multikueue/jobs_test.go
+++ b/test/integration/multikueue/jobs_test.go
@@ -41,7 +41,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadappwrapper "sigs.k8s.io/kueue/pkg/controller/jobs/appwrapper"
@@ -1598,7 +1598,9 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdTrainJob := kftrainer.TrainJob{}
 				g.Expect(worker2TestCluster.client.Get(worker2TestCluster.ctx, client.ObjectKeyFromObject(trainJob), &createdTrainJob)).To(gomega.Succeed())
-				createdTrainJob.Status.JobsStatus = []kftrainer.JobStatus{{Name: "foo"}}
+				createdTrainJob.Status.JobsStatus = []kftrainer.JobStatus{
+					testingtrainjob.MakeJobStatusWrapper("foo").Obj(),
+				}
 				g.Expect(worker2TestCluster.client.Status().Update(worker2TestCluster.ctx, &createdTrainJob)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			gomega.Eventually(func(g gomega.Gomega) {
diff --git a/test/integration/multikueue/no_gc_test.go b/test/integration/multikueue/no_gc_test.go
index ee7828fd9..93213cae9 100644
--- a/test/integration/multikueue/no_gc_test.go
+++ b/test/integration/multikueue/no_gc_test.go
@@ -29,7 +29,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/test/integration/multikueue/setup_test.go b/test/integration/multikueue/setup_test.go
index a69b98395..f790d1d66 100644
--- a/test/integration/multikueue/setup_test.go
+++ b/test/integration/multikueue/setup_test.go
@@ -30,7 +30,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
diff --git a/test/integration/multikueue/suite_test.go b/test/integration/multikueue/suite_test.go
index 9559d9157..f67267f41 100644
--- a/test/integration/multikueue/suite_test.go
+++ b/test/integration/multikueue/suite_test.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/admissionchecks/provisioning/suite_test.go b/test/integration/singlecluster/controller/admissionchecks/provisioning/suite_test.go
index ed341020b..bc2f60a01 100644
--- a/test/integration/singlecluster/controller/admissionchecks/provisioning/suite_test.go
+++ b/test/integration/singlecluster/controller/admissionchecks/provisioning/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/core/suite_test.go b/test/integration/singlecluster/controller/core/suite_test.go
index 3c5cb9f8c..c15d63d03 100644
--- a/test/integration/singlecluster/controller/core/suite_test.go
+++ b/test/integration/singlecluster/controller/core/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/core"
diff --git a/test/integration/singlecluster/controller/core/workload_controller_test.go b/test/integration/singlecluster/controller/core/workload_controller_test.go
index 153d6afa8..67cec5aca 100644
--- a/test/integration/singlecluster/controller/core/workload_controller_test.go
+++ b/test/integration/singlecluster/controller/core/workload_controller_test.go
@@ -29,7 +29,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/features"
diff --git a/test/integration/singlecluster/controller/dra/dra_test.go b/test/integration/singlecluster/controller/dra/dra_test.go
index 64c2bbb48..f06511d5d 100644
--- a/test/integration/singlecluster/controller/dra/dra_test.go
+++ b/test/integration/singlecluster/controller/dra/dra_test.go
@@ -27,7 +27,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
@@ -486,5 +486,267 @@ var _ = ginkgo.Describe("DRA Integration", ginkgo.Ordered, ginkgo.ContinueOnFail
 					"DRA resource usage should be a multiple of pod count for webhook validation")
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 		})
+
+		ginkgo.It("Should reject workload with AllocationMode 'All'", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate with AllocationMode All")
+			rct := utiltesting.MakeResourceClaimTemplate("all-mode-template", ns.Name).
+				DeviceRequest("device-request", "foo.example.com", 0).
+				AllocationModeAll().
+				Obj()
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with AllocationMode All")
+			wl := utiltestingapi.MakeWorkload("test-wl-all-mode", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("all-mode-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+					gomega.HaveField("Message", gomega.ContainSubstring("AllocationMode 'All' is not supported")),
+				)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should reject workload with CEL selectors", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate with CEL selectors")
+			rct := utiltesting.MakeResourceClaimTemplate("cel-selector-template", ns.Name).
+				DeviceRequest("device-request", "foo.example.com", 2).
+				WithCELSelectors("device.driver == \"test-driver\"").
+				Obj()
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with CEL selectors")
+			wl := utiltestingapi.MakeWorkload("test-wl-cel-selector", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("cel-selector-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+					gomega.HaveField("Message", gomega.ContainSubstring("CEL selectors are not supported")),
+				)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should reject workload with device constraints", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate with device constraints")
+			rct := utiltesting.MakeResourceClaimTemplate("constraint-template", ns.Name).
+				DeviceRequest("gpu-1", "foo.example.com", 1).
+				DeviceRequest("gpu-2", "foo.example.com", 1).
+				WithDeviceConstraints([]string{"gpu-1", "gpu-2"}, "example.com/numa_node").
+				Obj()
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with device constraints")
+			wl := utiltestingapi.MakeWorkload("test-wl-constraint", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("constraint-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+					gomega.HaveField("Message", gomega.ContainSubstring("device constraints (MatchAttribute) are not supported")),
+				)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should reject workload with AdminAccess", func() {
+			ginkgo.By("Adding admin-access label to namespace")
+			var namespace corev1.Namespace
+			gomega.Expect(k8sClient.Get(ctx, client.ObjectKey{Name: ns.Name}, &namespace)).To(gomega.Succeed())
+			if namespace.Labels == nil {
+				namespace.Labels = make(map[string]string)
+			}
+			namespace.Labels["resource.kubernetes.io/admin-access"] = "true"
+			gomega.Expect(k8sClient.Update(ctx, &namespace)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a ResourceClaimTemplate with AdminAccess")
+			rct := utiltesting.MakeResourceClaimTemplate("admin-access-template", ns.Name).
+				DeviceRequest("device-request", "foo.example.com", 2).
+				WithAdminAccess(true).
+				Obj()
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with AdminAccess")
+			wl := utiltestingapi.MakeWorkload("test-wl-admin-access", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("admin-access-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+					gomega.HaveField("Message", gomega.ContainSubstring("AdminAccess is not supported")),
+				)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should reject workload with device config", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate with device config")
+			rct := utiltesting.MakeResourceClaimTemplate("device-config-template", ns.Name).
+				DeviceRequest("device-request", "foo.example.com", 2).
+				WithDeviceConfig("device-request", "driver.example.com", []byte(`{"key":"value"}`)).
+				Obj()
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with device config")
+			wl := utiltestingapi.MakeWorkload("test-wl-device-config", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("device-config-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+					gomega.HaveField("Message", gomega.ContainSubstring("device config is not supported")),
+				)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should reject workload with FirstAvailable", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate with FirstAvailable")
+			rct := utiltesting.MakeResourceClaimTemplate("first-available-template", ns.Name).
+				FirstAvailableRequest("device-request", "foo.example.com").
+				Obj()
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with FirstAvailable")
+			wl := utiltestingapi.MakeWorkload("test-wl-first-available", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("first-available-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+					gomega.HaveField("Message", gomega.ContainSubstring("FirstAvailable device selection is not supported")),
+				)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should admit workload with empty AllocationMode that defaults to ExactCount", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate with empty AllocationMode")
+			rct := utiltesting.MakeResourceClaimTemplate("empty-mode-template", ns.Name).
+				DeviceRequest("device-request", "foo.example.com", 2).
+				Obj()
+			// Set AllocationMode to empty string explicitly
+			rct.Spec.Spec.Devices.Requests[0].Exactly.AllocationMode = ""
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload that references the template with empty AllocationMode")
+			wl := utiltestingapi.MakeWorkload("test-wl-empty-mode", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("empty-mode-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+		})
 	})
 })
diff --git a/test/integration/singlecluster/controller/dra/suite_test.go b/test/integration/singlecluster/controller/dra/suite_test.go
index d337546dc..e743e82a8 100644
--- a/test/integration/singlecluster/controller/dra/suite_test.go
+++ b/test/integration/singlecluster/controller/dra/suite_test.go
@@ -28,7 +28,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/core"
diff --git a/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go b/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go
index cb975e82a..377d256c7 100644
--- a/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go
@@ -35,7 +35,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/appwrapper/suite_test.go b/test/integration/singlecluster/controller/jobs/appwrapper/suite_test.go
index 72acf3af5..730f0ffe6 100644
--- a/test/integration/singlecluster/controller/jobs/appwrapper/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/appwrapper/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go b/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go
index 17d8f61de..24a4c5f39 100644
--- a/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go
@@ -29,7 +29,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/jaxjob/suite_test.go b/test/integration/singlecluster/controller/jobs/jaxjob/suite_test.go
index d5a8b4e4e..d879ce585 100644
--- a/test/integration/singlecluster/controller/jobs/jaxjob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/jaxjob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/job/job_controller_test.go b/test/integration/singlecluster/controller/jobs/job/job_controller_test.go
index b7a45f1e2..ea1d39e97 100644
--- a/test/integration/singlecluster/controller/jobs/job/job_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/job/job_controller_test.go
@@ -40,7 +40,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/job/suite_test.go b/test/integration/singlecluster/controller/jobs/job/suite_test.go
index 2ed7a785d..f61be92ec 100644
--- a/test/integration/singlecluster/controller/jobs/job/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/job/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go b/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
index bfdfbcbbb..a3c02f888 100644
--- a/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
@@ -34,7 +34,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/jobset/suite_test.go b/test/integration/singlecluster/controller/jobs/jobset/suite_test.go
index 2901938cc..33683d835 100644
--- a/test/integration/singlecluster/controller/jobs/jobset/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/jobset/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go b/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go
index d9edce41c..c2da406a2 100644
--- a/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go
@@ -33,7 +33,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/mpijob/suite_test.go b/test/integration/singlecluster/controller/jobs/mpijob/suite_test.go
index 5e1e6fbce..8eaeb8614 100644
--- a/test/integration/singlecluster/controller/jobs/mpijob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/mpijob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go b/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go
index dd917c520..7675e25fa 100644
--- a/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go
@@ -27,7 +27,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadpaddlejob "sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/paddlejob"
diff --git a/test/integration/singlecluster/controller/jobs/paddlejob/suite_test.go b/test/integration/singlecluster/controller/jobs/paddlejob/suite_test.go
index d20cecfdb..2c61fa214 100644
--- a/test/integration/singlecluster/controller/jobs/paddlejob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/paddlejob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go b/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go
index 741ad5bf2..d8e7c367f 100644
--- a/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/pod/suite_test.go b/test/integration/singlecluster/controller/jobs/pod/suite_test.go
index 9ace5306e..d7c310d53 100644
--- a/test/integration/singlecluster/controller/jobs/pod/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/pod/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go b/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go
index 0228ebd27..31aa0e64e 100644
--- a/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go
@@ -29,7 +29,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/pytorchjob/suite_test.go b/test/integration/singlecluster/controller/jobs/pytorchjob/suite_test.go
index 3d0520fbc..6a09357b7 100644
--- a/test/integration/singlecluster/controller/jobs/pytorchjob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/pytorchjob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/raycluster/raycluster_controller_test.go b/test/integration/singlecluster/controller/jobs/raycluster/raycluster_controller_test.go
index ec37b656d..6f876cefb 100644
--- a/test/integration/singlecluster/controller/jobs/raycluster/raycluster_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/raycluster/raycluster_controller_test.go
@@ -34,7 +34,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/raycluster/suite_test.go b/test/integration/singlecluster/controller/jobs/raycluster/suite_test.go
index 080ad9fe9..260d47c17 100644
--- a/test/integration/singlecluster/controller/jobs/raycluster/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/raycluster/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/rayjob/rayjob_controller_test.go b/test/integration/singlecluster/controller/jobs/rayjob/rayjob_controller_test.go
index ffd488711..2a49df482 100644
--- a/test/integration/singlecluster/controller/jobs/rayjob/rayjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/rayjob/rayjob_controller_test.go
@@ -31,7 +31,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
diff --git a/test/integration/singlecluster/controller/jobs/rayjob/suite_test.go b/test/integration/singlecluster/controller/jobs/rayjob/suite_test.go
index 27fa38ecf..b62b1e025 100644
--- a/test/integration/singlecluster/controller/jobs/rayjob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/rayjob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/tfjob/suite_test.go b/test/integration/singlecluster/controller/jobs/tfjob/suite_test.go
index 644ed3d93..ed90ef2b8 100644
--- a/test/integration/singlecluster/controller/jobs/tfjob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/tfjob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go b/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go
index ecc468159..950517932 100644
--- a/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go
@@ -27,7 +27,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadtfjob "sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/tfjob"
diff --git a/test/integration/singlecluster/controller/jobs/trainjob/suite_test.go b/test/integration/singlecluster/controller/jobs/trainjob/suite_test.go
index 70018b80c..74c130e70 100644
--- a/test/integration/singlecluster/controller/jobs/trainjob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/trainjob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
@@ -34,6 +34,8 @@ import (
 	"sigs.k8s.io/kueue/pkg/controller/core/indexer"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/trainjob"
+	"sigs.k8s.io/kueue/pkg/controller/tas"
+	tasindexer "sigs.k8s.io/kueue/pkg/controller/tas/indexer"
 	"sigs.k8s.io/kueue/pkg/scheduler"
 	"sigs.k8s.io/kueue/test/integration/framework"
 	"sigs.k8s.io/kueue/test/util"
@@ -84,7 +86,7 @@ func managerSetup(opts ...jobframework.Option) framework.ManagerSetup {
 	}
 }
 
-func managerAndSchedulerSetup(opts ...jobframework.Option) framework.ManagerSetup {
+func managerAndSchedulerSetup(setupTASControllers bool, opts ...jobframework.Option) framework.ManagerSetup {
 	return func(ctx context.Context, mgr manager.Manager) {
 		managerSetup(opts...)(ctx, mgr)
 
@@ -100,6 +102,14 @@ func managerAndSchedulerSetup(opts ...jobframework.Option) framework.ManagerSetu
 		failedCtrl, err := core.SetupControllers(mgr, queues, cCache, configuration)
 		gomega.Expect(err).ToNot(gomega.HaveOccurred(), "controller", failedCtrl)
 
+		if setupTASControllers {
+			failedCtrl, err = tas.SetupControllers(mgr, queues, cCache, configuration)
+			gomega.Expect(err).ToNot(gomega.HaveOccurred(), "TAS controller", failedCtrl)
+
+			err = tasindexer.SetupIndexes(ctx, mgr.GetFieldIndexer())
+			gomega.Expect(err).NotTo(gomega.HaveOccurred())
+		}
+
 		sched := scheduler.New(queues, cCache, mgr.GetClient(), mgr.GetEventRecorderFor(constants.AdmissionName))
 		err = sched.Start(ctx)
 		gomega.Expect(err).NotTo(gomega.HaveOccurred())
diff --git a/test/integration/singlecluster/controller/jobs/trainjob/trainjob_controller_test.go b/test/integration/singlecluster/controller/jobs/trainjob/trainjob_controller_test.go
index b74e35f0c..d4f914fb9 100644
--- a/test/integration/singlecluster/controller/jobs/trainjob/trainjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/trainjob/trainjob_controller_test.go
@@ -19,16 +19,20 @@ package trainjob
 import (
 	"fmt"
 
+	"github.com/google/go-cmp/cmp/cmpopts"
 	kftrainerapi "github.com/kubeflow/trainer/v2/pkg/apis/trainer/v1alpha1"
 	"github.com/onsi/ginkgo/v2"
 	"github.com/onsi/gomega"
+	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
 	apimeta "k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/clock"
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
+	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
@@ -37,6 +41,7 @@ import (
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
 	testingjobset "sigs.k8s.io/kueue/pkg/util/testingjobs/jobset"
+	testingnode "sigs.k8s.io/kueue/pkg/util/testingjobs/node"
 	testingtrainjob "sigs.k8s.io/kueue/pkg/util/testingjobs/trainjob"
 	"sigs.k8s.io/kueue/pkg/workload"
 	"sigs.k8s.io/kueue/test/util"
@@ -244,9 +249,9 @@ var _ = ginkgo.Describe("Trainjob controller", ginkgo.Ordered, ginkgo.ContinueOn
 			ginkgo.By("mark the trainjob as active", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(trainJob), trainJob)).To(gomega.Succeed())
-					trainJob.Status.JobsStatus = make([]kftrainerapi.JobStatus, 1)
-					trainJob.Status.JobsStatus[0].Active = 1
-					trainJob.Status.JobsStatus[0].Name = "node"
+					trainJob.Status.JobsStatus = []kftrainerapi.JobStatus{
+						testingtrainjob.MakeJobStatusWrapper("node").Active(1).Obj(),
+					}
 					g.Expect(k8sClient.Status().Update(ctx, trainJob)).To(gomega.Succeed())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
@@ -275,7 +280,7 @@ var _ = ginkgo.Describe("Trainjob controller", ginkgo.Ordered, ginkgo.ContinueOn
 			ginkgo.By("mark the trainjob as inactive", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(trainJob), trainJob)).To(gomega.Succeed())
-					trainJob.Status.JobsStatus[0].Active = 0
+					trainJob.Status.JobsStatus[0].Active = ptr.To(int32(0))
 					g.Expect(k8sClient.Status().Update(ctx, trainJob)).To(gomega.Succeed())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
@@ -351,7 +356,7 @@ var _ = ginkgo.Describe("TrainJob controller for workloads when only jobs with q
 
 var _ = ginkgo.Describe("TrainJob controller interacting with scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, func() {
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, managerAndSchedulerSetup())
+		fwk.StartManager(ctx, cfg, managerAndSchedulerSetup(false))
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
@@ -426,11 +431,11 @@ var _ = ginkgo.Describe("TrainJob controller interacting with scheduler", ginkgo
 		gomega.Eventually(func(g gomega.Gomega) {
 			g.Expect(k8sClient.Get(ctx, types.NamespacedName{Name: trainJob.Name, Namespace: ns.Name}, createdTrainJob)).Should(gomega.Succeed())
 			g.Expect(*createdTrainJob.Spec.Suspend).Should(gomega.BeFalse())
-			g.Expect(createdTrainJob.Spec.PodSpecOverrides).To(gomega.HaveLen(2))
-			g.Expect(createdTrainJob.Spec.PodSpecOverrides[0].TargetJobs[0]).Should(gomega.Equal(kftrainerapi.PodSpecOverrideTargetJob{Name: "node-1"}))
-			g.Expect(createdTrainJob.Spec.PodSpecOverrides[1].TargetJobs[0]).Should(gomega.Equal(kftrainerapi.PodSpecOverrideTargetJob{Name: "node-2"}))
-			g.Expect(createdTrainJob.Spec.PodSpecOverrides[0].NodeSelector[instanceKey]).Should(gomega.Equal(spotUntaintedFlavor.Name))
-			g.Expect(createdTrainJob.Spec.PodSpecOverrides[1].NodeSelector[instanceKey]).Should(gomega.Equal(onDemandFlavor.Name))
+			g.Expect(createdTrainJob.Spec.PodTemplateOverrides).To(gomega.HaveLen(2))
+			g.Expect(createdTrainJob.Spec.PodTemplateOverrides[0].TargetJobs[0]).Should(gomega.Equal(kftrainerapi.PodTemplateOverrideTargetJob{Name: "node-1"}))
+			g.Expect(createdTrainJob.Spec.PodTemplateOverrides[1].TargetJobs[0]).Should(gomega.Equal(kftrainerapi.PodTemplateOverrideTargetJob{Name: "node-2"}))
+			g.Expect(createdTrainJob.Spec.PodTemplateOverrides[0].Spec.NodeSelector[instanceKey]).Should(gomega.Equal(spotUntaintedFlavor.Name))
+			g.Expect(createdTrainJob.Spec.PodTemplateOverrides[1].Spec.NodeSelector[instanceKey]).Should(gomega.Equal(onDemandFlavor.Name))
 		}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
 		util.ExpectPendingWorkloadsMetric(clusterQueue, 0, 0)
@@ -524,14 +529,8 @@ var _ = ginkgo.Describe("TrainJob controller interacting with scheduler", ginkgo
 			createdTrainJob1 := &kftrainerapi.TrainJob{}
 			gomega.Expect(k8sClient.Get(ctx, types.NamespacedName{Name: trainJob1.Name, Namespace: ns.Name}, createdTrainJob1)).Should(gomega.Succeed())
 			createdTrainJob1.Status.JobsStatus = []kftrainerapi.JobStatus{
-				{
-					Name:      "node-1",
-					Succeeded: 2,
-				},
-				{
-					Name:      "node-2",
-					Succeeded: 1,
-				},
+				testingtrainjob.MakeJobStatusWrapper("node-1").Succeeded(2).Obj(),
+				testingtrainjob.MakeJobStatusWrapper("node-2").Succeeded(1).Obj(),
 			}
 			gomega.Expect(k8sClient.Status().Update(ctx, createdTrainJob1)).Should(gomega.Succeed())
 
@@ -561,3 +560,170 @@ var _ = ginkgo.Describe("TrainJob controller interacting with scheduler", ginkgo
 		})
 	})
 })
+
+var _ = ginkgo.Describe("TrainJob controller with TopologyAwareScheduling", ginkgo.Ordered, ginkgo.ContinueOnFailure, func() {
+	const (
+		nodeGroupLabel = "node-group"
+	)
+
+	var (
+		ns           *corev1.Namespace
+		nodes        []corev1.Node
+		topology     *kueue.Topology
+		tasFlavor    *kueue.ResourceFlavor
+		clusterQueue *kueue.ClusterQueue
+		localQueue   *kueue.LocalQueue
+	)
+
+	ginkgo.BeforeAll(func() {
+		fwk.StartManager(ctx, cfg, managerAndSchedulerSetup(true))
+	})
+
+	ginkgo.AfterAll(func() {
+		fwk.StopManager(ctx)
+	})
+
+	ginkgo.BeforeEach(func() {
+		ns = util.CreateNamespaceFromPrefixWithLog(ctx, k8sClient, "tas-jobset-")
+
+		nodes = []corev1.Node{
+			*testingnode.MakeNode("b1r1").
+				Label(nodeGroupLabel, "tas").
+				Label(testing.DefaultBlockTopologyLevel, "b1").
+				Label(testing.DefaultRackTopologyLevel, "r1").
+				StatusAllocatable(corev1.ResourceList{
+					corev1.ResourceCPU:    resource.MustParse("1"),
+					corev1.ResourceMemory: resource.MustParse("1Gi"),
+					corev1.ResourcePods:   resource.MustParse("10"),
+				}).
+				Ready().
+				Obj(),
+		}
+		util.CreateNodesWithStatus(ctx, k8sClient, nodes)
+
+		topology = utiltestingapi.MakeDefaultTwoLevelTopology("default")
+		util.MustCreate(ctx, k8sClient, topology)
+
+		tasFlavor = utiltestingapi.MakeResourceFlavor("tas-flavor").
+			NodeLabel(nodeGroupLabel, "tas").
+			TopologyName("default").Obj()
+		util.MustCreate(ctx, k8sClient, tasFlavor)
+
+		clusterQueue = utiltestingapi.MakeClusterQueue("cluster-queue").
+			ResourceGroup(*utiltestingapi.MakeFlavorQuotas(tasFlavor.Name).Resource(corev1.ResourceCPU, "5").Obj()).
+			Obj()
+		util.MustCreate(ctx, k8sClient, clusterQueue)
+		util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
+
+		localQueue = utiltestingapi.MakeLocalQueue("local-queue", ns.Name).ClusterQueue(clusterQueue.Name).Obj()
+		util.MustCreate(ctx, k8sClient, localQueue)
+	})
+
+	ginkgo.AfterEach(func() {
+		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
+		util.ExpectObjectToBeDeleted(ctx, k8sClient, clusterQueue, true)
+		util.ExpectObjectToBeDeleted(ctx, k8sClient, tasFlavor, true)
+		util.ExpectObjectToBeDeleted(ctx, k8sClient, topology, true)
+		for _, node := range nodes {
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, &node, true)
+		}
+	})
+
+	ginkgo.It("should admit workload which fits in a required topology domain", func() {
+		testJobSet := testingjobset.MakeJobSet("", "").ReplicatedJobs(
+			testingjobset.ReplicatedJobRequirements{
+				Name:        "node-1",
+				Replicas:    1,
+				Parallelism: 1,
+				Completions: 1,
+				PodAnnotations: map[string]string{
+					kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+				},
+			}, testingjobset.ReplicatedJobRequirements{
+				Name:        "node-2",
+				Replicas:    1,
+				Parallelism: 1,
+				Completions: 1,
+				PodAnnotations: map[string]string{
+					kueue.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+				},
+			},
+		).
+			Request("node-1", corev1.ResourceCPU, "100m").
+			Request("node-2", corev1.ResourceCPU, "100m").
+			Obj()
+		testTr := testingtrainjob.MakeTrainingRuntime("test", ns.Name, testJobSet.Spec)
+		trainJob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).RuntimeRef(kftrainerapi.RuntimeRef{
+			APIGroup: ptr.To("trainer.kubeflow.org"),
+			Name:     "test",
+			Kind:     ptr.To(kftrainerapi.TrainingRuntimeKind),
+		}).
+			Queue(localQueue.Name).
+			Suspend(false).
+			Obj()
+
+		ginkgo.By("creating a TrainJob", func() {
+			util.MustCreate(ctx, k8sClient, testTr)
+			util.MustCreate(ctx, k8sClient, trainJob)
+		})
+
+		wl := &kueue.Workload{}
+		wlLookupKey := types.NamespacedName{
+			Name:      workloadtrainjob.GetWorkloadNameForTrainJob(trainJob.Name, trainJob.UID),
+			Namespace: ns.Name,
+		}
+
+		ginkgo.By("verify the workload is created", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(k8sClient.Get(ctx, wlLookupKey, wl)).Should(gomega.Succeed())
+				g.Expect(wl.Spec.PodSets).Should(gomega.BeComparableTo([]kueue.PodSet{
+					{
+						Name:  "node-1",
+						Count: 1,
+						TopologyRequest: &kueue.PodSetTopologyRequest{
+							Required:           ptr.To(testing.DefaultBlockTopologyLevel),
+							PodIndexLabel:      ptr.To(batchv1.JobCompletionIndexAnnotation),
+							SubGroupIndexLabel: ptr.To(jobsetapi.JobIndexKey),
+							SubGroupCount:      ptr.To[int32](1),
+						},
+					},
+					{
+						Name:  "node-2",
+						Count: 1,
+						TopologyRequest: &kueue.PodSetTopologyRequest{
+							Preferred:          ptr.To(testing.DefaultRackTopologyLevel),
+							PodIndexLabel:      ptr.To(batchv1.JobCompletionIndexAnnotation),
+							SubGroupIndexLabel: ptr.To(jobsetapi.JobIndexKey),
+							SubGroupCount:      ptr.To[int32](1),
+						},
+					},
+				}, cmpopts.IgnoreFields(kueue.PodSet{}, "Template")))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("verify the workload is admitted", func() {
+			util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wl)
+			util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 1)
+		})
+
+		ginkgo.By("verify admission for the workload", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(k8sClient.Get(ctx, wlLookupKey, wl)).Should(gomega.Succeed())
+				g.Expect(wl.Status.Admission).ShouldNot(gomega.BeNil())
+				g.Expect(wl.Status.Admission.PodSetAssignments).Should(gomega.HaveLen(2))
+				g.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment).Should(gomega.BeComparableTo(
+					&kueue.TopologyAssignment{
+						Levels:  []string{testing.DefaultBlockTopologyLevel, testing.DefaultRackTopologyLevel},
+						Domains: []kueue.TopologyDomainAssignment{{Count: 1, Values: []string{"b1", "r1"}}},
+					},
+				))
+				g.Expect(wl.Status.Admission.PodSetAssignments[1].TopologyAssignment).Should(gomega.BeComparableTo(
+					&kueue.TopologyAssignment{
+						Levels:  []string{testing.DefaultBlockTopologyLevel, testing.DefaultRackTopologyLevel},
+						Domains: []kueue.TopologyDomainAssignment{{Count: 1, Values: []string{"b1", "r1"}}},
+					},
+				))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+	})
+})
diff --git a/test/integration/singlecluster/controller/jobs/xgboostjob/suite_test.go b/test/integration/singlecluster/controller/jobs/xgboostjob/suite_test.go
index ef1219213..54b164626 100644
--- a/test/integration/singlecluster/controller/jobs/xgboostjob/suite_test.go
+++ b/test/integration/singlecluster/controller/jobs/xgboostjob/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go b/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go
index efec6877a..a54790d7b 100644
--- a/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go
@@ -27,7 +27,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadxgboostjob "sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/xgboostjob"
diff --git a/test/integration/singlecluster/conversion/suite_test.go b/test/integration/singlecluster/conversion/suite_test.go
index 6d902a589..7f6c86dda 100644
--- a/test/integration/singlecluster/conversion/suite_test.go
+++ b/test/integration/singlecluster/conversion/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/importer/suite_test.go b/test/integration/singlecluster/importer/suite_test.go
index 547c58592..5700f93b4 100644
--- a/test/integration/singlecluster/importer/suite_test.go
+++ b/test/integration/singlecluster/importer/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/kueuectl/suite_test.go b/test/integration/singlecluster/kueuectl/suite_test.go
index c2c13274d..fb32ef6f9 100644
--- a/test/integration/singlecluster/kueuectl/suite_test.go
+++ b/test/integration/singlecluster/kueuectl/suite_test.go
@@ -28,7 +28,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/core"
diff --git a/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go b/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
index 4cef95808..f963bcd94 100644
--- a/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
+++ b/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
@@ -17,6 +17,7 @@ limitations under the License.
 package fairsharing
 
 import (
+	"math"
 	"time"
 
 	"github.com/onsi/ginkgo/v2"
@@ -28,8 +29,9 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	"sigs.k8s.io/kueue/pkg/controller/core"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/metrics"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
@@ -161,9 +163,9 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			}
 			util.ExpectReservingActiveWorkloadsMetric(cqA, 8)
 			util.ExpectPendingWorkloadsMetric(cqA, 0, 2)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 625)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 0)
-			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 625.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 0.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0.0)
 
 			ginkgo.By("Creating newer workloads in cq-b")
 			util.WaitForNextSecondAfterCreation(wls[len(wls)-1])
@@ -171,9 +173,9 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 				createWorkload("b", "1")
 			}
 			util.ExpectPendingWorkloadsMetric(cqB, 0, 5)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 625)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 0)
-			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 625.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 0.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0.0)
 
 			ginkgo.By("Terminating 4 running workloads in cqA: shared quota is fair-shared")
 			util.FinishRunningWorkloadsInCQ(ctx, k8sClient, cqA, 4)
@@ -183,9 +185,9 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.ExpectPendingWorkloadsMetric(cqA, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cqB, 3)
 			util.ExpectPendingWorkloadsMetric(cqB, 0, 2)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 250)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 250)
-			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 250.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 250.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0.0)
 
 			ginkgo.By("Terminating 2 more running workloads in cqA: cqB starts to take over shared quota")
 			util.FinishRunningWorkloadsInCQ(ctx, k8sClient, cqA, 2)
@@ -195,9 +197,9 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.ExpectPendingWorkloadsMetric(cqA, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(cqB, 4)
 			util.ExpectPendingWorkloadsMetric(cqB, 0, 1)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 125)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 375)
-			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 125.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 375.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqShared, 0.0)
 
 			ginkgo.By("Checking that weight share status changed")
 			cqAKey := client.ObjectKeyFromObject(cqA)
@@ -235,28 +237,34 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 				Cohort("all").
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU, "3").Obj(),
-				).Preemption(kueue.ClusterQueuePreemption{
-				ReclaimWithinCohort: kueue.PreemptionPolicyAny,
-				WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
-			}).Obj())
+				).
+				Preemption(kueue.ClusterQueuePreemption{
+					ReclaimWithinCohort: kueue.PreemptionPolicyAny,
+					WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
+				}).
+				Obj())
 
 			cqB = createQueue(utiltestingapi.MakeClusterQueue("b").
 				Cohort("all").
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU, "3").Obj(),
-				).Preemption(kueue.ClusterQueuePreemption{
-				ReclaimWithinCohort: kueue.PreemptionPolicyAny,
-				WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
-			}).Obj())
+				).
+				Preemption(kueue.ClusterQueuePreemption{
+					ReclaimWithinCohort: kueue.PreemptionPolicyAny,
+					WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
+				}).
+				Obj())
 
 			cqC = createQueue(utiltestingapi.MakeClusterQueue("c").
 				Cohort("all").
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU, "3").Obj(),
-				).Preemption(kueue.ClusterQueuePreemption{
-				ReclaimWithinCohort: kueue.PreemptionPolicyAny,
-				WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
-			}).Obj())
+				).
+				Preemption(kueue.ClusterQueuePreemption{
+					ReclaimWithinCohort: kueue.PreemptionPolicyAny,
+					WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
+				}).
+				Obj())
 		})
 
 		ginkgo.It("Admits workloads respecting fair share", framework.SlowSpec, func() {
@@ -266,9 +274,9 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			}
 			util.ExpectReservingActiveWorkloadsMetric(cqA, 9)
 			util.ExpectPendingWorkloadsMetric(cqA, 0, 1)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 667)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 0)
-			util.ExpectClusterQueueWeightedShareMetric(cqC, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 6.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 0.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqC, 0.0)
 
 			ginkgo.By("Creating newer workloads in cq-b")
 			for range 5 {
@@ -279,24 +287,24 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			ginkgo.By("Finishing eviction of 4 running workloads in cqA: shared quota is fair-shared")
 			util.FinishEvictionOfWorkloadsInCQ(ctx, k8sClient, cqA, 4)
 			util.ExpectReservingActiveWorkloadsMetric(cqB, 4)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 223)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 112)
-			util.ExpectClusterQueueWeightedShareMetric(cqC, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 2.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 1.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqC, 0.0)
 
 			ginkgo.By("cq-c reclaims one unit, preemption happens in cq-a")
 			cWorkload := utiltestingapi.MakeWorkload("c0", ns.Name).Queue("c").Request(corev1.ResourceCPU, "1").Obj()
 			util.MustCreate(ctx, k8sClient, cWorkload)
 			util.ExpectPendingWorkloadsMetric(cqC, 1, 0)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 223)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 112)
-			util.ExpectClusterQueueWeightedShareMetric(cqC, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 2.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 1.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqC, 0.0)
 
 			ginkgo.By("Finishing eviction of 1 running workloads in the CQ with highest usage: cqA")
 			util.FinishEvictionOfWorkloadsInCQ(ctx, k8sClient, cqA, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cqC, 1)
-			util.ExpectClusterQueueWeightedShareMetric(cqA, 112)
-			util.ExpectClusterQueueWeightedShareMetric(cqB, 112)
-			util.ExpectClusterQueueWeightedShareMetric(cqC, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqA, 1.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqB, 1.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqC, 0.0)
 
 			ginkgo.By("Checking that weight share status changed")
 			cqAKey := client.ObjectKeyFromObject(cqA)
@@ -378,6 +386,22 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.ExpectEvictedWorkloadsTotalMetric(cqA.Name, kueue.WorkloadEvictedByPreemption, "", "", 1)
 			util.ExpectEvictedWorkloadsTotalMetric(cqB.Name, kueue.WorkloadEvictedByPreemption, "", "", 0)
 		})
+
+		ginkgo.It("should have NaN weighted share metric", func() {
+			ginkgo.By("Creating a workload in cqA")
+			wlA1 := createWorkloadWithPriority("best-effort-cq-a", "4", 100)
+			util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wlA1)
+			util.ExpectAdmittedWorkloadsTotalMetric(cqA, "", 1)
+			util.ExpectReservingActiveWorkloadsMetric(cqA, 1)
+
+			ginkgo.By("checking the weighted share metric")
+			gomega.Eventually(func(g gomega.Gomega) {
+				metric := metrics.ClusterQueueWeightedShare.WithLabelValues(cqA.Name, string(cqA.Spec.Cohort))
+				v, err := testutil.GetGaugeMetricValue(metric)
+				g.Expect(err).ToNot(gomega.HaveOccurred())
+				g.Expect(math.IsNaN(v)).Should(gomega.BeTrue())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
 	})
 
 	ginkgo.When("using hierarchical cohorts", func() {
@@ -409,9 +433,9 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas(defaultFlavor.Name).Resource(corev1.ResourceCPU, "2").Obj(),
 				).Obj())
-			expectCohortWeightedShare(cohortFirstLeft.Name, 0)
-			expectCohortWeightedShare(cohortFirstRight.Name, 0)
-			expectCohortWeightedShare(cohortBank.Name, 0)
+			expectCohortWeightedShare(cohortFirstLeft.Name, 0.0)
+			expectCohortWeightedShare(cohortFirstRight.Name, 0.0)
+			expectCohortWeightedShare(cohortBank.Name, 0.0)
 
 			ginkgo.By("Adding workloads to cqSecondLeft and cqSecondRight in round-robin fashion")
 			for range 5 {
@@ -423,11 +447,11 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.ExpectReservingActiveWorkloadsMetric(cqSecondLeft, 5)
 			util.ExpectAdmittedWorkloadsTotalMetric(cqSecondRight, "", 5)
 			util.ExpectReservingActiveWorkloadsMetric(cqSecondRight, 5)
-			expectCohortWeightedShare(cohortFirstLeft.Name, 429)
-			expectCohortWeightedShare(cohortFirstRight.Name, 0)
-			expectCohortWeightedShare(cohortSecondLeft.Name, 215)
-			expectCohortWeightedShare(cohortSecondRight.Name, 215)
-			expectCohortWeightedShare(cohortBank.Name, 0)
+			expectCohortWeightedShare(cohortFirstLeft.Name, 6.0*1000.0/14.0)
+			expectCohortWeightedShare(cohortFirstRight.Name, 0.0)
+			expectCohortWeightedShare(cohortSecondLeft.Name, 3.0*1000.0/14.0)
+			expectCohortWeightedShare(cohortSecondRight.Name, 3.0*1000.0/14.0)
+			expectCohortWeightedShare(cohortBank.Name, 0.0)
 		})
 		ginkgo.It("preempts workloads to enforce fair share", func() {
 			// below are Cohorts and their fair
@@ -462,8 +486,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 				createWorkloadWithPriority(kueue.LocalQueueName(bestEffortQueue.GetName()), "1", -1)
 				createWorkloadWithPriority(kueue.LocalQueueName(physicsQueue.GetName()), "1", -1)
 			}
-			expectCohortWeightedShare("best-effort", 1000)
-			expectCohortWeightedShare("physics", 500)
+			expectCohortWeightedShare("best-effort", 1000.0)
+			expectCohortWeightedShare("physics", 500.0)
 			util.ExpectAdmittedWorkloadsTotalMetric(bestEffortQueue, "", 6)
 			util.ExpectReservingActiveWorkloadsMetric(bestEffortQueue, 6)
 			util.ExpectAdmittedWorkloadsTotalMetric(physicsQueue, "", 6)
@@ -482,12 +506,12 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 
 			ginkgo.By("share is fair with respect to each parent")
 			// parent root
-			expectCohortWeightedShare("best-effort", 667)
-			expectCohortWeightedShare("research", 667)
+			expectCohortWeightedShare("best-effort", 4.0*1000.0/12.0/0.5)
+			expectCohortWeightedShare("research", 8.0*1000.0/12.0)
 			// parent research
-			expectCohortWeightedShare("chemistry", 167)
-			expectCohortWeightedShare("physics", 167)
-			expectCohortWeightedShare("llm", 167)
+			expectCohortWeightedShare("chemistry", 2.0*1000.0/12.0)
+			expectCohortWeightedShare("physics", 2.0*1000.0/12.0)
+			expectCohortWeightedShare("llm", 4.0*1000.0/12.0/2.0)
 
 			ginkgo.By("number workloads admitted proportional to share at each level")
 			util.ExpectReservingActiveWorkloadsMetric(bestEffortQueue, 4)
@@ -608,8 +632,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.ExpectReservingActiveWorkloadsMetric(cqp1, 18)
 
 			ginkgo.By("Expected Weighted Shares")
-			util.ExpectClusterQueueWeightedShareMetric(cqp1, 600)
-			expectCohortWeightedShare("cohort-a", 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp1, 600.0)
+			expectCohortWeightedShare("cohort-a", 0.0)
 		})
 		ginkgo.It("Prefers flavor with remaining guarantees at Cohort level (FlavorFungibilityImplicitPreferenceDefault=true)", func() {
 			_ = features.SetEnable(features.FlavorFungibilityImplicitPreferenceDefault, true)
@@ -621,8 +645,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.ExpectReservingActiveWorkloadsMetric(cqp1, 18)
 
 			ginkgo.By("Expected Weighted Shares")
-			util.ExpectClusterQueueWeightedShareMetric(cqp1, 600)
-			expectCohortWeightedShare("cohort-a", 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp1, 600.0)
+			expectCohortWeightedShare("cohort-a", 0.0)
 		})
 
 		// scenario from Kueue#7015
@@ -638,7 +662,7 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			}
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp1, "", 20)
 			util.ExpectReservingActiveWorkloadsMetric(cqp1, 20)
-			expectCohortWeightedShare("cohort-a", 100)
+			expectCohortWeightedShare("cohort-a", 100.0)
 
 			ginkgo.By("Create workloads in CohortB which will preempt CohortA")
 			createWorkload("cq-p5", "1")
@@ -652,10 +676,10 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.ExpectReservingActiveWorkloadsMetric(cqp5, 2)
 
 			ginkgo.By("Expected Weighted Shares")
-			util.ExpectClusterQueueWeightedShareMetric(cqp1, 600)
-			util.ExpectClusterQueueWeightedShareMetric(cqp5, 100)
-			expectCohortWeightedShare("cohort-a", 0)
-			expectCohortWeightedShare("cohort-b", 0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp1, 600.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp5, 100.0)
+			expectCohortWeightedShare("cohort-a", 0.0)
+			expectCohortWeightedShare("cohort-b", 0.0)
 		})
 	})
 
@@ -728,8 +752,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			ginkgo.By("Expected Total Admitted Workloads and Weighted Share")
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp1, "", 4)
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp2, "", 1)
-			util.ExpectClusterQueueWeightedShareMetric(cqp1, 445)
-			util.ExpectClusterQueueWeightedShareMetric(cqp2, 556)
+			util.ExpectClusterQueueWeightedShareMetric(cqp1, 4.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp2, 5.0*1000.0/9.0)
 		})
 
 		// The larger workload, size 6, satisfies
@@ -761,8 +785,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			ginkgo.By("Expected Total Admitted Workloads and Weighted Share")
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp1, "", 4)
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp2, "", 1)
-			util.ExpectClusterQueueWeightedShareMetric(cqp1, 445)
-			util.ExpectClusterQueueWeightedShareMetric(cqp2, 556)
+			util.ExpectClusterQueueWeightedShareMetric(cqp1, 4.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp2, 5.0*1000.0/9.0)
 		})
 
 		ginkgo.It("workload of size 4 admits with inadmissible higher priority workload at ClusterQueue head", func() {
@@ -787,8 +811,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			ginkgo.By("Expected Total Admitted Workloads and Weighted Share")
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp1, "", 4)
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp2, "", 1)
-			util.ExpectClusterQueueWeightedShareMetric(cqp1, 445)
-			util.ExpectClusterQueueWeightedShareMetric(cqp2, 445)
+			util.ExpectClusterQueueWeightedShareMetric(cqp1, 4.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp2, 4.0*1000.0/9.0)
 		})
 
 		ginkgo.It("workload admits when several higher priority blocking workloads in front", func() {
@@ -814,8 +838,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			ginkgo.By("Expected Total Admitted Workloads and Weighted Share")
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp1, "", 4)
 			util.ExpectAdmittedWorkloadsTotalMetric(cqp2, "", 1)
-			util.ExpectClusterQueueWeightedShareMetric(cqp1, 445)
-			util.ExpectClusterQueueWeightedShareMetric(cqp2, 556)
+			util.ExpectClusterQueueWeightedShareMetric(cqp1, 4.0*1000.0/9.0)
+			util.ExpectClusterQueueWeightedShareMetric(cqp2, 5.0*1000.0/9.0)
 		})
 	})
 
@@ -885,8 +909,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			ginkgo.By("Expected Total Admitted Workloads and Weighted Share")
 			util.ExpectAdmittedWorkloadsTotalMetric(cq1, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq2, "", 2)
-			util.ExpectClusterQueueWeightedShareMetric(cq1, 0)
-			util.ExpectClusterQueueWeightedShareMetric(cq2, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cq1, 0.0)
+			util.ExpectClusterQueueWeightedShareMetric(cq2, 0.0)
 		})
 
 		ginkgo.It("sticky workload becomes inadmissible. next workload admits", func() {
@@ -923,8 +947,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 
 			ginkgo.By("Expected Total Admitted Workloads and Weighted Share")
 			util.ExpectAdmittedWorkloadsTotalMetric(cq1, "", 1)
-			util.ExpectClusterQueueWeightedShareMetric(cq1, 0)
-			util.ExpectClusterQueueWeightedShareMetric(cq2, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cq1, 0.0)
+			util.ExpectClusterQueueWeightedShareMetric(cq2, 0.0)
 		})
 
 		ginkgo.It("sticky workload deleted, next workload can admit", func() {
@@ -956,8 +980,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 
 			ginkgo.By("Expected Total Admitted Workloads and Weighted Share")
 			util.ExpectAdmittedWorkloadsTotalMetric(cq1, "", 1)
-			util.ExpectClusterQueueWeightedShareMetric(cq1, 0)
-			util.ExpectClusterQueueWeightedShareMetric(cq2, 0)
+			util.ExpectClusterQueueWeightedShareMetric(cq1, 0.0)
+			util.ExpectClusterQueueWeightedShareMetric(cq2, 0.0)
 		})
 	})
 
@@ -1135,19 +1159,21 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 				Cohort("all").FairWeight(resource.MustParse("300")).
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU, "600").Obj(),
-				).Preemption(kueue.ClusterQueuePreemption{
-				ReclaimWithinCohort: kueue.PreemptionPolicyAny,
-				WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
-			}).Obj())
+				).
+				Preemption(kueue.ClusterQueuePreemption{
+					ReclaimWithinCohort: kueue.PreemptionPolicyAny,
+					WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
+				}).Obj())
 
 			cqB = createQueue(utiltestingapi.MakeClusterQueue("b").
 				Cohort("all").FairWeight(resource.MustParse("300")).
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU, "600").Obj(),
-				).Preemption(kueue.ClusterQueuePreemption{
-				ReclaimWithinCohort: kueue.PreemptionPolicyAny,
-				WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
-			}).Obj())
+				).
+				Preemption(kueue.ClusterQueuePreemption{
+					ReclaimWithinCohort: kueue.PreemptionPolicyAny,
+					WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
+				}).Obj())
 		})
 
 		ginkgo.It("Queue can reclaim its nominal quota", framework.SlowSpec, func() {
@@ -1187,8 +1213,9 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 				Cohort("all").
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU, "8").Obj(),
-				).Preemption(kueue.ClusterQueuePreemption{
-				ReclaimWithinCohort: kueue.PreemptionPolicyAny}).
+				).
+				Preemption(kueue.ClusterQueuePreemption{
+					ReclaimWithinCohort: kueue.PreemptionPolicyAny}).
 				Obj())
 
 			features.SetFeatureGateDuringTest(ginkgo.GinkgoTB(), features.AdmissionFairSharing, false)
@@ -1218,13 +1245,13 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 	})
 })
 
-func expectCohortWeightedShare(cohortName string, weightedShare int64) {
+func expectCohortWeightedShare(cohortName string, weightedShare float64) {
 	// check Status
 	gomega.EventuallyWithOffset(1, func(g gomega.Gomega) {
 		cohort := &kueue.Cohort{}
 		g.ExpectWithOffset(1, k8sClient.Get(ctx, client.ObjectKey{Name: cohortName}, cohort)).Should(gomega.Succeed())
 		g.ExpectWithOffset(1, cohort.Status.FairSharing).ShouldNot(gomega.BeNil())
-		g.ExpectWithOffset(1, cohort.Status.FairSharing.WeightedShare).Should(gomega.Equal(weightedShare))
+		g.ExpectWithOffset(1, cohort.Status.FairSharing.WeightedShare).Should(gomega.Equal(core.WeightedShare(weightedShare)))
 	}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
 	// check Metric
@@ -1232,7 +1259,7 @@ func expectCohortWeightedShare(cohortName string, weightedShare int64) {
 	gomega.EventuallyWithOffset(1, func(g gomega.Gomega) {
 		v, err := testutil.GetGaugeMetricValue(metric)
 		g.ExpectWithOffset(1, err).ToNot(gomega.HaveOccurred())
-		g.ExpectWithOffset(1, int64(v)).Should(gomega.Equal(weightedShare))
+		g.ExpectWithOffset(1, v).Should(gomega.Equal(weightedShare))
 	}, util.Timeout, util.Interval).Should(gomega.Succeed())
 }
 
@@ -1328,10 +1355,12 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 				Cohort("all").
 				ResourceGroup(
 					*utiltestingapi.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU, "16").Obj(),
-				).Preemption(kueue.ClusterQueuePreemption{
-				ReclaimWithinCohort: kueue.PreemptionPolicyAny,
-				WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
-			}).Obj()
+				).
+				Preemption(kueue.ClusterQueuePreemption{
+					ReclaimWithinCohort: kueue.PreemptionPolicyAny,
+					WithinClusterQueue:  kueue.PreemptionPolicyLowerPriority,
+				}).
+				Obj()
 			util.MustCreate(ctx, k8sClient, cq2)
 			cqs = append(cqs, cq2)
 
diff --git a/test/integration/singlecluster/scheduler/fairsharing/suite_test.go b/test/integration/singlecluster/scheduler/fairsharing/suite_test.go
index e1730bc1d..c02423a32 100644
--- a/test/integration/singlecluster/scheduler/fairsharing/suite_test.go
+++ b/test/integration/singlecluster/scheduler/fairsharing/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/scheduler/podsready/scheduler_test.go b/test/integration/singlecluster/scheduler/podsready/scheduler_test.go
index 7b9f5c933..1082d86e1 100644
--- a/test/integration/singlecluster/scheduler/podsready/scheduler_test.go
+++ b/test/integration/singlecluster/scheduler/podsready/scheduler_test.go
@@ -30,7 +30,7 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta1"
 	"sigs.k8s.io/kueue/pkg/workload"
diff --git a/test/integration/singlecluster/scheduler/podsready/suite_test.go b/test/integration/singlecluster/scheduler/podsready/suite_test.go
index c0a868e82..b8bdbc14d 100644
--- a/test/integration/singlecluster/scheduler/podsready/suite_test.go
+++ b/test/integration/singlecluster/scheduler/podsready/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/scheduler/suite_test.go b/test/integration/singlecluster/scheduler/suite_test.go
index 3ad1ea3d3..ea8eaa9c9 100644
--- a/test/integration/singlecluster/scheduler/suite_test.go
+++ b/test/integration/singlecluster/scheduler/suite_test.go
@@ -29,7 +29,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/tas/suite_test.go b/test/integration/singlecluster/tas/suite_test.go
index be1d3c55e..e5b007a92 100644
--- a/test/integration/singlecluster/tas/suite_test.go
+++ b/test/integration/singlecluster/tas/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
diff --git a/test/integration/singlecluster/webhook/core/suite_test.go b/test/integration/singlecluster/webhook/core/suite_test.go
index 66b66d61b..e140608b7 100644
--- a/test/integration/singlecluster/webhook/core/suite_test.go
+++ b/test/integration/singlecluster/webhook/core/suite_test.go
@@ -26,7 +26,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/core"
diff --git a/test/integration/singlecluster/webhook/jobs/trainjob_webhook_test.go b/test/integration/singlecluster/webhook/jobs/trainjob_webhook_test.go
index 79d05bbf1..2b57b4f09 100644
--- a/test/integration/singlecluster/webhook/jobs/trainjob_webhook_test.go
+++ b/test/integration/singlecluster/webhook/jobs/trainjob_webhook_test.go
@@ -23,9 +23,13 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
+	ctrl "sigs.k8s.io/controller-runtime"
 
+	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconstants "sigs.k8s.io/kueue/pkg/controller/constants"
+	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadtrainjob "sigs.k8s.io/kueue/pkg/controller/jobs/trainjob"
+	testingjobset "sigs.k8s.io/kueue/pkg/util/testingjobs/jobset"
 	testingtrainjob "sigs.k8s.io/kueue/pkg/util/testingjobs/trainjob"
 	"sigs.k8s.io/kueue/test/util"
 )
@@ -35,7 +39,18 @@ var _ = ginkgo.Describe("Trainjob Webhook", func() {
 
 	ginkgo.When("with manageJobsWithoutQueueName disabled", ginkgo.Ordered, ginkgo.ContinueOnFailure, func() {
 		ginkgo.BeforeAll(func() {
-			fwk.StartManager(ctx, cfg, managerSetup(workloadtrainjob.SetupTrainJobWebhook))
+			fwk.StartManager(ctx, cfg, managerSetup(func(mgr ctrl.Manager, opts ...jobframework.Option) error {
+				// Necessary to initialize the runtimes
+				if _, err := workloadtrainjob.NewReconciler(
+					ctx,
+					mgr.GetClient(),
+					mgr.GetFieldIndexer(),
+					mgr.GetEventRecorderFor(constants.JobControllerName),
+					opts...); err != nil {
+					return err
+				}
+				return workloadtrainjob.SetupTrainJobWebhook(mgr, opts...)
+			}))
 		})
 		ginkgo.BeforeEach(func() {
 			ns = util.CreateNamespaceFromPrefixWithLog(ctx, k8sClient, "trainjob-")
@@ -48,12 +63,24 @@ var _ = ginkgo.Describe("Trainjob Webhook", func() {
 		})
 
 		ginkgo.It("should succed creating the TrainJob", func() {
-			trainJob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).
+			testJobSet := testingjobset.MakeJobSet("", "").ReplicatedJobs(
+				testingjobset.ReplicatedJobRequirements{
+					Name:     "node",
+					Replicas: 1,
+				}).
+				Obj()
+			testTr := testingtrainjob.MakeTrainingRuntime("test", ns.Name, testJobSet.Spec)
+			trainJob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).RuntimeRef(kftrainerapi.RuntimeRef{
+				APIGroup: ptr.To(kftrainerapi.GroupVersion.Group),
+				Name:     "test",
+				Kind:     ptr.To(kftrainerapi.TrainingRuntimeKind),
+			}).
 				Queue("queue").
 				Suspend(false).
 				Obj()
 
 			ginkgo.By("by creating the TrainJob", func() {
+				util.MustCreate(ctx, k8sClient, testTr)
 				util.MustCreate(ctx, k8sClient, trainJob)
 			})
 
@@ -68,11 +95,23 @@ var _ = ginkgo.Describe("Trainjob Webhook", func() {
 		})
 
 		ginkgo.It("should not suspend a TrainJob without queue", func() {
-			trainJob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).
+			testJobSet := testingjobset.MakeJobSet("", "").ReplicatedJobs(
+				testingjobset.ReplicatedJobRequirements{
+					Name:     "node",
+					Replicas: 1,
+				}).
+				Obj()
+			testTr := testingtrainjob.MakeTrainingRuntime("test", ns.Name, testJobSet.Spec)
+			trainJob := testingtrainjob.MakeTrainJob("trainjob-test", ns.Name).RuntimeRef(kftrainerapi.RuntimeRef{
+				APIGroup: ptr.To(kftrainerapi.GroupVersion.Group),
+				Name:     "test",
+				Kind:     ptr.To(kftrainerapi.TrainingRuntimeKind),
+			}).
 				Suspend(false).
 				Obj()
 
 			ginkgo.By("by creating the TrainJob", func() {
+				util.MustCreate(ctx, k8sClient, testTr)
 				util.MustCreate(ctx, k8sClient, trainJob)
 			})
 
diff --git a/test/performance/scheduler/minimalkueue/main.go b/test/performance/scheduler/minimalkueue/main.go
index 51307d130..df95d6bbc 100644
--- a/test/performance/scheduler/minimalkueue/main.go
+++ b/test/performance/scheduler/minimalkueue/main.go
@@ -36,7 +36,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
diff --git a/test/performance/scheduler/runner/main.go b/test/performance/scheduler/runner/main.go
index 59863ec2f..1c67c8a39 100644
--- a/test/performance/scheduler/runner/main.go
+++ b/test/performance/scheduler/runner/main.go
@@ -45,7 +45,7 @@ import (
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 	"sigs.k8s.io/yaml"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/test/util/e2e.go b/test/util/e2e.go
index 4c423df77..1132070d0 100644
--- a/test/util/e2e.go
+++ b/test/util/e2e.go
@@ -49,7 +49,7 @@ import (
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 	"sigs.k8s.io/yaml"
 
-	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	kueuev1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
diff --git a/test/util/util.go b/test/util/util.go
index 25e7495c8..e84704e5b 100644
--- a/test/util/util.go
+++ b/test/util/util.go
@@ -728,12 +728,12 @@ func ExpectClusterQueueStatusMetric(cq *kueue.ClusterQueue, status metrics.Clust
 	}
 }
 
-func ExpectClusterQueueWeightedShareMetric(cq *kueue.ClusterQueue, value int64) {
-	metric := metrics.ClusterQueueWeightedShare.WithLabelValues(cq.Name)
+func ExpectClusterQueueWeightedShareMetric(cq *kueue.ClusterQueue, value float64) {
+	metric := metrics.ClusterQueueWeightedShare.WithLabelValues(cq.Name, string(cq.Spec.Cohort))
 	gomega.EventuallyWithOffset(1, func(g gomega.Gomega) {
 		v, err := testutil.GetGaugeMetricValue(metric)
 		g.Expect(err).ToNot(gomega.HaveOccurred())
-		g.Expect(int64(v)).Should(gomega.Equal(value))
+		g.Expect(v).Should(gomega.Equal(value))
 	}, Timeout, Interval).Should(gomega.Succeed())
 }