@@ -38,13 +38,21 @@ func TestIdlerAndPriorityClass(t *testing.T) {
3838 podsToIdle := prepareWorkloads (t , await .Member1 (), idler .Name , wait .WithSandboxPriorityClass ())
3939 podsNoise := prepareWorkloads (t , await .Member1 (), idlerNoise .Name , wait .WithSandboxPriorityClass ())
4040
41+ // Create a Claw workload only in the dev namespace (the one being idled).
42+ // Not added to prepareWorkloads to avoid exceeding the ClusterResourceQuota pod limit
43+ // when workloads are created in multiple namespaces for the same user.
44+ clawDeployment := createClaw (t , memberAwait , "test-idler-claw" , idler .Name )
45+ podsToIdle , err := memberAwait .WaitForPods (t , idler .Name , len (podsToIdle )+ int (* clawDeployment .Spec .Replicas ),
46+ wait .PodRunning (), wait .WithPodLabel ("idler" , "idler" ), wait .WithSandboxPriorityClass ())
47+ require .NoError (t , err )
48+
4149 // Create more noise pods in non-user namespace
4250 memberAwait .CreateNamespace (t , "workloads-noise" )
4351 externalNsPodsNoise := prepareWorkloads (t , await .Member1 (), "workloads-noise" , wait .WithOriginalPriorityClass ())
4452
4553 // Set a short timeout for one of the idler to trigger pod idling
4654 // The idler is currently updating its status since it's already been idling the pods. So we need to keep trying to update.
47- idler , err : = wait .For (t , memberAwait .Awaitility , & toolchainv1alpha1.Idler {}).
55+ idler , err = wait .For (t , memberAwait .Awaitility , & toolchainv1alpha1.Idler {}).
4856 Update (idler .Name , memberAwait .Namespace , func (i * toolchainv1alpha1.Idler ) {
4957 i .Spec .TimeoutSeconds = 5
5058 })
@@ -101,6 +109,10 @@ func TestIdlerAndPriorityClass(t *testing.T) {
101109 _ , err = memberAwait .WaitForAAP (t , "test-idler-aap" , idler .Name , clnt .Resource (aapRes ), true )
102110 require .NoError (t , err )
103111
112+ // Wait for the Claw resource to be idled (spec.idle: true)
113+ _ , err = memberAwait .WaitForClaw (t , "test-idler-claw" , idler .Name , clnt .Resource (clawRes ), true )
114+ require .NoError (t , err )
115+
104116 // Wait for the InferenceService to be deleted - the expected action to idle
105117 // the workload is by deleting the InferenceService that is old enough.
106118 // The pods are idled as well, which is verified in the previous step - after some time,
@@ -208,6 +220,7 @@ func createDeployment(t *testing.T, memberAwait *wait.MemberAwaitility, namespac
208220}
209221
210222var aapRes = schema.GroupVersionResource {Group : "aap.ansible.com" , Version : "v1alpha1" , Resource : "ansibleautomationplatforms" }
223+ var clawRes = schema.GroupVersionResource {Group : "claw.sandbox.redhat.com" , Version : "v1alpha1" , Resource : "claws" }
211224var servingRuntimeRes = schema.GroupVersionResource {Group : "serving.kserve.io" , Version : "v1alpha1" , Resource : "servingruntimes" }
212225var inferenceServiceRes = schema.GroupVersionResource {Group : "serving.kserve.io" , Version : "v1beta1" , Resource : "inferenceservices" }
213226var dataVolumeRes = schema.GroupVersionResource {Group : "cdi.kubevirt.io" , Version : "v1beta1" , Resource : "datavolumes" }
@@ -244,6 +257,51 @@ func createAAP(t *testing.T, memberAwait *wait.MemberAwaitility, name, namespace
244257 return deployment
245258}
246259
260+ // createClaw creates an instance of claws.claw.sandbox.redhat.com with one deployment owned by this instance
261+ // returns the underlying deployment
262+ func createClaw (t * testing.T , memberAwait * wait.MemberAwaitility , name , namespace string ) * appsv1.Deployment {
263+ clnt , err := dynamic .NewForConfig (memberAwait .RestConfig )
264+ require .NoError (t , err )
265+
266+ claw := clawResource (name )
267+ createdClaw , err := clnt .Resource (clawRes ).Namespace (namespace ).Create (context .TODO (), claw , metav1.CreateOptions {})
268+ require .NoError (t , err )
269+
270+ replicas := int32 (2 )
271+ deployment := & appsv1.Deployment {
272+ ObjectMeta : metav1.ObjectMeta {
273+ Name : name ,
274+ Namespace : namespace ,
275+ },
276+ Spec : appsv1.DeploymentSpec {
277+ Selector : & metav1.LabelSelector {MatchLabels : selectorLabels (name )},
278+ Replicas : & replicas ,
279+ Template : podTemplateSpec (name ),
280+ },
281+ }
282+ err = controllerutil .SetOwnerReference (createdClaw , deployment , scheme .Scheme )
283+ require .NoError (t , err )
284+ err = memberAwait .Create (t , deployment )
285+ require .NoError (t , err )
286+
287+ return deployment
288+ }
289+
290+ func clawResource (name string ) * unstructured.Unstructured {
291+ return & unstructured.Unstructured {
292+ Object : map [string ]interface {}{
293+ "apiVersion" : "claw.sandbox.redhat.com/v1alpha1" ,
294+ "kind" : "Claw" ,
295+ "metadata" : map [string ]interface {}{
296+ "name" : name ,
297+ },
298+ "spec" : map [string ]interface {}{
299+ "idle" : false ,
300+ },
301+ },
302+ }
303+ }
304+
247305func createReplicaSet (t * testing.T , memberAwait * wait.MemberAwaitility , namespace string ) * appsv1.ReplicaSet {
248306 // Standalone ReplicaSet
249307 replicas := int32 (2 )
0 commit comments