Skip to content

Commit 1550ad5

Browse files
committed
[YUNIKORN-656] Add LDAP resolver for group resolution
1 parent bf04bd4 commit 1550ad5

15 files changed

+3474
-291
lines changed

go.mod

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ toolchain go1.23.7
2525

2626
require (
2727
github.com/apache/yunikorn-scheduler-interface v0.0.0-20250304214837-4513ff3a692d
28+
github.com/go-ldap/ldap/v3 v3.4.11
2829
github.com/google/btree v1.1.3
2930
github.com/google/go-cmp v0.7.0
3031
github.com/google/uuid v1.6.0
@@ -34,23 +35,28 @@ require (
3435
github.com/prometheus/client_model v0.5.0
3536
github.com/prometheus/common v0.45.0
3637
github.com/sasha-s/go-deadlock v0.3.5
38+
github.com/stretchr/testify v1.8.1
3739
go.uber.org/zap v1.27.0
3840
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7
39-
golang.org/x/net v0.36.0
41+
golang.org/x/net v0.38.0
4042
golang.org/x/time v0.10.0
4143
google.golang.org/grpc v1.71.0
4244
gopkg.in/yaml.v3 v3.0.1
4345
gotest.tools/v3 v3.5.2
4446
)
4547

4648
require (
49+
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
4750
github.com/beorn7/perks v1.0.1 // indirect
4851
github.com/cespare/xxhash/v2 v2.3.0 // indirect
4952
github.com/davecgh/go-spew v1.1.1 // indirect
53+
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
5054
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
5155
github.com/petermattis/goid v0.0.0-20250303134427-723919f7f203 // indirect
56+
github.com/pmezard/go-difflib v1.0.0 // indirect
5257
github.com/prometheus/procfs v0.12.0 // indirect
5358
go.uber.org/multierr v1.10.0 // indirect
59+
golang.org/x/crypto v0.36.0 // indirect
5460
golang.org/x/sys v0.30.0 // indirect
5561
golang.org/x/text v0.22.0 // indirect
5662
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect

go.sum

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1+
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
2+
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
3+
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI=
4+
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
15
github.com/apache/yunikorn-scheduler-interface v0.0.0-20250304214837-4513ff3a692d h1:JDRId3/5HqpDlOV1RrVL8xDrZ2v0s/ucb6vpEGvkuy8=
26
github.com/apache/yunikorn-scheduler-interface v0.0.0-20250304214837-4513ff3a692d/go.mod h1:udBVRAW3pcKRneNL8xTC9t40I5zwLjBldT+bpzw9He4=
37
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
48
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
59
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
610
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
11+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
712
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
813
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
14+
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo=
15+
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
16+
github.com/go-ldap/ldap/v3 v3.4.11 h1:4k0Yxweg+a3OyBLjdYn5OKglv18JNvfDykSoI8bW0gU=
17+
github.com/go-ldap/ldap/v3 v3.4.11/go.mod h1:bY7t0FLK8OAVpp/vV6sSlpz3EQDGcQwc8pF0ujLgKvM=
918
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
1019
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
1120
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -18,6 +27,20 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
1827
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
1928
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
2029
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
30+
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
31+
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
32+
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
33+
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
34+
github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
35+
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
36+
github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=
37+
github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
38+
github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=
39+
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
40+
github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=
41+
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
42+
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
43+
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
2144
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
2245
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
2346
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -44,6 +67,11 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR
4467
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
4568
github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU=
4669
github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U=
70+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
71+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
72+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
73+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
74+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
4775
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
4876
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
4977
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
@@ -64,6 +92,8 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
6492
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
6593
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
6694
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
95+
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
96+
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
6797
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7 h1:aWwlzYV971S4BXRS9AmqwDLAD85ouC6X+pocatKY58c=
6898
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
6999
golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
@@ -83,6 +113,7 @@ google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojt
83113
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
84114
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
85115
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
116+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
86117
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
87118
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
88119
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=

pkg/common/configs/config.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,20 @@ type SchedulerConfig struct {
4545
// - a list of placement rule definition objects
4646
// - a list of users specifying limits on the partition
4747
// - the preemption configuration for the partition
48+
// - user group resolver type (os, ldap, "")
4849
type PartitionConfig struct {
49-
Name string
50-
Queues []QueueConfig
51-
PlacementRules []PlacementRule `yaml:",omitempty" json:",omitempty"`
52-
Limits []Limit `yaml:",omitempty" json:",omitempty"`
53-
Preemption PartitionPreemptionConfig `yaml:",omitempty" json:",omitempty"`
54-
NodeSortPolicy NodeSortingPolicy `yaml:",omitempty" json:",omitempty"`
50+
Name string
51+
Queues []QueueConfig
52+
PlacementRules []PlacementRule `yaml:",omitempty" json:",omitempty"`
53+
Limits []Limit `yaml:",omitempty" json:",omitempty"`
54+
Preemption PartitionPreemptionConfig `yaml:",omitempty" json:",omitempty"`
55+
NodeSortPolicy NodeSortingPolicy `yaml:",omitempty" json:",omitempty"`
56+
UserGroupResolver UserGroupResolver `yaml:",omitempty" json:",omitempty"`
5557
}
5658

57-
// The partition preemption configuration
59+
type UserGroupResolver struct {
60+
Type string `yaml:"type,omitempty" json:"type,omitempty"`
61+
}
5862
type PartitionPreemptionConfig struct {
5963
Enabled *bool `yaml:",omitempty" json:",omitempty"`
6064
}

pkg/common/configs/config_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2181,3 +2181,53 @@ partitions:
21812181
_, err = CreateConfig(data)
21822182
assert.ErrorContains(t, err, "group * max resource map[memory:90000 vcore:100000] of queue leaf is greater than immediate or ancestor parent maximum resource map[memory:10000 vcore:10000000]")
21832183
}
2184+
2185+
// TestUserGroupResolverConfig: tests the user group resolver configuration
2186+
func TestUserGroupResolverConfig(t *testing.T) {
2187+
data := `
2188+
partitions:
2189+
-
2190+
name: default
2191+
usergroupresolver:
2192+
type: ldap
2193+
placementrules:
2194+
- name: tag
2195+
value: namespace
2196+
create: true
2197+
queues:
2198+
- name: root
2199+
submitacl: '*'
2200+
properties:
2201+
application.sort.policy: fifo
2202+
sample: value2
2203+
`
2204+
// validate the config and check after the update
2205+
config, err := CreateConfig(data)
2206+
assert.NilError(t, err)
2207+
2208+
// check if the user group resolver is set correctly
2209+
assert.Equal(t, "ldap", config.Partitions[0].UserGroupResolver.Type)
2210+
2211+
// partition with no user group resolver
2212+
data = `
2213+
partitions:
2214+
-
2215+
name: default
2216+
placementrules:
2217+
- name: tag
2218+
value: namespace
2219+
create: true
2220+
queues:
2221+
- name: root
2222+
submitacl: '*'
2223+
properties:
2224+
application.sort.policy: fifo
2225+
sample: value2
2226+
`
2227+
// validate the config and check after the update
2228+
config, err = CreateConfig(data)
2229+
assert.NilError(t, err)
2230+
2231+
// check if the user group resolver is set to empty
2232+
assert.Equal(t, "", config.Partitions[0].UserGroupResolver.Type)
2233+
}

pkg/common/constants.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,32 @@ const (
2929
RecoveryQueue = "@recovery@"
3030
RecoveryQueueFull = "root." + RecoveryQueue
3131
DefaultPlacementQueue = "root.default"
32+
LdapHost = "Host"
33+
LdapPort = "Port"
34+
LdapBaseDN = "BaseDN"
35+
LdapFilter = "Filter"
36+
LdapGroupAttr = "GroupAttr"
37+
LdapReturnAttr = "ReturnAttr"
38+
LdapBindUser = "BindUser"
39+
LdapBindPassword = "BindPassword"
40+
LdapInsecure = "Insecure"
41+
LdapSSL = "SSL"
42+
)
43+
44+
const (
45+
DefaultLdapHost = "localhost"
46+
DefaultLdapPort = 389
47+
DefaultLdapBaseDN = "dc=example,dc=com"
48+
DefaultLdapFilter = "(&(sAMAccountName=%s))"
49+
DefaultLdapGroupAttr = "memberOf"
50+
DefaultLdapBindUser = "admin"
51+
DefaultLdapBindPassword = "admin"
52+
DefaultLdapInsecure = false
53+
DefaultLdapSSL = false
54+
DefaultLdapUserUID = "1211"
55+
)
56+
57+
var (
58+
LdapMountPath = "/run/secrets/ldap"
59+
DefaultLdapReturnAttr = []string{"memberOf"}
3260
)

0 commit comments

Comments
 (0)