Skip to content

Commit 7881164

Browse files
committed
HMS-10725: support filtering systems by workspace id
1 parent 6c5b053 commit 7881164

4 files changed

Lines changed: 97 additions & 3 deletions

File tree

‎docs/v3/openapi.json‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3283,6 +3283,19 @@
32833283
}
32843284
}
32853285
},
3286+
{
3287+
"name": "filter[group_id]",
3288+
"in": "query",
3289+
"description": "Filter systems by inventory groups",
3290+
"style": "form",
3291+
"explode": true,
3292+
"schema": {
3293+
"type": "array",
3294+
"items": {
3295+
"type": "string"
3296+
}
3297+
}
3298+
},
32863299
{
32873300
"name": "filter[system_profile][sap_system]",
32883301
"in": "query",
@@ -4577,6 +4590,19 @@
45774590
}
45784591
}
45794592
},
4593+
{
4594+
"name": "filter[group_id]",
4595+
"in": "query",
4596+
"description": "Filter systems by inventory groups",
4597+
"style": "form",
4598+
"explode": true,
4599+
"schema": {
4600+
"type": "array",
4601+
"items": {
4602+
"type": "string"
4603+
}
4604+
}
4605+
},
45804606
{
45814607
"name": "filter[system_profile][sap_system]",
45824608
"in": "query",
@@ -5013,6 +5039,19 @@
50135039
}
50145040
}
50155041
},
5042+
{
5043+
"name": "filter[group_id]",
5044+
"in": "query",
5045+
"description": "Filter systems by inventory groups",
5046+
"style": "form",
5047+
"explode": true,
5048+
"schema": {
5049+
"type": "array",
5050+
"items": {
5051+
"type": "string"
5052+
}
5053+
}
5054+
},
50165055
{
50175056
"name": "filter[system_profile][sap_system]",
50185057
"in": "query",

‎manager/controllers/systems.go‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ func systemsListResponse(c *gin.Context, query *gorm.DB, meta *ListMeta, params
286286
// @Param filter[osminor] query string false "Filter OS minor version"
287287
// @Param tags query []string false "Tag filter"
288288
// @Param filter[group_name] query []string false "Filter systems by inventory groups"
289+
// @Param filter[group_id] query []string false "Filter systems by inventory groups"
289290
// @Param filter[system_profile][sap_system] query bool false "Filter only SAP systems"
290291
// @Param filter[system_profile][sap_sids] query []string false "Filter systems by their SAP SIDs"
291292
// @Param filter[system_profile][ansible] query string false "Filter systems by ansible"
@@ -352,6 +353,7 @@ func SystemsListHandler(c *gin.Context) {
352353
// @Param filter[osminor] query string false "Filter OS minor version"
353354
// @Param tags query []string false "Tag filter"
354355
// @Param filter[group_name] query []string false "Filter systems by inventory groups"
356+
// @Param filter[group_id] query []string false "Filter systems by inventory groups"
355357
// @Param filter[system_profile][sap_system] query bool false "Filter only SAP systems"
356358
// @Param filter[system_profile][sap_sids] query []string false "Filter systems by their SAP SIDs"
357359
// @Param filter[system_profile][ansible] query string false "Filter systems by ansible"
@@ -428,6 +430,7 @@ func SystemsListPostHandler(c *gin.Context) {
428430
// @Param filter[arch] query string false "Filter"
429431
// @Param tags query []string false "Tag filter"
430432
// @Param filter[group_name] query []string false "Filter systems by inventory groups"
433+
// @Param filter[group_id] query []string false "Filter systems by inventory groups"
431434
// @Param filter[system_profile][sap_system] query bool false "Filter only SAP systems"
432435
// @Param filter[system_profile][sap_sids] query []string false "Filter systems by their SAP SIDs"
433436
// @Param filter[system_profile][ansible] query string false "Filter systems by ansible"

‎manager/controllers/utils.go‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ type NestedFilterMap map[string]string
7171

7272
var nestedFilters = NestedFilterMap{
7373
"group_name": "group_name",
74+
"group_id": "group_id",
7475
"system_profile][sap_system": "(si.sap_workload)",
7576
"system_profile][sap_sids": "(si.sap_workload_sids)",
7677
"system_profile][sap_sids][in]": "(si.sap_workload_sids)",
@@ -388,11 +389,18 @@ func ApplyInventoryWhere(filters map[string]FilterData, tx *gorm.DB) (*gorm.DB,
388389
// buildSystemProfileQuery("system_profile][mssql][version", "1.0")
389390
// returns "(si.mssql_workload_version) = 1.0"
390391
func buildInventoryQuery(tx *gorm.DB, key string, values []string) *gorm.DB {
391-
if strings.Contains(key, "group_name") {
392+
if strings.Contains(key, "group_name") || strings.Contains(key, "group_id") {
392393
groups := []string{}
393394
for _, v := range values {
394-
name := v
395-
group, err := utils.ParseInventoryGroup(nil, &name)
395+
var group string
396+
var err error
397+
if strings.Contains(key, "group_id") {
398+
id := v
399+
group, err = utils.ParseInventoryGroup(&id, nil)
400+
} else {
401+
name := v
402+
group, err = utils.ParseInventoryGroup(nil, &name)
403+
}
396404
if err != nil {
397405
// couldn't marshal inventory group to json
398406
continue

‎manager/controllers/utils_test.go‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,50 @@ func TestGroupNameFilter2(t *testing.T) {
5757
assert.Equal(t, 9, len(systems)) // 2 systems with `group2`, 6 with `group1` in test_data
5858
}
5959

60+
func TestGroupIDFilter(t *testing.T) {
61+
utils.SkipWithoutDB(t)
62+
database.Configure()
63+
64+
c, _ := gin.CreateTestContext(httptest.NewRecorder())
65+
c.Request, _ = http.NewRequest("GET", "/?filter[group_id]=inventory-group-2", nil)
66+
67+
filters, err := ParseAllFilters(c, ListOpts{})
68+
assert.Nil(t, err)
69+
70+
var systems []SystemsID
71+
groups := map[string]string{
72+
utils.KeyGrouped: `{"[{\"id\":\"inventory-group-1\"}]","[{\"id\":\"inventory-group-2\"}]"}`,
73+
}
74+
tx := database.Systems(database.DB, 1, groups)
75+
tx, _ = ApplyInventoryFilter(filters, tx, "si.inventory_id")
76+
tx.Scan(&systems)
77+
78+
assert.Equal(t, 2, len(systems))
79+
assert.Equal(t, "00000000-0000-0000-0000-000000000007", systems[0].ID)
80+
assert.Equal(t, "00000000-0000-0000-0000-000000000008", systems[1].ID)
81+
}
82+
83+
func TestGroupIDFilterMultiple(t *testing.T) {
84+
utils.SkipWithoutDB(t)
85+
database.Configure()
86+
87+
c, _ := gin.CreateTestContext(httptest.NewRecorder())
88+
c.Request, _ = http.NewRequest("GET", "/?filter[group_id]=inventory-group-2,inventory-group-1", nil)
89+
90+
filters, err := ParseAllFilters(c, ListOpts{})
91+
assert.Nil(t, err)
92+
93+
var systems []SystemsID
94+
groups := map[string]string{
95+
utils.KeyGrouped: `{"[{\"id\":\"inventory-group-1\"}]","[{\"id\":\"inventory-group-2\"}]"}`,
96+
}
97+
tx := database.Systems(database.DB, 1, groups)
98+
tx, _ = ApplyInventoryFilter(filters, tx, "si.inventory_id")
99+
tx.Scan(&systems)
100+
101+
assert.Equal(t, 9, len(systems))
102+
}
103+
60104
func TestApplySearchEmpty(t *testing.T) {
61105
var baseTx gorm.DB
62106

0 commit comments

Comments
 (0)