Skip to content

Commit f52c0e2

Browse files
committed
IM2/Slurm: Untested fixes for several issues
#4746 and #4747
1 parent f622890 commit f52c0e2

File tree

16 files changed

+172
-56
lines changed

16 files changed

+172
-56
lines changed

provider-integration/im2/pkg/im/controller/connection.go

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import (
1212

1313
"github.com/prometheus/client_golang/prometheus"
1414
"github.com/prometheus/client_golang/prometheus/promauto"
15+
"ucloud.dk/pkg/im/ipc"
1516
"ucloud.dk/shared/pkg/apm"
1617
db "ucloud.dk/shared/pkg/database"
17-
"ucloud.dk/pkg/im/ipc"
1818

19-
"ucloud.dk/shared/pkg/client"
2019
cfg "ucloud.dk/pkg/im/config"
2120
"ucloud.dk/pkg/im/gateway"
21+
"ucloud.dk/shared/pkg/client"
2222
"ucloud.dk/shared/pkg/log"
2323
"ucloud.dk/shared/pkg/util"
2424
)
@@ -176,27 +176,47 @@ func RegisterConnectionCompleteEx(username string, uid uint32, notifyUCloud bool
176176
return err
177177
}
178178

179-
func RemoveConnection(uid uint32, notifyUCloud bool) error {
179+
type RemoveConnectionFlag int
180+
181+
const (
182+
RemoveConnectionNotify RemoveConnectionFlag = 1 << iota
183+
RemoveConnectionTrulyRemove
184+
)
185+
186+
func RemoveConnection(uid uint32, flags RemoveConnectionFlag) error {
180187
ucloud, ok, _ := MapLocalToUCloud(uid)
181188
if !ok {
182189
return fmt.Errorf("unknown user supplied: %v", uid)
183190
}
184191

185192
db.NewTx0(func(tx *db.Transaction) {
186-
db.Exec(
187-
tx,
188-
`
189-
update connections
190-
set expires_at = now()
191-
where uid = :uid
192-
`,
193-
db.Params{
194-
"uid": uid,
195-
},
196-
)
193+
if flags&RemoveConnectionTrulyRemove == 0 {
194+
db.Exec(
195+
tx,
196+
`
197+
update connections
198+
set expires_at = now()
199+
where uid = :uid
200+
`,
201+
db.Params{
202+
"uid": uid,
203+
},
204+
)
205+
} else {
206+
db.Exec(
207+
tx,
208+
`
209+
delete from connections
210+
where uid = :uid
211+
`,
212+
db.Params{
213+
"uid": uid,
214+
},
215+
)
216+
}
197217
})
198218

199-
if notifyUCloud {
219+
if flags&RemoveConnectionNotify != 0 {
200220
type Req struct {
201221
Username string `json:"username"`
202222
}
@@ -450,7 +470,7 @@ func controllerConnection(mux *http.ServeMux) {
450470
}
451471
}
452472

453-
err := RemoveConnection(local, false)
473+
err := RemoveConnection(local, 0)
454474
sendResponseOrError(w, util.EmptyValue, err)
455475
}),
456476
)

provider-integration/im2/pkg/im/external/gpfs/mock_server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import (
77
"io"
88
"net/http"
99
"os"
10-
"os/user"
1110
"path/filepath"
1211
"strconv"
1312
"strings"
1413
"sync"
1514
"time"
15+
"ucloud.dk/pkg/im/external/user"
1616
"ucloud.dk/shared/pkg/log"
1717
"ucloud.dk/shared/pkg/util"
1818
)
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package user
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
"ucloud.dk/shared/pkg/util"
8+
)
9+
10+
// NOTE(Dan): This package provides a "getent" based alternative to Go's builtin user package. The API is largely
11+
// compatible, but doesn't support all fields. This alternative is needed because of Go's alternative implementation
12+
// when CGO is disabled for a given build. In these cases, Go will fall back to reading from /etc/passwd and /etc/group
13+
// which is not sufficient for our use-cases, in particular with the Slurm integration. In these cases we often need
14+
// to read from NSS. AS a result, we use the "getent" executable which is, more or less, omnipresent on the systems we
15+
// are targeting.
16+
//
17+
// This API differs mostly by the fact that structs are returned directly instead of an interface (reference type). This
18+
// means that it is not possible to check if a UserInfo or GroupInfo is nil. Instead, you must look at the error being
19+
// returned. This, however, has the added benefit that you are very unlikely to accidentally do a nil-dereference.
20+
21+
type UserInfo struct {
22+
Uid string
23+
Gid string
24+
Username string
25+
}
26+
27+
type GroupInfo struct {
28+
Gid string
29+
Name string
30+
}
31+
32+
func Current() (UserInfo, error) {
33+
return LookupId(fmt.Sprintf("%d", os.Getuid()))
34+
}
35+
36+
func Lookup(username string) (UserInfo, error) {
37+
return lookupPasswd(username)
38+
}
39+
40+
func LookupId(uid string) (UserInfo, error) {
41+
return lookupPasswd(uid)
42+
}
43+
44+
func lookupPasswd(query string) (UserInfo, error) {
45+
stdout, _, ok := util.RunCommand([]string{getent, "passwd", query})
46+
if !ok {
47+
return UserInfo{}, fmt.Errorf("unknown user: %s", query)
48+
}
49+
50+
toks := strings.Split(stdout, ":")
51+
if len(toks) != 7 {
52+
return UserInfo{}, fmt.Errorf("unable to read output of getent: %s", stdout)
53+
}
54+
55+
return UserInfo{
56+
Uid: toks[2],
57+
Gid: toks[3],
58+
Username: toks[0],
59+
}, nil
60+
}
61+
62+
func LookupGroup(groupName string) (GroupInfo, error) {
63+
return lookupGroup(groupName)
64+
}
65+
66+
func LookupGroupId(gid string) (GroupInfo, error) {
67+
return lookupGroup(gid)
68+
}
69+
70+
func lookupGroup(query string) (GroupInfo, error) {
71+
stdout, _, ok := util.RunCommand([]string{getent, "group", query})
72+
if !ok {
73+
return GroupInfo{}, fmt.Errorf("unknown user: %s", query)
74+
}
75+
76+
toks := strings.Split(stdout, ":")
77+
if len(toks) != 4 {
78+
return GroupInfo{}, fmt.Errorf("unable to read output of getent: %s", stdout)
79+
}
80+
81+
return GroupInfo{
82+
Gid: toks[0],
83+
Name: toks[2],
84+
}, nil
85+
}
86+
87+
const getent = "getent"

