diff --git a/docs/v3/openapi.json b/docs/v3/openapi.json index 4120c5b5e..f9b4ced34 100644 --- a/docs/v3/openapi.json +++ b/docs/v3/openapi.json @@ -3283,6 +3283,19 @@ } } }, + { + "name": "filter[group_id]", + "in": "query", + "description": "Filter systems by inventory groups", + "style": "form", + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, { "name": "filter[system_profile][sap_system]", "in": "query", @@ -4577,6 +4590,19 @@ } } }, + { + "name": "filter[group_id]", + "in": "query", + "description": "Filter systems by inventory groups", + "style": "form", + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, { "name": "filter[system_profile][sap_system]", "in": "query", @@ -5013,6 +5039,19 @@ } } }, + { + "name": "filter[group_id]", + "in": "query", + "description": "Filter systems by inventory groups", + "style": "form", + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, { "name": "filter[system_profile][sap_system]", "in": "query", diff --git a/manager/controllers/systems.go b/manager/controllers/systems.go index c4305e9aa..8454fe332 100644 --- a/manager/controllers/systems.go +++ b/manager/controllers/systems.go @@ -286,6 +286,7 @@ func systemsListResponse(c *gin.Context, query *gorm.DB, meta *ListMeta, params // @Param filter[osminor] query string false "Filter OS minor version" // @Param tags query []string false "Tag filter" // @Param filter[group_name] query []string false "Filter systems by inventory groups" +// @Param filter[group_id] query []string false "Filter systems by inventory groups" // @Param filter[system_profile][sap_system] query bool false "Filter only SAP systems" // @Param filter[system_profile][sap_sids] query []string false "Filter systems by their SAP SIDs" // @Param filter[system_profile][ansible] query string false "Filter systems by ansible" @@ -352,6 +353,7 @@ func SystemsListHandler(c *gin.Context) { // @Param filter[osminor] query string false "Filter OS minor version" // @Param tags query []string false "Tag filter" // @Param filter[group_name] query []string false "Filter systems by inventory groups" +// @Param filter[group_id] query []string false "Filter systems by inventory groups" // @Param filter[system_profile][sap_system] query bool false "Filter only SAP systems" // @Param filter[system_profile][sap_sids] query []string false "Filter systems by their SAP SIDs" // @Param filter[system_profile][ansible] query string false "Filter systems by ansible" @@ -428,6 +430,7 @@ func SystemsListPostHandler(c *gin.Context) { // @Param filter[arch] query string false "Filter" // @Param tags query []string false "Tag filter" // @Param filter[group_name] query []string false "Filter systems by inventory groups" +// @Param filter[group_id] query []string false "Filter systems by inventory groups" // @Param filter[system_profile][sap_system] query bool false "Filter only SAP systems" // @Param filter[system_profile][sap_sids] query []string false "Filter systems by their SAP SIDs" // @Param filter[system_profile][ansible] query string false "Filter systems by ansible" diff --git a/manager/controllers/utils.go b/manager/controllers/utils.go index 3c08fa4f5..012866631 100644 --- a/manager/controllers/utils.go +++ b/manager/controllers/utils.go @@ -71,6 +71,7 @@ type NestedFilterMap map[string]string var nestedFilters = NestedFilterMap{ "group_name": "group_name", + "group_id": "group_id", "system_profile][sap_system": "(si.sap_workload)", "system_profile][sap_sids": "(si.sap_workload_sids)", "system_profile][sap_sids][in]": "(si.sap_workload_sids)", @@ -388,11 +389,18 @@ func ApplyInventoryWhere(filters map[string]FilterData, tx *gorm.DB) (*gorm.DB, // buildSystemProfileQuery("system_profile][mssql][version", "1.0") // returns "(si.mssql_workload_version) = 1.0" func buildInventoryQuery(tx *gorm.DB, key string, values []string) *gorm.DB { - if strings.Contains(key, "group_name") { + if strings.Contains(key, "group_name") || strings.Contains(key, "group_id") { groups := []string{} for _, v := range values { - name := v - group, err := utils.ParseInventoryGroup(nil, &name) + var group string + var err error + if strings.Contains(key, "group_id") { + id := v + group, err = utils.ParseInventoryGroup(&id, nil) + } else { + name := v + group, err = utils.ParseInventoryGroup(nil, &name) + } if err != nil { // couldn't marshal inventory group to json continue diff --git a/manager/controllers/utils_test.go b/manager/controllers/utils_test.go index e4782ff64..fd0bbdf3a 100644 --- a/manager/controllers/utils_test.go +++ b/manager/controllers/utils_test.go @@ -57,6 +57,50 @@ func TestGroupNameFilter2(t *testing.T) { assert.Equal(t, 9, len(systems)) // 2 systems with `group2`, 6 with `group1` in test_data } +func TestGroupIDFilter(t *testing.T) { + utils.SkipWithoutDB(t) + database.Configure() + + c, _ := gin.CreateTestContext(httptest.NewRecorder()) + c.Request, _ = http.NewRequest("GET", "/?filter[group_id]=inventory-group-2", nil) + + filters, err := ParseAllFilters(c, ListOpts{}) + assert.Nil(t, err) + + var systems []SystemsID + groups := map[string]string{ + utils.KeyGrouped: `{"[{\"id\":\"inventory-group-1\"}]","[{\"id\":\"inventory-group-2\"}]"}`, + } + tx := database.Systems(database.DB, 1, groups) + tx, _ = ApplyInventoryFilter(filters, tx, "si.inventory_id") + tx.Scan(&systems) + + assert.Equal(t, 2, len(systems)) + assert.Equal(t, "00000000-0000-0000-0000-000000000007", systems[0].ID) + assert.Equal(t, "00000000-0000-0000-0000-000000000008", systems[1].ID) +} + +func TestGroupIDFilterMultiple(t *testing.T) { + utils.SkipWithoutDB(t) + database.Configure() + + c, _ := gin.CreateTestContext(httptest.NewRecorder()) + c.Request, _ = http.NewRequest("GET", "/?filter[group_id]=inventory-group-2,inventory-group-1", nil) + + filters, err := ParseAllFilters(c, ListOpts{}) + assert.Nil(t, err) + + var systems []SystemsID + groups := map[string]string{ + utils.KeyGrouped: `{"[{\"id\":\"inventory-group-1\"}]","[{\"id\":\"inventory-group-2\"}]"}`, + } + tx := database.Systems(database.DB, 1, groups) + tx, _ = ApplyInventoryFilter(filters, tx, "si.inventory_id") + tx.Scan(&systems) + + assert.Equal(t, 9, len(systems)) +} + func TestApplySearchEmpty(t *testing.T) { var baseTx gorm.DB