@@ -11,8 +11,13 @@ import (
11
11
"github.com/ovh/cds/sdk"
12
12
)
13
13
14
- func Insert (db gorp.SqlExecutor , w * sdk.Worker ) error {
15
- return gorpmapping .Insert (db , w )
14
+ func Insert (ctx context.Context , db gorp.SqlExecutor , w * sdk.Worker ) error {
15
+ dbData := & dbWorker {Worker : * w }
16
+ if err := gorpmapping .InsertAndSign (ctx , db , dbData ); err != nil {
17
+ return err
18
+ }
19
+ * w = dbData .Worker
20
+ return nil
16
21
}
17
22
18
23
// Delete remove worker from database, it also removes the associated access_token
@@ -37,83 +42,180 @@ func Delete(db gorp.SqlExecutor, id string) error {
37
42
38
43
func LoadByConsumerID (ctx context.Context , db gorp.SqlExecutor , id string ) (* sdk.Worker , error ) {
39
44
query := gorpmapping .NewQuery ("SELECT * FROM worker WHERE auth_consumer_id = $1" ).Args (id )
40
- var w sdk. Worker
45
+ var w dbWorker
41
46
found , err := gorpmapping .Get (ctx , db , query , & w )
42
47
if err != nil {
43
48
return nil , err
44
49
}
45
50
if ! found {
46
51
return nil , sdk .WithStack (sdk .ErrNotFound )
47
52
}
48
- return & w , nil
53
+ isValid , err := gorpmapping .CheckSignature (w , w .Signature )
54
+ if err != nil {
55
+ return nil , err
56
+ }
57
+ if ! isValid {
58
+ return nil , sdk .WithStack (sdk .ErrInvalidData )
59
+ }
60
+ return & w .Worker , nil
49
61
}
50
62
51
63
func LoadByID (ctx context.Context , db gorp.SqlExecutor , id string ) (* sdk.Worker , error ) {
52
64
query := gorpmapping .NewQuery ("SELECT * FROM worker WHERE id = $1" ).Args (id )
53
- var w sdk. Worker
65
+ var w dbWorker
54
66
found , err := gorpmapping .Get (ctx , db , query , & w )
55
67
if err != nil {
56
68
return nil , err
57
69
}
58
70
if ! found {
59
71
return nil , sdk .WithStack (sdk .ErrNotFound )
60
72
}
61
- return & w , nil
73
+ isValid , err := gorpmapping .CheckSignature (w , w .Signature )
74
+ if err != nil {
75
+ return nil , err
76
+ }
77
+ if ! isValid {
78
+ return nil , sdk .WithStack (sdk .ErrInvalidData )
79
+ }
80
+ return & w .Worker , nil
62
81
}
63
82
64
83
func LoadAll (ctx context.Context , db gorp.SqlExecutor ) ([]sdk.Worker , error ) {
65
- var workers []sdk. Worker
84
+ var wks []dbWorker
66
85
query := gorpmapping .NewQuery (`SELECT * FROM worker ORDER BY name ASC` )
67
- if err := gorpmapping .GetAll (ctx , db , query , & workers ); err != nil {
86
+ if err := gorpmapping .GetAll (ctx , db , query , & wks ); err != nil {
68
87
return nil , err
69
88
}
89
+ workers := make ([]sdk.Worker , len (wks ))
90
+ for i := range wks {
91
+ isValid , err := gorpmapping .CheckSignature (wks [i ], wks [i ].Signature )
92
+ if err != nil {
93
+ return nil , err
94
+ }
95
+ if ! isValid {
96
+ return nil , sdk .WithStack (sdk .ErrInvalidData )
97
+ }
98
+ workers [i ] = wks [i ].Worker
99
+ }
70
100
return workers , nil
71
101
}
72
102
73
103
func LoadByHatcheryID (ctx context.Context , db gorp.SqlExecutor , hatcheryID int64 ) ([]sdk.Worker , error ) {
74
- var workers []sdk. Worker
104
+ var wks []dbWorker
75
105
query := gorpmapping .NewQuery (`SELECT * FROM worker WHERE hatchery_id = $1 ORDER BY name ASC` ).Args (hatcheryID )
76
- if err := gorpmapping .GetAll (ctx , db , query , & workers ); err != nil {
106
+ if err := gorpmapping .GetAll (ctx , db , query , & wks ); err != nil {
77
107
return nil , err
78
108
}
109
+ workers := make ([]sdk.Worker , len (wks ))
110
+ for i := range wks {
111
+ isValid , err := gorpmapping .CheckSignature (wks [i ], wks [i ].Signature )
112
+ if err != nil {
113
+ return nil , err
114
+ }
115
+ if ! isValid {
116
+ return nil , sdk .WithStack (sdk .ErrInvalidData )
117
+ }
118
+ workers [i ] = wks [i ].Worker
119
+ }
79
120
return workers , nil
80
121
}
81
122
82
123
func LoadDeadWorkers (ctx context.Context , db gorp.SqlExecutor , timeout float64 , status []string ) ([]sdk.Worker , error ) {
83
- var workers []sdk. Worker
124
+ var wks []dbWorker
84
125
query := gorpmapping .NewQuery (`SELECT *
85
126
FROM worker
86
127
WHERE status = ANY(string_to_array($1, ',')::text[])
87
128
AND now() - last_beat > $2 * INTERVAL '1' SECOND
88
129
ORDER BY last_beat ASC` ).Args (strings .Join (status , "," ), timeout )
89
- if err := gorpmapping .GetAll (ctx , db , query , & workers ); err != nil {
130
+ if err := gorpmapping .GetAll (ctx , db , query , & wks ); err != nil {
90
131
return nil , err
91
132
}
133
+ workers := make ([]sdk.Worker , len (wks ))
134
+ for i := range wks {
135
+ isValid , err := gorpmapping .CheckSignature (wks [i ], wks [i ].Signature )
136
+ if err != nil {
137
+ return nil , err
138
+ }
139
+ if ! isValid {
140
+ return nil , sdk .WithStack (sdk .ErrInvalidData )
141
+ }
142
+ workers [i ] = wks [i ].Worker
143
+ }
92
144
return workers , nil
93
145
}
94
146
95
147
// SetStatus sets job_run_id and status to building on given worker
96
- func SetStatus (db gorp.SqlExecutor , workerID string , status string ) error {
97
- query := `UPDATE worker SET status = $1 WHERE id = $2`
148
+ func SetStatus (ctx context.Context , db gorp.SqlExecutor , workerID string , status string ) error {
149
+ w , err := LoadByID (ctx , db , workerID )
150
+ if err != nil {
151
+ return err
152
+ }
153
+ w .Status = status
98
154
if status == sdk .StatusBuilding || status == sdk .StatusWaiting {
99
- query = `UPDATE worker SET status = $1, job_run_id = NULL WHERE id = $2`
155
+ w . JobRunID = nil
100
156
}
101
-
102
- if _ , err := db . Exec ( query , status , workerID ); err != nil {
103
- return sdk . WithStack ( err )
157
+ dbData := & dbWorker { Worker : * w }
158
+ if err := gorpmapping . UpdateAndSign ( ctx , db , dbData ); err != nil {
159
+ return err
104
160
}
105
161
return nil
106
162
}
107
163
108
164
// SetToBuilding sets job_run_id and status to building on given worker
109
- func SetToBuilding (db gorp.SqlExecutor , workerID string , jobRunID int64 ) error {
110
- query := `UPDATE worker SET status = $1, job_run_id = $2 WHERE id = $3`
165
+ func SetToBuilding (ctx context.Context , db gorp.SqlExecutor , workerID string , jobRunID int64 , key []byte ) error {
166
+ w , err := LoadByID (ctx , db , workerID )
167
+ if err != nil {
168
+ return err
169
+ }
170
+ w .Status = sdk .StatusBuilding
171
+ w .JobRunID = & jobRunID
172
+ w .PrivateKey = key
111
173
112
- res , errE := db . Exec ( query , sdk . StatusBuilding , jobRunID , workerID )
113
- if errE != nil {
114
- return sdk . WithStack ( errE )
174
+ dbData := & dbWorker { Worker : * w }
175
+ if err := gorpmapping . UpdateAndSign ( ctx , db , dbData ); err != nil {
176
+ return err
115
177
}
178
+ return nil
179
+ }
180
+
181
+ // LoadWorkerByIDWithDecryptKey load worker with decrypted private key
182
+ func LoadWorkerByIDWithDecryptKey (ctx context.Context , db gorp.SqlExecutor , workerID string ) (* sdk.Worker , error ) {
183
+ var work dbWorker
184
+ query := gorpmapping .NewQuery (`SELECT * FROM worker WHERE id = $1` ).Args (workerID )
185
+ found , err := gorpmapping .Get (ctx , db , query , & work , gorpmapping .GetOptions .WithDecryption )
186
+ if err != nil {
187
+ return nil , err
188
+ }
189
+ if ! found {
190
+ return nil , sdk .WithStack (sdk .ErrNotFound )
191
+ }
192
+ isValid , err := gorpmapping .CheckSignature (work , work .Signature )
193
+ if err != nil {
194
+ return nil , err
195
+ }
196
+ if ! isValid {
197
+ return nil , sdk .WithStack (sdk .ErrInvalidData )
198
+ }
199
+ return & work .Worker , err
200
+ }
116
201
117
- _ , err := res .RowsAffected ()
118
- return err
202
+ // LoadWorkerByName load worker by name
203
+ func LoadWorkerByName (ctx context.Context , db gorp.SqlExecutor , workerName string ) (* sdk.Worker , error ) {
204
+ var work dbWorker
205
+ query := gorpmapping .NewQuery (`SELECT * FROM worker WHERE name = $1` ).Args (workerName )
206
+ found , err := gorpmapping .Get (ctx , db , query , & work )
207
+ if err != nil {
208
+ return nil , err
209
+ }
210
+ if ! found {
211
+ return nil , sdk .WithStack (sdk .ErrNotFound )
212
+ }
213
+ isValid , err := gorpmapping .CheckSignature (work , work .Signature )
214
+ if err != nil {
215
+ return nil , err
216
+ }
217
+ if ! isValid {
218
+ return nil , sdk .WithStack (sdk .ErrInvalidData )
219
+ }
220
+ return & work .Worker , err
119
221
}
0 commit comments