8000 feat(api,ui): add state filter on worker model (#3319) · ovh/cds@a2e3f11 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit a2e3f11

Browse files
bnjjjyesnault
authored andcommitted
feat(api,ui): add state filter on worker model (#3319)
Signed-off-by: Benjamin Coenen <benjamin.coenen@corp.ovh.com>
1 parent 3f31cf2 commit a2e3f11

File tree

14 files changed

+148
-20
lines changed

14 files changed

+148
-20
lines changed

cli/cdsctl/worker_model.go

Lines changed: 8 additions & 1 deletion
Diff line number
Original file line numberDiff line change
@@ -40,18 +40,25 @@ var workerModelListCmd = cli.Command{
4040
Kind: reflect.String,
4141
ShortHand: "b",
4242
},
43+
{
44+
Name: "state",
45+
Usage: "Use this flag to filter worker model by his state (disabled|error|register|deprecated)",
46+
Kind: reflect.String,
47+
ShortHand: "s",
48+
},
4349
},
4450
}
4551

4652
func workerModelListRun(v cli.Values) (cli.ListResult, error) {
4753
var err error
4854
var workerModels []sdk.Model
4955
binaryFlag := v.GetString("binary")
56+
stateFlag := v.GetString("state")
5057

5158
if binaryFlag != "" {
5259
workerModels, err = client.WorkerModelsByBinary(binaryFlag)
5360
} else {
54-
workerModels, err = client.WorkerModels()
61+
workerModels, err = client.WorkerModelsByState(stateFlag)
5562
}
5663

5764
if err != nil {

engine/api/requirements.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func (api *API) getRequirementTypeValuesHandler() service.Handler {
3232
return service.WriteJSON(w, req.Values(), http.StatusOK)
3333

3434
case sdk.ModelRequirement:
35-
models, err := worker.LoadWorkerModelsByUser(api.mustDB(), api.Cache, getUser(ctx))
35+
models, err := worker.LoadWorkerModelsByUser(api.mustDB(), api.Cache, getUser(ctx), nil)
3636
if err != nil {
3737
return sdk.WrapError(err, "getRequirementTypeValuesHandler> Cannot load worker models")
3838
}

engine/api/worker/model.go

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"sort"
88
"strconv"
9+
"strings"
910
"time"
1011

1112
"github.com/go-gorp/gorp"
@@ -54,6 +55,21 @@ type dbResultWMS struct {
5455
GroupName string `db:"groupname"`
5556
}
5657

58+
// StateLoadOption represent load options to load worker model
59+
type StateLoadOption string
60+
61+
func (state StateLoadOption) String() string {
62+
return string(state)
63+
}
64+
65+
// List of const for state load option
66+
const (
67+
StateError StateLoadOption = "error"
68+
StateDisabled StateLoadOption = "disabled"
69+
StateRegister StateLoadOption = "register"
70+
StateDeprecated StateLoadOption = "deprecated"
71+
)
72+
5773
// InsertWorkerModel insert a new worker model in database
5874
func InsertWorkerModel(db gorp.SqlExecutor, model *sdk.Model) error {
5975
dbmodel := WorkerModel(*model)
@@ -165,16 +181,26 @@ func LoadAndLockWorkerModelByID(db gorp.SqlExecutor, ID int64) (*sdk.Model, erro
165181
}
166182

167183
// LoadWorkerModelsByUser returns worker models list according to user's groups
168-
func LoadWorkerModelsByUser(db gorp.SqlExecutor, store cache.Store, user *sdk.User) ([]sdk.Model, error) {
169-
key := cache.Key("api:workermodels", user.Username)
184+
func LoadWorkerModelsByUser(db gorp.SqlExecutor, store cache.Store, user *sdk.User, opts *StateLoadOption) ([]sdk.Model, error) {
185+
prefixKey := "api:workermodels"
186+
187+
if opts != nil {
188+
prefixKey += fmt.Sprintf(":%v", *opts)
189+
}
190+
key := cache.Key(prefixKey, user.Username)
170191
models := []sdk.Model{}
171< 10000 /td>192
if store.Get(key, &models) {
172193
return models, nil
173194
}
174195

196+
additionalFilters := getAdditionalSQLFilters(opts)
175197
wms := []dbResultWMS{}
176198
if user.Admin {
177199
query := fmt.Sprintf(`select %s from worker_model JOIN "group" on worker_model.group_id = "group".id`, modelColumns)
200+
if len(additionalFilters) > 0 {
201+
query += fmt.Sprintf(" WHERE %s", strings.Join(additionalFilters, " AND "))
202+
}
203+
178204
if _, err := db.Select(&wms, query); err != nil {
179205
return nil, sdk.WrapError(err, "LoadWorkerModelsByUser> for admin")
180206
}
@@ -187,6 +213,10 @@ func LoadWorkerModelsByUser(db gorp.SqlExecutor, store cache.Store, user *sdk.Us
187213
select %s from worker_model
188214
JOIN "group" on worker_model.group_id = "group".id
189215
where group_id = $2`, modelColumns, modelColumns)
216+
if len(additionalFilters) > 0 {
217+
query += fmt.Sprintf(" AND %s", strings.Join(additionalFilters, " AND "))
218+
}
219+
190220
if _, err := db.Select(&wms, query, user.ID, group.SharedInfraGroup.ID); err != nil {
191221
return nil, sdk.WrapError(err, "LoadWorkerModelsByUser> for user")
192222
}
@@ -459,3 +489,20 @@ func mergeWithDefaultEnvs(envs map[string]string) map[string]string {
459489

460490
return envs
461491
}
492+
493+
func getAdditionalSQLFilters(opts *StateLoadOption) []string {
494+
var additionalFilters []string
495+
if opts != nil {
496+
switch {
497+
case *opts == StateError:
498+
additionalFilters = append(additionalFilters, "worker_model.nb_spawn_err > 0")
499+
case *opts == StateDisabled:
500+
additionalFilters = append(additionalFilters, "worker_model.disabled = true")
501+
case *opts == StateRegister:
502+
additionalFilters = append(additionalFilters, "worker_model.need_registration = true")
503+
case *opts == StateDeprecated:
504+
additionalFilters = append(additionalFilters, "worker_model.is_deprecated = true")
505+
}
506+
}
507+
return additionalFilters
508+
}

engine/api/worker/model_test.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func TestInsertWorkerModel(t *testing.T) {
110110
group.InsertGroup(db, g)
111111
group.InsertUserInGroup(db, g.ID, u.ID, false)
112112

113-
m3, err := LoadWorkerModelsByUser(db, store, u)
113+
m3, err := LoadWorkerModelsByUser(db, store, u, nil)
114114
if err != nil {
115115
t.Fatalf("Cannot load worker model by user: %s", err)
116116
}
@@ -170,6 +170,26 @@ func TestLoadWorkerModels(t *testing.T) {
170170
}
171171
}
172172

173+
func TestLoadWorkerModelsWithFilter(t *testing.T) {
174+
db, store := test.SetupPG(t, bootstrap.InitiliazeDB)
175+
deleteAllWorkerModel(t, db)
176+
177+
g := insertGroup(t, db)
178+
179+
insertWorkerModel(t, db, "lol", g.ID)
180+
insertWorkerModel(t, db, "foo", g.ID)
181+
182+
opts := StateError
183+
models, err := LoadWorkerModelsByUser(db, store, &sdk.User{Admin: true}, &opts)
184+
if err != nil {
185+
t.Fatalf("Cannot load worker model: %s", err)
186+
}
187+
188+
if len(models) != 0 {
189+
t.Fatalf("Expected 0 models, got %d", len(models))
190+
}
191+
}
192+
173193
func TestLoadWorkerModelsByUserAndBinary(t *testing.T) {
174194
db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
175195
deleteAllWorkerModel(t, db)

engine/api/worker_model.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,16 @@ func (api *API) getWorkerModelsHandler() service.Handler {
441441
}
442442

443443
binary := r.FormValue("binary")
444+
state := r.FormValue("state")
445+
var opt *worker.StateLoadOption
446+
switch state {
447+
case "", worker.StateDisabled.String(), worker.StateError.String(), worker.StateRegister.String(), worker.StateDeprecated.String():
448+
opt = new(worker.StateLoadOption)
449+
*opt = worker.StateLoadOption(state)
450+
break
451+
default:
452+
return sdk.ErrWrongRequest
453+
}
444454

445455
u := getUser(ctx)
446456
if u == nil || u.ID == 0 {
@@ -456,7 +466,7 @@ func (api *API) getWorkerModelsHandler() service.Handler {
456466
if binary != "" {
457467
models, errbyuser = worker.LoadWorkerModelsByUserAndBinary(api.mustDB(), getUser(ctx), binary)
458468
} else {
459-
models, errbyuser = worker.LoadWorkerModelsByUser(api.mustDB(), api.Cache, getUser(ctx))
469+
models, errbyuser = worker.LoadWorkerModelsByUser(api.mustDB(), api.Cache, getUser(ctx), opt)
460470
}
461471
if errbyuser != nil {
462472
return sdk.WrapError(errbyuser, "getWorkerModels> cannot load worker models for user id %d", getUser(ctx).ID)

sdk/cdsclient/client_worker_model.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,32 @@ func (c *client) WorkerModelBook(id int64) error {
2020

2121
// WorkerModelsEnabled retrieves all worker models enabled and available to user
2222
func (c *client) WorkerModelsEnabled() ([]sdk.Model, error) {
23-
return c.workerModels(false, "")
23+
return c.workerModels(false, "", "")
2424
}
2525

2626
// WorkerModels retrieves all worker models available to user (enabled or not)
2727
func (c *client) WorkerModels() ([]sdk.Model, error) {
28-
return c.workerModels(true, "")
28+
return c.workerModels(true, "", "")
2929
}
3030

31-
// WorkerModels retrieves all worker models available to user (enabled or not)
31+
// WorkerModelsByBinary retrieves all worker models by binary available to user (enabled or not)
3232
func (c *client) WorkerModelsByBinary(binary string) ([]sdk.Model, error) {
33-
return c.workerModels(true, binary)
33+
return c.workerModels(true, binary, "")
34+
}
35+
36+
// WorkerModelsByState retrieves all worker models by state (error|deprecated|register|disabled) available to user (enabled or not)
37+
func (c *client) WorkerModelsByState(state string) ([]sdk.Model, error) {
38+
return c.workerModels(true, "", state)
3439
}
3540

36-
func (c *client) workerModels(withDisabled bool, binary string) ([]sdk.Model, error) {
41+
func (c *client) workerModels(withDisabled bool, binary, state string) ([]sdk.Model, error) {
3742
var uri string
3843
if withDisabled {
3944
uri = fmt.Sprintf("/worker/model")
4045
if binary != "" {
4146
uri += "?binary=" + url.QueryEscape(binary)
47+
} else if state != "" {
48+
uri += "?state=" + url.QueryEscape(state)
4249
}
4350
} else {
4451
uri = fmt.Sprintf("/worker/model/enabled")

sdk/cdsclient/interface.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ type WorkerClient interface {
241241
WorkerModelsEnabled() ([]sdk.Model, error)
242242
WorkerModels() ([]sdk.Model, error)
243243
WorkerModelsByBinary(binary string) ([]sdk.Model, error)
244+
WorkerModelsByState(state string) ([]sdk.Model, error)
244245
WorkerRegister(sdk.WorkerRegistrationForm) (*sdk.Worker, bool, error)
245246
WorkerSetStatus(sdk.Status) error
246247
}

ui/src/app/service/worker-model/worker-model.service.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,14 @@ export class WorkerModelService {
5252
* Get the list of available worker models
5353
* @returns {Observable<WorkerModel[]>}
5454
*/
55-
getWorkerModels(binary?: string): Observable<Array<WorkerModel>> {
55+
getWorkerModels(state: string, binary?: string): Observable<Array<WorkerModel>> {
5656
let params = new HttpParams();
5757
if (binary) {
5858
params = params.append('binary', binary);
5959
}
60+
if (state) {
61+
params = params.append('state', state);
62+
}
6063

6164
return this._http.get<Array<WorkerModel>>('/worker/model', {params});
6265
}

ui/src/app/shared/requirements/form/requirements.form.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export class RequirementsFormComponent implements OnInit {
7777
}
7878

7979
ngOnInit() {
80-
this._workerModelService.getWorkerModels()
80+
this._workerModelService.getWorkerModels(null)
8181
.pipe(
8282
first(),
8383
finalize(() => this.loading = false)

ui/src/app/shared/requirements/list/requirements.list.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export class RequirementsListComponent extends Table implements OnInit {
6060
}
6161

6262
ngOnInit() {
63-
this._workerModelService.getWorkerModels()
63+
this._workerModelService.getWorkerModels(null)
6464
.pipe(finalize(() => this.loading = false), first())
6565
.subscribe(wms => {
6666
this.workerModels = wms;

0 commit comments

Comments
 (0)
0