diff --git a/server/datastore/datastore_hosts_test.go b/server/datastore/datastore_hosts_test.go index a615d174c6..7337354711 100644 --- a/server/datastore/datastore_hosts_test.go +++ b/server/datastore/datastore_hosts_test.go @@ -136,6 +136,26 @@ func testDeleteHost(t *testing.T, ds kolide.Datastore) { assert.NotNil(t, err) } +func testIdempotentDeleteHost(t *testing.T, ds kolide.Datastore) { + host, err := ds.NewHost(&kolide.Host{ + DetailUpdateTime: time.Now(), + SeenTime: time.Now(), + NodeKey: "1", + UUID: "1", + HostName: "foo.local", + }) + require.Nil(t, err) + require.NotNil(t, host) + id := host.ID + err = ds.DeleteHost(host.ID) + + host, err = ds.Host(host.ID) + assert.NotNil(t, err) + + err = ds.DeleteHost(id) + assert.Nil(t, err) +} + func testListHost(t *testing.T, ds kolide.Datastore) { hosts := []*kolide.Host{} for i := 0; i < 10; i++ { diff --git a/server/datastore/datastore_test.go b/server/datastore/datastore_test.go index 6d3230c883..8e6ad6a7ef 100644 --- a/server/datastore/datastore_test.go +++ b/server/datastore/datastore_test.go @@ -68,4 +68,5 @@ var testFunctions = [...]func(*testing.T, kolide.Datastore){ testGenerateHostStatusStatistics, testMarkHostSeen, testDuplicateNewQuery, + testIdempotentDeleteHost, } diff --git a/server/datastore/inmem/hosts.go b/server/datastore/inmem/hosts.go index 28fde68cb0..63490bdf2b 100644 --- a/server/datastore/inmem/hosts.go +++ b/server/datastore/inmem/hosts.go @@ -49,11 +49,10 @@ func (d *Datastore) DeleteHost(hid uint) error { d.mtx.Lock() defer d.mtx.Unlock() - if _, ok := d.hosts[hid]; !ok { - return notFound("Host").WithID(hid) + if _, ok := d.hosts[hid]; ok { + delete(d.hosts, hid) } - delete(d.hosts, hid) return nil } diff --git a/server/datastore/mysql/hosts.go b/server/datastore/mysql/hosts.go index 0dcadfd514..f5fce72ac2 100644 --- a/server/datastore/mysql/hosts.go +++ b/server/datastore/mysql/hosts.go @@ -242,7 +242,11 @@ func (d *Datastore) SaveHost(host *kolide.Host) error { } func (d *Datastore) DeleteHost(hid uint) error { - return d.deleteEntity("hosts", hid) + _, err := d.db.Exec("DELETE FROM hosts WHERE id = ?", hid) + if err != nil { + return errors.Wrapf(err, "deleting host with id %d", hid) + } + return nil } // TODO needs test