@@ -11,8 +11,13 @@ import (
1111 "github.com/ovh/cds/sdk"
1212)
1313
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
1621}
1722
1823// Delete remove worker from database, it also removes the associated access_token
@@ -37,83 +42,180 @@ func Delete(db gorp.SqlExecutor, id string) error {
3742
3843func LoadByConsumerID (ctx context.Context , db gorp.SqlExecutor , id string ) (* sdk.Worker , error ) {
3944 query := gorpmapping .NewQuery ("SELECT * FROM worker WHERE auth_consumer_id = $1" ).Args (id )
40- var w sdk. Worker
45+ var w dbWorker
4146 found , err := gorpmapping .Get (ctx , db , query , & w )
4247 if err != nil {
4348 return nil , err
4449 }
4550 if ! found {
4651 return nil , sdk .WithStack (sdk .ErrNotFound )
4752 }
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
4961}
5062
5163func LoadByID (ctx context.Context , db gorp.SqlExecutor , id string ) (* sdk.Worker , error ) {
5264 query := gorpmapping .NewQuery ("SELECT * FROM worker WHERE id = $1" ).Args (id )
53- var w sdk. Worker
65+ var w dbWorker
5466 found , err := gorpmapping .Get (ctx , db , query , & w )
5567 if err != nil {
5668 return nil , err
5769 }
5870 if ! found {
5971 return nil , sdk .WithStack (sdk .ErrNotFound )
6072 }
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
6281}
6382
6483func LoadAll (ctx context.Context , db gorp.SqlExecutor ) ([]sdk.Worker , error ) {
65- var workers []sdk. Worker
84+ var wks []dbWorker
6685 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 {
6887 return nil , err
6988 }
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+ }
70100 return workers , nil
71101}
72102
73103func LoadByHatcheryID (ctx context.Context , db gorp.SqlExecutor , hatcheryID int64 ) ([]sdk.Worker , error ) {
74- var workers []sdk. Worker
104+ var wks []dbWorker
75105 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 {
77107 return nil , err
78108 }
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+ }
79120 return workers , nil
80121}
81122
82123func LoadDeadWorkers (ctx context.Context , db gorp.SqlExecutor , timeout float64 , status []string ) ([]sdk.Worker , error ) {
83- var workers []sdk. Worker
124+ var wks []dbWorker
84125 query := gorpmapping .NewQuery (`SELECT *
85126 FROM worker
86127 WHERE status = ANY(string_to_array($1, ',')::text[])
87128 AND now() - last_beat > $2 * INTERVAL '1' SECOND
88129 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 {
90131 return nil , err
91132 }
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+ }
92144 return workers , nil
93145}
94146
95147// 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
98154 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
100156 }
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
104160 }
105161 return nil
106162}
107163
108164// 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
111173
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
115177 }
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+ }
116201
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
119221}
0 commit comments