-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathexecutorutil.go
More file actions
117 lines (106 loc) · 3.79 KB
/
executorutil.go
File metadata and controls
117 lines (106 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
* === This file is part of ALICE O² ===
*
* Copyright 2022 CERN and copyright holders of ALICE O².
* Author: Teo Mrnjavac <teo.mrnjavac@cern.ch>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* In applying this license CERN does not waive the privileges and
* immunities granted to it by virtue of its status as an
* Intergovernmental Organization or submit itself to any jurisdiction.
*/
// Package executorutil provides utility functions for the executor,
// including resource management and task execution helpers.
package executorutil
import (
"os/exec"
"os/user"
"strconv"
"strings"
"github.com/AliceO2Group/Control/common/utils/uid"
mesos "github.com/mesos/mesos-go/api/v1/lib"
)
type Labeler interface {
GetLabels() *mesos.Labels
}
func GetEnvironmentIdFromLabelerType(labeler Labeler) uid.ID {
envId := uid.NilID()
var err error
labels := labeler.GetLabels()
if labels != nil && len(labels.GetLabels()) > 0 {
for _, label := range labels.GetLabels() {
if label.GetKey() == "environmentId" && label.GetValue() != "" {
envId, err = uid.FromString(label.GetValue())
if err != nil {
envId = uid.NilID()
}
break
}
}
}
return envId
}
func GetValueFromLabelerType(labeler Labeler, key string) string {
labels := labeler.GetLabels()
if labels != nil && len(labels.GetLabels()) > 0 {
for _, label := range labels.GetLabels() {
if label.GetKey() == key && label.GetValue() != "" {
return label.GetValue()
}
}
}
return ""
}
func GetGroupIDs(targetUser *user.User) ([]uint32, []string) {
gidStrings, err := targetUser.GroupIds()
if err != nil {
// Non-nil error means we're building with !osusergo, so our binary is fully
// static and therefore certain CGO calls needed by os.user aren't available.
// We work around by calling `id -G username` like in the shell.
idCmd := exec.Command("id", "-G", targetUser.Username) // list of GIDs for a given user
output, err := idCmd.Output()
if err != nil {
return []uint32{}, []string{}
}
gidStrings = strings.Split(string(output[:]), " ")
}
gids := make([]uint32, len(gidStrings))
for i, v := range gidStrings {
parsed, err := strconv.ParseUint(strings.TrimSpace(v), 10, 32)
if err != nil {
return []uint32{}, []string{}
}
gids[i] = uint32(parsed)
}
return gids, gidStrings
}
// TruncateCommandBeforeTheLastPipe
// DPL commands are often aggregated in pipes, one after another.
// In certain contexts only the piece after the last pipe actually matters,
// while the previous ones only provide awareness of the whole topology.
// The current IL does not allow us to fit messages longer than 1024 characters,
// so we end up with truncated logs anyway.
// This method attempts to keep the piece after the last '|' intact, but will trim anything before
// if the total command length is going to exceed maxLength.
func TruncateCommandBeforeTheLastPipe(cmd string, maxLength int) string {
lastPipeIdx := strings.LastIndex(cmd, "|")
const separator = " <CUT> |"
if lastPipeIdx == -1 || lastPipeIdx+1 == len(cmd) || len(cmd) < maxLength {
return cmd
} else {
budgetForBeginning := maxLength - (len(cmd) - lastPipeIdx) - len(separator)
return cmd[:budgetForBeginning] + separator + cmd[lastPipeIdx+1:]
}
}