diff --git a/changes/issue-13809-fix-host-filtering b/changes/issue-13809-fix-host-filtering new file mode 100644 index 0000000000..5ebbeac23f --- /dev/null +++ b/changes/issue-13809-fix-host-filtering @@ -0,0 +1 @@ +* Use the correct set of parameters for SQL statement when the `after` and `order_key` query params are passed to the `/api/latest/fleet/labels/{labelID}/hosts` endpoint. Fixes issue 13809. \ No newline at end of file diff --git a/server/datastore/mysql/labels.go b/server/datastore/mysql/labels.go index 30e0e8e86d..551ad04635 100644 --- a/server/datastore/mysql/labels.go +++ b/server/datastore/mysql/labels.go @@ -584,7 +584,7 @@ func (ds *Datastore) applyHostLabelFilters(filter fleet.TeamFilter, lid uint, qu query, params = filterHostsByMDMBootstrapPackageStatus(query, opt, params) query, params = searchLike(query, params, opt.MatchQuery, hostSearchColumns...) - query = appendListOptionsToSQL(query, &opt.ListOptions) + query, params = appendListOptionsWithCursorToSQL(query, params, &opt.ListOptions) return query, params } diff --git a/server/datastore/mysql/labels_test.go b/server/datastore/mysql/labels_test.go index 2d904e19d6..db4ef80494 100644 --- a/server/datastore/mysql/labels_test.go +++ b/server/datastore/mysql/labels_test.go @@ -324,6 +324,10 @@ func testLabelsListHostsInLabel(t *testing.T, db *Datastore) { listHostsInLabelCheckCount(t, db, filter, l1.ID, fleet.HostListOptions{}, 3) + hosts := listHostsInLabelCheckCount(t, db, filter, l1.ID, fleet.HostListOptions{LowDiskSpaceFilter: ptr.Int(35), ListOptions: fleet.ListOptions{OrderKey: "id", After: "1"}}, 2) + require.Equal(t, h2.ID, hosts[0].ID) + require.Equal(t, h3.ID, hosts[1].ID) + listHostsInLabelCheckCount(t, db, filter, l1.ID, fleet.HostListOptions{LowDiskSpaceFilter: ptr.Int(35)}, 3) listHostsInLabelCheckCount(t, db, filter, l1.ID, fleet.HostListOptions{LowDiskSpaceFilter: ptr.Int(25)}, 2) listHostsInLabelCheckCount(t, db, filter, l1.ID, fleet.HostListOptions{LowDiskSpaceFilter: ptr.Int(15)}, 1) diff --git a/server/service/integration_core_test.go b/server/service/integration_core_test.go index f7243a1e6f..45b0551153 100644 --- a/server/service/integration_core_test.go +++ b/server/service/integration_core_test.go @@ -3089,6 +3089,11 @@ func (s *integrationTestSuite) TestLabels() { s.DoJSON("GET", fmt.Sprintf("/api/latest/fleet/labels/%d/hosts", lbl2.ID), nil, http.StatusOK, &listHostsResp) assert.Len(t, listHostsResp.Hosts, len(hosts)) + s.DoJSON("GET", fmt.Sprintf("/api/latest/fleet/labels/%d/hosts", lbl2.ID), nil, http.StatusOK, &listHostsResp, "order_key", "id", "after", fmt.Sprintf("%d", hosts[0].ID)) + assert.Len(t, listHostsResp.Hosts, 2) + assert.Equal(t, hosts[1].ID, listHostsResp.Hosts[0].ID) + assert.Equal(t, hosts[2].ID, listHostsResp.Hosts[1].ID) + // list hosts in label searching by display_name s.DoJSON("GET", fmt.Sprintf("/api/latest/fleet/labels/%d/hosts", lbl2.ID), nil, http.StatusOK, &listHostsResp, "order_key", "display_name", "order_direction", "desc") assert.Len(t, listHostsResp.Hosts, len(hosts))