Repository: kubernetes-sigs/kueue

Issue:
[flaky test] ManageJobsWithoutQueueName when manageJobsWithoutQueueName=true should not admit child jobs and jobset even if the child job and jobset has a queue-name label
**What happened**:

failure https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/kubernetes-sigs_kueue/7835/pull-kueue-test-e2e-customconfigs-main/1992927930895831040

**What you expected to happen**:
no failure
**How to reproduce it (as minimally and precisely as possible)**:
ci
**Anything else we need to know?**:
```
{Timed out after 45.001s.
The function passed to Eventually failed at /home/prow/go/src/sigs.k8s.io/kueue/test/e2e/customconfigs/managejobswithoutqueuename_test.go:498 with:
Expected
    <string>: 
to equal
    <string>: Completed failed [FAILED] Timed out after 45.001s.
The function passed to Eventually failed at /home/prow/go/src/sigs.k8s.io/kueue/test/e2e/customconfigs/managejobswithoutqueuename_test.go:498 with:
Expected
    <string>: 
to equal
    <string>: Completed
In [It] at: /home/prow/go/src/sigs.k8s.io/kueue/test/e2e/customconfigs/managejobswithoutqueuename_test.go:499 @ 11/24/25 12:19:51.505
}
```

Discussion:
@mimowo: cc @kannon92 @kannon92: This is a different test than the one we just fixed btw.@kannon92: I took a look at the logs.

https://github.com/kubernetes-sigs/jobset/issues/1094

It looks like for the test we hit an error on modifying an out of date job. @mimowo: Interesting, shouldn't we then retry on the error until the update succeeds? Is it a recent regression in JobSet? I haven't seen this before. Also, I'm wondering if we really need then to wait for the JobSet to finish. It is not really the intention of the test, so as fixing the flake we could just remove the assert, and verify the JobSet is unsuspended.@kannon92: The flake seemed rare.

I'm open to restricting the test to what we actually care about. Waiting for complettion can be slow so if we don't need it I would suggest we don't check on it.
@mimowo: sgtm@kannon92: https://github.com/kubernetes-sigs/kueue/pull/7862@kannon92: /assign

Solution patch:
diff --git a/OWNERS b/OWNERS
index 302f65827..b73dcd616 100644
--- a/OWNERS
+++ b/OWNERS
@@ -11,6 +11,7 @@ reviewers:
 - mimowo
 - pbundyra
 - tenzen-y
+- kannon92
 
 emeritus_approvers:
 - ahg-g
