Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions fleetspeak/src/server/admin/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,16 @@ func (s adminServer) StoreFile(ctx context.Context, req *spb.StoreFileRequest) (
return &fspb.EmptyMessage{}, nil
}

func (s adminServer) DeleteFile(ctx context.Context, req *spb.DeleteFileRequest) (*fspb.EmptyMessage, error) {
if req.ServiceName == "" || req.FileName == "" {
return nil, errors.New("file must have service_name and file_name")
}
if err := s.store.DeleteFile(ctx, req.ServiceName, req.FileName); err != nil {
return nil, err
}
return &fspb.EmptyMessage{}, nil
}

func (s adminServer) KeepAlive(ctx context.Context, _ *fspb.EmptyMessage) (*fspb.EmptyMessage, error) {
return &fspb.EmptyMessage{}, nil
}
Expand Down
4 changes: 4 additions & 0 deletions fleetspeak/src/server/db/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,10 @@ type FileStore interface {
// StoreFile stores data into the Filestore, organized by service and name.
StoreFile(ctx context.Context, service, name string, data io.Reader) error

// DeleteFile deletes a file from the filestore. It is not an error if the
// file does not exist.
DeleteFile(ctx context.Context, service, name string) error

// StatFile returns the modification time of a file previously stored by
// StoreFile. Returns ErrNotFound if not found.
StatFile(ctx context.Context, servce, name string) (time.Time, error)
Expand Down
14 changes: 14 additions & 0 deletions fleetspeak/src/server/dbtesting/filestore_suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,20 @@ func FileStoreTest(t *testing.T, fs db.Store) {
if _, _, err := fs.ReadFile(ctx, "testService", "missingFile"); err == nil || !fs.IsNotFound(err) {
t.Errorf("Wrong error for ReadFile(testService, missingFile), want IsNotFound(err)=true, got %v", err)
}

if err := fs.DeleteFile(ctx, "testService", "testFile"); err != nil {
t.Errorf("Error from DeleteFile(testService, testFile): %v", err)
}
if _, err := fs.StatFile(ctx, "testService", "testFile"); err == nil || !fs.IsNotFound(err) {
t.Errorf("Wrong error for StatFile(testService, testFile) after delete, want IsNotFound(err)=true, got %v", err)
}
// Deleting a non-existent file should not error.
if err := fs.DeleteFile(ctx, "testService", "testFile"); err != nil {
t.Errorf("Error from DeleteFile(testService, testFile) when file not present: %v", err)
}
if err := fs.DeleteFile(ctx, "testService", "missingFile"); err != nil {
t.Errorf("Error from DeleteFile(testService, missingFile): %v", err)
}
}

func fileStoreTestSuite(t *testing.T, env DbTestEnv) {
Expand Down
7 changes: 7 additions & 0 deletions fleetspeak/src/server/mysql/filestore.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ func (d *Datastore) StoreFile(ctx context.Context, service, name string, data io
})
}

func (d *Datastore) DeleteFile(ctx context.Context, service, name string) error {
return d.runInTx(ctx, false, func(tx *sql.Tx) error {
_, err := tx.ExecContext(ctx, "DELETE FROM files WHERE service = ? AND name = ?", service, name)
return err
})
}

func (d *Datastore) StatFile(ctx context.Context, service, name string) (time.Time, error) {
var ts int64

Expand Down
529 changes: 298 additions & 231 deletions fleetspeak/src/server/proto/fleetspeak_server/admin.pb.go

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions fleetspeak/src/server/proto/fleetspeak_server/admin.proto
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ message StoreFileRequest {
bytes data = 3;
}

message DeleteFileRequest {
string service_name = 1;
string file_name = 2;
}

message ListClientContactsRequest {
bytes client_id = 1;
}
Expand Down Expand Up @@ -179,6 +184,9 @@ service Admin {
// StoreFile inserts a file into the Fleetspeak system.
rpc StoreFile(StoreFileRequest) returns (fleetspeak.EmptyMessage) {}

// DeleteFile deletes a file from the Fleetspeak system.
rpc DeleteFile(DeleteFileRequest) returns (fleetspeak.EmptyMessage) {}

// KeepAlive does as little as possible.
rpc KeepAlive(fleetspeak.EmptyMessage) returns (fleetspeak.EmptyMessage) {}

Expand Down
40 changes: 40 additions & 0 deletions fleetspeak/src/server/proto/fleetspeak_server/admin_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions fleetspeak/src/server/spanner/filestore.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@ func (d *Datastore) tryStoreFile(txn *spanner.ReadWriteTransaction, service, nam
return err
}

// DeleteFile implements db.FileStore.
func (d *Datastore) DeleteFile(ctx context.Context, service, name string) error {
_, err := d.dbClient.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
m := spanner.Delete(d.files, spanner.Key{service, name})
return txn.BufferWrite([]*spanner.Mutation{m})
})
return err
}

// StatFile implements db.FileStore.
func (d *Datastore) StatFile(ctx context.Context, service, name string) (time.Time, error) {
txn := d.dbClient.Single()
Expand Down
9 changes: 9 additions & 0 deletions fleetspeak/src/server/sqlite/filestore.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ func (d *Datastore) StoreFile(ctx context.Context, service, name string, data io
})
}

func (d *Datastore) DeleteFile(ctx context.Context, service, name string) error {
d.l.Lock()
defer d.l.Unlock()
return d.runInTx(func(tx *sql.Tx) error {
_, err := tx.ExecContext(ctx, "DELETE FROM files WHERE service = ? AND name = ?", service, name)
return err
})
}

func (d *Datastore) StatFile(ctx context.Context, service, name string) (time.Time, error) {
d.l.Lock()
defer d.l.Unlock()
Expand Down
4 changes: 4 additions & 0 deletions fleetspeak/src/server/stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,10 @@ func (d MonitoredDatastore) StoreFile(ctx context.Context, service, name string,
return d.D.StoreFile(ctx, service, name, data)
}

func (d MonitoredDatastore) DeleteFile(ctx context.Context, service, name string) error {
return d.D.DeleteFile(ctx, service, name)
}

func (d MonitoredDatastore) StatFile(ctx context.Context, service, name string) (time.Time, error) {
return d.D.StatFile(ctx, service, name)
}
Expand Down
Loading