provider-integration/im2/pkg/im/launcher/module.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import (
44
"fmt"
55
"net/http"
66
"os"
7-
"os/user"
87
"path/filepath"
8+
"ucloud.dk/pkg/im/external/user"
99
"ucloud.dk/pkg/im/migrations"
1010

1111
"github.com/jmoiron/sqlx"

provider-integration/im2/pkg/im/services/idfreeipa/projects.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package idfreeipa
22

33
import (
44
"fmt"
5-
"os/user"
65
"strconv"
7-
fnd "ucloud.dk/shared/pkg/foundation"
86
ctrl "ucloud.dk/pkg/im/controller"
97
"ucloud.dk/pkg/im/external/freeipa"
8+
"ucloud.dk/pkg/im/external/user"
9+
fnd "ucloud.dk/shared/pkg/foundation"
1010
"ucloud.dk/shared/pkg/log"
1111
"ucloud.dk/shared/pkg/util"
1212
)

provider-integration/im2/pkg/im/services/slurm/account_mapper.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ package slurm
33
import (
44
"fmt"
55
"net/http"
6-
"os/user"
76
"regexp"
87
"strconv"
98
"time"
10-
"ucloud.dk/shared/pkg/apm"
11-
db "ucloud.dk/shared/pkg/database"
129
cfg "ucloud.dk/pkg/im/config"
1310
ctrl "ucloud.dk/pkg/im/controller"
1411
slurmcli "ucloud.dk/pkg/im/external/slurm"
12+
"ucloud.dk/pkg/im/external/user"
1513
"ucloud.dk/pkg/im/ipc"
14+
"ucloud.dk/shared/pkg/apm"
15+
db "ucloud.dk/shared/pkg/database"
1616
"ucloud.dk/shared/pkg/log"
1717
"ucloud.dk/shared/pkg/util"
1818
)

provider-integration/im2/pkg/im/services/slurm/cli_allocations.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ import (
55
"fmt"
66
"net/http"
77
"os"
8-
"os/user"
98
"regexp"
109
"strings"
1110
"time"
12-
"ucloud.dk/shared/pkg/apm"
1311
"ucloud.dk/pkg/cli"
14-
db "ucloud.dk/shared/pkg/database"
15-
fnd "ucloud.dk/shared/pkg/foundation"
1612
cfg "ucloud.dk/pkg/im/config"
13+
"ucloud.dk/pkg/im/external/user"
1714
"ucloud.dk/pkg/im/ipc"
1815
"ucloud.dk/pkg/termio"
16+
"ucloud.dk/shared/pkg/apm"
17+
db "ucloud.dk/shared/pkg/database"
18+
fnd "ucloud.dk/shared/pkg/foundation"
1919
"ucloud.dk/shared/pkg/util"
2020
)
2121

provider-integration/im2/pkg/im/services/slurm/cli_connect.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package slurm
33
import (
44
"fmt"
55
"os"
6-
"os/user"
76
"time"
87
ctrl "ucloud.dk/pkg/im/controller"
8+
"ucloud.dk/pkg/im/external/user"
99
"ucloud.dk/pkg/termio"
1010
"ucloud.dk/shared/pkg/util"
1111
)

provider-integration/im2/pkg/im/services/slurm/cli_drives.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ import (
66
"fmt"
77
"net/http"
88
"os"
9-
"os/user"
109
"regexp"
1110
"strings"
1211
"ucloud.dk/pkg/cli"
13-
db "ucloud.dk/shared/pkg/database"
1412
ctrl "ucloud.dk/pkg/im/controller"
13+
"ucloud.dk/pkg/im/external/user"
1514
"ucloud.dk/pkg/im/ipc"
16-
orc "ucloud.dk/shared/pkg/orchestrators"
1715
"ucloud.dk/pkg/termio"
16+
db "ucloud.dk/shared/pkg/database"
17+
orc "ucloud.dk/shared/pkg/orchestrators"
1818
)
1919

2020
func HandleDrivesCommand() {

provider-integration/im2/pkg/im/services/slurm/cli_jobs.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ import (
66
"fmt"
77
"net/http"
88
"os"
9-
"os/user"
109
"regexp"
1110
"slices"
1211
"strings"
1312
"time"
1413
"ucloud.dk/pkg/cli"
15-
db "ucloud.dk/shared/pkg/database"
1614
slurmcli "ucloud.dk/pkg/im/external/slurm"
15+
"ucloud.dk/pkg/im/external/user"
1716
"ucloud.dk/pkg/im/ipc"
18-
orc "ucloud.dk/shared/pkg/orchestrators"
1917
"ucloud.dk/pkg/termio"
18+
db "ucloud.dk/shared/pkg/database"
19+
orc "ucloud.dk/shared/pkg/orchestrators"
2020
)
2121

2222
func HandleJobsCommand() {

0 commit comments

Comments
 (0)