diff --git a/server/datastore/datastore_labels_test.go b/server/datastore/datastore_labels_test.go index e5d85c787d..4c02b4dc53 100644 --- a/server/datastore/datastore_labels_test.go +++ b/server/datastore/datastore_labels_test.go @@ -197,23 +197,34 @@ func testSearchLabels(t *testing.T, db kolide.Datastore) { }) require.Nil(t, err) - // We once threw errors when the search query was empty. Verify that we - // don't error. - _, err = db.SearchLabels("") + all, err := db.NewLabel(&kolide.Label{ + Name: "All Hosts", + LabelType: kolide.LabelTypeBuiltIn, + }) + require.Nil(t, err) + all, err = db.Label(all.ID) require.Nil(t, err) - labels, err := db.SearchLabels("foo") - assert.Nil(t, err) - assert.Len(t, labels, 2) + // We once threw errors when the search query was empty. Verify that we + // don't error. + labels, err := db.SearchLabels("") + require.Nil(t, err) + assert.Contains(t, labels, *all) - label, err := db.SearchLabels("foo", l3.ID) + labels, err = db.SearchLabels("foo") + assert.Nil(t, err) + assert.Len(t, labels, 3) + assert.Contains(t, labels, *all) + + label, err := db.SearchLabels("foo", l3.ID, all.ID) assert.Nil(t, err) assert.Len(t, label, 1) assert.Equal(t, "foo", label[0].Name) none, err := db.SearchLabels("xxx") assert.Nil(t, err) - assert.Len(t, none, 0) + assert.Len(t, none, 1) + assert.Contains(t, labels, *all) } func testSearchLabelsLimit(t *testing.T, db kolide.Datastore) { @@ -296,8 +307,10 @@ func testBuiltInLabels(t *testing.T, db kolide.Datastore) { hits, err := db.SearchLabels("Mac OS X") require.Nil(t, err) - assert.Equal(t, 1, len(hits)) + // Should get Mac OS X and All Hosts + assert.Equal(t, 2, len(hits)) assert.Equal(t, kolide.LabelTypeBuiltIn, hits[0].LabelType) + assert.Equal(t, kolide.LabelTypeBuiltIn, hits[1].LabelType) } func testListUniqueHostsInLabels(t *testing.T, db kolide.Datastore) { diff --git a/server/datastore/inmem/labels.go b/server/datastore/inmem/labels.go index 980c3a86f1..891ab63492 100644 --- a/server/datastore/inmem/labels.go +++ b/server/datastore/inmem/labels.go @@ -9,6 +9,7 @@ import ( kolide_errors "github.com/kolide/kolide-ose/server/errors" "github.com/kolide/kolide-ose/server/kolide" + "github.com/patrickmn/sortutil" ) func (orm *Datastore) NewLabel(label *kolide.Label) (*kolide.Label, error) { @@ -192,12 +193,14 @@ func (orm *Datastore) SearchLabels(query string, omit ...uint) ([]kolide.Label, break } - if strings.Contains(l.Name, query) && !omitLookup[l.ID] { + if (strings.Contains(l.Name, query) || l.Name == "All Hosts") && !omitLookup[l.ID] { results = append(results, *l) continue } } + sortutil.AscByField(results, "ID") + return results, nil } diff --git a/server/datastore/mysql/datastore.go b/server/datastore/mysql/datastore.go index e87854a4a2..cb2c3d563e 100644 --- a/server/datastore/mysql/datastore.go +++ b/server/datastore/mysql/datastore.go @@ -169,6 +169,12 @@ func (d *Datastore) createBuiltinLabels() error { } labels := []kolide.Label{ + { + Platform: "all", + Name: "All Hosts", + Query: "select 1;", + LabelType: kolide.LabelTypeBuiltIn, + }, { Platform: "darwin", Name: "Mac OS X", @@ -193,12 +199,6 @@ func (d *Datastore) createBuiltinLabels() error { Query: "select 1 from osquery_info where build_platform = 'windows';", LabelType: kolide.LabelTypeBuiltIn, }, - { - Platform: "all", - Name: "All Hosts", - Query: "select 1;", - LabelType: kolide.LabelTypeBuiltIn, - }, } for _, label := range labels { diff --git a/server/datastore/mysql/labels.go b/server/datastore/mysql/labels.go index 7622bbfa69..f385ce0c23 100644 --- a/server/datastore/mysql/labels.go +++ b/server/datastore/mysql/labels.go @@ -219,13 +219,20 @@ func (d *Datastore) searchLabelsWithOmits(query string, omit ...uint) ([]kolide. sqlStatement := ` SELECT * FROM labels - WHERE MATCH(name) - AGAINST(? IN BOOLEAN MODE) - AND NOT deleted + WHERE ( + MATCH(name) AGAINST(? IN BOOLEAN MODE) + AND NOT deleted + ) + OR ( + label_type=? + AND name = 'All Hosts' + ) AND id NOT IN (?) + ORDER BY id ASC LIMIT 10 ` - sql, args, err := sqlx.In(sqlStatement, query, omit) + + sql, args, err := sqlx.In(sqlStatement, query, kolide.LabelTypeBuiltIn, omit) if err != nil { return nil, errors.DatabaseError(err) } @@ -255,13 +262,19 @@ func (d *Datastore) SearchLabels(query string, omit ...uint) ([]kolide.Label, er sqlStatement := ` SELECT * FROM labels - WHERE MATCH(name) - AGAINST(? IN BOOLEAN MODE) - AND NOT deleted + WHERE ( + MATCH(name) AGAINST(? IN BOOLEAN MODE) + AND NOT deleted + ) + OR ( + label_type=? + AND name = 'All Hosts' + ) + ORDER BY id ASC LIMIT 10 ` matches := []kolide.Label{} - err := d.db.Select(&matches, sqlStatement, query) + err := d.db.Select(&matches, sqlStatement, query, kolide.LabelTypeBuiltIn) if err != nil { return nil, errors.DatabaseError(err) }