From cdc66e57042b62265beeed4ca4a39c993bb3fe12 Mon Sep 17 00:00:00 2001 From: seanavery Date: Tue, 1 Oct 2024 16:12:19 -0400 Subject: [PATCH 1/2] Add save client example --- examples/save_client.go | 89 +++++++++++++++++++++++++++++++++++++++++ go.mod | 1 + go.sum | 2 + 3 files changed, 92 insertions(+) create mode 100644 examples/save_client.go diff --git a/examples/save_client.go b/examples/save_client.go new file mode 100644 index 0000000..eed8211 --- /dev/null +++ b/examples/save_client.go @@ -0,0 +1,89 @@ +/* +This example domenstrates calling async save command on video-store resource. To setup: +- You need to have a robot running with video-store component. +- Ensure you have a .env file with the necessary credentials and secrets. +- run example script `go run save_client.go` +*/ + +package main + +import ( + "context" + "os" + "time" + + "github.com/joho/godotenv" + "go.viam.com/rdk/components/camera" + "go.viam.com/rdk/logging" + "go.viam.com/rdk/robot/client" + "go.viam.com/utils/rpc" + "golang.org/x/exp/rand" +) + +func main() { + logger := logging.NewDebugLogger("client") + + err := godotenv.Load() + if err != nil { + logger.Fatalf("Error loading .env file") + } + + robotAddress := os.Getenv("ROBOT_ADDRESS") + apiKeyID := os.Getenv("API_KEY_ID") + apiKey := os.Getenv("API_KEY") + + machine, err := client.New( + context.Background(), + robotAddress, + logger, + client.WithDialOptions(rpc.WithEntityCredentials( + apiKeyID, + rpc.Credentials{ + Type: rpc.CredentialsTypeAPIKey, + Payload: apiKey, + })), + ) + if err != nil { + logger.Fatal(err) + } + + defer machine.Close(context.Background()) + logger.Info("Resources:") + logger.Info(machine.ResourceNames()) + + videoStore, err := camera.FromRobot(machine, "video-store") + if err != nil { + logger.Error(err) + return + } + videoStoreReturnValue, err := videoStore.Properties(context.Background()) + if err != nil { + logger.Error(err) + return + } + logger.Infof("video-store Properties return value: %+v", videoStoreReturnValue) + + for { + now := time.Now() + rand.Seed(uint64(time.Now().UnixNano())) + randomSeconds := rand.Intn(56) + 5 // 5 to 60 seconds + from := now.Add(-time.Duration(randomSeconds) * time.Second) + nowStr := now.Format("2006-01-02_15-04-05") + fromStr := from.Format("2006-01-02_15-04-05") + _, err = videoStore.DoCommand(context.Background(), + map[string]interface{}{ + "command": "save", + "from": fromStr, + "to": nowStr, + "metadata": "metadata", + "async": true, + }, + ) + if err != nil { + logger.Error(err) + return + } + time.Sleep(30 * time.Second) + } + +} diff --git a/go.mod b/go.mod index 442d368..1ce0066 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/fullstorydev/grpcurl v1.8.6 github.com/golangci/golangci-lint v1.54.0 github.com/google/uuid v1.6.0 + github.com/joho/godotenv v1.5.1 github.com/rhysd/actionlint v1.6.24 go.viam.com/rdk v0.40.0 go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 diff --git a/go.sum b/go.sum index d2b7643..0beaffa 100644 --- a/go.sum +++ b/go.sum @@ -750,6 +750,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= From 897aee898b649e5269a4a28f439e89a6a70e3576 Mon Sep 17 00:00:00 2001 From: seanavery Date: Tue, 1 Oct 2024 16:16:08 -0400 Subject: [PATCH 2/2] Add env var checkers --- examples/save_client.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/save_client.go b/examples/save_client.go index eed8211..3cb77be 100644 --- a/examples/save_client.go +++ b/examples/save_client.go @@ -2,7 +2,7 @@ This example domenstrates calling async save command on video-store resource. To setup: - You need to have a robot running with video-store component. - Ensure you have a .env file with the necessary credentials and secrets. -- run example script `go run save_client.go` +- Run example script `go run save_client.go` */ package main @@ -25,12 +25,14 @@ func main() { err := godotenv.Load() if err != nil { - logger.Fatalf("Error loading .env file") + logger.Fatal("Please make sure you add a .env file with the necessary credentials and secrets.") } - robotAddress := os.Getenv("ROBOT_ADDRESS") apiKeyID := os.Getenv("API_KEY_ID") apiKey := os.Getenv("API_KEY") + if robotAddress == "" || apiKeyID == "" || apiKey == "" { + logger.Fatal("Missing required environment variables: ROBOT_ADDRESS, API_KEY_ID, or API_KEY.") + } machine, err := client.New( context.Background(), @@ -46,7 +48,6 @@ func main() { if err != nil { logger.Fatal(err) } - defer machine.Close(context.Background()) logger.Info("Resources:") logger.Info(machine.ResourceNames()) @@ -63,6 +64,7 @@ func main() { } logger.Infof("video-store Properties return value: %+v", videoStoreReturnValue) + // Save clip of random duration every 30 seconds for { now := time.Now() rand.Seed(uint64(time.Now().UnixNano()))