@@ -12,18 +12,14 @@ import (
12
12
"github.com/ovh/cds/sdk/log"
13
13
)
14
14
15
- // getNodeJobRunRequirements returns requirements list interpolated, and true or false if at least
15
+ // processNodeJobRunRequirements returns requirements list interpolated, and true or false if at least
16
16
// one requirement is of type "Service"
17
- func getNodeJobRunRequirements (db gorp.SqlExecutor , j sdk.Job , run * sdk.WorkflowNodeRun ) (sdk.RequirementList , bool , string , * sdk.MultiError ) {
18
- requirements := sdk.RequirementList {}
19
- tmp := map [string ]string {}
20
- errm := & sdk.MultiError {}
21
-
17
+ func processNodeJobRunRequirements (db gorp.SqlExecutor , j sdk.Job , run * sdk.WorkflowNodeRun , execsGroupIDs []int64 ) (sdk.RequirementList , bool , string , * sdk.MultiError ) {
18
+ var requirements sdk.RequirementList
19
+ var errm sdk.MultiError
22
20
var containsService bool
23
21
var model string
24
- for _ , v := range run .BuildParameters {
25
- tmp [v .Name ] = v .Value
26
- }
22
+ var tmp = sdk .ParametersToMap (run .BuildParameters )
27
23
28
24
for _ , v := range j .Action .Requirements {
29
25
name , errName := interpolate .Do (v .Name , tmp )
@@ -36,29 +32,64 @@ func getNodeJobRunRequirements(db gorp.SqlExecutor, j sdk.Job, run *sdk.Workflow
36
32
errm .Append (errValue )
37
33
continue
38
34
}
39
- sdk . AddRequirement ( & requirements , v . ID , name , v . Type , value )
35
+
40
36
if v .Type == sdk .ServiceRequirement {
41
37
containsService = true
42
38
}
43
39
if v .Type == sdk .ModelRequirement {
40
+ // It is forbidden to have more than one model requirement.
41
+ if model != "" {
42
+ errm .Append (sdk .ErrInvalidJobRequirementDuplicateModel )
43
+ break
44
+ }
44
45
model = value
45
46
}
47
+
48
+ sdk .AddRequirement (& requirements , v .ID , name , v .Type , value )
46
49
}
47
50
48
51
var modelType string
49
52
if model != "" {
6D40
53
+ // Load the worker model
50
54
wm , err := worker .LoadWorkerModelByName (db , model )
51
55
if err != nil {
52
56
log .Error ("getNodeJobRunRequirements> error while getting worker model %s: %v" , model , err )
57
+ errm .Append (sdk .ErrNoWorkerModel )
53
58
} else {
59
+ // Check that the worker model is in an exec group
60
+ if ! sdk .IsInInt64Array (wm .GroupID , execsGroupIDs ) {
61
+ errm .Append (sdk .ErrInvalidJobRequirementWorkerModelPermission )
62
+ }
63
+
64
+ // Check that the worker model has the binaries capabilitites
65
+ // only if the worker model doesn't need registration
66
+ if ! wm .NeedRegistration && ! wm .CheckRegistration {
67
+ for _ , req := range requirements {
68
+ if req .Type == sdk .BinaryRequirement {
69
+ var hasCapa bool
70
+ for _ , cap := range wm .RegisteredCapabilities {
71
+ if cap .Value == req .Value {
72
+ hasCapa = true
73
+ break
74
+ }
75
+ }
76
+ if ! hasCapa {
77
+ errm .Append (sdk .ErrInvalidJobRequirementWorkerModelCapabilitites )
78
+ break
79
+ }
80
+ }
81
+ }
82
+ }
83
+
54
84
modelType = wm .Type
55
85
}
86
+
56
87
}
57
88
58
89
if errm .IsEmpty () {
59
90
return requirements , containsService , modelType , nil
60
91
}
61
- return requirements , containsService , modelType , errm
92
+ return requirements , containsService , modelType , & errm
62
93
}
63
94
64
95
func prepareRequirementsToNodeJobRunParameters (reqs sdk.RequirementList ) []sdk.Parameter {
0 commit comments