Skip to content

Commit

Permalink
Add support for recording key to foxglove CLI
Browse files Browse the repository at this point in the history
Adds support for upload and export with recording key.
  • Loading branch information
Wyatt Alt committed Jan 4, 2024
1 parent ed2d962 commit a85dfb3
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 29 deletions.
5 changes: 5 additions & 0 deletions foxglove/cmd/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -820,6 +820,7 @@ func executeExport(

func createStreamRequest(
recordingID string,
key string,
importID string,
deviceID string,
deviceName string,
Expand Down Expand Up @@ -849,6 +850,7 @@ func createStreamRequest(

request := &console.StreamRequest{
RecordingID: recordingID,
Key: key,
ImportID: importID,
DeviceName: deviceName,
DeviceID: deviceID,
Expand All @@ -866,6 +868,7 @@ func createStreamRequest(

func newExportCommand(params *baseParams) (*cobra.Command, error) {
var recordingID string
var key string
var importID string
var deviceID string
var deviceName string
Expand Down Expand Up @@ -893,6 +896,7 @@ func newExportCommand(params *baseParams) (*cobra.Command, error) {
}
request, err := createStreamRequest(
recordingID,
key,
importID,
deviceID,
deviceName,
Expand Down Expand Up @@ -950,6 +954,7 @@ func newExportCommand(params *baseParams) (*cobra.Command, error) {
exportCmd.PersistentFlags().StringVarP(&deviceName, "device-name", "", "", "device name")
exportCmd.PersistentFlags().StringVarP(&outputFile, "output-file", "o", "", "output file")
exportCmd.PersistentFlags().StringVarP(&recordingID, "recording-id", "", "", "recording ID")
exportCmd.PersistentFlags().StringVarP(&key, "key", "", "", "recording key")
exportCmd.PersistentFlags().StringVarP(&importID, "import-id", "", "", "import ID")
exportCmd.PersistentFlags().StringVarP(&start, "start", "", "", "start time (ISO8601 timestamp)")
exportCmd.PersistentFlags().StringVarP(&end, "end", "", "", "end time (ISO8601 timestamp")
Expand Down
3 changes: 3 additions & 0 deletions foxglove/cmd/export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ func TestDoExport(t *testing.T) {
clientID,
deviceID,
"",
"",
"../testdata/gps.mcap",
token,
"user-agent",
Expand Down Expand Up @@ -320,6 +321,7 @@ func TestExportCommand(t *testing.T) {
clientID,
deviceID,
"",
"",
"../testdata/gps.bag",
token,
"user-agent",
Expand Down Expand Up @@ -364,6 +366,7 @@ func TestExportCommand(t *testing.T) {
clientID,
deviceID,
"",
"",
"../testdata/gps.mcap",
token,
"user-agent",
Expand Down
46 changes: 23 additions & 23 deletions foxglove/cmd/import.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"github.com/spf13/viper"
)

func executeImport(baseURL, clientID, deviceID, deviceName, filename, token, userAgent string) error {
func executeImport(baseURL, clientID, deviceID, deviceName, key, filename, token, userAgent string) error {
ctx := context.Background()
f, err := os.Open(filename)
if err != nil {
Expand All @@ -22,7 +22,7 @@ func executeImport(baseURL, clientID, deviceID, deviceName, filename, token, use
return err
}
client := console.NewRemoteFoxgloveClient(baseURL, clientID, token, userAgent)
err = console.Import(ctx, client, deviceID, deviceName, filename)
err = console.Import(ctx, client, deviceID, deviceName, key, filename)
if err != nil {
return err
}
Expand All @@ -48,42 +48,42 @@ func newImportCommand(params *baseParams, commandName string) (*cobra.Command, e
var deviceID string
var deviceName string
var edgeRecordingID string
var key string
importCmd := &cobra.Command{
Use: fmt.Sprintf("%s [FILE]", commandName),
Short: "Import a data file to Foxglove Data Platform",
Run: func(cmd *cobra.Command, args []string) {
if deviceName == "" && deviceID == "" && edgeRecordingID == "" {
dief("Must specify either --device-id, --device-name, or --edge-recording-id")
}
if deviceName != "" || deviceID != "" {
if len(args) == 0 {
dief("Filename not specified")
}
filename := args[0]
err := executeImport(
params.baseURL,
*params.clientID,
deviceID,
deviceName,
filename,
viper.GetString("bearer_token"),
params.userAgent,
)
if err != nil {
dief("Failed to import %s: %s", filename, err)
}
}
if edgeRecordingID != "" {
err := importFromEdge(params.baseURL, *params.clientID, params.token, params.userAgent, edgeRecordingID)
if err != nil {
dief("Failed to import edge recording: %s", err)
}
return
}

if len(args) == 0 {
dief("Filename not specified")
}
filename := args[0]
err := executeImport(
params.baseURL,
*params.clientID,
deviceID,
deviceName,
key,
filename,
viper.GetString("bearer_token"),
params.userAgent,
)
if err != nil {
dief("Failed to import %s: %s", filename, err)
}
},
}
importCmd.InheritedFlags()
importCmd.PersistentFlags().StringVarP(&deviceID, "device-id", "", "", "device ID")
importCmd.PersistentFlags().StringVarP(&deviceName, "device-name", "", "", "device name")
importCmd.PersistentFlags().StringVarP(&key, "key", "", "", "recording key")
importCmd.PersistentFlags().StringVarP(&edgeRecordingID, "edge-recording-id", "", "", "edge recording ID")
AddDeviceAutocompletion(importCmd, params)
return importCmd, nil
Expand Down
2 changes: 2 additions & 0 deletions foxglove/cmd/import_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ func TestImportCommand(t *testing.T) {
"abc",
"test-device",
"",
"",
"../testdata/gps.bag",
"",
"user-agent",
Expand All @@ -40,6 +41,7 @@ func TestImportCommand(t *testing.T) {
"abc",
"unregistered-device",
"",
"",
"../testdata/gps.bag",
token,
"user-agent",
Expand Down
9 changes: 7 additions & 2 deletions foxglove/console/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ type TokenResponse struct {
type UploadRequest struct {
Filename string `json:"filename"`
DeviceID string `json:"device.id,omitempty"`
Key string `json:"key,omitempty"`
DeviceName string `json:"device.name,omitempty"`
}

Expand All @@ -34,6 +35,7 @@ type UploadResponse struct {

type StreamRequest struct {
RecordingID string `json:"recordingId,omitempty"`
Key string `json:"key,omitempty"`
ImportID string `json:"importId,omitempty"`
DeviceID string `json:"device.id,omitempty"`
DeviceName string `json:"device.name,omitempty"`
Expand All @@ -44,8 +46,8 @@ type StreamRequest struct {
}

func (req *StreamRequest) Validate() error {
if req.RecordingID == "" && req.ImportID == "" && req.DeviceID == "" && req.DeviceName == "" {
return fmt.Errorf("either recording-id, import-id, or all three of device-id/device-name, start, and end are required")
if req.RecordingID == "" && req.ImportID == "" && req.DeviceID == "" && req.DeviceName == "" && req.Key == "" {
return fmt.Errorf("either recording-id/key, import-id, or all three of device-id/device-name, start, and end are required")
}
if req.DeviceID != "" && req.DeviceName != "" && req.ImportID == "" && (req.Start == nil || req.End == nil) {
return fmt.Errorf("start/end are required if device is supplied")
Expand Down Expand Up @@ -192,6 +194,7 @@ type RecordingsResponse struct {
EdgeSite SiteSummary `json:"edgeSite"`
Device DeviceSummary `json:"device"`
Metadata []MetadataRecord `json:"metadata"`
Key string `json:"key"`
}

func (r RecordingsResponse) Headers() []string {
Expand All @@ -212,6 +215,7 @@ func (r RecordingsResponse) Headers() []string {
"Device ID",
"Device Name",
"Metadata",
"Key",
}
}

Expand All @@ -234,6 +238,7 @@ func (r RecordingsResponse) Fields() []string {
r.Device.ID,
r.Device.Name,
string(metadata),
r.Key,
}
}

Expand Down
2 changes: 2 additions & 0 deletions foxglove/console/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ func Import(
client *FoxgloveClient,
deviceID string,
deviceName string,
key string,
filename string,
) error {
f, err := os.Open(filename)
Expand All @@ -80,6 +81,7 @@ func Import(
reader := progressbar.NewReader(f, bar)
err = client.Upload(&reader, UploadRequest{
Filename: name,
Key: key,
DeviceID: deviceID,
DeviceName: deviceName,
})
Expand Down
8 changes: 4 additions & 4 deletions foxglove/console/lib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func TestImport(t *testing.T) {
sv, err := NewMockServer(ctx)
assert.Nil(t, err)
client := NewRemoteFoxgloveClient(sv.BaseURL(), "abc", "", "test-app")
err = Import(ctx, client, "test-device", "", "../testdata/gps.bag")
err = Import(ctx, client, "test-device", "", "", "../testdata/gps.bag")
assert.ErrorIs(t, err, ErrForbidden)
})
t.Run("successfully imports data after auth", func(t *testing.T) {
Expand All @@ -34,7 +34,7 @@ func TestImport(t *testing.T) {
token, err := login(ctx, sv)
assert.Nil(t, err)
client := NewRemoteFoxgloveClient(sv.BaseURL(), "abc", token, "test-app")
err = Import(ctx, client, "test-device", "", "../testdata/gps.bag")
err = Import(ctx, client, "test-device", "", "", "../testdata/gps.bag")
assert.Nil(t, err)
assert.Equal(t, 5324051, len(sv.Uploads["device_id=test-device/gps.bag"]))
})
Expand All @@ -46,7 +46,7 @@ func TestImport(t *testing.T) {
token, err := login(ctx, sv)
assert.Nil(t, err)
client := NewRemoteFoxgloveClient(sv.BaseURL(), "abc", token, "test-app")
err = Import(ctx, client, "", "my test device", "../testdata/gps.bag")
err = Import(ctx, client, "", "my test device", "", "../testdata/gps.bag")
assert.Nil(t, err)
assert.Equal(t, 5324051, len(sv.Uploads["device_id=test-device/gps.bag"]))
})
Expand Down Expand Up @@ -108,7 +108,7 @@ func TestExport(t *testing.T) {
assert.Nil(t, err)
client := NewRemoteFoxgloveClient(sv.BaseURL(), "abc", token, "test-app")
buf := &bytes.Buffer{}
err = Import(ctx, client, "test-device", "", "../testdata/gps.bag")
err = Import(ctx, client, "test-device", "", "", "../testdata/gps.bag")
assert.Nil(t, err)
start, err := time.Parse(time.RFC3339, "2020-01-01T00:00:00Z")
assert.Nil(t, err)
Expand Down

0 comments on commit a85dfb3

Please sign in to comment.