This is an automated email from the ASF dual-hosted git repository.

mani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 12d927c5 [YUNIKORN-1986] add ugm CanRunApp to TryReservedAllocate 
(#650)
12d927c5 is described below

commit 12d927c53660449c1bb84b32a5138fb0d21a5344
Author: PoAn Yang <pay...@apache.org>
AuthorDate: Tue Sep 19 11:43:32 2023 +0530

    [YUNIKORN-1986] add ugm CanRunApp to TryReservedAllocate (#650)
    
    Closes: #650
    
    Signed-off-by: Manikandan R <maniraj...@gmail.com>
---
 pkg/scheduler/objects/queue.go  |   2 +-
 pkg/scheduler/partition_test.go | 160 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 161 insertions(+), 1 deletion(-)

diff --git a/pkg/scheduler/objects/queue.go b/pkg/scheduler/objects/queue.go
index 7eb01b89..58bc3574 100644
--- a/pkg/scheduler/objects/queue.go
+++ b/pkg/scheduler/objects/queue.go
@@ -1435,7 +1435,7 @@ func (sq *Queue) TryReservedAllocate(iterator func() 
NodeIterator) *Allocation {
                                                zap.String("appID", appID))
                                        return nil
                                }
-                               if app.IsAccepted() && !sq.canRunApp(appID) {
+                               if app.IsAccepted() && (!sq.canRunApp(appID) || 
!ugm.GetUserManager().CanRunApp(sq.QueuePath, appID, app.user)) {
                                        continue
                                }
                                alloc := app.tryReservedAllocate(headRoom, 
iterator)
diff --git a/pkg/scheduler/partition_test.go b/pkg/scheduler/partition_test.go
index 8f81d88f..59e91f86 100644
--- a/pkg/scheduler/partition_test.go
+++ b/pkg/scheduler/partition_test.go
@@ -3902,3 +3902,163 @@ func TestLimitMaxApplications(t *testing.T) {
                })
        }
 }
+
+//nolint:funlen
+func TestLimitMaxApplicationsForReservedAllocation(t *testing.T) {
+       testCases := []struct {
+               name   string
+               limits []configs.Limit
+       }{
+               {
+                       name: "specific user",
+                       limits: []configs.Limit{
+                               {
+                                       Limit:           "specific user limit",
+                                       Users:           []string{"testuser"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 1,
+                               },
+                       },
+               },
+               {
+                       name: "specific group",
+                       limits: []configs.Limit{
+                               {
+                                       Limit:           "specific group limit",
+                                       Groups:          []string{"testgroup"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 1,
+                               },
+                       },
+               },
+               {
+                       name: "wildcard user",
+                       limits: []configs.Limit{
+                               {
+                                       Limit:           "wildcard user limit",
+                                       Users:           []string{"*"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 1,
+                               },
+                       },
+               },
+               {
+                       name: "wildcard group",
+                       limits: []configs.Limit{
+                               {
+                                       Limit:           "specific group limit",
+                                       Groups:          
[]string{"nonexistent-group"},
+                                       MaxResources:    
map[string]string{"memory": "500", "vcores": "500"},
+                                       MaxApplications: 100,
+                               },
+                               {
+                                       Limit:           "wildcard group limit",
+                                       Groups:          []string{"*"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 1,
+                               },
+                       },
+               },
+               {
+                       name: "specific user lower than specific group limit",
+                       limits: []configs.Limit{
+                               {
+                                       Limit:           "specific user limit",
+                                       Users:           []string{"testuser"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 1,
+                               },
+                               {
+                                       Limit:           "specific user limit",
+                                       Groups:          []string{"testgroup"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 100,
+                               },
+                       },
+               },
+               {
+                       name: "specific group lower than specific user limit",
+                       limits: []configs.Limit{
+                               {
+                                       Limit:           "specific user limit",
+                                       Users:           []string{"testuser"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 100,
+                               },
+                               {
+                                       Limit:           "specific group limit",
+                                       Groups:          []string{"testgroup"},
+                                       MaxResources:    
map[string]string{"memory": "5", "vcores": "5"},
+                                       MaxApplications: 1,
+                               },
+                       },
+               },
+       }
+       for _, tc := range testCases {
+               t.Run(tc.name, func(t *testing.T) {
+                       setupUGM()
+                       conf := configs.PartitionConfig{
+                               Name: "default",
+                               Queues: []configs.QueueConfig{
+                                       {
+                                               Name:      "root",
+                                               Parent:    true,
+                                               SubmitACL: "*",
+                                               Queues: []configs.QueueConfig{
+                                                       {
+                                                               Name:   
"default",
+                                                               Parent: false,
+                                                               Limits: 
tc.limits,
+                                                       },
+                                               },
+                                       },
+                               },
+                               NodeSortPolicy: configs.NodeSortingPolicy{},
+                       }
+
+                       partition, err := newPartitionContext(conf, rmID, nil)
+                       assert.NilError(t, err, "partition create failed")
+
+                       // add node1
+                       nodeRes, err := 
resources.NewResourceFromConf(map[string]string{"memory": "10", "vcores": "10"})
+                       assert.NilError(t, err, "failed to create basic 
resource")
+                       node := newNodeMaxResource("node-1", nodeRes)
+                       err = partition.AddNode(node, nil)
+                       assert.NilError(t, err, "test node1 add failed 
unexpected")
+
+                       resMap := map[string]string{"memory": "2", "vcores": 
"2"}
+                       res, err := resources.NewResourceFromConf(resMap)
+                       assert.NilError(t, err, "Unexpected error when creating 
resource from map")
+
+                       // add app1
+                       app1 := newApplication(appID1, "default", defQueue)
+                       err = partition.AddApplication(app1)
+                       assert.NilError(t, err, "add application to partition 
should not have failed")
+                       app1AllocAsk := newAllocationAsk(allocID, appID1, res)
+                       err = app1.AddAllocationAsk(app1AllocAsk)
+                       assert.NilError(t, err, "failed to add ask alloc-1 to 
app-1")
+
+                       partition.reserve(app1, node, app1AllocAsk)
+                       alloc := partition.tryReservedAllocate()
+                       if alloc == nil {
+                               t.Fatal("allocation did not return any 
allocation")
+                       }
+                       assert.Equal(t, alloc.GetResult(), 
objects.AllocatedReserved, "result is not the expected allocated reserved")
+                       assert.Equal(t, alloc.GetApplicationID(), appID1, 
"expected application app-1 to be allocated reserved")
+                       assert.Equal(t, alloc.GetAllocationKey(), allocID, 
"expected ask alloc-1 to be allocated reserved")
+
+                       // add app2
+                       app2 := newApplication(appID2, "default", defQueue)
+                       err = partition.AddApplication(app2)
+                       assert.NilError(t, err, "add application to partition 
should not have failed")
+                       app2AllocAsk := newAllocationAsk(allocID2, appID2, res)
+                       err = app2.AddAllocationAsk(app2AllocAsk)
+                       assert.NilError(t, err, "failed to add ask alloc-2 to 
app-1")
+                       assert.Equal(t, app2.CurrentState(), 
objects.Accepted.String(), "application should have moved to accepted state")
+
+                       partition.reserve(app2, node, app2AllocAsk)
+                       alloc = partition.tryReservedAllocate()
+                       assert.Equal(t, alloc == nil, true, "allocation should 
not have happened as max apps reached")
+               })
+       }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@yunikorn.apache.org
For additional commands, e-mail: issues-h...@yunikorn.apache.org

Reply via email to