diff --git a/README.md b/README.md
index c62647f2e..408e92f37 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ Read the [overview](https://kueue.sigs.k8s.io/docs/overview/) and watch the Kueu
 - **Integrations:** Built-in support for popular jobs, e.g. [BatchJob](https://kueue.sigs.k8s.io/docs/tasks/run/jobs/), [Kubeflow training jobs](https://kueue.sigs.k8s.io/docs/tasks/run/kubeflow/), [RayJob](https://kueue.sigs.k8s.io/docs/tasks/run/rayjobs/), [RayCluster](https://kueue.sigs.k8s.io/docs/tasks/run/rayclusters/), [JobSet](https://kueue.sigs.k8s.io/docs/tasks/run/jobsets/),  [plain Pod and Pod Groups](https://kueue.sigs.k8s.io/docs/tasks/run/plain_pods/).
 - **System insight:** Build-in [prometheus metrics](https://kueue.sigs.k8s.io/docs/reference/metrics/) to help monitor the state of the system, and on-demand visibility endpoint for [monitoring of pending workloads](https://kueue.sigs.k8s.io/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand/).
 - **AdmissionChecks:** A mechanism for internal or external components to influence whether a workload can be [admitted](https://kueue.sigs.k8s.io/docs/concepts/admission_check/).
-- **Advanced autoscaling support:** Integration with cluster-autoscaler's [provisioningRequest](https://kueue.sigs.k8s.io/docs/admission-check-controllers/provisioning/#job-using-a-provisioningrequest) via admissionChecks.
+- **Advanced autoscaling support:** Integration with cluster-autoscaler's [provisioningRequest](https://kueue.sigs.k8s.io/docs/concepts/admission_check/provisioning_request/#job-using-a-provisioningrequest) via admissionChecks.
 - **All-or-nothing with ready Pods:** A timeout-based implementation of [All-or-nothing scheduling](https://kueue.sigs.k8s.io/docs/tasks/manage/setup_wait_for_pods_ready/).
 - **Partial admission and dynamic reclaim:** mechanisms to run a job with [reduced parallelism](https://kueue.sigs.k8s.io/docs/tasks/run/jobs/#partial-admission), based on available quota, and to [release](https://kueue.sigs.k8s.io/docs/concepts/workload/#dynamic-reclaim) the quota the pods complete..
 - **Mixing training and inference**: Simultaneous management of batch workloads along with serving workloads (such as [Deployments](https://kueue.sigs.k8s.io/docs/tasks/run/deployment/) or [StatefulSets](https://kueue.sigs.k8s.io/docs/tasks/run/statefulset/))
diff --git a/apis/kueue/v1beta1/multikueue_conversion.go b/apis/kueue/v1beta1/multikueue_conversion.go
index 235388510..76b1b69c0 100644
--- a/apis/kueue/v1beta1/multikueue_conversion.go
+++ b/apis/kueue/v1beta1/multikueue_conversion.go
@@ -43,6 +43,11 @@ func Convert_v1beta2_MultiKueueClusterSpec_To_v1beta1_MultiKueueClusterSpec(in *
 			LocationType: LocationType(in.ClusterSource.KubeConfig.LocationType),
 		}
 	}
+	if in.ClusterSource.ClusterProfileRef != nil {
+		out.ClusterProfileRef = &ClusterProfileReference{
+			Name: in.ClusterSource.ClusterProfileRef.Name,
+		}
+	}
 	return autoConvert_v1beta2_MultiKueueClusterSpec_To_v1beta1_MultiKueueClusterSpec(in, out, s)
 }
 
@@ -55,5 +60,10 @@ func Convert_v1beta1_MultiKueueClusterSpec_To_v1beta2_MultiKueueClusterSpec(in *
 			},
 		}
 	}
+	if in.ClusterProfileRef != nil {
+		out.ClusterSource.ClusterProfileRef = &v1beta2.ClusterProfileReference{
+			Name: in.ClusterProfileRef.Name,
+		}
+	}
 	return autoConvert_v1beta1_MultiKueueClusterSpec_To_v1beta2_MultiKueueClusterSpec(in, out, s)
 }
diff --git a/apis/kueue/v1beta1/multikueue_types.go b/apis/kueue/v1beta1/multikueue_types.go
index 7d3cbfc68..f9297c7e7 100644
--- a/apis/kueue/v1beta1/multikueue_types.go
+++ b/apis/kueue/v1beta1/multikueue_types.go
@@ -61,6 +61,21 @@ type KubeConfig struct {
 type MultiKueueClusterSpec struct {
 	// kubeConfig is information on how to connect to the cluster.
 	KubeConfig KubeConfig `json:"kubeConfig"`
+
+	// clusterProfileRef is the reference to the ClusterProfile object used to connect to the cluster.
+	//
+	// This is only used to prevent data loss when converting between v1beta2 and v1beta1.
+	// It has no effect in v1beta1.
+	// +optional
+	ClusterProfileRef *ClusterProfileReference `json:"clusterProfileRef,omitempty"`
+}
+
+type ClusterProfileReference struct {
+	// name of the ClusterProfile.
+	// +kubebuilder:validation:MaxLength=256
+	// +kubebuilder:validation:MinLength=1
+	// +required
+	Name string `json:"name,omitempty"`
 }
 
 type MultiKueueClusterStatus struct {
diff --git a/apis/kueue/v1beta1/zz_generated.conversion.go b/apis/kueue/v1beta1/zz_generated.conversion.go
index 07203119e..cf59fc28c 100644
--- a/apis/kueue/v1beta1/zz_generated.conversion.go
+++ b/apis/kueue/v1beta1/zz_generated.conversion.go
@@ -143,6 +143,16 @@ func RegisterConversions(s *runtime.Scheme) error {
 	}); err != nil {
 		return err
 	}
+	if err := s.AddGeneratedConversionFunc((*ClusterProfileReference)(nil), (*v1beta2.ClusterProfileReference)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ClusterProfileReference_To_v1beta2_ClusterProfileReference(a.(*ClusterProfileReference), b.(*v1beta2.ClusterProfileReference), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterProfileReference)(nil), (*ClusterProfileReference)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ClusterProfileReference_To_v1beta1_ClusterProfileReference(a.(*v1beta2.ClusterProfileReference), b.(*ClusterProfileReference), scope)
+	}); err != nil {
+		return err
+	}
 	if err := s.AddGeneratedConversionFunc((*ClusterQueue)(nil), (*v1beta2.ClusterQueue)(nil), func(a, b interface{}, scope conversion.Scope) error {
 		return Convert_v1beta1_ClusterQueue_To_v1beta2_ClusterQueue(a.(*ClusterQueue), b.(*v1beta2.ClusterQueue), scope)
 	}); err != nil {
@@ -1065,6 +1075,26 @@ func Convert_v1beta2_BorrowWithinCohort_To_v1beta1_BorrowWithinCohort(in *v1beta
 	return autoConvert_v1beta2_BorrowWithinCohort_To_v1beta1_BorrowWithinCohort(in, out, s)
 }
 
+func autoConvert_v1beta1_ClusterProfileReference_To_v1beta2_ClusterProfileReference(in *ClusterProfileReference, out *v1beta2.ClusterProfileReference, s conversion.Scope) error {
+	out.Name = in.Name
+	return nil
+}
+
+// Convert_v1beta1_ClusterProfileReference_To_v1beta2_ClusterProfileReference is an autogenerated conversion function.
+func Convert_v1beta1_ClusterProfileReference_To_v1beta2_ClusterProfileReference(in *ClusterProfileReference, out *v1beta2.ClusterProfileReference, s conversion.Scope) error {
+	return autoConvert_v1beta1_ClusterProfileReference_To_v1beta2_ClusterProfileReference(in, out, s)
+}
+
+func autoConvert_v1beta2_ClusterProfileReference_To_v1beta1_ClusterProfileReference(in *v1beta2.ClusterProfileReference, out *ClusterProfileReference, s conversion.Scope) error {
+	out.Name = in.Name
+	return nil
+}
+
+// Convert_v1beta2_ClusterProfileReference_To_v1beta1_ClusterProfileReference is an autogenerated conversion function.
+func Convert_v1beta2_ClusterProfileReference_To_v1beta1_ClusterProfileReference(in *v1beta2.ClusterProfileReference, out *ClusterProfileReference, s conversion.Scope) error {
+	return autoConvert_v1beta2_ClusterProfileReference_To_v1beta1_ClusterProfileReference(in, out, s)
+}
+
 func autoConvert_v1beta1_ClusterQueue_To_v1beta2_ClusterQueue(in *ClusterQueue, out *v1beta2.ClusterQueue, s conversion.Scope) error {
 	out.ObjectMeta = in.ObjectMeta
 	if err := Convert_v1beta1_ClusterQueueSpec_To_v1beta2_ClusterQueueSpec(&in.Spec, &out.Spec, s); err != nil {
@@ -1737,6 +1767,7 @@ func Convert_v1beta2_MultiKueueClusterList_To_v1beta1_MultiKueueClusterList(in *
 
 func autoConvert_v1beta1_MultiKueueClusterSpec_To_v1beta2_MultiKueueClusterSpec(in *MultiKueueClusterSpec, out *v1beta2.MultiKueueClusterSpec, s conversion.Scope) error {
 	// WARNING: in.KubeConfig requires manual conversion: does not exist in peer-type
+	// WARNING: in.ClusterProfileRef requires manual conversion: does not exist in peer-type
 	return nil
 }
 
diff --git a/apis/kueue/v1beta1/zz_generated.deepcopy.go b/apis/kueue/v1beta1/zz_generated.deepcopy.go
index 6f98100a4..c22e2fa92 100644
--- a/apis/kueue/v1beta1/zz_generated.deepcopy.go
+++ b/apis/kueue/v1beta1/zz_generated.deepcopy.go
@@ -302,6 +302,21 @@ func (in *BorrowWithinCohort) DeepCopy() *BorrowWithinCohort {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterProfileReference) DeepCopyInto(out *ClusterProfileReference) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterProfileReference.
+func (in *ClusterProfileReference) DeepCopy() *ClusterProfileReference {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterProfileReference)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ClusterQueue) DeepCopyInto(out *ClusterQueue) {
 	*out = *in
@@ -964,7 +979,7 @@ func (in *MultiKueueCluster) DeepCopyInto(out *MultiKueueCluster) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	out.Spec = in.Spec
+	in.Spec.DeepCopyInto(&out.Spec)
 	in.Status.DeepCopyInto(&out.Status)
 }
 
@@ -1022,6 +1037,11 @@ func (in *MultiKueueClusterList) DeepCopyObject() runtime.Object {
 func (in *MultiKueueClusterSpec) DeepCopyInto(out *MultiKueueClusterSpec) {
 	*out = *in
 	out.KubeConfig = in.KubeConfig
+	if in.ClusterProfileRef != nil {
+		in, out := &in.ClusterProfileRef, &out.ClusterProfileRef
+		*out = new(ClusterProfileReference)
+		**out = **in
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MultiKueueClusterSpec.
diff --git a/charts/kueue/OWNERS b/charts/kueue/OWNERS
deleted file mode 100644
index ef7abba9d..000000000
--- a/charts/kueue/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# See the OWNERS docs at https://go.k8s.io/owners
-
-reviewers:
-- kannon92
-
diff --git a/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml b/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml
index ec13903bb..2c2d95e2d 100644
--- a/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml
+++ b/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml
@@ -80,6 +80,21 @@ spec:
             spec:
               description: spec is the specification of the MultiKueueCluster.
               properties:
+                clusterProfileRef:
+                  description: |-
+                    clusterProfileRef is the reference to the ClusterProfile object used to connect to the cluster.
+
+                    This is only used to prevent data loss when converting between v1beta2 and v1beta1.
+                    It has no effect in v1beta1.
+                  properties:
+                    name:
+                      description: name of the ClusterProfile.
+                      maxLength: 256
+                      minLength: 1
+                      type: string
+                  required:
+                    - name
+                  type: object
                 kubeConfig:
                   description: kubeConfig is information on how to connect to the cluster.
                   properties:
diff --git a/client-go/applyconfiguration/kueue/v1beta1/clusterprofilereference.go b/client-go/applyconfiguration/kueue/v1beta1/clusterprofilereference.go
new file mode 100644
index 000000000..ff6229fed
--- /dev/null
+++ b/client-go/applyconfiguration/kueue/v1beta1/clusterprofilereference.go
@@ -0,0 +1,38 @@
+/*
+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 applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta1
+
+// ClusterProfileReferenceApplyConfiguration represents a declarative configuration of the ClusterProfileReference type for use
+// with apply.
+type ClusterProfileReferenceApplyConfiguration struct {
+	Name *string `json:"name,omitempty"`
+}
+
+// ClusterProfileReferenceApplyConfiguration constructs a declarative configuration of the ClusterProfileReference type for use with
+// apply.
+func ClusterProfileReference() *ClusterProfileReferenceApplyConfiguration {
+	return &ClusterProfileReferenceApplyConfiguration{}
+}
+
+// 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 *ClusterProfileReferenceApplyConfiguration) WithName(value string) *ClusterProfileReferenceApplyConfiguration {
+	b.Name = &value
+	return b
+}
diff --git a/client-go/applyconfiguration/kueue/v1beta1/multikueueclusterspec.go b/client-go/applyconfiguration/kueue/v1beta1/multikueueclusterspec.go
index d218f49d9..92814254a 100644
--- a/client-go/applyconfiguration/kueue/v1beta1/multikueueclusterspec.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/multikueueclusterspec.go
@@ -20,7 +20,8 @@ package v1beta1
 // MultiKueueClusterSpecApplyConfiguration represents a declarative configuration of the MultiKueueClusterSpec type for use
 // with apply.
 type MultiKueueClusterSpecApplyConfiguration struct {
-	KubeConfig *KubeConfigApplyConfiguration `json:"kubeConfig,omitempty"`
+	KubeConfig        *KubeConfigApplyConfiguration              `json:"kubeConfig,omitempty"`
+	ClusterProfileRef *ClusterProfileReferenceApplyConfiguration `json:"clusterProfileRef,omitempty"`
 }
 
 // MultiKueueClusterSpecApplyConfiguration constructs a declarative configuration of the MultiKueueClusterSpec type for use with
@@ -36,3 +37,11 @@ func (b *MultiKueueClusterSpecApplyConfiguration) WithKubeConfig(value *KubeConf
 	b.KubeConfig = value
 	return b
 }
+
+// WithClusterProfileRef sets the ClusterProfileRef 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 ClusterProfileRef field is set to the value of the last call.
+func (b *MultiKueueClusterSpecApplyConfiguration) WithClusterProfileRef(value *ClusterProfileReferenceApplyConfiguration) *MultiKueueClusterSpecApplyConfiguration {
+	b.ClusterProfileRef = value
+	return b
+}
diff --git a/client-go/applyconfiguration/utils.go b/client-go/applyconfiguration/utils.go
index b8a8257dc..f78502e9e 100644
--- a/client-go/applyconfiguration/utils.go
+++ b/client-go/applyconfiguration/utils.go
@@ -59,6 +59,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
 		return &kueuev1beta1.AdmissionScopeApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("BorrowWithinCohort"):
 		return &kueuev1beta1.BorrowWithinCohortApplyConfiguration{}
+	case v1beta1.SchemeGroupVersion.WithKind("ClusterProfileReference"):
+		return &kueuev1beta1.ClusterProfileReferenceApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("ClusterQueue"):
 		return &kueuev1beta1.ClusterQueueApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("ClusterQueuePendingWorkload"):
diff --git a/config/OWNERS b/config/OWNERS
deleted file mode 100644
index ef7abba9d..000000000
--- a/config/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# See the OWNERS docs at https://go.k8s.io/owners
-
-reviewers:
-- kannon92
-
diff --git a/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml b/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml
index 8a49ccc0c..c54a75322 100644
--- a/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml
+++ b/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml
@@ -48,6 +48,21 @@ spec:
           spec:
             description: spec is the specification of the MultiKueueCluster.
             properties:
+              clusterProfileRef:
+                description: |-
+                  clusterProfileRef is the reference to the ClusterProfile object used to connect to the cluster.
+
+                  This is only used to prevent data loss when converting between v1beta2 and v1beta1.
+                  It has no effect in v1beta1.
+                properties:
+                  name:
+                    description: name of the ClusterProfile.
+                    maxLength: 256
+                    minLength: 1
+                    type: string
+                required:
+                - name
+                type: object
               kubeConfig:
                 description: kubeConfig is information on how to connect to the cluster.
                 properties:
diff --git a/keps/3258-delayed-admission-check-retries/README.md b/keps/3258-delayed-admission-check-retries/README.md
index a9761e19f..230bca469 100644
--- a/keps/3258-delayed-admission-check-retries/README.md
+++ b/keps/3258-delayed-admission-check-retries/README.md
@@ -48,7 +48,7 @@ This immediate retry behavior can cause several issues:
 - Inefficient resource utilization when the retry condition is expected to persist for a known duration
 - Artificial reduction of available quotas
 
-Currently, there's a shared `.status.requeueState` field used by both the [provisioning request admission check](https://kueue.sigs.k8s.io/docs/admission-check-controllers/provisioning/#provisioningrequestconfig) and the [WaitForPodsReady](https://kueue.sigs.k8s.io/docs/tasks/manage/setup_wait_for_pods_ready/) feature. It already serves these purposes well but will need some adjustments to support the new use case.
+Currently, there's a shared `.status.requeueState` field used by both the [provisioning request admission check](https://kueue.sigs.k8s.io/docs/concepts/admission_check/provisioning_request/#provisioningrequestconfig) and the [WaitForPodsReady](https://kueue.sigs.k8s.io/docs/tasks/manage/setup_wait_for_pods_ready/) feature. It already serves these purposes well but will need some adjustments to support the new use case.
 
 ### Goals
 
diff --git a/pkg/controller/jobs/jobset/OWNERS b/pkg/controller/jobs/jobset/OWNERS
deleted file mode 100644
index ef7abba9d..000000000
--- a/pkg/controller/jobs/jobset/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# See the OWNERS docs at https://go.k8s.io/owners
-
-reviewers:
-- kannon92
-
diff --git a/site/OWNERS b/site/OWNERS
index 5dbff6270..418f7e800 100644
--- a/site/OWNERS
+++ b/site/OWNERS
@@ -3,6 +3,3 @@
 approvers:
 - moficodes
 
-reviewers:
-- kannon92
-
diff --git a/site/content/en/docs/concepts/admission_check/_index.md b/site/content/en/docs/concepts/admission_check/_index.md
index f7c3dd3f1..bdf6954e7 100644
--- a/site/content/en/docs/concepts/admission_check/_index.md
+++ b/site/content/en/docs/concepts/admission_check/_index.md
@@ -130,4 +130,4 @@ If any of the Workload's AdmissionCheck is in the `Rejected` state:
 ## What's next?
 
 - Read the [API reference](/docs/reference/kueue.v1beta1/#kueue-x-k8s-io-v1beta1-AdmissionCheck) for `AdmissionCheck`
-- Learn more from the built-in [Provisioning Admission Check Controller](/docs/admission-check-controllers/provisioning)
\ No newline at end of file
+- Learn more from the built-in [Provisioning Admission Check Controller](/docs/concepts/admission_check/provisioning_request)
\ No newline at end of file
diff --git a/site/content/en/docs/concepts/topology_aware_scheduling.md b/site/content/en/docs/concepts/topology_aware_scheduling.md
index 3cc0f930f..f83e6a663 100644
--- a/site/content/en/docs/concepts/topology_aware_scheduling.md
+++ b/site/content/en/docs/concepts/topology_aware_scheduling.md
@@ -115,7 +115,7 @@ to a TAS ResourceFlavor.
 ### ClusterAutoscaler support
 
 TAS integrates with the [Kubernetes ClusterAutoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)
-through the [Provisioning AdmissionCheck](/docs/admission-check-controllers/provisioning/).
+through the [Provisioning AdmissionCheck](/docs/concepts/admission_check/provisioning_request/).
 
 When a workload is assigned to the TAS ResourceFlavor with Provisioning
 AdmissionCheck, then its admission flow has the following stages:
@@ -127,7 +127,7 @@ AdmissionCheck, then its admission flow has the following stages:
 3. **Topology assignment**: Kueue sets topology assignment, on the Workload
   object, calculated taking into account any newly provisioned nodes.
 
-Check also [PodSet updates in ProvisioningRequestConfig](site/content/en/docs/admission-check-controllers/provisioning.md)
+Check also [PodSet updates in ProvisioningRequestConfig](/docs/concepts/admission_check/provisioning_request/#podset-updates)
 to see how you can configure Kueue if you want to restrict scheduling to the
 newly provisioned nodes (assuming the provisioning class supports it).
 
diff --git a/site/content/en/docs/overview/_index.md b/site/content/en/docs/overview/_index.md
index f266d4e94..9eb25d1b5 100644
--- a/site/content/en/docs/overview/_index.md
+++ b/site/content/en/docs/overview/_index.md
@@ -29,7 +29,7 @@ A core design principle for Kueue is to avoid duplicating mature functionality i
 - **Integrations:** Built-in support for popular jobs, e.g. [BatchJob](/docs/tasks/run/jobs/), [Kubeflow training jobs](/docs/tasks/run/kubeflow/), [RayJob](/docs/tasks/run/rayjobs/), [RayCluster](/docs/tasks/run/rayclusters/), [JobSet](/docs/tasks/run/jobsets/),  [AppWrappers](/docs/tasks/run/appwrappers/), [plain Pod and Pod Groups](/docs/tasks/run/plain_pods/).
 - **System insight:** Build-in [prometheus metrics](/docs/reference/metrics/) to help monitor the state of the system, and on-demand visibility endpoint for [monitoring of pending workloads](/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand/).
 - **AdmissionChecks:** A mechanism for internal or external components to influence whether a workload can be [admitted](/docs/concepts/admission_check/).
-- **Advanced autoscaling support:** Integration with cluster-autoscaler's [provisioningRequest](/docs/admission-check-controllers/provisioning/#job-using-a-provisioningrequest) via admissionChecks.
+- **Advanced autoscaling support:** Integration with cluster-autoscaler's [provisioningRequest](/docs/concepts/admission_check/provisioning_request/#job-using-a-provisioningrequest) via admissionChecks.
 - **All-or-nothing with ready Pods:** A timeout-based implementation of [All-or-nothing scheduling](/docs/tasks/manage/setup_wait_for_pods_ready/).
 - **Partial admission and dynamic reclaim:** mechanisms to run a job with [reduced parallelism](/docs/tasks/run/jobs/#partial-admission), based on available quota, and to [release](/docs/concepts/workload/#dynamic-reclaim) the quota the pods complete..
 - **Mixing training and inference**: Simultaneous management of batch workloads along with serving workloads (such as [Deployments](/docs/tasks/run/deployment/) or [StatefulSets](/docs/tasks/run/statefulset/))
@@ -46,7 +46,7 @@ A core design principle for Kueue is to avoid duplicating mature functionality i
 | [PartialAdmission](/docs/tasks/run/jobs/#partial-admission)                                                     | +              |        |           |            |       |            |        |        |     |            |        |            |            |             |                 |
 | [Workload Priority Class](/docs/concepts/workload_priority_class/)                                              | +              | +      | +         | +          | +     | +          | +      |   +    | +   | +          | +      | +          | +          | +           | +               |
 | [FlavorFungibility](/docs/concepts/cluster_queue/#flavorfungibility)                                            | +              | +      | +         | +          | +     | +          | +      |   +    | +   | +          | +      | +          | +          | +           | +               |
-| [ProvisioningACC](/docs/admission-check-controllers/provisioning/)                                              | +              | +      | +         | +          | +     | +          | +      |   +    | +   | +          | +      | +          | +          | +           | +               |
+| [ProvisioningACC](/docs/concepts/admission_check/provisioning_request/)                                              | +              | +      | +         | +          | +     | +          | +      |   +    | +   | +          | +      | +          | +          | +           | +               |
 | [VisibilityOnDemand](/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand/)                 | +              | +      | +         | +          | +     | +          | +      |   +    | +   | +          | +      | +          | +          | +           | +               |
 | [PrioritySortingWithinCohort](/docs/concepts/cluster_queue/#flavors-and-borrowing-semantics)                    | +              | +      | +         | +          | +     | +          | +      |   +    | +   | +          | +      | +          | +          | +           | +               |
 | [LendingLimit](/docs/concepts/cluster_queue/#lendinglimit)                                                      | +              | +      | +         | +          | +     | +          | +      |   +    | +   | +          | +      | +          | +          | +           | +               |
diff --git a/site/content/en/docs/reference/kueue.v1beta1.md b/site/content/en/docs/reference/kueue.v1beta1.md
index 15eab11bd..dd470b788 100644
--- a/site/content/en/docs/reference/kueue.v1beta1.md
+++ b/site/content/en/docs/reference/kueue.v1beta1.md
@@ -826,6 +826,30 @@ policy can be preempted by the borrowing workload.</p>
 
 
 
+## `ClusterProfileReference`     {#kueue-x-k8s-io-v1beta1-ClusterProfileReference}
+    
+
+**Appears in:**
+
+- [MultiKueueClusterSpec](#kueue-x-k8s-io-v1beta1-MultiKueueClusterSpec)
+
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>name</code> <B>[Required]</B><br/>
+<code>string</code>
+</td>
+<td>
+   <p>name of the ClusterProfile.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
 ## `ClusterQueuePendingWorkload`     {#kueue-x-k8s-io-v1beta1-ClusterQueuePendingWorkload}
     
 
@@ -1934,6 +1958,15 @@ workloads assigned to this LocalQueue.</p>
    <p>kubeConfig is information on how to connect to the cluster.</p>
 </td>
 </tr>
+<tr><td><code>clusterProfileRef</code><br/>
+<a href="#kueue-x-k8s-io-v1beta1-ClusterProfileReference"><code>ClusterProfileReference</code></a>
+</td>
+<td>
+   <p>clusterProfileRef is the reference to the ClusterProfile object used to connect to the cluster.</p>
+<p>This is only used to prevent data loss when converting between v1beta2 and v1beta1.
+It has no effect in v1beta1.</p>
+</td>
+</tr>
 </tbody>
 </table>
 
diff --git a/site/content/en/docs/reference/labels-and-annotations.md b/site/content/en/docs/reference/labels-and-annotations.md
index afaef113c..d10acfe12 100644
--- a/site/content/en/docs/reference/labels-and-annotations.md
+++ b/site/content/en/docs/reference/labels-and-annotations.md
@@ -52,7 +52,7 @@ Type: Label
 
 Example: `kueue.x-k8s.io/managed: "true"`
 
-Used on: [Plain Pods](/docs/tasks/run/plain_pods/) and [ProvisioningRequest](/docs/admission-check-controllers/provisioning.md).
+Used on: [Plain Pods](/docs/tasks/run/plain_pods/) and [ProvisioningRequest](/docs/concepts/admission_check/provisioning_request).
 
 The label key that indicates which pods and ProvisioningRequest are managed by Kueuue.
 
diff --git a/site/content/en/docs/tasks/dev/develop-acc.md b/site/content/en/docs/tasks/dev/develop-acc.md
index c9f6dda1f..46de5c5a0 100644
--- a/site/content/en/docs/tasks/dev/develop-acc.md
+++ b/site/content/en/docs/tasks/dev/develop-acc.md
@@ -21,20 +21,20 @@ Monitors the AdmissionChecks in the cluster and maintains the `Active` condition
 
 Optionally, it can watch custom [parameters](/docs/reference/kueue.v1beta1/#kueue-x-k8s-io-v1beta1-AdmissionCheckParametersReference) objects.
 
-The [Provisioning Admission Check Controller](/docs/admission-check-controllers/provisioning/) implements this in `pkg/controller/admissionchecks/provisioning/admissioncheck_reconciler.go`
+The [Provisioning Admission Check Controller](/docs/concepts/admission_check/provisioning_request/) implements this in `pkg/controller/admissionchecks/provisioning/admissioncheck_reconciler.go`
 
 ### Workload Reconciler
 
 It is in charge of maintaining the [AdmissionCheckStates](/docs/concepts/admission_check/#admissioncheckstates) of individual workloads
 based on the ACC's custom logic. It can either allow the admission, requeue or fail the workload. 
 
-The [Provisioning Admission Check Controller](/docs/admission-check-controllers/provisioning/) implements this in `pkg/controller/admissionchecks/provisioning/controller.go`
+The [Provisioning Admission Check Controller](/docs/concepts/admission_check/provisioning_request/) implements this in `pkg/controller/admissionchecks/provisioning/controller.go`
 
 ### Parameters Object Type
 Optionally, you can define a cluster level object type to hold the Admission Check parameters specific to your implementation.
 Users can reference instances of this object type in the AdmissionCheck definition in [spec.parameters](/docs/reference/kueue.v1beta1/#kueue-x-k8s-io-v1beta1-AdmissionCheckParametersReference).
 
-For example, the [Provisioning Admission Check Controller](/docs/admission-check-controllers/provisioning/) uses [ProvisioningRequestConfig](/docs/reference/kueue.v1beta1/#kueue-x-k8s-io-v1beta1-ProvisioningRequestConfig) for this purpose.
+For example, the [Provisioning Admission Check Controller](/docs/concepts/admission_check/provisioning_request/) uses [ProvisioningRequestConfig](/docs/reference/kueue.v1beta1/#kueue-x-k8s-io-v1beta1-ProvisioningRequestConfig) for this purpose.
 
 ## Utility Code
 
@@ -44,6 +44,6 @@ For example, the [Provisioning Admission Check Controller](/docs/admission-check
 
 Currently there are two ACCs implemented into kueue:
 
-- [Provisioning Admission Check Controller](/docs/admission-check-controllers/provisioning/) is implemented in `pkg/controller/admissionchecks/provisioning` and implements the Kueue's integration with [Kubernetes cluster-autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) [ProvisioningRequests](https://github.com/kubernetes/autoscaler/blob/4872bddce2bcc5b4a5f6a3d569111c11b8a2baf4/cluster-autoscaler/provisioningrequest/apis/autoscaling.x-k8s.io/v1beta1/types.go#L41).
+- [Provisioning Admission Check Controller](/docs/concepts/admission_check/provisioning_request/) is implemented in `pkg/controller/admissionchecks/provisioning` and implements the Kueue's integration with [Kubernetes cluster-autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) [ProvisioningRequests](https://github.com/kubernetes/autoscaler/blob/4872bddce2bcc5b4a5f6a3d569111c11b8a2baf4/cluster-autoscaler/provisioningrequest/apis/autoscaling.x-k8s.io/v1beta1/types.go#L41).
 - [MultiKueue](/docs/concepts/multikueue/), the Kueue's multi-cluster support is implemented as an AdmissionCheck Controller in `/pkg/controller/admissionchecks/multikueue`.
 
diff --git a/site/content/en/docs/tasks/troubleshooting/troubleshooting_jobs.md b/site/content/en/docs/tasks/troubleshooting/troubleshooting_jobs.md
index 56043f8b3..6a96d4975 100644
--- a/site/content/en/docs/tasks/troubleshooting/troubleshooting_jobs.md
+++ b/site/content/en/docs/tasks/troubleshooting/troubleshooting_jobs.md
@@ -215,7 +215,7 @@ See [resources groups](https://kueue.sigs.k8s.io/docs/concepts/cluster_queue/#re
 ### Pending Admission Checks
 
 When the ClusterQueue has [admission checks](/docs/concepts/admission_check) configured, such as
-[ProvisioningRequest](/docs/admission-check-controllers/provisioning) or [MultiKueue](/docs/concepts/multikueue),
+[ProvisioningRequest](/docs/concepts/admission_check/provisioning_request) or [MultiKueue](/docs/concepts/multikueue),
 a Workload might stay with a status similar to the following, until the admission checks pass:
 
 ```yaml
diff --git a/site/content/en/docs/tasks/troubleshooting/troubleshooting_provreq.md b/site/content/en/docs/tasks/troubleshooting/troubleshooting_provreq.md
index 574010307..f7e87ddca 100644
--- a/site/content/en/docs/tasks/troubleshooting/troubleshooting_provreq.md
+++ b/site/content/en/docs/tasks/troubleshooting/troubleshooting_provreq.md
@@ -8,7 +8,7 @@ description: >
 
 This document helps you troubleshoot ProvisioningRequests, an API defined by [ClusterAutoscaler](https://github.com/kubernetes/autoscaler/blob/4872bddce2bcc5b4a5f6a3d569111c11b8a2baf4/cluster-autoscaler/provisioningrequest/apis/autoscaling.x-k8s.io/v1beta1/types.go#L41).
 
-Kueue creates ProvisioningRequests via the [Provisioning Admission Check Controller](/docs/admission-check-controllers/provisioning/), and treats them like an [Admission Check](/docs/concepts/admission_check/). In order for Kueue to admit a Workload, the ProvisioningRequest created for it needs to succeed.
+Kueue creates ProvisioningRequests via the [Provisioning Admission Check Controller](/docs/concepts/admission_check/provisioning_request/), and treats them like an [Admission Check](/docs/concepts/admission_check/). In order for Kueue to admit a Workload, the ProvisioningRequest created for it needs to succeed.
 
 ## Before you begin
 



Test patch:
diff --git a/apis/kueue/v1beta1/multikueue_conversion_test.go b/apis/kueue/v1beta1/multikueue_conversion_test.go
index 17aab5e1f..c8eed3c29 100644
--- a/apis/kueue/v1beta1/multikueue_conversion_test.go
+++ b/apis/kueue/v1beta1/multikueue_conversion_test.go
@@ -179,7 +179,11 @@ func TestMultiKueueClusterConvertFrom(t *testing.T) {
 			},
 			expected: &MultiKueueCluster{
 				ObjectMeta: defaultObjectMeta,
-				Spec:       MultiKueueClusterSpec{},
+				Spec: MultiKueueClusterSpec{
+					ClusterProfileRef: &ClusterProfileReference{
+						Name: "foobar",
+					},
+				},
 			},
 		},
 		"complete MultiKueueCluster with status": {
@@ -293,3 +297,85 @@ func TestMultiKueueClusterConversion_RoundTrip(t *testing.T) {
 		})
 	}
 }
+
+func TestMultiKueueClusterConversion_RoundTrip_Reverse(t *testing.T) {
+	testCases := map[string]struct {
+		v1beta2Obj *v1beta2.MultiKueueCluster
+	}{
+		"complete MultiKueueCluster with ClusterProfile and status": {
+			v1beta2Obj: &v1beta2.MultiKueueCluster{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "test-multikueuecluster",
+				},
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						ClusterProfileRef: &v1beta2.ClusterProfileReference{
+							Name: "foobar",
+						},
+					},
+				},
+				Status: v1beta2.MultiKueueClusterStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   "Active",
+							Status: metav1.ConditionTrue,
+							Reason: "Ready",
+						},
+					},
+				},
+			},
+		},
+		"complete MultiKueueCluster with KubeConfig and status": {
+			v1beta2Obj: &v1beta2.MultiKueueCluster{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "test-multikueuecluster",
+				},
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						KubeConfig: &v1beta2.KubeConfig{
+							Location:     "test-location",
+							LocationType: v1beta2.LocationType(SecretLocationType),
+						},
+					},
+				},
+				Status: v1beta2.MultiKueueClusterStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   "Active",
+							Status: metav1.ConditionTrue,
+							Reason: "Ready",
+						},
+					},
+				},
+			},
+		},
+		"minimal MultiKueueCluster": {
+			v1beta2Obj: &v1beta2.MultiKueueCluster{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "minimal-mkc",
+				},
+			},
+		},
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			// Convert v1beta2 -> v1beta1
+			v1beta1Obj := &MultiKueueCluster{}
+			if err := v1beta1Obj.ConvertFrom(tc.v1beta2Obj); err != nil {
+				t.Fatalf("ConvertFrom failed: %v", err)
+			}
+
+			// Convert v1beta1 -> v1beta2 (round-trip)
+			roundTripped := &v1beta2.MultiKueueCluster{}
+			if err := v1beta1Obj.ConvertTo(roundTripped); err != nil {
+				t.Fatalf("ConvertTo failed: %v", err)
+			}
+
+			// Verify round-trip
+			if diff := cmp.Diff(tc.v1beta2Obj, roundTripped); diff != "" {
+				t.Errorf("round-trip conversion produced diff (-original +roundtripped):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/test/OWNERS b/test/OWNERS
index 497236848..f8fdba0e9 100644
--- a/test/OWNERS
+++ b/test/OWNERS
@@ -1,7 +1,4 @@
 # See the OWNERS docs at https://go.k8s.io/owners
 
-reviewers:
-- kannon92
-
 emeritus_approvers:
 - trasc
diff --git a/test/e2e/customconfigs/managejobswithoutqueuename_test.go b/test/e2e/customconfigs/managejobswithoutqueuename_test.go
index d0ee9c49a..49d2d6332 100644
--- a/test/e2e/customconfigs/managejobswithoutqueuename_test.go
+++ b/test/e2e/customconfigs/managejobswithoutqueuename_test.go
@@ -491,13 +491,6 @@ var _ = ginkgo.Describe("ManageJobsWithoutQueueName", ginkgo.Ordered, func() {
 					g.Expect(createdJobSet.Spec.Suspend).Should(gomega.Equal(ptr.To(false)))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
-
-			ginkgo.By("Checking that the JobSet is finished", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					g.Expect(k8sClient.Get(ctx, jobSetKey, createdJobSet)).Should(gomega.Succeed())
-					g.Expect(createdJobSet.Status.TerminalState).Should(gomega.Equal(string(v1alpha2.JobSetCompleted)))
-				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
-			})
 		})
 
 		ginkgo.It("should not admit child jobs even if the child job has a queue-name label", func() {