Return host count when modifying a label (#2221)

This commit is contained in:
Tomas Touceda 2021-09-24 15:56:55 -03:00 committed by GitHub
parent 655b57789d
commit d81a6317a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 14 deletions

View file

@ -0,0 +1 @@
* Do not reset label counts when modifying them.

View file

@ -217,17 +217,12 @@ func (d *Datastore) NewLabel(ctx context.Context, label *fleet.Label, opts ...fl
}
func (d *Datastore) SaveLabel(ctx context.Context, label *fleet.Label) (*fleet.Label, error) {
query := `
UPDATE labels SET
name = ?,
description = ?
WHERE id = ?
`
query := `UPDATE labels SET name = ?, description = ? WHERE id = ?`
_, err := d.writer.ExecContext(ctx, query, label.Name, label.Description, label.ID)
if err != nil {
return nil, errors.Wrap(err, "saving label")
}
return label, nil
return labelDB(ctx, label.ID, d.writer)
}
// DeleteLabel deletes a fleet.Label
@ -237,13 +232,20 @@ func (d *Datastore) DeleteLabel(ctx context.Context, name string) error {
// Label returns a fleet.Label identified by lid if one exists.
func (d *Datastore) Label(ctx context.Context, lid uint) (*fleet.Label, error) {
return labelDB(ctx, lid, d.reader)
}
func labelDB(ctx context.Context, lid uint, q sqlx.QueryerContext) (*fleet.Label, error) {
sql := `
SELECT * FROM labels
WHERE id = ?
SELECT
l.*,
(SELECT COUNT(1) FROM label_membership lm JOIN hosts h ON (lm.host_id = h.id) WHERE label_id = l.id) AS host_count
FROM labels l
WHERE id = ?
`
label := &fleet.Label{}
if err := sqlx.GetContext(ctx, d.reader, label, sql, lid); err != nil {
if err := sqlx.GetContext(ctx, q, label, sql, lid); err != nil {
return nil, errors.Wrap(err, "selecting label")
}

View file

@ -594,22 +594,37 @@ func testLabelsIDsByName(t *testing.T, ds *Datastore) {
}
func testLabelsSave(t *testing.T, db *Datastore) {
h1, err := db.NewHost(context.Background(), &fleet.Host{
DetailUpdatedAt: time.Now(),
LabelUpdatedAt: time.Now(),
SeenTime: time.Now(),
OsqueryHostID: "1",
NodeKey: "1",
UUID: "1",
Hostname: "foo.local",
})
require.NoError(t, err)
label := &fleet.Label{
Name: "my label",
Description: "a label",
Query: "select 1 from processes;",
Platform: "darwin",
}
label, err := db.NewLabel(context.Background(), label)
require.Nil(t, err)
label, err = db.NewLabel(context.Background(), label)
require.NoError(t, err)
label.Name = "changed name"
label.Description = "changed description"
require.NoError(t, db.RecordLabelQueryExecutions(context.Background(), h1, map[uint]*bool{label.ID: ptr.Bool(true)}, time.Now()))
_, err = db.SaveLabel(context.Background(), label)
require.Nil(t, err)
require.NoError(t, err)
saved, err := db.Label(context.Background(), label.ID)
require.Nil(t, err)
require.NoError(t, err)
assert.Equal(t, label.Name, saved.Name)
assert.Equal(t, label.Description, saved.Description)
assert.Equal(t, 1, saved.HostCount)
}
func testLabelsQueriesForCentOSHost(t *testing.T, db *Datastore) {