From 155e6069c9b200a3e1d98904aae7bed66b87b6ff Mon Sep 17 00:00:00 2001 From: salaboy Date: Thu, 27 Jun 2024 19:49:22 +0100 Subject: [PATCH 01/74] updating Kubernetes hello quickstart to support endpoint env vars (#1030) Signed-off-by: salaboy Signed-off-by: Fernando Rocha --- tutorials/hello-kubernetes/node/app.js | 12 ++++++------ tutorials/hello-kubernetes/python/app.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tutorials/hello-kubernetes/node/app.js b/tutorials/hello-kubernetes/node/app.js index 68fe0dc4e..996139602 100644 --- a/tutorials/hello-kubernetes/node/app.js +++ b/tutorials/hello-kubernetes/node/app.js @@ -19,11 +19,11 @@ const app = express(); app.use(bodyParser.json()); // These ports are injected automatically into the container. -const daprPort = process.env.DAPR_HTTP_PORT ?? "3500"; -const daprGRPCPort = process.env.DAPR_GRPC_PORT ?? "50001"; +const daprHttpEndpoint = process.env.DAPR_HTTP_ENDPOINT ?? "http://localhost:3500"; +const daprGRPCEndpoint = process.env.DAPR_GRPC_ENDPOINT ?? "http://localhost:50001"; const stateStoreName = process.env.STATE_STORE_NAME ?? "statestore"; -const stateUrl = `http://localhost:${daprPort}/v1.0/state/${stateStoreName}`; +const stateUrl = `${daprHttpEndpoint}/v1.0/state/${stateStoreName}`; const port = process.env.APP_PORT ?? "3000"; app.get('/order', async (_req, res) => { @@ -71,9 +71,9 @@ app.post('/neworder', async (req, res) => { }); app.get('/ports', (_req, res) => { - console.log("DAPR_HTTP_PORT: " + daprPort); - console.log("DAPR_GRPC_PORT: " + daprGRPCPort); - res.status(200).send({DAPR_HTTP_PORT: daprPort, DAPR_GRPC_PORT: daprGRPCPort }) + console.log("DAPR_HTTP_ENDPOINT: " + daprHttpEndpoint); + console.log("DAPR_GRPC_ENDPOINT: " + daprGRPCEndpoint); + res.status(200).send({DAPR_HTTP_ENDPOINT: daprHttpEndpoint, DAPR_GRPC_ENDPOINT: daprGRPCEndpoint }) }); app.listen(port, () => console.log(`Node App listening on port ${port}!`)); diff --git a/tutorials/hello-kubernetes/python/app.py b/tutorials/hello-kubernetes/python/app.py index c9264af30..cb7cbd469 100644 --- a/tutorials/hello-kubernetes/python/app.py +++ b/tutorials/hello-kubernetes/python/app.py @@ -15,8 +15,8 @@ import requests import time -dapr_port = os.getenv("DAPR_HTTP_PORT", 3500) -dapr_url = "http://localhost:{}/neworder".format(dapr_port) +dapr_http_endpoint = os.getenv("DAPR_HTTP_ENDPOINT", "http://localhost:3500") +dapr_url = "{}/neworder".format(dapr_http_endpoint) n = 0 while True: From 829fda40a8c51f0c6f3ddca9c3ebd3fe2522bf52 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 4 Jul 2024 11:43:42 -0700 Subject: [PATCH 02/74] first commit Signed-off-by: Fernando Rocha --- job/go/http/README.md | 66 +++++++++++ job/go/http/batch/app.go | 122 ++++++++++++++++++++ job/go/http/batch/go.mod | 6 + job/go/http/batch/go.sum | 2 + job/go/http/makefile | 2 + job/go/sdk/README.md | 66 +++++++++++ job/go/sdk/maintenance-scheduler/app.go | 147 ++++++++++++++++++++++++ job/go/sdk/maintenance-scheduler/go.mod | 21 ++++ job/go/sdk/maintenance-scheduler/go.sum | 43 +++++++ job/go/sdk/makefile | 2 + 10 files changed, 477 insertions(+) create mode 100644 job/go/http/README.md create mode 100644 job/go/http/batch/app.go create mode 100644 job/go/http/batch/go.mod create mode 100644 job/go/http/batch/go.sum create mode 100644 job/go/http/makefile create mode 100644 job/go/sdk/README.md create mode 100644 job/go/sdk/maintenance-scheduler/app.go create mode 100644 job/go/sdk/maintenance-scheduler/go.mod create mode 100644 job/go/sdk/maintenance-scheduler/go.sum create mode 100644 job/go/sdk/makefile diff --git a/job/go/http/README.md b/job/go/http/README.md new file mode 100644 index 000000000..9fa3984d2 --- /dev/null +++ b/job/go/http/README.md @@ -0,0 +1,66 @@ +# Dapr Scheduler (HTTP) + +In this quickstart, you'll create a microservice to demonstrate Dapr's scheudler API to work with external systems as inputs and outputs. The service listens to input binding events from a system CRON and then outputs the contents of local data to a PostreSql output binding. + +Visit [this](https://docs.dapr.io/developing-applications/building-blocks/bindings/) link for more information about Dapr and Bindings. + +> **Note:** This example leverages only HTTP REST. If you are looking for the example using the Dapr SDK [click here](../sdk). + +This quickstart includes one service: + +- Go service `app` + +### Run and initialize PostgreSQL container + +1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): + + + +```bash +cd ../../db +docker-compose up +``` + + + +### Run Go service with Dapr + +2. Open a new terminal, change directories to `./batch` in the quickstart directory and run: + + + +```bash +cd ./batch +go build . +``` + + +3. Run the Go service app with Dapr: + + + +```bash +dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . +``` + + diff --git a/job/go/http/batch/app.go b/job/go/http/batch/app.go new file mode 100644 index 000000000..54a6f697f --- /dev/null +++ b/job/go/http/batch/app.go @@ -0,0 +1,122 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +/* +dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . +*/ + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "strconv" + "strings" + + "github.com/gorilla/mux" +) + +var ( + cronBindingName, sqlBindingName string = "cron", "sqldb" +) + +type Orders struct { + Orders []Order `json:"orders"` +} + +type Order struct { + OrderId int `json:"orderid"` + Customer string `json:"customer"` + Price float64 `json:"price"` +} + +func processBatch(w http.ResponseWriter, r *http.Request) { + + fmt.Println("Processing batch..") + + fileContent, err := os.Open("../../../orders.json") + if err != nil { + log.Fatal(err) + return + } + + defer fileContent.Close() + + byteResult, _ := io.ReadAll(fileContent) + + var orders Orders + + json.Unmarshal(byteResult, &orders) + + for i := 0; i < len(orders.Orders); i++ { + err := sqlOutput(orders.Orders[i]) + if err != nil { + log.Fatal(err) + os.Exit(1) + } + } + fmt.Println("Finished processing batch") + +} + +func sqlOutput(order Order) (err error) { + var daprHost, daprHttpPort string + var okHost, okPort bool + + if daprHost, okHost = os.LookupEnv("DAPR_HOST"); !okHost { + daprHost = "http://localhost" + } + + if daprHttpPort, okPort = os.LookupEnv("DAPR_HTTP_PORT"); !okPort { + daprHttpPort = "3503" + } + + var daprUrl string = daprHost + ":" + daprHttpPort + "/v1.0/bindings/" + sqlBindingName + + sqlCmd := fmt.Sprintf("insert into orders (orderid, customer, price) values (%d, '%s', %s);", order.OrderId, order.Customer, strconv.FormatFloat(order.Price, 'f', 2, 64)) + + payload := `{"operation": "exec", "metadata": {"sql": "` + sqlCmd + `" }}` + fmt.Println(sqlCmd) + + client := http.Client{} + // Insert order using Dapr output binding via HTTP Post + req, err := http.NewRequest("POST", daprUrl, strings.NewReader(payload)) + if err != nil { + return err + } + if _, err = client.Do(req); err != nil { + return err + } + return nil +} + +func main() { + var appPort string + var okHost bool + if appPort, okHost = os.LookupEnv("APP_PORT"); !okHost { + appPort = "6003" + } + + r := mux.NewRouter() + + // Triggered by Dapr input binding + r.HandleFunc("/"+cronBindingName, processBatch).Methods("POST") + + if err := http.ListenAndServe(":"+appPort, r); err != nil { + log.Panic(err) + } +} diff --git a/job/go/http/batch/go.mod b/job/go/http/batch/go.mod new file mode 100644 index 000000000..f0ca12514 --- /dev/null +++ b/job/go/http/batch/go.mod @@ -0,0 +1,6 @@ +module dapr_job_example + +go 1.22.4 + + +require github.com/gorilla/mux v1.8.0 diff --git a/job/go/http/batch/go.sum b/job/go/http/batch/go.sum new file mode 100644 index 000000000..535028803 --- /dev/null +++ b/job/go/http/batch/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/job/go/http/makefile b/job/go/http/makefile new file mode 100644 index 000000000..e7a8826bf --- /dev/null +++ b/job/go/http/makefile @@ -0,0 +1,2 @@ +include ../../../docker.mk +include ../../../validate.mk \ No newline at end of file diff --git a/job/go/sdk/README.md b/job/go/sdk/README.md new file mode 100644 index 000000000..51b16c489 --- /dev/null +++ b/job/go/sdk/README.md @@ -0,0 +1,66 @@ +# Dapr Job (Dapr SDK) + +In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. + +Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. + +> **Note:** This example leverages the Dapr SDK. If you are looking for the example using HTTP REST only [click here](../http). + +This quickstart includes one service: + +- Go service `app` + +### Run and initialize PostgreSQL container + +1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): + + + +```bash +cd ../../db +docker-compose up +``` + + + +### Run Go service with Dapr + +2. Open a new terminal window, change directories to `./batch` in the quickstart directory and run: + + + +```bash +cd ./batch +go build . +``` + + +3. Run the Go service app with Dapr: + + + +```bash +dapr run --app-id batch-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 --resources-path ../../../components -- go run . +``` + + diff --git a/job/go/sdk/maintenance-scheduler/app.go b/job/go/sdk/maintenance-scheduler/app.go new file mode 100644 index 000000000..cd522c911 --- /dev/null +++ b/job/go/sdk/maintenance-scheduler/app.go @@ -0,0 +1,147 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +/* +dapr run --app-id job-sdk --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 -- go run . +*/ + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "log" + "time" + + daprc "github.com/mikeee/dapr_go-sdk/tree/feat-dist-scheduler/client" + + "github.com/dapr/go-sdk/service/common" + daprs "github.com/dapr/go-sdk/service/grpc" + + "google.golang.org/protobuf/types/known/anypb" +) + +var daprClient daprc.Client + +// Define a Droid struct +type Droid struct { + Name string + Jobs []string +} + +type MaintenanceJob struct { + JobName string + DroidName string + DroidJob string +} + +func main() { + + // Define the droids and their maintenance jobs + droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + } + + //Create new Dapr client + daprClient, err := daprc.NewClient() + if err != nil { + panic(err) + } + defer daprClient.Close() + + // Create a new Dapr service + server, err := daprs.NewService(":6003") + if err != nil { + log.Fatalf("failed to start the server: %v", err) + } + + log.Println("starting server") + go func() { + if err = server.Start(); err != nil { + log.Fatalf("failed to start server: %v", err) + } + }() + + // Brief intermission to allow for the server to initialize. + time.Sleep(10 * time.Second) + + // Setup handler and schedule jobs + for _, droid := range droids { + for _, job := range droid.Jobs { + + // create maintenance job + maintenanceJob := MaintenanceJob{ + JobName: droid.Name + " - " + job, + DroidName: droid.Name, + DroidJob: job, + } + + jobData, err := json.Marshal(maintenanceJob) + if err != nil { + log.Fatalf("failed to marshall job %v: %v", maintenanceJob.JobName, err) + } + + // setup job event handler + if err = server.AddJobEventHandler(maintenanceJob.JobName, droidMaintenanceHandler); err != nil { + log.Fatalf("failed to register job event handler: %v", err) + } + + ctx := context.Background() + // schedule job + scheduleJob(ctx, maintenanceJob, jobData) + + } + } +} + +func scheduleJob(ctx context.Context, maintenanceJob MaintenanceJob, jobData []byte) { + // schedule job + job := daprc.Job{ + Name: maintenanceJob.JobName, + Schedule: "@every 1s", + Repeats: 10, + Data: &anypb.Any{ + Value: jobData, + }, + } + + err := daprClient.ScheduleJobAlpha1(ctx, &job) + if err != nil { + log.Fatalf("failed to schedule job %v: %v", maintenanceJob.JobName, err) + } + + fmt.Println("schedulejob - success") + + time.Sleep(3 * time.Second) +} + +func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { + var jobData common.Job + if err := json.Unmarshal(job.Data, &jobData); err != nil { + return fmt.Errorf("failed to unmarshal job: %v", err) + } + decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) + if err != nil { + return fmt.Errorf("failed to decode job payload: %v", err) + } + var jobPayload MaintenanceJob + if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { + return fmt.Errorf("failed to unmarshal payload: %v", err) + } + fmt.Printf("Maintenance job %v received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobPayload.JobName, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) + return nil +} diff --git a/job/go/sdk/maintenance-scheduler/go.mod b/job/go/sdk/maintenance-scheduler/go.mod new file mode 100644 index 000000000..7e6f7d105 --- /dev/null +++ b/job/go/sdk/maintenance-scheduler/go.mod @@ -0,0 +1,21 @@ +module dapr_job_example + +go 1.22.4 + +require ( + github.com/dapr/go-sdk v1.10.0 + google.golang.org/protobuf v1.34.2 +) + +require ( + github.com/dapr/dapr v1.14.0-rc.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect + google.golang.org/grpc v1.64.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/job/go/sdk/maintenance-scheduler/go.sum b/job/go/sdk/maintenance-scheduler/go.sum new file mode 100644 index 000000000..64d75d54a --- /dev/null +++ b/job/go/sdk/maintenance-scheduler/go.sum @@ -0,0 +1,43 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dapr/dapr v1.14.0-rc.1 h1:4P376+PIU66hMtLz5TiF41IJ6Lh5FNY1DiwaNNYZv/8= +github.com/dapr/dapr v1.14.0-rc.1/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/dapr/go-sdk v1.10.0 h1:5b91e46Mu9Se0NqQ3ujFoD7gDRSbMhm2VNZpN0uuNa0= +github.com/dapr/go-sdk v1.10.0/go.mod h1:Wgisyn1yQx1PDU6xsuwxsQv9u7yiVHQOUFQNNQE/PXI= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/job/go/sdk/makefile b/job/go/sdk/makefile new file mode 100644 index 000000000..e7a8826bf --- /dev/null +++ b/job/go/sdk/makefile @@ -0,0 +1,2 @@ +include ../../../docker.mk +include ../../../validate.mk \ No newline at end of file From cf735d7937ff3c7a334078c50b3f8954645d80f3 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 4 Jul 2024 23:07:52 -0700 Subject: [PATCH 03/74] first commit Signed-off-by: Fernando Rocha --- job/go/http/README.md | 88 ++++++++-------- job/go/http/batch/app.go | 122 ----------------------- job/go/http/batch/go.mod | 6 -- job/go/http/batch/go.sum | 2 - job/go/http/maintenance-scheduler/app.go | 42 ++++++++ job/go/http/maintenance-scheduler/go.mod | 5 + job/go/http/maintenance-scheduler/go.sum | 2 + job/go/sdk/README.md | 56 ++--------- 8 files changed, 106 insertions(+), 217 deletions(-) delete mode 100644 job/go/http/batch/app.go delete mode 100644 job/go/http/batch/go.mod delete mode 100644 job/go/http/batch/go.sum create mode 100644 job/go/http/maintenance-scheduler/app.go create mode 100644 job/go/http/maintenance-scheduler/go.mod create mode 100644 job/go/http/maintenance-scheduler/go.sum diff --git a/job/go/http/README.md b/job/go/http/README.md index 9fa3984d2..ec0b6b0d2 100644 --- a/job/go/http/README.md +++ b/job/go/http/README.md @@ -1,66 +1,70 @@ -# Dapr Scheduler (HTTP) +# Dapr Job (Dapr SDK) -In this quickstart, you'll create a microservice to demonstrate Dapr's scheudler API to work with external systems as inputs and outputs. The service listens to input binding events from a system CRON and then outputs the contents of local data to a PostreSql output binding. +In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -Visit [this](https://docs.dapr.io/developing-applications/building-blocks/bindings/) link for more information about Dapr and Bindings. +Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. -> **Note:** This example leverages only HTTP REST. If you are looking for the example using the Dapr SDK [click here](../sdk). +> **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). This quickstart includes one service: - Go service `app` -### Run and initialize PostgreSQL container +### Run and initialize the server -1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): +Open a new terminal, change directories to `/maintenance-scheduler`, and start the server: - +```bash +cd maintenance-scheduler +dapr run --app-id job-http --app-port 3500 --dapr-http-port 6002 --log-level debug -- go run . +``` + +### Schedule a job using an HTTP request + + Open a new terminal window and run: ```bash -cd ../../db -docker-compose up +curl -X POST \ + http://localhost:6002/v1.0-alpha1/jobs/r2-d2 \ + -H "Content-Type: application/json" + -d '{ + "job": { + "data": { + "maintenanceType": "Oil Change" + }, + "dueTime": "30s" + } + }' ``` - +You should see a `202` response. -### Run Go service with Dapr +### Get a scheduled job using an HTTP request -2. Open a new terminal, change directories to `./batch` in the quickstart directory and run: +On the same terminal window yoy used to schedule the job or a new one, run: - +```bash +curl -X GET http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" +``` + +You should see the following: ```bash -cd ./batch -go build . +{ + "name":"r2-d2", + "dueTime":"30s", + "data": { + "maintenanceType": "Oil Change" + } +} ``` - -3. Run the Go service app with Dapr: - - - +### Delete a scheduled job using an HTTP request + +On the same terminal window you used to schedule the job or a new one, run: + ```bash -dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . +curl -X DELETE http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" ``` - +You should see a `202` response. diff --git a/job/go/http/batch/app.go b/job/go/http/batch/app.go deleted file mode 100644 index 54a6f697f..000000000 --- a/job/go/http/batch/app.go +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2021 The Dapr Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -/* -dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . -*/ - -import ( - "encoding/json" - "fmt" - "io" - "log" - "net/http" - "os" - "strconv" - "strings" - - "github.com/gorilla/mux" -) - -var ( - cronBindingName, sqlBindingName string = "cron", "sqldb" -) - -type Orders struct { - Orders []Order `json:"orders"` -} - -type Order struct { - OrderId int `json:"orderid"` - Customer string `json:"customer"` - Price float64 `json:"price"` -} - -func processBatch(w http.ResponseWriter, r *http.Request) { - - fmt.Println("Processing batch..") - - fileContent, err := os.Open("../../../orders.json") - if err != nil { - log.Fatal(err) - return - } - - defer fileContent.Close() - - byteResult, _ := io.ReadAll(fileContent) - - var orders Orders - - json.Unmarshal(byteResult, &orders) - - for i := 0; i < len(orders.Orders); i++ { - err := sqlOutput(orders.Orders[i]) - if err != nil { - log.Fatal(err) - os.Exit(1) - } - } - fmt.Println("Finished processing batch") - -} - -func sqlOutput(order Order) (err error) { - var daprHost, daprHttpPort string - var okHost, okPort bool - - if daprHost, okHost = os.LookupEnv("DAPR_HOST"); !okHost { - daprHost = "http://localhost" - } - - if daprHttpPort, okPort = os.LookupEnv("DAPR_HTTP_PORT"); !okPort { - daprHttpPort = "3503" - } - - var daprUrl string = daprHost + ":" + daprHttpPort + "/v1.0/bindings/" + sqlBindingName - - sqlCmd := fmt.Sprintf("insert into orders (orderid, customer, price) values (%d, '%s', %s);", order.OrderId, order.Customer, strconv.FormatFloat(order.Price, 'f', 2, 64)) - - payload := `{"operation": "exec", "metadata": {"sql": "` + sqlCmd + `" }}` - fmt.Println(sqlCmd) - - client := http.Client{} - // Insert order using Dapr output binding via HTTP Post - req, err := http.NewRequest("POST", daprUrl, strings.NewReader(payload)) - if err != nil { - return err - } - if _, err = client.Do(req); err != nil { - return err - } - return nil -} - -func main() { - var appPort string - var okHost bool - if appPort, okHost = os.LookupEnv("APP_PORT"); !okHost { - appPort = "6003" - } - - r := mux.NewRouter() - - // Triggered by Dapr input binding - r.HandleFunc("/"+cronBindingName, processBatch).Methods("POST") - - if err := http.ListenAndServe(":"+appPort, r); err != nil { - log.Panic(err) - } -} diff --git a/job/go/http/batch/go.mod b/job/go/http/batch/go.mod deleted file mode 100644 index f0ca12514..000000000 --- a/job/go/http/batch/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module dapr_job_example - -go 1.22.4 - - -require github.com/gorilla/mux v1.8.0 diff --git a/job/go/http/batch/go.sum b/job/go/http/batch/go.sum deleted file mode 100644 index 535028803..000000000 --- a/job/go/http/batch/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/job/go/http/maintenance-scheduler/app.go b/job/go/http/maintenance-scheduler/app.go new file mode 100644 index 000000000..c759a74ba --- /dev/null +++ b/job/go/http/maintenance-scheduler/app.go @@ -0,0 +1,42 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +/* +dapr run --app-id job-http --app-port 3500 --dapr-http-port 60021 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +import ( + "errors" + "log" + "net/http" + "os" + + "github.com/gorilla/mux" +) + +func main() { + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "6002" + } + + r := mux.NewRouter() + + // Start the server; this is a blocking call + err := http.ListenAndServe(":"+appPort, r) + if !errors.Is(err, http.ErrServerClosed) { + log.Panic(err) + } +} diff --git a/job/go/http/maintenance-scheduler/go.mod b/job/go/http/maintenance-scheduler/go.mod new file mode 100644 index 000000000..b8e020f76 --- /dev/null +++ b/job/go/http/maintenance-scheduler/go.mod @@ -0,0 +1,5 @@ +module dapr_job_example + +go 1.22.4 + +require github.com/gorilla/mux v1.8.1 diff --git a/job/go/http/maintenance-scheduler/go.sum b/job/go/http/maintenance-scheduler/go.sum new file mode 100644 index 000000000..712833743 --- /dev/null +++ b/job/go/http/maintenance-scheduler/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= diff --git a/job/go/sdk/README.md b/job/go/sdk/README.md index 51b16c489..a555928f9 100644 --- a/job/go/sdk/README.md +++ b/job/go/sdk/README.md @@ -10,57 +10,23 @@ This quickstart includes one service: - Go service `app` -### Run and initialize PostgreSQL container +### Run the Go service app with Dapr -1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): +This example will schedule 6 different droid manintenance jobs: - - -```bash -cd ../../db -docker-compose up +```go +droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, +} ``` - - -### Run Go service with Dapr - -2. Open a new terminal window, change directories to `./batch` in the quickstart directory and run: - - - -```bash -cd ./batch -go build . -``` - - -3. Run the Go service app with Dapr: +Open a terminal window and run, navigate to the `/maintenance-scheduler` folder and run: - - ```bash -dapr run --app-id batch-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 --resources-path ../../../components -- go run . +cd maintenance-scheduler +dapr run --app-id job-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 -- go run . ``` From 5d12e38e503d034bb6f8fcbe3326a1dee29705f6 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 09:54:53 -0700 Subject: [PATCH 04/74] Update README.md Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- job/go/http/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/job/go/http/README.md b/job/go/http/README.md index ec0b6b0d2..e091581d4 100644 --- a/job/go/http/README.md +++ b/job/go/http/README.md @@ -26,7 +26,7 @@ dapr run --app-id job-http --app-port 3500 --dapr-http-port 6002 --log-level deb ```bash curl -X POST \ http://localhost:6002/v1.0-alpha1/jobs/r2-d2 \ - -H "Content-Type: application/json" + -H "Content-Type: application/json" \ -d '{ "job": { "data": { From 0a5f57a1341a237c6f4d2c527094478d95d4f4ef Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 10:04:01 -0700 Subject: [PATCH 05/74] Update README.md Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- job/go/http/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/job/go/http/README.md b/job/go/http/README.md index e091581d4..d5e933221 100644 --- a/job/go/http/README.md +++ b/job/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Job (Dapr SDK) +# Dapr Job (HTTP request) In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. From 26e155134924715fb9a4052cc13159ce3bc7d283 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 13:40:27 -0700 Subject: [PATCH 06/74] folder name, dapr.yaml Signed-off-by: Fernando Rocha --- {job => jobs}/go/http/README.md | 4 ++-- jobs/go/http/dapr.yaml | 8 ++++++++ {job => jobs}/go/http/maintenance-scheduler/app.go | 2 +- {job => jobs}/go/http/maintenance-scheduler/go.mod | 0 {job => jobs}/go/http/maintenance-scheduler/go.sum | 0 {job => jobs}/go/http/makefile | 0 {job => jobs}/go/sdk/README.md | 1 + jobs/go/sdk/dapr.yaml | 9 +++++++++ {job => jobs}/go/sdk/maintenance-scheduler/app.go | 2 +- {job => jobs}/go/sdk/maintenance-scheduler/go.mod | 0 {job => jobs}/go/sdk/maintenance-scheduler/go.sum | 0 {job => jobs}/go/sdk/makefile | 0 12 files changed, 22 insertions(+), 4 deletions(-) rename {job => jobs}/go/http/README.md (92%) create mode 100644 jobs/go/http/dapr.yaml rename {job => jobs}/go/http/maintenance-scheduler/app.go (86%) rename {job => jobs}/go/http/maintenance-scheduler/go.mod (100%) rename {job => jobs}/go/http/maintenance-scheduler/go.sum (100%) rename {job => jobs}/go/http/makefile (100%) rename {job => jobs}/go/sdk/README.md (99%) create mode 100644 jobs/go/sdk/dapr.yaml rename {job => jobs}/go/sdk/maintenance-scheduler/app.go (97%) rename {job => jobs}/go/sdk/maintenance-scheduler/go.mod (100%) rename {job => jobs}/go/sdk/maintenance-scheduler/go.sum (100%) rename {job => jobs}/go/sdk/makefile (100%) diff --git a/job/go/http/README.md b/jobs/go/http/README.md similarity index 92% rename from job/go/http/README.md rename to jobs/go/http/README.md index d5e933221..ddcf54074 100644 --- a/job/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Job (HTTP request) +# Dapr Job (Dapr SDK) In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -16,7 +16,7 @@ Open a new terminal, change directories to `/maintenance-scheduler`, and start t ```bash cd maintenance-scheduler -dapr run --app-id job-http --app-port 3500 --dapr-http-port 6002 --log-level debug -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug -- go run . ``` ### Schedule a job using an HTTP request diff --git a/jobs/go/http/dapr.yaml b/jobs/go/http/dapr.yaml new file mode 100644 index 000000000..9a5a4ec96 --- /dev/null +++ b/jobs/go/http/dapr.yaml @@ -0,0 +1,8 @@ +version: 1 +apps: + - appDirPath: ./maintenance-scheduler/ + appID: maintenance-scheduler + appPort: 5200 + appProtocol: http + daprHTTPPort: 5280 + command: ["go", "run", "."] \ No newline at end of file diff --git a/job/go/http/maintenance-scheduler/app.go b/jobs/go/http/maintenance-scheduler/app.go similarity index 86% rename from job/go/http/maintenance-scheduler/app.go rename to jobs/go/http/maintenance-scheduler/app.go index c759a74ba..a9a865451 100644 --- a/job/go/http/maintenance-scheduler/app.go +++ b/jobs/go/http/maintenance-scheduler/app.go @@ -14,7 +14,7 @@ limitations under the License. package main /* -dapr run --app-id job-http --app-port 3500 --dapr-http-port 60021 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . */ import ( diff --git a/job/go/http/maintenance-scheduler/go.mod b/jobs/go/http/maintenance-scheduler/go.mod similarity index 100% rename from job/go/http/maintenance-scheduler/go.mod rename to jobs/go/http/maintenance-scheduler/go.mod diff --git a/job/go/http/maintenance-scheduler/go.sum b/jobs/go/http/maintenance-scheduler/go.sum similarity index 100% rename from job/go/http/maintenance-scheduler/go.sum rename to jobs/go/http/maintenance-scheduler/go.sum diff --git a/job/go/http/makefile b/jobs/go/http/makefile similarity index 100% rename from job/go/http/makefile rename to jobs/go/http/makefile diff --git a/job/go/sdk/README.md b/jobs/go/sdk/README.md similarity index 99% rename from job/go/sdk/README.md rename to jobs/go/sdk/README.md index a555928f9..14ca0001b 100644 --- a/job/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -15,6 +15,7 @@ This quickstart includes one service: This example will schedule 6 different droid manintenance jobs: ```go + droids := []Droid{ {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, diff --git a/jobs/go/sdk/dapr.yaml b/jobs/go/sdk/dapr.yaml new file mode 100644 index 000000000..685206094 --- /dev/null +++ b/jobs/go/sdk/dapr.yaml @@ -0,0 +1,9 @@ +version: 1 +apps: + - appDirPath: ./maintenance-scheduler/ + appID: maintenance-scheduler + appPort: 5200 + appProtocol: http + daprHTTPPort: 5280 + daprGRPCPort: 5201 + command: ["go", "run", "."] \ No newline at end of file diff --git a/job/go/sdk/maintenance-scheduler/app.go b/jobs/go/sdk/maintenance-scheduler/app.go similarity index 97% rename from job/go/sdk/maintenance-scheduler/app.go rename to jobs/go/sdk/maintenance-scheduler/app.go index cd522c911..3e253b831 100644 --- a/job/go/sdk/maintenance-scheduler/app.go +++ b/jobs/go/sdk/maintenance-scheduler/app.go @@ -14,7 +14,7 @@ limitations under the License. package main /* -dapr run --app-id job-sdk --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . */ import ( diff --git a/job/go/sdk/maintenance-scheduler/go.mod b/jobs/go/sdk/maintenance-scheduler/go.mod similarity index 100% rename from job/go/sdk/maintenance-scheduler/go.mod rename to jobs/go/sdk/maintenance-scheduler/go.mod diff --git a/job/go/sdk/maintenance-scheduler/go.sum b/jobs/go/sdk/maintenance-scheduler/go.sum similarity index 100% rename from job/go/sdk/maintenance-scheduler/go.sum rename to jobs/go/sdk/maintenance-scheduler/go.sum diff --git a/job/go/sdk/makefile b/jobs/go/sdk/makefile similarity index 100% rename from job/go/sdk/makefile rename to jobs/go/sdk/makefile From 56270098ebeb98f370a1680339701df63bd1050b Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 13:43:12 -0700 Subject: [PATCH 07/74] readme Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 4 ++-- jobs/go/sdk/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index ddcf54074..efb061072 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Job (Dapr SDK) +# Dapr Jobs (API) In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -16,7 +16,7 @@ Open a new terminal, change directories to `/maintenance-scheduler`, and start t ```bash cd maintenance-scheduler -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 -- go run . ``` ### Schedule a job using an HTTP request diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 14ca0001b..1704b57c7 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,4 +1,4 @@ -# Dapr Job (Dapr SDK) +# Dapr Job (SDK)) In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -27,7 +27,7 @@ Open a terminal window and run, navigate to the `/maintenance-scheduler` folder ```bash cd maintenance-scheduler -dapr run --app-id job-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . ``` From 6b05361bc41f6ae58cd3bdeea11606e77de9547c Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 11 Jul 2024 21:40:39 -0700 Subject: [PATCH 08/74] Refactoring and finishign HTTP example Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 146 +++++++++++---- jobs/go/http/dapr.yaml | 10 +- jobs/go/http/job-scheduler/go.mod | 3 + jobs/go/http/job-scheduler/go.sum | 0 jobs/go/http/job-scheduler/job-scheduler.go | 109 +++++++++++ jobs/go/http/job-service/go.mod | 3 + jobs/go/http/job-service/go.sum | 0 jobs/go/http/job-service/job-service.go | 189 ++++++++++++++++++++ jobs/go/http/maintenance-scheduler/app.go | 42 ----- jobs/go/http/maintenance-scheduler/go.mod | 5 - jobs/go/http/maintenance-scheduler/go.sum | 2 - jobs/go/sdk/README.md | 23 ++- jobs/go/sdk/maintenance-scheduler/app.go | 34 ++-- jobs/go/sdk/maintenance-scheduler/go.mod | 7 +- jobs/go/sdk/maintenance-scheduler/go.sum | 6 +- 15 files changed, 477 insertions(+), 102 deletions(-) create mode 100644 jobs/go/http/job-scheduler/go.mod create mode 100644 jobs/go/http/job-scheduler/go.sum create mode 100644 jobs/go/http/job-scheduler/job-scheduler.go create mode 100644 jobs/go/http/job-service/go.mod create mode 100644 jobs/go/http/job-service/go.sum create mode 100644 jobs/go/http/job-service/job-service.go delete mode 100644 jobs/go/http/maintenance-scheduler/app.go delete mode 100644 jobs/go/http/maintenance-scheduler/go.mod delete mode 100644 jobs/go/http/maintenance-scheduler/go.sum diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index efb061072..fd99fcb23 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Jobs (API) +# Dapr Hobs In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -6,65 +6,145 @@ Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) > **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). -This quickstart includes one service: - -- Go service `app` +This quickstart includes two apps: -### Run and initialize the server +- `job-scheduler.go`, responsible for scheduling, retrieving and deleting jobs. +- `job-service`, responsible for handling the scheduled jobs. -Open a new terminal, change directories to `/maintenance-scheduler`, and start the server: +## Run the app with the template file + +This section shows how to run both applications at once using [multi-app run template files](https://docs.dapr.io/developing-applications/local-development/multi-app-dapr-run/multi-app-overview/) with `dapr run -f .`. This enables to you test the interactions between multiple applications and will `schedule`, `run`, `get`, and `delete` jobs within a single process. + +Open a new terminal window and run the multi app run template: + + ```bash -cd maintenance-scheduler -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 -- go run . +dapr run -f . +``` + +The terminal console output should look similar to this, where: + +- The `R2-D2` job is being scheduled. +- The `R2-D2` job is being executed after 2 seconds. +- The `C-3PO` job is being scheduled. +- The `C-3PO` job is being retrieved. + +```text +== APP - job-scheduler == Job Scheduled: R2-D2 +== APP - job-service == Received job request... +== APP - job-service == Starting droid: R2-D2 +== APP - job-service == Executing maintenance job: Oil Change +== APP - job-scheduler == Job Scheduled: C-3PO +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +``` + +After 60 seconds, the terminal output should present the `C-3PO` job being processed: + +```text +== APP - job-service == Received job request... +== APP - job-service == Starting droid: C-3PO +== APP - job-service == Executing maintenance job: Limb Calibration ``` -### Schedule a job using an HTTP request + + +## Run the Jobs APIs individually + +### Schedule Jobs + +1. Open a terminal and run the `job-service` app: + +```bash +dapr run --app-id job-service --app-port 5200 --dapr-http-port 5280 -- go run . +``` - Open a new terminal window and run: +2. On a new terminal window, schedule the `R2-D2` Job using the Jobs API. ```bash curl -X POST \ - http://localhost:6002/v1.0-alpha1/jobs/r2-d2 \ + http://localhost:5280/v1.0-alpha1/jobs/r2-d2 \ -H "Content-Type: application/json" \ -d '{ - "job": { - "data": { - "maintenanceType": "Oil Change" - }, - "dueTime": "30s" - } - }' + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "R2-D2:Oil Change" + }, + "dueTime": "2s" + } +}' ``` -You should see a `202` response. +Back at the `job-service` app terminal window, the output should be: -### Get a scheduled job using an HTTP request +```text +== APP - job-app == Received job request... +== APP - job-app == Starting droid: R2-D2 +== APP - job-app == Executing maintenance job: Oil Change +``` -On the same terminal window yoy used to schedule the job or a new one, run: +3. On the same terminal window, schedule the `C-3PO` Job using the Jobs API. ```bash -curl -X GET http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" +curl -X POST \ + http://localhost:5280/v1.0-alpha1/jobs/c-3po \ + -H "Content-Type: application/json" \ + -d '{ + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "C-3PO:Limb Calibration" + }, + "dueTime": "60s" + } +}' ``` -You should see the following: +### Get a scheduled job + +1. On the same terminal window, run the command below to get the recently scheduled `C-3PO` job. ```bash -{ - "name":"r2-d2", - "dueTime":"30s", - "data": { - "maintenanceType": "Oil Change" - } -} +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` -### Delete a scheduled job using an HTTP request +You should see the following: -On the same terminal window you used to schedule the job or a new one, run: +```text +{"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +``` + +### Delete a scheduled job + +1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. ```bash curl -X DELETE http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" ``` -You should see a `202` response. +2. Run the command below to attempt to retrieve rhe deleted job: + +```bash +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +Back at the `job-service` app terminal window, the output should be: + +```text +ERRO[0249] Error getting job c-3po due to: rpc error: code = Unknown desc = job not found: app||default||job-service||c-3po instance=diagrid.local scope=dapr.api type=log ver=1.14.0-rc.2 +``` \ No newline at end of file diff --git a/jobs/go/http/dapr.yaml b/jobs/go/http/dapr.yaml index 9a5a4ec96..0b10d1f49 100644 --- a/jobs/go/http/dapr.yaml +++ b/jobs/go/http/dapr.yaml @@ -1,8 +1,12 @@ version: 1 apps: - - appDirPath: ./maintenance-scheduler/ - appID: maintenance-scheduler + - appDirPath: ./job-service/ + appID: job-service appPort: 5200 - appProtocol: http daprHTTPPort: 5280 + command: ["go", "run", "."] + - appDirPath: ./job-scheduler/ + appID: job-scheduler + appPort: 5300 + daprHTTPPort: 5380 command: ["go", "run", "."] \ No newline at end of file diff --git a/jobs/go/http/job-scheduler/go.mod b/jobs/go/http/job-scheduler/go.mod new file mode 100644 index 000000000..7d2ee39eb --- /dev/null +++ b/jobs/go/http/job-scheduler/go.mod @@ -0,0 +1,3 @@ +module job-scheduler + +go 1.22.4 diff --git a/jobs/go/http/job-scheduler/go.sum b/jobs/go/http/job-scheduler/go.sum new file mode 100644 index 000000000..e69de29bb diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go new file mode 100644 index 000000000..30a793c35 --- /dev/null +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -0,0 +1,109 @@ +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "os" + "strings" + "time" +) + +var c3poJobBody = `{ + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "C-3PO:Limb Calibration" + }, + "dueTime": "60s" + } + }` + +var r2d2JobBody = `{ + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "R2-D2:Oil Change" + }, + "dueTime": "2s" + } + }` + +func main() { + daprHost := os.Getenv("DAPR_HOST") + if daprHost == "" { + daprHost = "http://localhost" + } + + schedulerDaprHttpPort := "5280" + + client := http.Client{ + Timeout: 15 * time.Second, + } + + // Schedule a job using the Dapr Jobs API with short dueTime + jobName := "R2-D2" + reqURL := daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName + + req, err := http.NewRequest("POST", reqURL, strings.NewReader(r2d2JobBody)) + if err != nil { + log.Fatal(err.Error()) + } + + req.Header.Set("Content-Type", "application/json") + + // Schedule a job using the Dapr Jobs API + res, err := client.Do(req) + if err != nil { + log.Fatal(err) + } + defer res.Body.Close() + + fmt.Println("Job Scheduled:", jobName) + + time.Sleep(5 * time.Second) + + // Schedule a job using the Dapr Jobs API with long dueTime + jobName = "C-3PO" + + reqURL = daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName + + req, err = http.NewRequest("POST", reqURL, strings.NewReader(c3poJobBody)) + if err != nil { + log.Fatal(err.Error()) + } + + req.Header.Set("Content-Type", "application/json") + + // Schedule a job using the Dapr Jobs API + res, err = client.Do(req) + if err != nil { + log.Fatal(err) + } + defer res.Body.Close() + + fmt.Println("Job Scheduled:", jobName) + + time.Sleep(5 * time.Second) + + // Gets a job using the Dapr Jobs API + jobName = "C-3PO" + reqURL = daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName + + res, err = http.Get(reqURL) + if err != nil { + log.Fatal(err.Error()) + } + defer res.Body.Close() + + resBody, err := io.ReadAll(res.Body) + if err != nil { + log.Fatal(err.Error()) + + } + + fmt.Println("Job details:", string(resBody)) + + time.Sleep(5 * time.Second) +} diff --git a/jobs/go/http/job-service/go.mod b/jobs/go/http/job-service/go.mod new file mode 100644 index 000000000..3ffbcf007 --- /dev/null +++ b/jobs/go/http/job-service/go.mod @@ -0,0 +1,3 @@ +module job-service + +go 1.22.4 diff --git a/jobs/go/http/job-service/go.sum b/jobs/go/http/job-service/go.sum new file mode 100644 index 000000000..e69de29bb diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go new file mode 100644 index 000000000..351b8bbcb --- /dev/null +++ b/jobs/go/http/job-service/job-service.go @@ -0,0 +1,189 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "strings" +) + +/* +dapr run --app-id job-app --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +var jobMap = map[string]string{ + "R2-D2": "Oil Change", + "C-3PO": "Memory Wipe", + "BB-8": "Internal Gyroscope Check", +} + +type Job struct { + TypeURL string `json:"type_url"` + Value string `json:"value"` +} + +type DroidJob struct { + Droid string `json:"droid"` + Task string `json:"task"` +} + +// func handleScheduledJob(w http.ResponseWriter, r *http.Request) { +// fmt.Println("Received job request...") +// rawBody, err := io.ReadAll(r.Body) +// if err != nil { +// http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) +// return +// } + +// //fmt.Println("Raw request body:", string(rawBody)) + +// var jobData Job +// if err := json.Unmarshal(rawBody, &jobData); err != nil { +// http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) +// return +// } + +// // Decoding job data +// decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) +// if err != nil { +// fmt.Printf("Error decoding base64: %v", err) +// http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) +// return +// } + +// //fmt.Println("decoded value:", string(decodedValue)) + +// // Creating Droid Job from decoded value +// droidJob := setDroidJob(string(decodedValue)) + +// fmt.Println("Starting droid:", droidJob.Droid) +// fmt.Println("Executing maintenance job:", droidJob.Task) + +// w.WriteHeader(http.StatusOK) +// } + +// func handleGetJob(w http.ResponseWriter, r *http.Request) { +// } + +// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { +// } + +// func setDroidJob(decodedValue string) DroidJob { +// droidStr := strings.ReplaceAll(decodedValue, "\n", "") +// droidArray := strings.Split(droidStr, ":") + +// droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} +// return droidJob +// } + +// func main() { +// appPort := os.Getenv("APP_PORT") +// if appPort == "" { +// appPort = "5280" +// } + +// r := mux.NewRouter() + +// // Handles the job scheduler request +// r.HandleFunc("/job/", handleScheduledJob).Methods("POST") + +// // Handles the get job request +// r.HandleFunc("/jobs/", handleGetJob).Methods("GET") + +// // Handles the delete job request +// r.HandleFunc("/jobs/", handleDeleteJob).Methods("DELETE") + +// // Start the server; this is a blocking call +// err := http.ListenAndServe(":"+appPort, r) +// if !errors.Is(err, http.ErrServerClosed) { +// log.Panic(err) +// } + +// } + +func main() { + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "5280" + } + + // Setup job handler + http.HandleFunc("/job/", handleJob) + + fmt.Printf("Server started on port %v\n", appPort) + err := http.ListenAndServe(":"+appPort, nil) + if err != nil { + log.Fatal(err) + } + +} + +func handleJob(w http.ResponseWriter, r *http.Request) { + fmt.Println("Received job request...") + rawBody, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) + return + } + + //fmt.Println("Raw request body:", string(rawBody)) + + var jobData Job + if err := json.Unmarshal(rawBody, &jobData); err != nil { + http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) + return + } + + // Decoding job data + decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) + if err != nil { + fmt.Printf("Error decoding base64: %v", err) + http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) + return + } + + //fmt.Println("decoded value:", string(decodedValue)) + + // Creating Droid Job from decoded value + droidJob := setDroidJob(string(decodedValue)) + + fmt.Println("Starting droid:", droidJob.Droid) + fmt.Println("Executing maintenance job:", droidJob.Task) + + w.WriteHeader(http.StatusOK) +} + +func setDroidJob(decodedValue string) DroidJob { + droidStr := strings.ReplaceAll(decodedValue, "\n", "") + droidArray := strings.Split(droidStr, ":") + + droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} + return droidJob +} + +// func handleGetJob(w http.ResponseWriter, r *http.Request) { +// w.WriteHeader(http.StatusOK) + +// } + +// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { +// w.WriteHeader(http.StatusOK) + +// } diff --git a/jobs/go/http/maintenance-scheduler/app.go b/jobs/go/http/maintenance-scheduler/app.go deleted file mode 100644 index a9a865451..000000000 --- a/jobs/go/http/maintenance-scheduler/app.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2021 The Dapr Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -/* -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . -*/ - -import ( - "errors" - "log" - "net/http" - "os" - - "github.com/gorilla/mux" -) - -func main() { - appPort := os.Getenv("APP_PORT") - if appPort == "" { - appPort = "6002" - } - - r := mux.NewRouter() - - // Start the server; this is a blocking call - err := http.ListenAndServe(":"+appPort, r) - if !errors.Is(err, http.ErrServerClosed) { - log.Panic(err) - } -} diff --git a/jobs/go/http/maintenance-scheduler/go.mod b/jobs/go/http/maintenance-scheduler/go.mod deleted file mode 100644 index b8e020f76..000000000 --- a/jobs/go/http/maintenance-scheduler/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module dapr_job_example - -go 1.22.4 - -require github.com/gorilla/mux v1.8.1 diff --git a/jobs/go/http/maintenance-scheduler/go.sum b/jobs/go/http/maintenance-scheduler/go.sum deleted file mode 100644 index 712833743..000000000 --- a/jobs/go/http/maintenance-scheduler/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 1704b57c7..109c537f4 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,4 +1,6 @@ -# Dapr Job (SDK)) +# Dapr Job (SDK) + +// Run dapr in debug mode - Cassie's example In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -25,6 +27,25 @@ droids := []Droid{ Open a terminal window and run, navigate to the `/maintenance-scheduler` folder and run: + + ```bash cd maintenance-scheduler dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . diff --git a/jobs/go/sdk/maintenance-scheduler/app.go b/jobs/go/sdk/maintenance-scheduler/app.go index 3e253b831..ff3a74f5e 100644 --- a/jobs/go/sdk/maintenance-scheduler/app.go +++ b/jobs/go/sdk/maintenance-scheduler/app.go @@ -14,7 +14,7 @@ limitations under the License. package main /* -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . */ import ( @@ -23,9 +23,10 @@ import ( "encoding/json" "fmt" "log" + "os" "time" - daprc "github.com/mikeee/dapr_go-sdk/tree/feat-dist-scheduler/client" + daprc "github.com/dapr/go-sdk/client" "github.com/dapr/go-sdk/service/common" daprs "github.com/dapr/go-sdk/service/grpc" @@ -56,15 +57,13 @@ func main() { {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, } - //Create new Dapr client - daprClient, err := daprc.NewClient() - if err != nil { - panic(err) + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "5280" } - defer daprClient.Close() // Create a new Dapr service - server, err := daprs.NewService(":6003") + server, err := daprs.NewService(":" + appPort) if err != nil { log.Fatalf("failed to start the server: %v", err) } @@ -76,6 +75,13 @@ func main() { } }() + //Create new Dapr client + daprClient, err := daprc.NewClient() + if err != nil { + panic(err) + } + defer daprClient.Close() + // Brief intermission to allow for the server to initialize. time.Sleep(10 * time.Second) @@ -104,7 +110,11 @@ func main() { // schedule job scheduleJob(ctx, maintenanceJob, jobData) + break + } + + break } } @@ -112,16 +122,20 @@ func scheduleJob(ctx context.Context, maintenanceJob MaintenanceJob, jobData []b // schedule job job := daprc.Job{ Name: maintenanceJob.JobName, - Schedule: "@every 1s", + Schedule: "@every 10s", Repeats: 10, + TTL: "60s", + DueTime: "1s", Data: &anypb.Any{ Value: jobData, }, } + fmt.Printf("Scheduling job %+v\n", job) + err := daprClient.ScheduleJobAlpha1(ctx, &job) if err != nil { - log.Fatalf("failed to schedule job %v: %v", maintenanceJob.JobName, err) + fmt.Printf("failed to schedule job %v: %v", maintenanceJob.JobName, err) } fmt.Println("schedulejob - success") diff --git a/jobs/go/sdk/maintenance-scheduler/go.mod b/jobs/go/sdk/maintenance-scheduler/go.mod index 7e6f7d105..cf39294c0 100644 --- a/jobs/go/sdk/maintenance-scheduler/go.mod +++ b/jobs/go/sdk/maintenance-scheduler/go.mod @@ -3,12 +3,12 @@ module dapr_job_example go 1.22.4 require ( - github.com/dapr/go-sdk v1.10.0 + github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 google.golang.org/protobuf v1.34.2 ) require ( - github.com/dapr/dapr v1.14.0-rc.1 // indirect + github.com/dapr/dapr v1.14.0-rc.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/kr/pretty v0.3.1 // indirect go.opentelemetry.io/otel v1.27.0 // indirect @@ -19,3 +19,6 @@ require ( google.golang.org/grpc v1.64.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 +replace github.com/dapr/go-sdk => /Users/rocha/Developer/go-sdk diff --git a/jobs/go/sdk/maintenance-scheduler/go.sum b/jobs/go/sdk/maintenance-scheduler/go.sum index 64d75d54a..7eba25360 100644 --- a/jobs/go/sdk/maintenance-scheduler/go.sum +++ b/jobs/go/sdk/maintenance-scheduler/go.sum @@ -1,8 +1,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/dapr/dapr v1.14.0-rc.1 h1:4P376+PIU66hMtLz5TiF41IJ6Lh5FNY1DiwaNNYZv/8= -github.com/dapr/dapr v1.14.0-rc.1/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= -github.com/dapr/go-sdk v1.10.0 h1:5b91e46Mu9Se0NqQ3ujFoD7gDRSbMhm2VNZpN0uuNa0= -github.com/dapr/go-sdk v1.10.0/go.mod h1:Wgisyn1yQx1PDU6xsuwxsQv9u7yiVHQOUFQNNQE/PXI= +github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= +github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= From c553abc973ece27f6f80cbe2799df7ff7e6649ef Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 11 Jul 2024 23:35:43 -0700 Subject: [PATCH 09/74] Including status code check for scheduler Signed-off-by: Fernando Rocha --- jobs/go/http/job-scheduler/job-scheduler.go | 5 ++ jobs/go/http/job-service/job-service.go | 74 --------------------- 2 files changed, 5 insertions(+), 74 deletions(-) diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go index 30a793c35..22a73bfce 100644 --- a/jobs/go/http/job-scheduler/job-scheduler.go +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -58,6 +58,11 @@ func main() { if err != nil { log.Fatal(err) } + + if res.StatusCode != http.StatusNoContent { + log.Fatalf("failed to register job event handler. status code: %v", res.StatusCode) + } + defer res.Body.Close() fmt.Println("Job Scheduled:", jobName) diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 351b8bbcb..0bf3fed36 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -44,80 +44,6 @@ type DroidJob struct { Task string `json:"task"` } -// func handleScheduledJob(w http.ResponseWriter, r *http.Request) { -// fmt.Println("Received job request...") -// rawBody, err := io.ReadAll(r.Body) -// if err != nil { -// http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) -// return -// } - -// //fmt.Println("Raw request body:", string(rawBody)) - -// var jobData Job -// if err := json.Unmarshal(rawBody, &jobData); err != nil { -// http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) -// return -// } - -// // Decoding job data -// decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) -// if err != nil { -// fmt.Printf("Error decoding base64: %v", err) -// http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) -// return -// } - -// //fmt.Println("decoded value:", string(decodedValue)) - -// // Creating Droid Job from decoded value -// droidJob := setDroidJob(string(decodedValue)) - -// fmt.Println("Starting droid:", droidJob.Droid) -// fmt.Println("Executing maintenance job:", droidJob.Task) - -// w.WriteHeader(http.StatusOK) -// } - -// func handleGetJob(w http.ResponseWriter, r *http.Request) { -// } - -// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { -// } - -// func setDroidJob(decodedValue string) DroidJob { -// droidStr := strings.ReplaceAll(decodedValue, "\n", "") -// droidArray := strings.Split(droidStr, ":") - -// droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} -// return droidJob -// } - -// func main() { -// appPort := os.Getenv("APP_PORT") -// if appPort == "" { -// appPort = "5280" -// } - -// r := mux.NewRouter() - -// // Handles the job scheduler request -// r.HandleFunc("/job/", handleScheduledJob).Methods("POST") - -// // Handles the get job request -// r.HandleFunc("/jobs/", handleGetJob).Methods("GET") - -// // Handles the delete job request -// r.HandleFunc("/jobs/", handleDeleteJob).Methods("DELETE") - -// // Start the server; this is a blocking call -// err := http.ListenAndServe(":"+appPort, r) -// if !errors.Is(err, http.ErrServerClosed) { -// log.Panic(err) -// } - -// } - func main() { appPort := os.Getenv("APP_PORT") if appPort == "" { From a748d7b297cb3e3a67e08c6487bb353bba7bbf61 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 12 Jul 2024 01:14:27 -0700 Subject: [PATCH 10/74] fixing validation Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index fd99fcb23..9b5c350f8 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -20,17 +20,17 @@ Open a new terminal window and run the multi app run template: ```bash From 8fcde38712cbd9c924bb97cfdb88d3935b8158d4 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 12 Jul 2024 01:20:12 -0700 Subject: [PATCH 11/74] Job duetime 60->30 Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 23 ++++++++++++++------- jobs/go/http/job-scheduler/job-scheduler.go | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 9b5c350f8..b527c05bd 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -24,13 +24,16 @@ expected_stdout_lines: - '== APP - job-service == Starting droid: R2-D2' - '== APP - job-service == Executing maintenance job: Oil Change' - '== APP - job-scheduler == Job Scheduled: C-3PO' - - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}}' + - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}}' + - '== APP - job-service == Received job request...' + - '== APP - job-service == Starting droid: C-3PO' + - '== APP - job-service == Executing maintenance job: Limb Calibration' expected_stderr_lines: output_match_mode: substring match_order: none background: true sleep: 10 -timeout_seconds: 80 +timeout_seconds: 60 --> ```bash @@ -50,10 +53,10 @@ The terminal console output should look similar to this, where: == APP - job-service == Starting droid: R2-D2 == APP - job-service == Executing maintenance job: Oil Change == APP - job-scheduler == Job Scheduled: C-3PO -== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} ``` -After 60 seconds, the terminal output should present the `C-3PO` job being processed: +After 30 seconds, the terminal output should present the `C-3PO` job being processed: ```text == APP - job-service == Received job request... @@ -61,6 +64,12 @@ After 60 seconds, the terminal output should present the `C-3PO` job being proce == APP - job-service == Executing maintenance job: Limb Calibration ``` +2. Stop and clean up application processes + +```bash +dapr stop -f . +``` + ## Run the Jobs APIs individually @@ -110,7 +119,7 @@ curl -X POST \ "@type": "type.googleapis.com/google.type.Expr", "expression": "C-3PO:Limb Calibration" }, - "dueTime": "60s" + "dueTime": "30s" } }' ``` @@ -126,7 +135,7 @@ curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: appli You should see the following: ```text -{"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} ``` ### Delete a scheduled job @@ -134,7 +143,7 @@ You should see the following: 1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. ```bash -curl -X DELETE http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" +curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` 2. Run the command below to attempt to retrieve rhe deleted job: diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go index 22a73bfce..9c58e53fa 100644 --- a/jobs/go/http/job-scheduler/job-scheduler.go +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -16,7 +16,7 @@ var c3poJobBody = `{ "@type": "type.googleapis.com/google.type.Expr", "expression": "C-3PO:Limb Calibration" }, - "dueTime": "60s" + "dueTime": "30" } }` From cc5f184530811094dce495591004ddef6c353f06 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 12 Jul 2024 16:15:57 -0700 Subject: [PATCH 12/74] Fixing request data type and README Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 22 ++++++++++----------- jobs/go/http/job-scheduler/job-scheduler.go | 10 +++++----- jobs/go/http/job-service/job-service.go | 17 +--------------- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index b527c05bd..5100739dc 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -2,7 +2,7 @@ In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. +Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. > **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). @@ -24,7 +24,7 @@ expected_stdout_lines: - '== APP - job-service == Starting droid: R2-D2' - '== APP - job-service == Executing maintenance job: Oil Change' - '== APP - job-scheduler == Job Scheduled: C-3PO' - - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}}' + - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "value":"C-3PO:Limb Calibration"}}' - '== APP - job-service == Received job request...' - '== APP - job-service == Starting droid: C-3PO' - '== APP - job-service == Executing maintenance job: Limb Calibration' @@ -32,8 +32,8 @@ expected_stderr_lines: output_match_mode: substring match_order: none background: true -sleep: 10 -timeout_seconds: 60 +sleep: 60 +timeout_seconds: 120 --> ```bash @@ -53,7 +53,7 @@ The terminal console output should look similar to this, where: == APP - job-service == Starting droid: R2-D2 == APP - job-service == Executing maintenance job: Oil Change == APP - job-scheduler == Job Scheduled: C-3PO -== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"ttype.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} ``` After 30 seconds, the terminal output should present the `C-3PO` job being processed: @@ -91,8 +91,8 @@ curl -X POST \ -d '{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "R2-D2:Oil Change" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "R2-D2:Oil Change" }, "dueTime": "2s" } @@ -116,8 +116,8 @@ curl -X POST \ -d '{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "C-3PO:Limb Calibration" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "C-3PO:Limb Calibration" }, "dueTime": "30s" } @@ -135,7 +135,7 @@ curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: appli You should see the following: ```text -{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} ``` ### Delete a scheduled job @@ -146,7 +146,7 @@ You should see the following: curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` -2. Run the command below to attempt to retrieve rhe deleted job: +2. Run the command below to attempt to retrieve the deleted job: ```bash curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go index 9c58e53fa..12c2524f1 100644 --- a/jobs/go/http/job-scheduler/job-scheduler.go +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -13,18 +13,18 @@ import ( var c3poJobBody = `{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "C-3PO:Limb Calibration" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "C-3PO:Limb Calibration" }, - "dueTime": "30" + "dueTime": "30s" } }` var r2d2JobBody = `{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "R2-D2:Oil Change" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "R2-D2:Oil Change" }, "dueTime": "2s" } diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 0bf3fed36..8c841f7f7 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -28,12 +28,6 @@ import ( dapr run --app-id job-app --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . */ -var jobMap = map[string]string{ - "R2-D2": "Oil Change", - "C-3PO": "Memory Wipe", - "BB-8": "Internal Gyroscope Check", -} - type Job struct { TypeURL string `json:"type_url"` Value string `json:"value"` @@ -97,19 +91,10 @@ func handleJob(w http.ResponseWriter, r *http.Request) { } func setDroidJob(decodedValue string) DroidJob { + // Removing new lines from decoded value - Workaround for base64 encoding issue droidStr := strings.ReplaceAll(decodedValue, "\n", "") droidArray := strings.Split(droidStr, ":") droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} return droidJob } - -// func handleGetJob(w http.ResponseWriter, r *http.Request) { -// w.WriteHeader(http.StatusOK) - -// } - -// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { -// w.WriteHeader(http.StatusOK) - -// } From 82598bfcc50ac12f522c3ffa1b66a18804f07a2a Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 15 Jul 2024 14:22:54 -0700 Subject: [PATCH 13/74] SDK jobs Signed-off-by: Fernando Rocha --- jobs/go/sdk/dapr.yaml | 11 +- jobs/go/sdk/job-scheduler/app.go | 108 ++++++++++++ .../go.mod | 0 .../go.sum | 0 jobs/go/sdk/job-service/app.go | 84 +++++++++ jobs/go/sdk/job-service/go.mod | 24 +++ jobs/go/sdk/job-service/go.sum | 41 +++++ jobs/go/sdk/maintenance-scheduler/app.go | 161 ------------------ 8 files changed, 264 insertions(+), 165 deletions(-) create mode 100644 jobs/go/sdk/job-scheduler/app.go rename jobs/go/sdk/{maintenance-scheduler => job-scheduler}/go.mod (100%) rename jobs/go/sdk/{maintenance-scheduler => job-scheduler}/go.sum (100%) create mode 100644 jobs/go/sdk/job-service/app.go create mode 100644 jobs/go/sdk/job-service/go.mod create mode 100644 jobs/go/sdk/job-service/go.sum delete mode 100644 jobs/go/sdk/maintenance-scheduler/app.go diff --git a/jobs/go/sdk/dapr.yaml b/jobs/go/sdk/dapr.yaml index 685206094..0b10d1f49 100644 --- a/jobs/go/sdk/dapr.yaml +++ b/jobs/go/sdk/dapr.yaml @@ -1,9 +1,12 @@ version: 1 apps: - - appDirPath: ./maintenance-scheduler/ - appID: maintenance-scheduler + - appDirPath: ./job-service/ + appID: job-service appPort: 5200 - appProtocol: http daprHTTPPort: 5280 - daprGRPCPort: 5201 + command: ["go", "run", "."] + - appDirPath: ./job-scheduler/ + appID: job-scheduler + appPort: 5300 + daprHTTPPort: 5380 command: ["go", "run", "."] \ No newline at end of file diff --git a/jobs/go/sdk/job-scheduler/app.go b/jobs/go/sdk/job-scheduler/app.go new file mode 100644 index 000000000..c3619a683 --- /dev/null +++ b/jobs/go/sdk/job-scheduler/app.go @@ -0,0 +1,108 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "google.golang.org/protobuf/types/known/anypb" + + daprc "github.com/dapr/go-sdk/client" +) + +/* +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +var daprClient daprc.Client +var err error + +// Define a Droid struct +type Droid struct { + Name string + Jobs []string +} + +type DroidJob struct { + DroidName string + DroidJob string +} + +func main() { + + // Define the droids and their maintenance jobs + droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + } + + //Create new Dapr client + daprClient, err = daprc.NewClient() + if err != nil { + panic(err) + } + defer daprClient.Close() + + //Schedule jobs + for _, droid := range droids { + for _, job := range droid.Jobs { + + //create maintenance job + droidJob := DroidJob{ + DroidName: droid.Name, + DroidJob: job, + } + + jobData, err := json.Marshal(droidJob) + if err != nil { + log.Fatalf("failed to marshall job %v: %v", droidJob.DroidJob, err) + } + + ctx := context.Background() + //schedule job + scheduleJob(ctx, droidJob, jobData) + + } + } +} + +func scheduleJob(ctx context.Context, droidJob DroidJob, jobData []byte) { + // schedule job + job := daprc.Job{ + Name: droidJob.DroidName, + Schedule: "@every 10s", + Repeats: 10, + TTL: "60s", + DueTime: "1s", + Data: &anypb.Any{ + Value: jobData, + }, + } + + fmt.Printf("Scheduling job %+v\n", job) + + err := daprClient.ScheduleJobAlpha1(ctx, &job) + if err != nil { + fmt.Printf("failed to schedule job for %v: %v", droidJob.DroidName, err) + } + + fmt.Println("schedulejob - success") + + time.Sleep(3 * time.Second) +} diff --git a/jobs/go/sdk/maintenance-scheduler/go.mod b/jobs/go/sdk/job-scheduler/go.mod similarity index 100% rename from jobs/go/sdk/maintenance-scheduler/go.mod rename to jobs/go/sdk/job-scheduler/go.mod diff --git a/jobs/go/sdk/maintenance-scheduler/go.sum b/jobs/go/sdk/job-scheduler/go.sum similarity index 100% rename from jobs/go/sdk/maintenance-scheduler/go.sum rename to jobs/go/sdk/job-scheduler/go.sum diff --git a/jobs/go/sdk/job-service/app.go b/jobs/go/sdk/job-service/app.go new file mode 100644 index 000000000..f7fee41ad --- /dev/null +++ b/jobs/go/sdk/job-service/app.go @@ -0,0 +1,84 @@ +package main + +/* +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "log" + "os" + + "github.com/dapr/go-sdk/service/common" + daprs "github.com/dapr/go-sdk/service/grpc" +) + +//var daprClient daprc.Client + +// Define a Droid struct +type Droid struct { + Name string + Jobs []string +} + +type MaintenanceJob struct { + JobName string + DroidName string + DroidJob string +} + +func main() { + + // Define the droids and their maintenance jobs + droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check"}}, + } + + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "5280" + } + + // Create a new Dapr service + server, err := daprs.NewService(":" + appPort) + if err != nil { + log.Fatalf("failed to start the server: %v", err) + } + + for _, droid := range droids { + // setup job event handler + if err = server.AddJobEventHandler(droid.Name, droidMaintenanceHandler); err != nil { + log.Fatalf("failed to register job event handler: %v", err) + } + + fmt.Println("Handler created for ", droid.Name) + } + + log.Println("starting server") + if err = server.Start(); err != nil { + log.Fatalf("failed to start server: %v", err) + } + +} + +func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { + var jobData common.Job + if err := json.Unmarshal(job.Data, &jobData); err != nil { + return fmt.Errorf("failed to unmarshal job: %v", err) + } + decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) + if err != nil { + return fmt.Errorf("failed to decode job payload: %v", err) + } + var jobPayload MaintenanceJob + if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { + return fmt.Errorf("failed to unmarshal payload: %v", err) + } + fmt.Printf("Maintenance job %v received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobPayload.JobName, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) + return nil +} diff --git a/jobs/go/sdk/job-service/go.mod b/jobs/go/sdk/job-service/go.mod new file mode 100644 index 000000000..cf39294c0 --- /dev/null +++ b/jobs/go/sdk/job-service/go.mod @@ -0,0 +1,24 @@ +module dapr_job_example + +go 1.22.4 + +require ( + github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 + google.golang.org/protobuf v1.34.2 +) + +require ( + github.com/dapr/dapr v1.14.0-rc.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect + google.golang.org/grpc v1.64.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 +replace github.com/dapr/go-sdk => /Users/rocha/Developer/go-sdk diff --git a/jobs/go/sdk/job-service/go.sum b/jobs/go/sdk/job-service/go.sum new file mode 100644 index 000000000..7eba25360 --- /dev/null +++ b/jobs/go/sdk/job-service/go.sum @@ -0,0 +1,41 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= +github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/jobs/go/sdk/maintenance-scheduler/app.go b/jobs/go/sdk/maintenance-scheduler/app.go deleted file mode 100644 index ff3a74f5e..000000000 --- a/jobs/go/sdk/maintenance-scheduler/app.go +++ /dev/null @@ -1,161 +0,0 @@ -/* -Copyright 2021 The Dapr Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -/* -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . -*/ - -import ( - "context" - "encoding/base64" - "encoding/json" - "fmt" - "log" - "os" - "time" - - daprc "github.com/dapr/go-sdk/client" - - "github.com/dapr/go-sdk/service/common" - daprs "github.com/dapr/go-sdk/service/grpc" - - "google.golang.org/protobuf/types/known/anypb" -) - -var daprClient daprc.Client - -// Define a Droid struct -type Droid struct { - Name string - Jobs []string -} - -type MaintenanceJob struct { - JobName string - DroidName string - DroidJob string -} - -func main() { - - // Define the droids and their maintenance jobs - droids := []Droid{ - {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, - {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, - {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, - } - - appPort := os.Getenv("APP_PORT") - if appPort == "" { - appPort = "5280" - } - - // Create a new Dapr service - server, err := daprs.NewService(":" + appPort) - if err != nil { - log.Fatalf("failed to start the server: %v", err) - } - - log.Println("starting server") - go func() { - if err = server.Start(); err != nil { - log.Fatalf("failed to start server: %v", err) - } - }() - - //Create new Dapr client - daprClient, err := daprc.NewClient() - if err != nil { - panic(err) - } - defer daprClient.Close() - - // Brief intermission to allow for the server to initialize. - time.Sleep(10 * time.Second) - - // Setup handler and schedule jobs - for _, droid := range droids { - for _, job := range droid.Jobs { - - // create maintenance job - maintenanceJob := MaintenanceJob{ - JobName: droid.Name + " - " + job, - DroidName: droid.Name, - DroidJob: job, - } - - jobData, err := json.Marshal(maintenanceJob) - if err != nil { - log.Fatalf("failed to marshall job %v: %v", maintenanceJob.JobName, err) - } - - // setup job event handler - if err = server.AddJobEventHandler(maintenanceJob.JobName, droidMaintenanceHandler); err != nil { - log.Fatalf("failed to register job event handler: %v", err) - } - - ctx := context.Background() - // schedule job - scheduleJob(ctx, maintenanceJob, jobData) - - break - - } - - break - } -} - -func scheduleJob(ctx context.Context, maintenanceJob MaintenanceJob, jobData []byte) { - // schedule job - job := daprc.Job{ - Name: maintenanceJob.JobName, - Schedule: "@every 10s", - Repeats: 10, - TTL: "60s", - DueTime: "1s", - Data: &anypb.Any{ - Value: jobData, - }, - } - - fmt.Printf("Scheduling job %+v\n", job) - - err := daprClient.ScheduleJobAlpha1(ctx, &job) - if err != nil { - fmt.Printf("failed to schedule job %v: %v", maintenanceJob.JobName, err) - } - - fmt.Println("schedulejob - success") - - time.Sleep(3 * time.Second) -} - -func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { - var jobData common.Job - if err := json.Unmarshal(job.Data, &jobData); err != nil { - return fmt.Errorf("failed to unmarshal job: %v", err) - } - decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) - if err != nil { - return fmt.Errorf("failed to decode job payload: %v", err) - } - var jobPayload MaintenanceJob - if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { - return fmt.Errorf("failed to unmarshal payload: %v", err) - } - fmt.Printf("Maintenance job %v received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobPayload.JobName, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) - return nil -} From a06268f28b245562b0fd65cc22f025f9d21922b1 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 16 Jul 2024 01:26:48 -0700 Subject: [PATCH 14/74] refactoring Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 4 +- jobs/go/sdk/README.md | 177 ++++++++++++++++++++++++------- jobs/go/sdk/dapr.yaml | 2 + jobs/go/sdk/job-scheduler/app.go | 62 ++++++----- jobs/go/sdk/job-service/app.go | 19 +++- 5 files changed, 200 insertions(+), 64 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 5100739dc..7e58012b3 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Hobs +# Dapr Jobs In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -9,7 +9,7 @@ Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/ This quickstart includes two apps: - `job-scheduler.go`, responsible for scheduling, retrieving and deleting jobs. -- `job-service`, responsible for handling the scheduled jobs. +- `job-service.go`, responsible for handling the scheduled jobs. ## Run the app with the template file diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 109c537f4..ea1943d5d 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,54 +1,159 @@ -# Dapr Job (SDK) +# Dapr Hobs -// Run dapr in debug mode - Cassie's example +In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. +Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. -Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. +> **Note:** This example leverages the SDK only. If you are looking for the example using the HTTP requests (recommended) [click here](../http/). -> **Note:** This example leverages the Dapr SDK. If you are looking for the example using HTTP REST only [click here](../http). +This quickstart includes two apps: -This quickstart includes one service: - -- Go service `app` +- `job-scheduler.go`, responsible for scheduling, retrieving and deleting jobs. +- `job-service.go`, responsible for handling the scheduled jobs. -### Run the Go service app with Dapr +## Run the app with the template file -This example will schedule 6 different droid manintenance jobs: +This section shows how to run both applications at once using [multi-app run template files](https://docs.dapr.io/developing-applications/local-development/multi-app-dapr-run/multi-app-overview/) with `dapr run -f .`. This enables to you test the interactions between multiple applications and will `schedule`, `run`, `get`, and `delete` jobs within a single process. -```go - -droids := []Droid{ - {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, - {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, - {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, -} -``` - -Open a terminal window and run, navigate to the `/maintenance-scheduler` folder and run: +Open a new terminal window and run the multi app run template: ```bash -cd maintenance-scheduler -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . +dapr run -f . +``` + +The terminal console output should look similar to this, where: + +- The `R2-D2` job is being scheduled. +- The `R2-D2` job is being executed after 2 seconds. +- The `C-3PO` job is being scheduled. +- The `C-3PO` job is being retrieved. + +```text +== APP - job-scheduler == Job Scheduled: R2-D2 +== APP - job-service == Received job request... +== APP - job-service == Starting droid: R2-D2 +== APP - job-service == Executing maintenance job: Oil Change +== APP - job-scheduler == Job Scheduled: C-3PO +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"ttype.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} +``` + +After 30 seconds, the terminal output should present the `C-3PO` job being processed: + +```text +== APP - job-service == Received job request... +== APP - job-service == Starting droid: C-3PO +== APP - job-service == Executing maintenance job: Limb Calibration +``` + +2. Stop and clean up application processes + +```bash +dapr stop -f . ``` + +## Run the Jobs APIs individually + +### Schedule Jobs + +1. Open a terminal and run the `job-service` app: + +```bash +dapr run --app-id job-service --app-port 5200 --dapr-http-port 5280 -- go run . +``` + +2. On a new terminal window, schedule the `R2-D2` Job using the Jobs API. + +```bash +curl -X POST \ + http://localhost:5280/v1.0-alpha1/jobs/r2-d2 \ + -H "Content-Type: application/json" \ + -d '{ + "job": { + "data": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "R2-D2:Oil Change" + }, + "dueTime": "2s" + } +}' +``` + +Back at the `job-service` app terminal window, the output should be: + +```text +== APP - job-app == Received job request... +== APP - job-app == Starting droid: R2-D2 +== APP - job-app == Executing maintenance job: Oil Change +``` + +3. On the same terminal window, schedule the `C-3PO` Job using the Jobs API. + +```bash +curl -X POST \ + http://localhost:5280/v1.0-alpha1/jobs/c-3po \ + -H "Content-Type: application/json" \ + -d '{ + "job": { + "data": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "C-3PO:Limb Calibration" + }, + "dueTime": "30s" + } +}' +``` + +### Get a scheduled job + +1. On the same terminal window, run the command below to get the recently scheduled `C-3PO` job. + +```bash +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +You should see the following: + +```text +{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} +``` + +### Delete a scheduled job + +1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. + +```bash +curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +2. Run the command below to attempt to retrieve the deleted job: + +```bash +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +Back at the `job-service` app terminal window, the output should be: + +```text +ERRO[0249] Error getting job c-3po due to: rpc error: code = Unknown desc = job not found: app||default||job-service||c-3po instance=diagrid.local scope=dapr.api type=log ver=1.14.0-rc.2 +``` \ No newline at end of file diff --git a/jobs/go/sdk/dapr.yaml b/jobs/go/sdk/dapr.yaml index 0b10d1f49..c4dc5c092 100644 --- a/jobs/go/sdk/dapr.yaml +++ b/jobs/go/sdk/dapr.yaml @@ -4,6 +4,8 @@ apps: appID: job-service appPort: 5200 daprHTTPPort: 5280 + daprGRPCPort: 5281 + appProtocol: grpc command: ["go", "run", "."] - appDirPath: ./job-scheduler/ appID: job-scheduler diff --git a/jobs/go/sdk/job-scheduler/app.go b/jobs/go/sdk/job-scheduler/app.go index c3619a683..c99e8d858 100644 --- a/jobs/go/sdk/job-scheduler/app.go +++ b/jobs/go/sdk/job-scheduler/app.go @@ -38,18 +38,26 @@ type Droid struct { Jobs []string } -type DroidJob struct { - DroidName string - DroidJob string +type Metadata struct { + DroidName string `json:"droidName"` +} + +type DroidTask struct { + Task string `json:"task"` + Metadata Metadata `json:"metadata"` } func main() { // Define the droids and their maintenance jobs + // droids := []Droid{ + // {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + // {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + // {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + // } + droids := []Droid{ - {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, - {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, - {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + {Name: "R2-D2", Jobs: []string{"Oil Change"}}, } //Create new Dapr client @@ -64,32 +72,33 @@ func main() { for _, job := range droid.Jobs { //create maintenance job - droidJob := DroidJob{ - DroidName: droid.Name, - DroidJob: job, - } - - jobData, err := json.Marshal(droidJob) - if err != nil { - log.Fatalf("failed to marshall job %v: %v", droidJob.DroidJob, err) + task := DroidTask{ + Task: job, + Metadata: Metadata{ + DroidName: droid.Name, + }, } ctx := context.Background() //schedule job - scheduleJob(ctx, droidJob, jobData) + scheduleJob(ctx, task) } } } -func scheduleJob(ctx context.Context, droidJob DroidJob, jobData []byte) { +func scheduleJob(ctx context.Context, task DroidTask) { + + jobData, err := json.Marshal(task) + if err != nil { + log.Fatalf("failed to marshall job %v: %v", task.Metadata.DroidName, err) + } + // schedule job job := daprc.Job{ - Name: droidJob.DroidName, - Schedule: "@every 10s", + Name: task.Metadata.DroidName, + Schedule: "@every 5s", Repeats: 10, - TTL: "60s", - DueTime: "1s", Data: &anypb.Any{ Value: jobData, }, @@ -97,12 +106,17 @@ func scheduleJob(ctx context.Context, droidJob DroidJob, jobData []byte) { fmt.Printf("Scheduling job %+v\n", job) - err := daprClient.ScheduleJobAlpha1(ctx, &job) + err = daprClient.ScheduleJobAlpha1(ctx, &job) if err != nil { - fmt.Printf("failed to schedule job for %v: %v", droidJob.DroidName, err) + fmt.Println("failed to schedule job. err: ", err) } - fmt.Println("schedulejob - success") - time.Sleep(3 * time.Second) + + resp, err := daprClient.GetJobAlpha1(ctx, task.Metadata.DroidName) + if err != nil { + fmt.Println("failed to get job. err: ", task.Metadata.DroidName, err) + } + fmt.Println("getjob - resp: ", resp) // parse + } diff --git a/jobs/go/sdk/job-service/app.go b/jobs/go/sdk/job-service/app.go index f7fee41ad..e740951de 100644 --- a/jobs/go/sdk/job-service/app.go +++ b/jobs/go/sdk/job-service/app.go @@ -1,3 +1,16 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package main /* @@ -16,8 +29,6 @@ import ( daprs "github.com/dapr/go-sdk/service/grpc" ) -//var daprClient daprc.Client - // Define a Droid struct type Droid struct { Name string @@ -64,9 +75,13 @@ func main() { log.Fatalf("failed to start server: %v", err) } + // Brief intermission to allow for the server to initialize. + //time.Sleep(5 * time.Second) + } func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { + fmt.Println("Received job event") var jobData common.Job if err := json.Unmarshal(job.Data, &jobData); err != nil { return fmt.Errorf("failed to unmarshal job: %v", err) From 05cbdf3c072ed274a10871898f25a56ba746bbb8 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Wed, 17 Jul 2024 19:49:21 -0700 Subject: [PATCH 15/74] finishing sdk example Signed-off-by: Fernando Rocha --- jobs/go/http/job-service/job-service.go | 6 +- jobs/go/sdk/README.md | 136 ++++++------- jobs/go/sdk/dapr.yaml | 1 - jobs/go/sdk/job-scheduler/app.go | 122 ----------- jobs/go/sdk/job-scheduler/go.mod | 12 +- jobs/go/sdk/job-scheduler/go.sum | 4 +- jobs/go/sdk/job-scheduler/job-scheduler.go | 153 ++++++++++++++ jobs/go/sdk/job-service/app.go | 99 --------- jobs/go/sdk/job-service/go.mod | 6 +- jobs/go/sdk/job-service/go.sum | 4 +- jobs/go/sdk/job-service/job-service.go | 223 +++++++++++++++++++++ 11 files changed, 450 insertions(+), 316 deletions(-) delete mode 100644 jobs/go/sdk/job-scheduler/app.go create mode 100644 jobs/go/sdk/job-scheduler/job-scheduler.go delete mode 100644 jobs/go/sdk/job-service/app.go create mode 100644 jobs/go/sdk/job-service/job-service.go diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 8c841f7f7..fc72be67e 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -24,10 +24,6 @@ import ( "strings" ) -/* -dapr run --app-id job-app --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . -*/ - type Job struct { TypeURL string `json:"type_url"` Value string `json:"value"` @@ -41,7 +37,7 @@ type DroidJob struct { func main() { appPort := os.Getenv("APP_PORT") if appPort == "" { - appPort = "5280" + appPort = "5200" } // Setup job handler diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index ea1943d5d..193969d82 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,4 +1,4 @@ -# Dapr Hobs +# Dapr Jobs In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -20,14 +20,19 @@ Open a new terminal window and run the multi app run template: com.service @@ -19,12 +19,12 @@ org.json json - 20211205 + 20240303 com.fasterxml.jackson.core jackson-databind - 2.13.0 + 2.17.1 org.springframework.boot @@ -33,7 +33,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -42,7 +42,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/bindings/java/sdk/batch/pom.xml b/bindings/java/sdk/batch/pom.xml index e69fdbb2f..99d1ef406 100644 --- a/bindings/java/sdk/batch/pom.xml +++ b/bindings/java/sdk/batch/pom.xml @@ -4,7 +4,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service @@ -19,7 +19,7 @@ com.squareup.okhttp3 okhttp - 4.9.0 + 4.12.0 org.springframework.boot @@ -38,13 +38,13 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true com.fasterxml.jackson.core jackson-databind - 2.13.0 + 2.17.1 @@ -53,12 +53,12 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.3.1 diff --git a/configuration/java/http/README.md b/configuration/java/http/README.md index 9d051c86f..4eceaab1d 100644 --- a/configuration/java/http/README.md +++ b/configuration/java/http/README.md @@ -13,10 +13,10 @@ This quickstart includes one service: ## Prerequisites - [Maven 3.x](https://maven.apache.org/install.html) -- Java JDK 11 (or greater): - - [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - - [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - - [OpenJDK 11](https://jdk.java.net/11/) +- Java JDK 17 (or greater): + - [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + - [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + - [OpenJDK 17](https://jdk.java.net/17/) - Locally running redis container - a redis container named `dapr_redis` is automatically created when you run `dapr init` ## Add configuration items to the config store diff --git a/configuration/java/http/order-processor/pom.xml b/configuration/java/http/order-processor/pom.xml index 4133cac6f..fa385cedb 100644 --- a/configuration/java/http/order-processor/pom.xml +++ b/configuration/java/http/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 @@ -25,7 +25,7 @@ org.json json - 20220924 + 20240303 @@ -33,7 +33,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/configuration/java/sdk/README.md b/configuration/java/sdk/README.md index 9e10db014..2b1f0fd20 100644 --- a/configuration/java/sdk/README.md +++ b/configuration/java/sdk/README.md @@ -11,10 +11,10 @@ This quickstart includes one service: ## Prerequisites - [Maven 3.x](https://maven.apache.org/install.html) -- Java JDK 11 (or greater): - - [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - - [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - - [OpenJDK 11](https://jdk.java.net/11/) +- Java JDK 17 (or greater): + - [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + - [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + - [OpenJDK 17](https://jdk.java.net/17/) - Locally running redis container - a redis container named `dapr_redis` is automatically created when you run `dapr init` ## Add configuration items to the config store diff --git a/configuration/java/sdk/order-processor/pom.xml b/configuration/java/sdk/order-processor/pom.xml index 1c39418e3..bd2be05d2 100644 --- a/configuration/java/sdk/order-processor/pom.xml +++ b/configuration/java/sdk/order-processor/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ io.projectreactor reactor-core - 3.4.0 + 3.6.7 @@ -31,7 +31,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java b/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java index dfd962ff3..a13b86241 100644 --- a/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java +++ b/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java @@ -1,7 +1,6 @@ package com.service; import io.dapr.client.DaprClientBuilder; -import io.dapr.client.DaprPreviewClient; import io.dapr.client.DaprClient; import io.dapr.client.domain.ConfigurationItem; import io.dapr.client.domain.SubscribeConfigurationResponse; diff --git a/pub_sub/java/http/README.md b/pub_sub/java/http/README.md index 1324d7967..dbda087a7 100644 --- a/pub_sub/java/http/README.md +++ b/pub_sub/java/http/README.md @@ -17,10 +17,10 @@ And one subscriber: ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. ## Run all apps with multi-app run template file: diff --git a/pub_sub/java/http/checkout/pom.xml b/pub_sub/java/http/checkout/pom.xml index 2c262b906..c0ab87867 100644 --- a/pub_sub/java/http/checkout/pom.xml +++ b/pub_sub/java/http/checkout/pom.xml @@ -11,13 +11,13 @@ 17 17 - 1.6.1 + 2.0.13 org.json json - 20211205 + 20240303 org.slf4j @@ -35,7 +35,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/pub_sub/java/http/order-processor/pom.xml b/pub_sub/java/http/order-processor/pom.xml index 8e127b431..5cef1ed2d 100644 --- a/pub_sub/java/http/order-processor/pom.xml +++ b/pub_sub/java/http/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service @@ -24,7 +24,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -33,7 +33,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/pub_sub/java/sdk/README.md b/pub_sub/java/sdk/README.md index 7bed80ac5..4425cd446 100644 --- a/pub_sub/java/sdk/README.md +++ b/pub_sub/java/sdk/README.md @@ -17,10 +17,10 @@ And one subscriber: ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. ## Run all apps with multi-app run template file: diff --git a/pub_sub/java/sdk/checkout/pom.xml b/pub_sub/java/sdk/checkout/pom.xml index 8d5abf89d..61467fa37 100644 --- a/pub_sub/java/sdk/checkout/pom.xml +++ b/pub_sub/java/sdk/checkout/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ com.squareup.okhttp3 okhttp - 4.9.0 + 4.12.0 org.slf4j @@ -37,7 +37,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -47,7 +47,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/pub_sub/java/sdk/order-processor/pom.xml b/pub_sub/java/sdk/order-processor/pom.xml index adee52775..011fd2be5 100644 --- a/pub_sub/java/sdk/order-processor/pom.xml +++ b/pub_sub/java/sdk/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service @@ -34,7 +34,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -44,12 +44,12 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.3.1 diff --git a/secrets_management/java/http/order-processor/pom.xml b/secrets_management/java/http/order-processor/pom.xml index 3c8a4f69d..521809649 100644 --- a/secrets_management/java/http/order-processor/pom.xml +++ b/secrets_management/java/http/order-processor/pom.xml @@ -21,7 +21,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/secrets_management/java/sdk/order-processor/pom.xml b/secrets_management/java/sdk/order-processor/pom.xml index 53c96875c..f13f28a87 100644 --- a/secrets_management/java/sdk/order-processor/pom.xml +++ b/secrets_management/java/sdk/order-processor/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/service_invocation/java/http/README.md b/service_invocation/java/http/README.md index 6fa25dbd3..ff93315e8 100644 --- a/service_invocation/java/http/README.md +++ b/service_invocation/java/http/README.md @@ -15,10 +15,10 @@ And one order processor service: ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. ## Run all apps with multi-app run template file: diff --git a/service_invocation/java/http/checkout/pom.xml b/service_invocation/java/http/checkout/pom.xml index c9a1d12fe..2796decff 100644 --- a/service_invocation/java/http/checkout/pom.xml +++ b/service_invocation/java/http/checkout/pom.xml @@ -11,13 +11,13 @@ 17 17 - 1.6.1 + 2.0.13 org.json json - 20211205 + 20240303 @@ -25,7 +25,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/service_invocation/java/http/order-processor/pom.xml b/service_invocation/java/http/order-processor/pom.xml index d1f6531a0..d88682cdb 100644 --- a/service_invocation/java/http/order-processor/pom.xml +++ b/service_invocation/java/http/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service diff --git a/state_management/java/http/README.md b/state_management/java/http/README.md index f77fef506..d3e4be489 100644 --- a/state_management/java/http/README.md +++ b/state_management/java/http/README.md @@ -9,10 +9,10 @@ Visit [this](https://docs.dapr.io/developing-applications/building-blocks/state- ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. This quickstart includes one service: Java client service `order-processor` diff --git a/state_management/java/http/order-processor/pom.xml b/state_management/java/http/order-processor/pom.xml index 86e3f98e0..f112a4e99 100644 --- a/state_management/java/http/order-processor/pom.xml +++ b/state_management/java/http/order-processor/pom.xml @@ -12,19 +12,19 @@ 17 17 - 1.6.1 + 2.0.13 org.projectlombok lombok - 1.18.24 + 1.18.32 true com.fasterxml.jackson.core jackson-databind - 2.9.8 + 2.17.1 @@ -32,7 +32,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/state_management/java/sdk/README.md b/state_management/java/sdk/README.md index 89b5abbe9..473c71230 100644 --- a/state_management/java/sdk/README.md +++ b/state_management/java/sdk/README.md @@ -9,10 +9,10 @@ Visit [this](https://docs.dapr.io/developing-applications/building-blocks/state- ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. This quickstart includes one service: Java client service `order-processor` diff --git a/state_management/java/sdk/order-processor/pom.xml b/state_management/java/sdk/order-processor/pom.xml index 7880fa049..9dcf72eef 100644 --- a/state_management/java/sdk/order-processor/pom.xml +++ b/state_management/java/sdk/order-processor/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -32,7 +32,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/workflows/java/sdk/order-processor/pom.xml b/workflows/java/sdk/order-processor/pom.xml index 6388ec247..108bea7f4 100644 --- a/workflows/java/sdk/order-processor/pom.xml +++ b/workflows/java/sdk/order-processor/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ org.slf4j slf4j-simple - 1.7.36 + 2.0.13 @@ -31,7 +31,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 From 46ae1d976eb3b46ad2651a7d965cfcdc1d46a847 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 22 Jul 2024 13:26:35 -0700 Subject: [PATCH 24/74] fixing sdk implementation Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 1 - jobs/go/sdk/README.md | 4 ++-- jobs/go/sdk/job-scheduler/go.mod | 5 +---- jobs/go/sdk/job-scheduler/go.sum | 2 ++ jobs/go/sdk/job-service/go.mod | 5 +---- jobs/go/sdk/job-service/go.sum | 4 ++++ jobs/go/sdk/job-service/job-service.go | 4 +--- 7 files changed, 11 insertions(+), 14 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 35a6388a5..46aea5ad0 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -23,7 +23,6 @@ expected_stdout_lines: - '== APP - job-service == Received job request...' - '== APP - job-service == Executing maintenance job: Oil Change' - '== APP - job-scheduler == Job Scheduled: C-3PO' - - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "value":"C-3PO:Limb Calibration"}}' - '== APP - job-service == Received job request...' - '== APP - job-service == Executing maintenance job: Limb Calibration' expected_stderr_lines: diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 6121660bb..955c44366 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -112,7 +112,7 @@ The output should be: == APP == Registered job handler for: R2-D2 == APP == Registered job handler for: C-3PO == APP == Registered job handler for: BB-8 -== APP == Starting server on port: 5200 +== APP == Starting server on port: 6200 ``` 2. On a new terminal window, run the `job-scheduler` app: @@ -124,7 +124,7 @@ dapr run --app-id job-scheduler --app-port 6300 -- go run . The output should be: ```text -== APP == dapr client initializing for: 127.0.0.1:63896 +== APP == dapr client initializing for: == APP == Get job response: {"droid":"C-3PO","Task":"Memory Wipe"} == APP == Get job response: {"droid":"BB-8","Task":"Internal Gyroscope Check"} == APP == Job deleted: BB-8 diff --git a/jobs/go/sdk/job-scheduler/go.mod b/jobs/go/sdk/job-scheduler/go.mod index b45ba4396..0660c25b8 100644 --- a/jobs/go/sdk/job-scheduler/go.mod +++ b/jobs/go/sdk/job-scheduler/go.mod @@ -2,7 +2,7 @@ module dapr_job_example go 1.22.5 -require github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 +require github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 require ( github.com/dapr/dapr v1.14.0-rc.2 // indirect @@ -17,6 +17,3 @@ require ( google.golang.org/protobuf v1.34.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 -replace github.com/dapr/go-sdk => /Users/rocha/Developer/dapr/go-sdk diff --git a/jobs/go/sdk/job-scheduler/go.sum b/jobs/go/sdk/job-scheduler/go.sum index b7cefaca8..2d3213c68 100644 --- a/jobs/go/sdk/job-scheduler/go.sum +++ b/jobs/go/sdk/job-scheduler/go.sum @@ -1,6 +1,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 h1:zFl/d1LAz/dwCApp5HRsRC8eabB0SkAqEAqyB5f4XYA= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164/go.mod h1:Xit2/1Go+fYy/TXrpf8oEefluvXtuvmC+nKEd3wJdQE= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= diff --git a/jobs/go/sdk/job-service/go.mod b/jobs/go/sdk/job-service/go.mod index 89212104b..2245c2f13 100644 --- a/jobs/go/sdk/job-service/go.mod +++ b/jobs/go/sdk/job-service/go.mod @@ -3,7 +3,7 @@ module dapr_job_example go 1.22.5 require ( - github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 + github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 google.golang.org/protobuf v1.34.2 ) @@ -19,6 +19,3 @@ require ( google.golang.org/grpc v1.65.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 -replace github.com/dapr/go-sdk => /Users/rocha/Developer/dapr/go-sdk diff --git a/jobs/go/sdk/job-service/go.sum b/jobs/go/sdk/job-service/go.sum index b7cefaca8..c5e81fe8a 100644 --- a/jobs/go/sdk/job-service/go.sum +++ b/jobs/go/sdk/job-service/go.sum @@ -1,6 +1,10 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 h1:zFl/d1LAz/dwCApp5HRsRC8eabB0SkAqEAqyB5f4XYA= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164/go.mod h1:Xit2/1Go+fYy/TXrpf8oEefluvXtuvmC+nKEd3wJdQE= +github.com/dapr/go-sdk v1.10.1 h1:g6mM2RXyGkrzsqWFfCy8rw+UAt1edQEgRaQXT+XP4PE= +github.com/dapr/go-sdk v1.10.1/go.mod h1:lPjyF/xubh35fbdNdKkxBbFxFNCmta4zmvsk0JxuUG0= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 9ce2b244f..1e6c76f53 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -29,10 +29,8 @@ import ( "github.com/dapr/go-sdk/service/common" "google.golang.org/protobuf/types/known/anypb" - daprs "github.com/dapr/go-sdk/service/grpc" - //daprs "github.com/dapr/go-sdk/service/http" - daprc "github.com/dapr/go-sdk/client" + daprs "github.com/dapr/go-sdk/service/grpc" ) type App struct { From 9771c41f106c85ece993d6949c0553e050bf6327 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 22 Jul 2024 14:45:00 -0700 Subject: [PATCH 25/74] Update README.md Co-authored-by: Cassie Coyle Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 46aea5ad0..d67823646 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -2,7 +2,7 @@ In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. +Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Jobs API. > **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). From 632e8f60666ec2a3627a7ae34ca9ec39a8c80675 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 22 Jul 2024 23:26:16 -0700 Subject: [PATCH 26/74] fixing ports on README files Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 4 ++-- jobs/go/sdk/README.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index d67823646..1540dac8f 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -136,13 +136,13 @@ You should see the following: 1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. ```bash -curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +curl -X DELETE http://localhost:6280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` 2. Run the command below to attempt to retrieve the deleted job: ```bash -curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +curl -X GET http://localhost:6280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` Back at the `job-service` app terminal window, the output should be: diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 955c44366..ea38f916f 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -58,11 +58,11 @@ The terminal console output should look similar to this, where: ```text -== APP - job-service == dapr client initializing for: 127.0.0.1:5281 +== APP - job-service == dapr client initializing for: 127.0.0.1:6281 == APP - job-service == Registered job handler for: R2-D2 == APP - job-service == Registered job handler for: C-3PO == APP - job-service == Registered job handler for: BB-8 -== APP - job-service == Starting server on port: 5200 +== APP - job-service == Starting server on port: 6200 == APP - job-service == Job scheduled: R2-D2 == APP - job-service == Job scheduled: C-3PO == APP - job-service == 2024/07/17 18:09:59 job:{name:"C-3PO" due_time:"10s" data:{value:"{\"droid\":\"C-3PO\",\"Task\":\"Memory Wipe\"}"}} @@ -108,7 +108,7 @@ dapr run --app-id job-service --app-port 6200 --dapr-http-port 6280 --dapr-grpc- The output should be: ```text -== APP == dapr client initializing for: 127.0.0.1:5281 +== APP == dapr client initializing for: 127.0.0.1:6281 == APP == Registered job handler for: R2-D2 == APP == Registered job handler for: C-3PO == APP == Registered job handler for: BB-8 From 64c14d6c4927c75ff1a9c7b8990dadad45ba8db1 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:12:38 -0700 Subject: [PATCH 27/74] Update jobs/go/http/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/http/job-service/job-service.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index ba7af6f29..1738d8bdf 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -59,8 +59,6 @@ func handleJob(w http.ResponseWriter, r *http.Request) { return } - //fmt.Println("Raw request body:", string(rawBody)) - var jobData Job if err := json.Unmarshal(rawBody, &jobData); err != nil { http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) From 06a5e46c84426d6d90d6028f78f350e89b49546f Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:21 -0700 Subject: [PATCH 28/74] Update jobs/go/sdk/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/sdk/job-service/job-service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 1e6c76f53..4f5b94711 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -185,7 +185,7 @@ func deleteJob(ctx context.Context, in *common.InvocationEvent) (out *common.Con return nil, err } - err = app.daprClient.DeleteJobAlpha1(context.Background(), string(in.Data)) + err = app.daprClient.DeleteJobAlpha1(ctx, string(in.Data)) if err != nil { fmt.Println("failed to delete job. err: ", err) } From 9205cd2c0ad620d513c4af54223f1ae96a4eddf1 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:32 -0700 Subject: [PATCH 29/74] Update jobs/go/sdk/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/sdk/job-service/job-service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 4f5b94711..18c21e82f 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -164,7 +164,7 @@ func getJob(ctx context.Context, in *common.InvocationEvent) (out *common.Conten return nil, err } - job, err := app.daprClient.GetJobAlpha1(context.Background(), string(in.Data)) + job, err := app.daprClient.GetJobAlpha1(ctx, string(in.Data)) if err != nil { fmt.Println("failed to get job. err: ", err) } From 2ee189fadad0c0b47d1b454ca02d869061bf1410 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:41 -0700 Subject: [PATCH 30/74] Update jobs/go/sdk/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/sdk/job-service/job-service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 18c21e82f..f056f2236 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -138,7 +138,7 @@ func scheduleJob(ctx context.Context, in *common.InvocationEvent) (out *common.C }, } - err = app.daprClient.ScheduleJobAlpha1(context.Background(), &job) + err = app.daprClient.ScheduleJobAlpha1(ctx, &job) if err != nil { fmt.Println("failed to schedule job. err: ", err) return nil, err From af757cd23709f29a2b289bb4e8871b4db63050f3 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:50 -0700 Subject: [PATCH 31/74] Update jobs/go/http/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/http/job-service/job-service.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 1738d8bdf..0eca44437 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -73,8 +73,6 @@ func handleJob(w http.ResponseWriter, r *http.Request) { return } - //fmt.Println("decoded value:", string(decodedValue)) - // Creating Droid Job from decoded value droidJob := setDroidJob(string(decodedValue)) From 1ac487e3fb815e2bf37fa03f03e114d75dbdf472 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:16:43 -0700 Subject: [PATCH 32/74] Update .github/env/global.env Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- .github/env/global.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/env/global.env b/.github/env/global.env index 70f766058..6abaee063 100644 --- a/.github/env/global.env +++ b/.github/env/global.env @@ -1,4 +1,4 @@ - DAPR_CLI_VERSION: 1.13.0 + DAPR_CLI_VERSION: 1.14.0-rc.6 DAPR_RUNTIME_VERSION: 1.13.5 DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v${DAPR_CLI_VERSION}/install/ DAPR_DEFAULT_IMAGE_REGISTRY: ghcr From 728b2285af291f07147ac8b18e47d2abcd2d0e29 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:16:49 -0700 Subject: [PATCH 33/74] Update .github/env/global.env Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- .github/env/global.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/env/global.env b/.github/env/global.env index 6abaee063..8ac1fd2a8 100644 --- a/.github/env/global.env +++ b/.github/env/global.env @@ -1,5 +1,5 @@ DAPR_CLI_VERSION: 1.14.0-rc.6 - DAPR_RUNTIME_VERSION: 1.13.5 + DAPR_RUNTIME_VERSION: 1.14.0-rc.5 DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v${DAPR_CLI_VERSION}/install/ DAPR_DEFAULT_IMAGE_REGISTRY: ghcr MACOS_PYTHON_VERSION: 3.10 From 4a35b99d162cab3c36c8c5aead71a90b12fe9636 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:19:02 -0700 Subject: [PATCH 34/74] fixing README typo Signed-off-by: Fernando Rocha --- jobs/go/sdk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index ea38f916f..27dc67615 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -4,7 +4,7 @@ In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. -> **Note:** This example leverages the SDK only. If you are looking for the example using the HTTP requests (recommended) [click here](../http/). +> **Note:** This example leverages the SDK only. If you are looking for the example using the HTTP requests [click here](../http/). This quickstart includes two apps: From e6d7aed6004da26858c94f70d44594fbfb8ebfe5 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 12:16:42 -0700 Subject: [PATCH 35/74] Increasing sleep to validate tests --- jobs/go/sdk/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 27dc67615..4321e9b77 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -37,8 +37,8 @@ expected_stderr_lines: output_match_mode: substring match_order: none background: true -sleep: 60 -timeout_seconds: 120 +sleep: 120 +timeout_seconds: 180 --> ```bash From 34466b430ac2c0bf39feeb0607a4f31a0b13a254 Mon Sep 17 00:00:00 2001 From: salaboy Date: Thu, 27 Jun 2024 19:49:22 +0100 Subject: [PATCH 36/74] updating Kubernetes hello quickstart to support endpoint env vars (#1030) Signed-off-by: salaboy Signed-off-by: Fernando Rocha --- tutorials/hello-kubernetes/node/app.js | 12 ++++++------ tutorials/hello-kubernetes/python/app.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tutorials/hello-kubernetes/node/app.js b/tutorials/hello-kubernetes/node/app.js index 68fe0dc4e..996139602 100644 --- a/tutorials/hello-kubernetes/node/app.js +++ b/tutorials/hello-kubernetes/node/app.js @@ -19,11 +19,11 @@ const app = express(); app.use(bodyParser.json()); // These ports are injected automatically into the container. -const daprPort = process.env.DAPR_HTTP_PORT ?? "3500"; -const daprGRPCPort = process.env.DAPR_GRPC_PORT ?? "50001"; +const daprHttpEndpoint = process.env.DAPR_HTTP_ENDPOINT ?? "http://localhost:3500"; +const daprGRPCEndpoint = process.env.DAPR_GRPC_ENDPOINT ?? "http://localhost:50001"; const stateStoreName = process.env.STATE_STORE_NAME ?? "statestore"; -const stateUrl = `http://localhost:${daprPort}/v1.0/state/${stateStoreName}`; +const stateUrl = `${daprHttpEndpoint}/v1.0/state/${stateStoreName}`; const port = process.env.APP_PORT ?? "3000"; app.get('/order', async (_req, res) => { @@ -71,9 +71,9 @@ app.post('/neworder', async (req, res) => { }); app.get('/ports', (_req, res) => { - console.log("DAPR_HTTP_PORT: " + daprPort); - console.log("DAPR_GRPC_PORT: " + daprGRPCPort); - res.status(200).send({DAPR_HTTP_PORT: daprPort, DAPR_GRPC_PORT: daprGRPCPort }) + console.log("DAPR_HTTP_ENDPOINT: " + daprHttpEndpoint); + console.log("DAPR_GRPC_ENDPOINT: " + daprGRPCEndpoint); + res.status(200).send({DAPR_HTTP_ENDPOINT: daprHttpEndpoint, DAPR_GRPC_ENDPOINT: daprGRPCEndpoint }) }); app.listen(port, () => console.log(`Node App listening on port ${port}!`)); diff --git a/tutorials/hello-kubernetes/python/app.py b/tutorials/hello-kubernetes/python/app.py index c9264af30..cb7cbd469 100644 --- a/tutorials/hello-kubernetes/python/app.py +++ b/tutorials/hello-kubernetes/python/app.py @@ -15,8 +15,8 @@ import requests import time -dapr_port = os.getenv("DAPR_HTTP_PORT", 3500) -dapr_url = "http://localhost:{}/neworder".format(dapr_port) +dapr_http_endpoint = os.getenv("DAPR_HTTP_ENDPOINT", "http://localhost:3500") +dapr_url = "{}/neworder".format(dapr_http_endpoint) n = 0 while True: From 44f84320e6828194f235fe86fe5285f655e398fd Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 4 Jul 2024 11:43:42 -0700 Subject: [PATCH 37/74] first commit Signed-off-by: Fernando Rocha --- job/go/http/README.md | 66 +++++++++++ job/go/http/batch/app.go | 122 ++++++++++++++++++++ job/go/http/batch/go.mod | 6 + job/go/http/batch/go.sum | 2 + job/go/http/makefile | 2 + job/go/sdk/README.md | 66 +++++++++++ job/go/sdk/maintenance-scheduler/app.go | 147 ++++++++++++++++++++++++ job/go/sdk/maintenance-scheduler/go.mod | 21 ++++ job/go/sdk/maintenance-scheduler/go.sum | 43 +++++++ job/go/sdk/makefile | 2 + 10 files changed, 477 insertions(+) create mode 100644 job/go/http/README.md create mode 100644 job/go/http/batch/app.go create mode 100644 job/go/http/batch/go.mod create mode 100644 job/go/http/batch/go.sum create mode 100644 job/go/http/makefile create mode 100644 job/go/sdk/README.md create mode 100644 job/go/sdk/maintenance-scheduler/app.go create mode 100644 job/go/sdk/maintenance-scheduler/go.mod create mode 100644 job/go/sdk/maintenance-scheduler/go.sum create mode 100644 job/go/sdk/makefile diff --git a/job/go/http/README.md b/job/go/http/README.md new file mode 100644 index 000000000..9fa3984d2 --- /dev/null +++ b/job/go/http/README.md @@ -0,0 +1,66 @@ +# Dapr Scheduler (HTTP) + +In this quickstart, you'll create a microservice to demonstrate Dapr's scheudler API to work with external systems as inputs and outputs. The service listens to input binding events from a system CRON and then outputs the contents of local data to a PostreSql output binding. + +Visit [this](https://docs.dapr.io/developing-applications/building-blocks/bindings/) link for more information about Dapr and Bindings. + +> **Note:** This example leverages only HTTP REST. If you are looking for the example using the Dapr SDK [click here](../sdk). + +This quickstart includes one service: + +- Go service `app` + +### Run and initialize PostgreSQL container + +1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): + + + +```bash +cd ../../db +docker-compose up +``` + + + +### Run Go service with Dapr + +2. Open a new terminal, change directories to `./batch` in the quickstart directory and run: + + + +```bash +cd ./batch +go build . +``` + + +3. Run the Go service app with Dapr: + + + +```bash +dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . +``` + + diff --git a/job/go/http/batch/app.go b/job/go/http/batch/app.go new file mode 100644 index 000000000..54a6f697f --- /dev/null +++ b/job/go/http/batch/app.go @@ -0,0 +1,122 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +/* +dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . +*/ + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "strconv" + "strings" + + "github.com/gorilla/mux" +) + +var ( + cronBindingName, sqlBindingName string = "cron", "sqldb" +) + +type Orders struct { + Orders []Order `json:"orders"` +} + +type Order struct { + OrderId int `json:"orderid"` + Customer string `json:"customer"` + Price float64 `json:"price"` +} + +func processBatch(w http.ResponseWriter, r *http.Request) { + + fmt.Println("Processing batch..") + + fileContent, err := os.Open("../../../orders.json") + if err != nil { + log.Fatal(err) + return + } + + defer fileContent.Close() + + byteResult, _ := io.ReadAll(fileContent) + + var orders Orders + + json.Unmarshal(byteResult, &orders) + + for i := 0; i < len(orders.Orders); i++ { + err := sqlOutput(orders.Orders[i]) + if err != nil { + log.Fatal(err) + os.Exit(1) + } + } + fmt.Println("Finished processing batch") + +} + +func sqlOutput(order Order) (err error) { + var daprHost, daprHttpPort string + var okHost, okPort bool + + if daprHost, okHost = os.LookupEnv("DAPR_HOST"); !okHost { + daprHost = "http://localhost" + } + + if daprHttpPort, okPort = os.LookupEnv("DAPR_HTTP_PORT"); !okPort { + daprHttpPort = "3503" + } + + var daprUrl string = daprHost + ":" + daprHttpPort + "/v1.0/bindings/" + sqlBindingName + + sqlCmd := fmt.Sprintf("insert into orders (orderid, customer, price) values (%d, '%s', %s);", order.OrderId, order.Customer, strconv.FormatFloat(order.Price, 'f', 2, 64)) + + payload := `{"operation": "exec", "metadata": {"sql": "` + sqlCmd + `" }}` + fmt.Println(sqlCmd) + + client := http.Client{} + // Insert order using Dapr output binding via HTTP Post + req, err := http.NewRequest("POST", daprUrl, strings.NewReader(payload)) + if err != nil { + return err + } + if _, err = client.Do(req); err != nil { + return err + } + return nil +} + +func main() { + var appPort string + var okHost bool + if appPort, okHost = os.LookupEnv("APP_PORT"); !okHost { + appPort = "6003" + } + + r := mux.NewRouter() + + // Triggered by Dapr input binding + r.HandleFunc("/"+cronBindingName, processBatch).Methods("POST") + + if err := http.ListenAndServe(":"+appPort, r); err != nil { + log.Panic(err) + } +} diff --git a/job/go/http/batch/go.mod b/job/go/http/batch/go.mod new file mode 100644 index 000000000..f0ca12514 --- /dev/null +++ b/job/go/http/batch/go.mod @@ -0,0 +1,6 @@ +module dapr_job_example + +go 1.22.4 + + +require github.com/gorilla/mux v1.8.0 diff --git a/job/go/http/batch/go.sum b/job/go/http/batch/go.sum new file mode 100644 index 000000000..535028803 --- /dev/null +++ b/job/go/http/batch/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/job/go/http/makefile b/job/go/http/makefile new file mode 100644 index 000000000..e7a8826bf --- /dev/null +++ b/job/go/http/makefile @@ -0,0 +1,2 @@ +include ../../../docker.mk +include ../../../validate.mk \ No newline at end of file diff --git a/job/go/sdk/README.md b/job/go/sdk/README.md new file mode 100644 index 000000000..51b16c489 --- /dev/null +++ b/job/go/sdk/README.md @@ -0,0 +1,66 @@ +# Dapr Job (Dapr SDK) + +In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. + +Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. + +> **Note:** This example leverages the Dapr SDK. If you are looking for the example using HTTP REST only [click here](../http). + +This quickstart includes one service: + +- Go service `app` + +### Run and initialize PostgreSQL container + +1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): + + + +```bash +cd ../../db +docker-compose up +``` + + + +### Run Go service with Dapr + +2. Open a new terminal window, change directories to `./batch` in the quickstart directory and run: + + + +```bash +cd ./batch +go build . +``` + + +3. Run the Go service app with Dapr: + + + +```bash +dapr run --app-id batch-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 --resources-path ../../../components -- go run . +``` + + diff --git a/job/go/sdk/maintenance-scheduler/app.go b/job/go/sdk/maintenance-scheduler/app.go new file mode 100644 index 000000000..cd522c911 --- /dev/null +++ b/job/go/sdk/maintenance-scheduler/app.go @@ -0,0 +1,147 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +/* +dapr run --app-id job-sdk --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 -- go run . +*/ + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "log" + "time" + + daprc "github.com/mikeee/dapr_go-sdk/tree/feat-dist-scheduler/client" + + "github.com/dapr/go-sdk/service/common" + daprs "github.com/dapr/go-sdk/service/grpc" + + "google.golang.org/protobuf/types/known/anypb" +) + +var daprClient daprc.Client + +// Define a Droid struct +type Droid struct { + Name string + Jobs []string +} + +type MaintenanceJob struct { + JobName string + DroidName string + DroidJob string +} + +func main() { + + // Define the droids and their maintenance jobs + droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + } + + //Create new Dapr client + daprClient, err := daprc.NewClient() + if err != nil { + panic(err) + } + defer daprClient.Close() + + // Create a new Dapr service + server, err := daprs.NewService(":6003") + if err != nil { + log.Fatalf("failed to start the server: %v", err) + } + + log.Println("starting server") + go func() { + if err = server.Start(); err != nil { + log.Fatalf("failed to start server: %v", err) + } + }() + + // Brief intermission to allow for the server to initialize. + time.Sleep(10 * time.Second) + + // Setup handler and schedule jobs + for _, droid := range droids { + for _, job := range droid.Jobs { + + // create maintenance job + maintenanceJob := MaintenanceJob{ + JobName: droid.Name + " - " + job, + DroidName: droid.Name, + DroidJob: job, + } + + jobData, err := json.Marshal(maintenanceJob) + if err != nil { + log.Fatalf("failed to marshall job %v: %v", maintenanceJob.JobName, err) + } + + // setup job event handler + if err = server.AddJobEventHandler(maintenanceJob.JobName, droidMaintenanceHandler); err != nil { + log.Fatalf("failed to register job event handler: %v", err) + } + + ctx := context.Background() + // schedule job + scheduleJob(ctx, maintenanceJob, jobData) + + } + } +} + +func scheduleJob(ctx context.Context, maintenanceJob MaintenanceJob, jobData []byte) { + // schedule job + job := daprc.Job{ + Name: maintenanceJob.JobName, + Schedule: "@every 1s", + Repeats: 10, + Data: &anypb.Any{ + Value: jobData, + }, + } + + err := daprClient.ScheduleJobAlpha1(ctx, &job) + if err != nil { + log.Fatalf("failed to schedule job %v: %v", maintenanceJob.JobName, err) + } + + fmt.Println("schedulejob - success") + + time.Sleep(3 * time.Second) +} + +func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { + var jobData common.Job + if err := json.Unmarshal(job.Data, &jobData); err != nil { + return fmt.Errorf("failed to unmarshal job: %v", err) + } + decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) + if err != nil { + return fmt.Errorf("failed to decode job payload: %v", err) + } + var jobPayload MaintenanceJob + if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { + return fmt.Errorf("failed to unmarshal payload: %v", err) + } + fmt.Printf("Maintenance job %v received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobPayload.JobName, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) + return nil +} diff --git a/job/go/sdk/maintenance-scheduler/go.mod b/job/go/sdk/maintenance-scheduler/go.mod new file mode 100644 index 000000000..7e6f7d105 --- /dev/null +++ b/job/go/sdk/maintenance-scheduler/go.mod @@ -0,0 +1,21 @@ +module dapr_job_example + +go 1.22.4 + +require ( + github.com/dapr/go-sdk v1.10.0 + google.golang.org/protobuf v1.34.2 +) + +require ( + github.com/dapr/dapr v1.14.0-rc.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect + google.golang.org/grpc v1.64.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/job/go/sdk/maintenance-scheduler/go.sum b/job/go/sdk/maintenance-scheduler/go.sum new file mode 100644 index 000000000..64d75d54a --- /dev/null +++ b/job/go/sdk/maintenance-scheduler/go.sum @@ -0,0 +1,43 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dapr/dapr v1.14.0-rc.1 h1:4P376+PIU66hMtLz5TiF41IJ6Lh5FNY1DiwaNNYZv/8= +github.com/dapr/dapr v1.14.0-rc.1/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/dapr/go-sdk v1.10.0 h1:5b91e46Mu9Se0NqQ3ujFoD7gDRSbMhm2VNZpN0uuNa0= +github.com/dapr/go-sdk v1.10.0/go.mod h1:Wgisyn1yQx1PDU6xsuwxsQv9u7yiVHQOUFQNNQE/PXI= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/job/go/sdk/makefile b/job/go/sdk/makefile new file mode 100644 index 000000000..e7a8826bf --- /dev/null +++ b/job/go/sdk/makefile @@ -0,0 +1,2 @@ +include ../../../docker.mk +include ../../../validate.mk \ No newline at end of file From d3e096bc4831581ccaf3e2bbc15f961ba0822b6c Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 4 Jul 2024 23:07:52 -0700 Subject: [PATCH 38/74] first commit Signed-off-by: Fernando Rocha --- job/go/http/README.md | 88 ++++++++-------- job/go/http/batch/app.go | 122 ----------------------- job/go/http/batch/go.mod | 6 -- job/go/http/batch/go.sum | 2 - job/go/http/maintenance-scheduler/app.go | 42 ++++++++ job/go/http/maintenance-scheduler/go.mod | 5 + job/go/http/maintenance-scheduler/go.sum | 2 + job/go/sdk/README.md | 56 ++--------- 8 files changed, 106 insertions(+), 217 deletions(-) delete mode 100644 job/go/http/batch/app.go delete mode 100644 job/go/http/batch/go.mod delete mode 100644 job/go/http/batch/go.sum create mode 100644 job/go/http/maintenance-scheduler/app.go create mode 100644 job/go/http/maintenance-scheduler/go.mod create mode 100644 job/go/http/maintenance-scheduler/go.sum diff --git a/job/go/http/README.md b/job/go/http/README.md index 9fa3984d2..ec0b6b0d2 100644 --- a/job/go/http/README.md +++ b/job/go/http/README.md @@ -1,66 +1,70 @@ -# Dapr Scheduler (HTTP) +# Dapr Job (Dapr SDK) -In this quickstart, you'll create a microservice to demonstrate Dapr's scheudler API to work with external systems as inputs and outputs. The service listens to input binding events from a system CRON and then outputs the contents of local data to a PostreSql output binding. +In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -Visit [this](https://docs.dapr.io/developing-applications/building-blocks/bindings/) link for more information about Dapr and Bindings. +Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. -> **Note:** This example leverages only HTTP REST. If you are looking for the example using the Dapr SDK [click here](../sdk). +> **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). This quickstart includes one service: - Go service `app` -### Run and initialize PostgreSQL container +### Run and initialize the server -1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): +Open a new terminal, change directories to `/maintenance-scheduler`, and start the server: - +```bash +cd maintenance-scheduler +dapr run --app-id job-http --app-port 3500 --dapr-http-port 6002 --log-level debug -- go run . +``` + +### Schedule a job using an HTTP request + + Open a new terminal window and run: ```bash -cd ../../db -docker-compose up +curl -X POST \ + http://localhost:6002/v1.0-alpha1/jobs/r2-d2 \ + -H "Content-Type: application/json" + -d '{ + "job": { + "data": { + "maintenanceType": "Oil Change" + }, + "dueTime": "30s" + } + }' ``` - +You should see a `202` response. -### Run Go service with Dapr +### Get a scheduled job using an HTTP request -2. Open a new terminal, change directories to `./batch` in the quickstart directory and run: +On the same terminal window yoy used to schedule the job or a new one, run: - +```bash +curl -X GET http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" +``` + +You should see the following: ```bash -cd ./batch -go build . +{ + "name":"r2-d2", + "dueTime":"30s", + "data": { + "maintenanceType": "Oil Change" + } +} ``` - -3. Run the Go service app with Dapr: - - - +### Delete a scheduled job using an HTTP request + +On the same terminal window you used to schedule the job or a new one, run: + ```bash -dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . +curl -X DELETE http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" ``` - +You should see a `202` response. diff --git a/job/go/http/batch/app.go b/job/go/http/batch/app.go deleted file mode 100644 index 54a6f697f..000000000 --- a/job/go/http/batch/app.go +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2021 The Dapr Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -/* -dapr run --app-id batch-http --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 --resources-path ../../../components -- go run . -*/ - -import ( - "encoding/json" - "fmt" - "io" - "log" - "net/http" - "os" - "strconv" - "strings" - - "github.com/gorilla/mux" -) - -var ( - cronBindingName, sqlBindingName string = "cron", "sqldb" -) - -type Orders struct { - Orders []Order `json:"orders"` -} - -type Order struct { - OrderId int `json:"orderid"` - Customer string `json:"customer"` - Price float64 `json:"price"` -} - -func processBatch(w http.ResponseWriter, r *http.Request) { - - fmt.Println("Processing batch..") - - fileContent, err := os.Open("../../../orders.json") - if err != nil { - log.Fatal(err) - return - } - - defer fileContent.Close() - - byteResult, _ := io.ReadAll(fileContent) - - var orders Orders - - json.Unmarshal(byteResult, &orders) - - for i := 0; i < len(orders.Orders); i++ { - err := sqlOutput(orders.Orders[i]) - if err != nil { - log.Fatal(err) - os.Exit(1) - } - } - fmt.Println("Finished processing batch") - -} - -func sqlOutput(order Order) (err error) { - var daprHost, daprHttpPort string - var okHost, okPort bool - - if daprHost, okHost = os.LookupEnv("DAPR_HOST"); !okHost { - daprHost = "http://localhost" - } - - if daprHttpPort, okPort = os.LookupEnv("DAPR_HTTP_PORT"); !okPort { - daprHttpPort = "3503" - } - - var daprUrl string = daprHost + ":" + daprHttpPort + "/v1.0/bindings/" + sqlBindingName - - sqlCmd := fmt.Sprintf("insert into orders (orderid, customer, price) values (%d, '%s', %s);", order.OrderId, order.Customer, strconv.FormatFloat(order.Price, 'f', 2, 64)) - - payload := `{"operation": "exec", "metadata": {"sql": "` + sqlCmd + `" }}` - fmt.Println(sqlCmd) - - client := http.Client{} - // Insert order using Dapr output binding via HTTP Post - req, err := http.NewRequest("POST", daprUrl, strings.NewReader(payload)) - if err != nil { - return err - } - if _, err = client.Do(req); err != nil { - return err - } - return nil -} - -func main() { - var appPort string - var okHost bool - if appPort, okHost = os.LookupEnv("APP_PORT"); !okHost { - appPort = "6003" - } - - r := mux.NewRouter() - - // Triggered by Dapr input binding - r.HandleFunc("/"+cronBindingName, processBatch).Methods("POST") - - if err := http.ListenAndServe(":"+appPort, r); err != nil { - log.Panic(err) - } -} diff --git a/job/go/http/batch/go.mod b/job/go/http/batch/go.mod deleted file mode 100644 index f0ca12514..000000000 --- a/job/go/http/batch/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module dapr_job_example - -go 1.22.4 - - -require github.com/gorilla/mux v1.8.0 diff --git a/job/go/http/batch/go.sum b/job/go/http/batch/go.sum deleted file mode 100644 index 535028803..000000000 --- a/job/go/http/batch/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/job/go/http/maintenance-scheduler/app.go b/job/go/http/maintenance-scheduler/app.go new file mode 100644 index 000000000..c759a74ba --- /dev/null +++ b/job/go/http/maintenance-scheduler/app.go @@ -0,0 +1,42 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +/* +dapr run --app-id job-http --app-port 3500 --dapr-http-port 60021 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +import ( + "errors" + "log" + "net/http" + "os" + + "github.com/gorilla/mux" +) + +func main() { + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "6002" + } + + r := mux.NewRouter() + + // Start the server; this is a blocking call + err := http.ListenAndServe(":"+appPort, r) + if !errors.Is(err, http.ErrServerClosed) { + log.Panic(err) + } +} diff --git a/job/go/http/maintenance-scheduler/go.mod b/job/go/http/maintenance-scheduler/go.mod new file mode 100644 index 000000000..b8e020f76 --- /dev/null +++ b/job/go/http/maintenance-scheduler/go.mod @@ -0,0 +1,5 @@ +module dapr_job_example + +go 1.22.4 + +require github.com/gorilla/mux v1.8.1 diff --git a/job/go/http/maintenance-scheduler/go.sum b/job/go/http/maintenance-scheduler/go.sum new file mode 100644 index 000000000..712833743 --- /dev/null +++ b/job/go/http/maintenance-scheduler/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= diff --git a/job/go/sdk/README.md b/job/go/sdk/README.md index 51b16c489..a555928f9 100644 --- a/job/go/sdk/README.md +++ b/job/go/sdk/README.md @@ -10,57 +10,23 @@ This quickstart includes one service: - Go service `app` -### Run and initialize PostgreSQL container +### Run the Go service app with Dapr -1. Open a new terminal, change directories to `../../db`, and run the container with [Docker Compose](https://docs.docker.com/compose/): +This example will schedule 6 different droid manintenance jobs: - - -```bash -cd ../../db -docker-compose up +```go +droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, +} ``` - - -### Run Go service with Dapr - -2. Open a new terminal window, change directories to `./batch` in the quickstart directory and run: - - - -```bash -cd ./batch -go build . -``` - - -3. Run the Go service app with Dapr: +Open a terminal window and run, navigate to the `/maintenance-scheduler` folder and run: - - ```bash -dapr run --app-id batch-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 --resources-path ../../../components -- go run . +cd maintenance-scheduler +dapr run --app-id job-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 -- go run . ``` From b8d27f0c940758e06e8d873379f41ee4b3383164 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 09:54:53 -0700 Subject: [PATCH 39/74] Update README.md Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- job/go/http/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/job/go/http/README.md b/job/go/http/README.md index ec0b6b0d2..e091581d4 100644 --- a/job/go/http/README.md +++ b/job/go/http/README.md @@ -26,7 +26,7 @@ dapr run --app-id job-http --app-port 3500 --dapr-http-port 6002 --log-level deb ```bash curl -X POST \ http://localhost:6002/v1.0-alpha1/jobs/r2-d2 \ - -H "Content-Type: application/json" + -H "Content-Type: application/json" \ -d '{ "job": { "data": { From 7dad62cd24f1ab918c92bc52371728ade928ae76 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 10:04:01 -0700 Subject: [PATCH 40/74] Update README.md Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- job/go/http/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/job/go/http/README.md b/job/go/http/README.md index e091581d4..d5e933221 100644 --- a/job/go/http/README.md +++ b/job/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Job (Dapr SDK) +# Dapr Job (HTTP request) In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. From 783c1f2033d9eba2d7504b100b7d31d36951d1a1 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 13:40:27 -0700 Subject: [PATCH 41/74] folder name, dapr.yaml Signed-off-by: Fernando Rocha --- {job => jobs}/go/http/README.md | 4 ++-- jobs/go/http/dapr.yaml | 8 ++++++++ {job => jobs}/go/http/maintenance-scheduler/app.go | 2 +- {job => jobs}/go/http/maintenance-scheduler/go.mod | 0 {job => jobs}/go/http/maintenance-scheduler/go.sum | 0 {job => jobs}/go/http/makefile | 0 {job => jobs}/go/sdk/README.md | 1 + jobs/go/sdk/dapr.yaml | 9 +++++++++ {job => jobs}/go/sdk/maintenance-scheduler/app.go | 2 +- {job => jobs}/go/sdk/maintenance-scheduler/go.mod | 0 {job => jobs}/go/sdk/maintenance-scheduler/go.sum | 0 {job => jobs}/go/sdk/makefile | 0 12 files changed, 22 insertions(+), 4 deletions(-) rename {job => jobs}/go/http/README.md (92%) create mode 100644 jobs/go/http/dapr.yaml rename {job => jobs}/go/http/maintenance-scheduler/app.go (86%) rename {job => jobs}/go/http/maintenance-scheduler/go.mod (100%) rename {job => jobs}/go/http/maintenance-scheduler/go.sum (100%) rename {job => jobs}/go/http/makefile (100%) rename {job => jobs}/go/sdk/README.md (99%) create mode 100644 jobs/go/sdk/dapr.yaml rename {job => jobs}/go/sdk/maintenance-scheduler/app.go (97%) rename {job => jobs}/go/sdk/maintenance-scheduler/go.mod (100%) rename {job => jobs}/go/sdk/maintenance-scheduler/go.sum (100%) rename {job => jobs}/go/sdk/makefile (100%) diff --git a/job/go/http/README.md b/jobs/go/http/README.md similarity index 92% rename from job/go/http/README.md rename to jobs/go/http/README.md index d5e933221..ddcf54074 100644 --- a/job/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Job (HTTP request) +# Dapr Job (Dapr SDK) In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -16,7 +16,7 @@ Open a new terminal, change directories to `/maintenance-scheduler`, and start t ```bash cd maintenance-scheduler -dapr run --app-id job-http --app-port 3500 --dapr-http-port 6002 --log-level debug -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug -- go run . ``` ### Schedule a job using an HTTP request diff --git a/jobs/go/http/dapr.yaml b/jobs/go/http/dapr.yaml new file mode 100644 index 000000000..9a5a4ec96 --- /dev/null +++ b/jobs/go/http/dapr.yaml @@ -0,0 +1,8 @@ +version: 1 +apps: + - appDirPath: ./maintenance-scheduler/ + appID: maintenance-scheduler + appPort: 5200 + appProtocol: http + daprHTTPPort: 5280 + command: ["go", "run", "."] \ No newline at end of file diff --git a/job/go/http/maintenance-scheduler/app.go b/jobs/go/http/maintenance-scheduler/app.go similarity index 86% rename from job/go/http/maintenance-scheduler/app.go rename to jobs/go/http/maintenance-scheduler/app.go index c759a74ba..a9a865451 100644 --- a/job/go/http/maintenance-scheduler/app.go +++ b/jobs/go/http/maintenance-scheduler/app.go @@ -14,7 +14,7 @@ limitations under the License. package main /* -dapr run --app-id job-http --app-port 3500 --dapr-http-port 60021 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . */ import ( diff --git a/job/go/http/maintenance-scheduler/go.mod b/jobs/go/http/maintenance-scheduler/go.mod similarity index 100% rename from job/go/http/maintenance-scheduler/go.mod rename to jobs/go/http/maintenance-scheduler/go.mod diff --git a/job/go/http/maintenance-scheduler/go.sum b/jobs/go/http/maintenance-scheduler/go.sum similarity index 100% rename from job/go/http/maintenance-scheduler/go.sum rename to jobs/go/http/maintenance-scheduler/go.sum diff --git a/job/go/http/makefile b/jobs/go/http/makefile similarity index 100% rename from job/go/http/makefile rename to jobs/go/http/makefile diff --git a/job/go/sdk/README.md b/jobs/go/sdk/README.md similarity index 99% rename from job/go/sdk/README.md rename to jobs/go/sdk/README.md index a555928f9..14ca0001b 100644 --- a/job/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -15,6 +15,7 @@ This quickstart includes one service: This example will schedule 6 different droid manintenance jobs: ```go + droids := []Droid{ {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, diff --git a/jobs/go/sdk/dapr.yaml b/jobs/go/sdk/dapr.yaml new file mode 100644 index 000000000..685206094 --- /dev/null +++ b/jobs/go/sdk/dapr.yaml @@ -0,0 +1,9 @@ +version: 1 +apps: + - appDirPath: ./maintenance-scheduler/ + appID: maintenance-scheduler + appPort: 5200 + appProtocol: http + daprHTTPPort: 5280 + daprGRPCPort: 5201 + command: ["go", "run", "."] \ No newline at end of file diff --git a/job/go/sdk/maintenance-scheduler/app.go b/jobs/go/sdk/maintenance-scheduler/app.go similarity index 97% rename from job/go/sdk/maintenance-scheduler/app.go rename to jobs/go/sdk/maintenance-scheduler/app.go index cd522c911..3e253b831 100644 --- a/job/go/sdk/maintenance-scheduler/app.go +++ b/jobs/go/sdk/maintenance-scheduler/app.go @@ -14,7 +14,7 @@ limitations under the License. package main /* -dapr run --app-id job-sdk --app-port 6003 --dapr-http-port 3503 --dapr-grpc-port 60003 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . */ import ( diff --git a/job/go/sdk/maintenance-scheduler/go.mod b/jobs/go/sdk/maintenance-scheduler/go.mod similarity index 100% rename from job/go/sdk/maintenance-scheduler/go.mod rename to jobs/go/sdk/maintenance-scheduler/go.mod diff --git a/job/go/sdk/maintenance-scheduler/go.sum b/jobs/go/sdk/maintenance-scheduler/go.sum similarity index 100% rename from job/go/sdk/maintenance-scheduler/go.sum rename to jobs/go/sdk/maintenance-scheduler/go.sum diff --git a/job/go/sdk/makefile b/jobs/go/sdk/makefile similarity index 100% rename from job/go/sdk/makefile rename to jobs/go/sdk/makefile From 1ecb0f5517f4c54237ba9a36612b475d73e70d98 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 5 Jul 2024 13:43:12 -0700 Subject: [PATCH 42/74] readme Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 4 ++-- jobs/go/sdk/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index ddcf54074..efb061072 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Job (Dapr SDK) +# Dapr Jobs (API) In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -16,7 +16,7 @@ Open a new terminal, change directories to `/maintenance-scheduler`, and start t ```bash cd maintenance-scheduler -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 -- go run . ``` ### Schedule a job using an HTTP request diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 14ca0001b..1704b57c7 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,4 +1,4 @@ -# Dapr Job (Dapr SDK) +# Dapr Job (SDK)) In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -27,7 +27,7 @@ Open a terminal window and run, navigate to the `/maintenance-scheduler` folder ```bash cd maintenance-scheduler -dapr run --app-id job-sdk --app-port 6004 --dapr-http-port 3502 --dapr-grpc-port 60002 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . ``` From fd1974dce5ef28480c7f8d9de54659515e4ae181 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 11 Jul 2024 21:40:39 -0700 Subject: [PATCH 43/74] Refactoring and finishign HTTP example Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 146 +++++++++++---- jobs/go/http/dapr.yaml | 10 +- jobs/go/http/job-scheduler/go.mod | 3 + jobs/go/http/job-scheduler/go.sum | 0 jobs/go/http/job-scheduler/job-scheduler.go | 109 +++++++++++ jobs/go/http/job-service/go.mod | 3 + jobs/go/http/job-service/go.sum | 0 jobs/go/http/job-service/job-service.go | 189 ++++++++++++++++++++ jobs/go/http/maintenance-scheduler/app.go | 42 ----- jobs/go/http/maintenance-scheduler/go.mod | 5 - jobs/go/http/maintenance-scheduler/go.sum | 2 - jobs/go/sdk/README.md | 23 ++- jobs/go/sdk/maintenance-scheduler/app.go | 34 ++-- jobs/go/sdk/maintenance-scheduler/go.mod | 7 +- jobs/go/sdk/maintenance-scheduler/go.sum | 6 +- 15 files changed, 477 insertions(+), 102 deletions(-) create mode 100644 jobs/go/http/job-scheduler/go.mod create mode 100644 jobs/go/http/job-scheduler/go.sum create mode 100644 jobs/go/http/job-scheduler/job-scheduler.go create mode 100644 jobs/go/http/job-service/go.mod create mode 100644 jobs/go/http/job-service/go.sum create mode 100644 jobs/go/http/job-service/job-service.go delete mode 100644 jobs/go/http/maintenance-scheduler/app.go delete mode 100644 jobs/go/http/maintenance-scheduler/go.mod delete mode 100644 jobs/go/http/maintenance-scheduler/go.sum diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index efb061072..fd99fcb23 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Jobs (API) +# Dapr Hobs In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -6,65 +6,145 @@ Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) > **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). -This quickstart includes one service: - -- Go service `app` +This quickstart includes two apps: -### Run and initialize the server +- `job-scheduler.go`, responsible for scheduling, retrieving and deleting jobs. +- `job-service`, responsible for handling the scheduled jobs. -Open a new terminal, change directories to `/maintenance-scheduler`, and start the server: +## Run the app with the template file + +This section shows how to run both applications at once using [multi-app run template files](https://docs.dapr.io/developing-applications/local-development/multi-app-dapr-run/multi-app-overview/) with `dapr run -f .`. This enables to you test the interactions between multiple applications and will `schedule`, `run`, `get`, and `delete` jobs within a single process. + +Open a new terminal window and run the multi app run template: + + ```bash -cd maintenance-scheduler -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 -- go run . +dapr run -f . +``` + +The terminal console output should look similar to this, where: + +- The `R2-D2` job is being scheduled. +- The `R2-D2` job is being executed after 2 seconds. +- The `C-3PO` job is being scheduled. +- The `C-3PO` job is being retrieved. + +```text +== APP - job-scheduler == Job Scheduled: R2-D2 +== APP - job-service == Received job request... +== APP - job-service == Starting droid: R2-D2 +== APP - job-service == Executing maintenance job: Oil Change +== APP - job-scheduler == Job Scheduled: C-3PO +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +``` + +After 60 seconds, the terminal output should present the `C-3PO` job being processed: + +```text +== APP - job-service == Received job request... +== APP - job-service == Starting droid: C-3PO +== APP - job-service == Executing maintenance job: Limb Calibration ``` -### Schedule a job using an HTTP request + + +## Run the Jobs APIs individually + +### Schedule Jobs + +1. Open a terminal and run the `job-service` app: + +```bash +dapr run --app-id job-service --app-port 5200 --dapr-http-port 5280 -- go run . +``` - Open a new terminal window and run: +2. On a new terminal window, schedule the `R2-D2` Job using the Jobs API. ```bash curl -X POST \ - http://localhost:6002/v1.0-alpha1/jobs/r2-d2 \ + http://localhost:5280/v1.0-alpha1/jobs/r2-d2 \ -H "Content-Type: application/json" \ -d '{ - "job": { - "data": { - "maintenanceType": "Oil Change" - }, - "dueTime": "30s" - } - }' + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "R2-D2:Oil Change" + }, + "dueTime": "2s" + } +}' ``` -You should see a `202` response. +Back at the `job-service` app terminal window, the output should be: -### Get a scheduled job using an HTTP request +```text +== APP - job-app == Received job request... +== APP - job-app == Starting droid: R2-D2 +== APP - job-app == Executing maintenance job: Oil Change +``` -On the same terminal window yoy used to schedule the job or a new one, run: +3. On the same terminal window, schedule the `C-3PO` Job using the Jobs API. ```bash -curl -X GET http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" +curl -X POST \ + http://localhost:5280/v1.0-alpha1/jobs/c-3po \ + -H "Content-Type: application/json" \ + -d '{ + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "C-3PO:Limb Calibration" + }, + "dueTime": "60s" + } +}' ``` -You should see the following: +### Get a scheduled job + +1. On the same terminal window, run the command below to get the recently scheduled `C-3PO` job. ```bash -{ - "name":"r2-d2", - "dueTime":"30s", - "data": { - "maintenanceType": "Oil Change" - } -} +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` -### Delete a scheduled job using an HTTP request +You should see the following: -On the same terminal window you used to schedule the job or a new one, run: +```text +{"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +``` + +### Delete a scheduled job + +1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. ```bash curl -X DELETE http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" ``` -You should see a `202` response. +2. Run the command below to attempt to retrieve rhe deleted job: + +```bash +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +Back at the `job-service` app terminal window, the output should be: + +```text +ERRO[0249] Error getting job c-3po due to: rpc error: code = Unknown desc = job not found: app||default||job-service||c-3po instance=diagrid.local scope=dapr.api type=log ver=1.14.0-rc.2 +``` \ No newline at end of file diff --git a/jobs/go/http/dapr.yaml b/jobs/go/http/dapr.yaml index 9a5a4ec96..0b10d1f49 100644 --- a/jobs/go/http/dapr.yaml +++ b/jobs/go/http/dapr.yaml @@ -1,8 +1,12 @@ version: 1 apps: - - appDirPath: ./maintenance-scheduler/ - appID: maintenance-scheduler + - appDirPath: ./job-service/ + appID: job-service appPort: 5200 - appProtocol: http daprHTTPPort: 5280 + command: ["go", "run", "."] + - appDirPath: ./job-scheduler/ + appID: job-scheduler + appPort: 5300 + daprHTTPPort: 5380 command: ["go", "run", "."] \ No newline at end of file diff --git a/jobs/go/http/job-scheduler/go.mod b/jobs/go/http/job-scheduler/go.mod new file mode 100644 index 000000000..7d2ee39eb --- /dev/null +++ b/jobs/go/http/job-scheduler/go.mod @@ -0,0 +1,3 @@ +module job-scheduler + +go 1.22.4 diff --git a/jobs/go/http/job-scheduler/go.sum b/jobs/go/http/job-scheduler/go.sum new file mode 100644 index 000000000..e69de29bb diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go new file mode 100644 index 000000000..30a793c35 --- /dev/null +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -0,0 +1,109 @@ +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "os" + "strings" + "time" +) + +var c3poJobBody = `{ + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "C-3PO:Limb Calibration" + }, + "dueTime": "60s" + } + }` + +var r2d2JobBody = `{ + "job": { + "data": { + "@type": "type.googleapis.com/google.type.Expr", + "expression": "R2-D2:Oil Change" + }, + "dueTime": "2s" + } + }` + +func main() { + daprHost := os.Getenv("DAPR_HOST") + if daprHost == "" { + daprHost = "http://localhost" + } + + schedulerDaprHttpPort := "5280" + + client := http.Client{ + Timeout: 15 * time.Second, + } + + // Schedule a job using the Dapr Jobs API with short dueTime + jobName := "R2-D2" + reqURL := daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName + + req, err := http.NewRequest("POST", reqURL, strings.NewReader(r2d2JobBody)) + if err != nil { + log.Fatal(err.Error()) + } + + req.Header.Set("Content-Type", "application/json") + + // Schedule a job using the Dapr Jobs API + res, err := client.Do(req) + if err != nil { + log.Fatal(err) + } + defer res.Body.Close() + + fmt.Println("Job Scheduled:", jobName) + + time.Sleep(5 * time.Second) + + // Schedule a job using the Dapr Jobs API with long dueTime + jobName = "C-3PO" + + reqURL = daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName + + req, err = http.NewRequest("POST", reqURL, strings.NewReader(c3poJobBody)) + if err != nil { + log.Fatal(err.Error()) + } + + req.Header.Set("Content-Type", "application/json") + + // Schedule a job using the Dapr Jobs API + res, err = client.Do(req) + if err != nil { + log.Fatal(err) + } + defer res.Body.Close() + + fmt.Println("Job Scheduled:", jobName) + + time.Sleep(5 * time.Second) + + // Gets a job using the Dapr Jobs API + jobName = "C-3PO" + reqURL = daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName + + res, err = http.Get(reqURL) + if err != nil { + log.Fatal(err.Error()) + } + defer res.Body.Close() + + resBody, err := io.ReadAll(res.Body) + if err != nil { + log.Fatal(err.Error()) + + } + + fmt.Println("Job details:", string(resBody)) + + time.Sleep(5 * time.Second) +} diff --git a/jobs/go/http/job-service/go.mod b/jobs/go/http/job-service/go.mod new file mode 100644 index 000000000..3ffbcf007 --- /dev/null +++ b/jobs/go/http/job-service/go.mod @@ -0,0 +1,3 @@ +module job-service + +go 1.22.4 diff --git a/jobs/go/http/job-service/go.sum b/jobs/go/http/job-service/go.sum new file mode 100644 index 000000000..e69de29bb diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go new file mode 100644 index 000000000..351b8bbcb --- /dev/null +++ b/jobs/go/http/job-service/job-service.go @@ -0,0 +1,189 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "strings" +) + +/* +dapr run --app-id job-app --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +var jobMap = map[string]string{ + "R2-D2": "Oil Change", + "C-3PO": "Memory Wipe", + "BB-8": "Internal Gyroscope Check", +} + +type Job struct { + TypeURL string `json:"type_url"` + Value string `json:"value"` +} + +type DroidJob struct { + Droid string `json:"droid"` + Task string `json:"task"` +} + +// func handleScheduledJob(w http.ResponseWriter, r *http.Request) { +// fmt.Println("Received job request...") +// rawBody, err := io.ReadAll(r.Body) +// if err != nil { +// http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) +// return +// } + +// //fmt.Println("Raw request body:", string(rawBody)) + +// var jobData Job +// if err := json.Unmarshal(rawBody, &jobData); err != nil { +// http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) +// return +// } + +// // Decoding job data +// decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) +// if err != nil { +// fmt.Printf("Error decoding base64: %v", err) +// http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) +// return +// } + +// //fmt.Println("decoded value:", string(decodedValue)) + +// // Creating Droid Job from decoded value +// droidJob := setDroidJob(string(decodedValue)) + +// fmt.Println("Starting droid:", droidJob.Droid) +// fmt.Println("Executing maintenance job:", droidJob.Task) + +// w.WriteHeader(http.StatusOK) +// } + +// func handleGetJob(w http.ResponseWriter, r *http.Request) { +// } + +// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { +// } + +// func setDroidJob(decodedValue string) DroidJob { +// droidStr := strings.ReplaceAll(decodedValue, "\n", "") +// droidArray := strings.Split(droidStr, ":") + +// droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} +// return droidJob +// } + +// func main() { +// appPort := os.Getenv("APP_PORT") +// if appPort == "" { +// appPort = "5280" +// } + +// r := mux.NewRouter() + +// // Handles the job scheduler request +// r.HandleFunc("/job/", handleScheduledJob).Methods("POST") + +// // Handles the get job request +// r.HandleFunc("/jobs/", handleGetJob).Methods("GET") + +// // Handles the delete job request +// r.HandleFunc("/jobs/", handleDeleteJob).Methods("DELETE") + +// // Start the server; this is a blocking call +// err := http.ListenAndServe(":"+appPort, r) +// if !errors.Is(err, http.ErrServerClosed) { +// log.Panic(err) +// } + +// } + +func main() { + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "5280" + } + + // Setup job handler + http.HandleFunc("/job/", handleJob) + + fmt.Printf("Server started on port %v\n", appPort) + err := http.ListenAndServe(":"+appPort, nil) + if err != nil { + log.Fatal(err) + } + +} + +func handleJob(w http.ResponseWriter, r *http.Request) { + fmt.Println("Received job request...") + rawBody, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) + return + } + + //fmt.Println("Raw request body:", string(rawBody)) + + var jobData Job + if err := json.Unmarshal(rawBody, &jobData); err != nil { + http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) + return + } + + // Decoding job data + decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) + if err != nil { + fmt.Printf("Error decoding base64: %v", err) + http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) + return + } + + //fmt.Println("decoded value:", string(decodedValue)) + + // Creating Droid Job from decoded value + droidJob := setDroidJob(string(decodedValue)) + + fmt.Println("Starting droid:", droidJob.Droid) + fmt.Println("Executing maintenance job:", droidJob.Task) + + w.WriteHeader(http.StatusOK) +} + +func setDroidJob(decodedValue string) DroidJob { + droidStr := strings.ReplaceAll(decodedValue, "\n", "") + droidArray := strings.Split(droidStr, ":") + + droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} + return droidJob +} + +// func handleGetJob(w http.ResponseWriter, r *http.Request) { +// w.WriteHeader(http.StatusOK) + +// } + +// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { +// w.WriteHeader(http.StatusOK) + +// } diff --git a/jobs/go/http/maintenance-scheduler/app.go b/jobs/go/http/maintenance-scheduler/app.go deleted file mode 100644 index a9a865451..000000000 --- a/jobs/go/http/maintenance-scheduler/app.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2021 The Dapr Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -/* -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . -*/ - -import ( - "errors" - "log" - "net/http" - "os" - - "github.com/gorilla/mux" -) - -func main() { - appPort := os.Getenv("APP_PORT") - if appPort == "" { - appPort = "6002" - } - - r := mux.NewRouter() - - // Start the server; this is a blocking call - err := http.ListenAndServe(":"+appPort, r) - if !errors.Is(err, http.ErrServerClosed) { - log.Panic(err) - } -} diff --git a/jobs/go/http/maintenance-scheduler/go.mod b/jobs/go/http/maintenance-scheduler/go.mod deleted file mode 100644 index b8e020f76..000000000 --- a/jobs/go/http/maintenance-scheduler/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module dapr_job_example - -go 1.22.4 - -require github.com/gorilla/mux v1.8.1 diff --git a/jobs/go/http/maintenance-scheduler/go.sum b/jobs/go/http/maintenance-scheduler/go.sum deleted file mode 100644 index 712833743..000000000 --- a/jobs/go/http/maintenance-scheduler/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 1704b57c7..109c537f4 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,4 +1,6 @@ -# Dapr Job (SDK)) +# Dapr Job (SDK) + +// Run dapr in debug mode - Cassie's example In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -25,6 +27,25 @@ droids := []Droid{ Open a terminal window and run, navigate to the `/maintenance-scheduler` folder and run: + + ```bash cd maintenance-scheduler dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . diff --git a/jobs/go/sdk/maintenance-scheduler/app.go b/jobs/go/sdk/maintenance-scheduler/app.go index 3e253b831..ff3a74f5e 100644 --- a/jobs/go/sdk/maintenance-scheduler/app.go +++ b/jobs/go/sdk/maintenance-scheduler/app.go @@ -14,7 +14,7 @@ limitations under the License. package main /* -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . */ import ( @@ -23,9 +23,10 @@ import ( "encoding/json" "fmt" "log" + "os" "time" - daprc "github.com/mikeee/dapr_go-sdk/tree/feat-dist-scheduler/client" + daprc "github.com/dapr/go-sdk/client" "github.com/dapr/go-sdk/service/common" daprs "github.com/dapr/go-sdk/service/grpc" @@ -56,15 +57,13 @@ func main() { {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, } - //Create new Dapr client - daprClient, err := daprc.NewClient() - if err != nil { - panic(err) + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "5280" } - defer daprClient.Close() // Create a new Dapr service - server, err := daprs.NewService(":6003") + server, err := daprs.NewService(":" + appPort) if err != nil { log.Fatalf("failed to start the server: %v", err) } @@ -76,6 +75,13 @@ func main() { } }() + //Create new Dapr client + daprClient, err := daprc.NewClient() + if err != nil { + panic(err) + } + defer daprClient.Close() + // Brief intermission to allow for the server to initialize. time.Sleep(10 * time.Second) @@ -104,7 +110,11 @@ func main() { // schedule job scheduleJob(ctx, maintenanceJob, jobData) + break + } + + break } } @@ -112,16 +122,20 @@ func scheduleJob(ctx context.Context, maintenanceJob MaintenanceJob, jobData []b // schedule job job := daprc.Job{ Name: maintenanceJob.JobName, - Schedule: "@every 1s", + Schedule: "@every 10s", Repeats: 10, + TTL: "60s", + DueTime: "1s", Data: &anypb.Any{ Value: jobData, }, } + fmt.Printf("Scheduling job %+v\n", job) + err := daprClient.ScheduleJobAlpha1(ctx, &job) if err != nil { - log.Fatalf("failed to schedule job %v: %v", maintenanceJob.JobName, err) + fmt.Printf("failed to schedule job %v: %v", maintenanceJob.JobName, err) } fmt.Println("schedulejob - success") diff --git a/jobs/go/sdk/maintenance-scheduler/go.mod b/jobs/go/sdk/maintenance-scheduler/go.mod index 7e6f7d105..cf39294c0 100644 --- a/jobs/go/sdk/maintenance-scheduler/go.mod +++ b/jobs/go/sdk/maintenance-scheduler/go.mod @@ -3,12 +3,12 @@ module dapr_job_example go 1.22.4 require ( - github.com/dapr/go-sdk v1.10.0 + github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 google.golang.org/protobuf v1.34.2 ) require ( - github.com/dapr/dapr v1.14.0-rc.1 // indirect + github.com/dapr/dapr v1.14.0-rc.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/kr/pretty v0.3.1 // indirect go.opentelemetry.io/otel v1.27.0 // indirect @@ -19,3 +19,6 @@ require ( google.golang.org/grpc v1.64.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 +replace github.com/dapr/go-sdk => /Users/rocha/Developer/go-sdk diff --git a/jobs/go/sdk/maintenance-scheduler/go.sum b/jobs/go/sdk/maintenance-scheduler/go.sum index 64d75d54a..7eba25360 100644 --- a/jobs/go/sdk/maintenance-scheduler/go.sum +++ b/jobs/go/sdk/maintenance-scheduler/go.sum @@ -1,8 +1,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/dapr/dapr v1.14.0-rc.1 h1:4P376+PIU66hMtLz5TiF41IJ6Lh5FNY1DiwaNNYZv/8= -github.com/dapr/dapr v1.14.0-rc.1/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= -github.com/dapr/go-sdk v1.10.0 h1:5b91e46Mu9Se0NqQ3ujFoD7gDRSbMhm2VNZpN0uuNa0= -github.com/dapr/go-sdk v1.10.0/go.mod h1:Wgisyn1yQx1PDU6xsuwxsQv9u7yiVHQOUFQNNQE/PXI= +github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= +github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= From 154731a52d82218adb47e6cf7d9515a63113ce38 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Thu, 11 Jul 2024 23:35:43 -0700 Subject: [PATCH 44/74] Including status code check for scheduler Signed-off-by: Fernando Rocha --- jobs/go/http/job-scheduler/job-scheduler.go | 5 ++ jobs/go/http/job-service/job-service.go | 74 --------------------- 2 files changed, 5 insertions(+), 74 deletions(-) diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go index 30a793c35..22a73bfce 100644 --- a/jobs/go/http/job-scheduler/job-scheduler.go +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -58,6 +58,11 @@ func main() { if err != nil { log.Fatal(err) } + + if res.StatusCode != http.StatusNoContent { + log.Fatalf("failed to register job event handler. status code: %v", res.StatusCode) + } + defer res.Body.Close() fmt.Println("Job Scheduled:", jobName) diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 351b8bbcb..0bf3fed36 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -44,80 +44,6 @@ type DroidJob struct { Task string `json:"task"` } -// func handleScheduledJob(w http.ResponseWriter, r *http.Request) { -// fmt.Println("Received job request...") -// rawBody, err := io.ReadAll(r.Body) -// if err != nil { -// http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) -// return -// } - -// //fmt.Println("Raw request body:", string(rawBody)) - -// var jobData Job -// if err := json.Unmarshal(rawBody, &jobData); err != nil { -// http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) -// return -// } - -// // Decoding job data -// decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) -// if err != nil { -// fmt.Printf("Error decoding base64: %v", err) -// http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) -// return -// } - -// //fmt.Println("decoded value:", string(decodedValue)) - -// // Creating Droid Job from decoded value -// droidJob := setDroidJob(string(decodedValue)) - -// fmt.Println("Starting droid:", droidJob.Droid) -// fmt.Println("Executing maintenance job:", droidJob.Task) - -// w.WriteHeader(http.StatusOK) -// } - -// func handleGetJob(w http.ResponseWriter, r *http.Request) { -// } - -// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { -// } - -// func setDroidJob(decodedValue string) DroidJob { -// droidStr := strings.ReplaceAll(decodedValue, "\n", "") -// droidArray := strings.Split(droidStr, ":") - -// droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} -// return droidJob -// } - -// func main() { -// appPort := os.Getenv("APP_PORT") -// if appPort == "" { -// appPort = "5280" -// } - -// r := mux.NewRouter() - -// // Handles the job scheduler request -// r.HandleFunc("/job/", handleScheduledJob).Methods("POST") - -// // Handles the get job request -// r.HandleFunc("/jobs/", handleGetJob).Methods("GET") - -// // Handles the delete job request -// r.HandleFunc("/jobs/", handleDeleteJob).Methods("DELETE") - -// // Start the server; this is a blocking call -// err := http.ListenAndServe(":"+appPort, r) -// if !errors.Is(err, http.ErrServerClosed) { -// log.Panic(err) -// } - -// } - func main() { appPort := os.Getenv("APP_PORT") if appPort == "" { From ad4d4a7c759df7fd6db77a86fcd884a275d285e9 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 12 Jul 2024 01:14:27 -0700 Subject: [PATCH 45/74] fixing validation Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index fd99fcb23..9b5c350f8 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -20,17 +20,17 @@ Open a new terminal window and run the multi app run template: ```bash From c37986c859e333f676ddeaf5beb2e5fc71476009 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 12 Jul 2024 01:20:12 -0700 Subject: [PATCH 46/74] Job duetime 60->30 Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 23 ++++++++++++++------- jobs/go/http/job-scheduler/job-scheduler.go | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 9b5c350f8..b527c05bd 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -24,13 +24,16 @@ expected_stdout_lines: - '== APP - job-service == Starting droid: R2-D2' - '== APP - job-service == Executing maintenance job: Oil Change' - '== APP - job-scheduler == Job Scheduled: C-3PO' - - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}}' + - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}}' + - '== APP - job-service == Received job request...' + - '== APP - job-service == Starting droid: C-3PO' + - '== APP - job-service == Executing maintenance job: Limb Calibration' expected_stderr_lines: output_match_mode: substring match_order: none background: true sleep: 10 -timeout_seconds: 80 +timeout_seconds: 60 --> ```bash @@ -50,10 +53,10 @@ The terminal console output should look similar to this, where: == APP - job-service == Starting droid: R2-D2 == APP - job-service == Executing maintenance job: Oil Change == APP - job-scheduler == Job Scheduled: C-3PO -== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} ``` -After 60 seconds, the terminal output should present the `C-3PO` job being processed: +After 30 seconds, the terminal output should present the `C-3PO` job being processed: ```text == APP - job-service == Received job request... @@ -61,6 +64,12 @@ After 60 seconds, the terminal output should present the `C-3PO` job being proce == APP - job-service == Executing maintenance job: Limb Calibration ``` +2. Stop and clean up application processes + +```bash +dapr stop -f . +``` + ## Run the Jobs APIs individually @@ -110,7 +119,7 @@ curl -X POST \ "@type": "type.googleapis.com/google.type.Expr", "expression": "C-3PO:Limb Calibration" }, - "dueTime": "60s" + "dueTime": "30s" } }' ``` @@ -126,7 +135,7 @@ curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: appli You should see the following: ```text -{"name":"C-3PO", "dueTime":"60s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} ``` ### Delete a scheduled job @@ -134,7 +143,7 @@ You should see the following: 1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. ```bash -curl -X DELETE http://localhost:6002/v1.0-alpha1/jobs/r2-d2 -H "Content-Type: application/json" +curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` 2. Run the command below to attempt to retrieve rhe deleted job: diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go index 22a73bfce..9c58e53fa 100644 --- a/jobs/go/http/job-scheduler/job-scheduler.go +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -16,7 +16,7 @@ var c3poJobBody = `{ "@type": "type.googleapis.com/google.type.Expr", "expression": "C-3PO:Limb Calibration" }, - "dueTime": "60s" + "dueTime": "30" } }` From 1436c5b8df58d1788b9fcc8247d20cc2556d6554 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Fri, 12 Jul 2024 16:15:57 -0700 Subject: [PATCH 47/74] Fixing request data type and README Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 22 ++++++++++----------- jobs/go/http/job-scheduler/job-scheduler.go | 10 +++++----- jobs/go/http/job-service/job-service.go | 17 +--------------- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index b527c05bd..5100739dc 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -2,7 +2,7 @@ In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. +Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. > **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). @@ -24,7 +24,7 @@ expected_stdout_lines: - '== APP - job-service == Starting droid: R2-D2' - '== APP - job-service == Executing maintenance job: Oil Change' - '== APP - job-scheduler == Job Scheduled: C-3PO' - - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}}' + - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "value":"C-3PO:Limb Calibration"}}' - '== APP - job-service == Received job request...' - '== APP - job-service == Starting droid: C-3PO' - '== APP - job-service == Executing maintenance job: Limb Calibration' @@ -32,8 +32,8 @@ expected_stderr_lines: output_match_mode: substring match_order: none background: true -sleep: 10 -timeout_seconds: 60 +sleep: 60 +timeout_seconds: 120 --> ```bash @@ -53,7 +53,7 @@ The terminal console output should look similar to this, where: == APP - job-service == Starting droid: R2-D2 == APP - job-service == Executing maintenance job: Oil Change == APP - job-scheduler == Job Scheduled: C-3PO -== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"ttype.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} ``` After 30 seconds, the terminal output should present the `C-3PO` job being processed: @@ -91,8 +91,8 @@ curl -X POST \ -d '{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "R2-D2:Oil Change" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "R2-D2:Oil Change" }, "dueTime": "2s" } @@ -116,8 +116,8 @@ curl -X POST \ -d '{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "C-3PO:Limb Calibration" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "C-3PO:Limb Calibration" }, "dueTime": "30s" } @@ -135,7 +135,7 @@ curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: appli You should see the following: ```text -{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.type.Expr", "expression":"C-3PO:Limb Calibration"}} +{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} ``` ### Delete a scheduled job @@ -146,7 +146,7 @@ You should see the following: curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` -2. Run the command below to attempt to retrieve rhe deleted job: +2. Run the command below to attempt to retrieve the deleted job: ```bash curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" diff --git a/jobs/go/http/job-scheduler/job-scheduler.go b/jobs/go/http/job-scheduler/job-scheduler.go index 9c58e53fa..12c2524f1 100644 --- a/jobs/go/http/job-scheduler/job-scheduler.go +++ b/jobs/go/http/job-scheduler/job-scheduler.go @@ -13,18 +13,18 @@ import ( var c3poJobBody = `{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "C-3PO:Limb Calibration" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "C-3PO:Limb Calibration" }, - "dueTime": "30" + "dueTime": "30s" } }` var r2d2JobBody = `{ "job": { "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "R2-D2:Oil Change" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "R2-D2:Oil Change" }, "dueTime": "2s" } diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 0bf3fed36..8c841f7f7 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -28,12 +28,6 @@ import ( dapr run --app-id job-app --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . */ -var jobMap = map[string]string{ - "R2-D2": "Oil Change", - "C-3PO": "Memory Wipe", - "BB-8": "Internal Gyroscope Check", -} - type Job struct { TypeURL string `json:"type_url"` Value string `json:"value"` @@ -97,19 +91,10 @@ func handleJob(w http.ResponseWriter, r *http.Request) { } func setDroidJob(decodedValue string) DroidJob { + // Removing new lines from decoded value - Workaround for base64 encoding issue droidStr := strings.ReplaceAll(decodedValue, "\n", "") droidArray := strings.Split(droidStr, ":") droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} return droidJob } - -// func handleGetJob(w http.ResponseWriter, r *http.Request) { -// w.WriteHeader(http.StatusOK) - -// } - -// func handleDeleteJob(w http.ResponseWriter, r *http.Request) { -// w.WriteHeader(http.StatusOK) - -// } From eb44b3d601b0fbd8f44cdba562f055a54cca4a1a Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 15 Jul 2024 14:22:54 -0700 Subject: [PATCH 48/74] SDK jobs Signed-off-by: Fernando Rocha --- jobs/go/sdk/dapr.yaml | 11 +- jobs/go/sdk/job-scheduler/app.go | 108 ++++++++++++ .../go.mod | 0 .../go.sum | 0 jobs/go/sdk/job-service/app.go | 84 +++++++++ jobs/go/sdk/job-service/go.mod | 24 +++ jobs/go/sdk/job-service/go.sum | 41 +++++ jobs/go/sdk/maintenance-scheduler/app.go | 161 ------------------ 8 files changed, 264 insertions(+), 165 deletions(-) create mode 100644 jobs/go/sdk/job-scheduler/app.go rename jobs/go/sdk/{maintenance-scheduler => job-scheduler}/go.mod (100%) rename jobs/go/sdk/{maintenance-scheduler => job-scheduler}/go.sum (100%) create mode 100644 jobs/go/sdk/job-service/app.go create mode 100644 jobs/go/sdk/job-service/go.mod create mode 100644 jobs/go/sdk/job-service/go.sum delete mode 100644 jobs/go/sdk/maintenance-scheduler/app.go diff --git a/jobs/go/sdk/dapr.yaml b/jobs/go/sdk/dapr.yaml index 685206094..0b10d1f49 100644 --- a/jobs/go/sdk/dapr.yaml +++ b/jobs/go/sdk/dapr.yaml @@ -1,9 +1,12 @@ version: 1 apps: - - appDirPath: ./maintenance-scheduler/ - appID: maintenance-scheduler + - appDirPath: ./job-service/ + appID: job-service appPort: 5200 - appProtocol: http daprHTTPPort: 5280 - daprGRPCPort: 5201 + command: ["go", "run", "."] + - appDirPath: ./job-scheduler/ + appID: job-scheduler + appPort: 5300 + daprHTTPPort: 5380 command: ["go", "run", "."] \ No newline at end of file diff --git a/jobs/go/sdk/job-scheduler/app.go b/jobs/go/sdk/job-scheduler/app.go new file mode 100644 index 000000000..c3619a683 --- /dev/null +++ b/jobs/go/sdk/job-scheduler/app.go @@ -0,0 +1,108 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "google.golang.org/protobuf/types/known/anypb" + + daprc "github.com/dapr/go-sdk/client" +) + +/* +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +var daprClient daprc.Client +var err error + +// Define a Droid struct +type Droid struct { + Name string + Jobs []string +} + +type DroidJob struct { + DroidName string + DroidJob string +} + +func main() { + + // Define the droids and their maintenance jobs + droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + } + + //Create new Dapr client + daprClient, err = daprc.NewClient() + if err != nil { + panic(err) + } + defer daprClient.Close() + + //Schedule jobs + for _, droid := range droids { + for _, job := range droid.Jobs { + + //create maintenance job + droidJob := DroidJob{ + DroidName: droid.Name, + DroidJob: job, + } + + jobData, err := json.Marshal(droidJob) + if err != nil { + log.Fatalf("failed to marshall job %v: %v", droidJob.DroidJob, err) + } + + ctx := context.Background() + //schedule job + scheduleJob(ctx, droidJob, jobData) + + } + } +} + +func scheduleJob(ctx context.Context, droidJob DroidJob, jobData []byte) { + // schedule job + job := daprc.Job{ + Name: droidJob.DroidName, + Schedule: "@every 10s", + Repeats: 10, + TTL: "60s", + DueTime: "1s", + Data: &anypb.Any{ + Value: jobData, + }, + } + + fmt.Printf("Scheduling job %+v\n", job) + + err := daprClient.ScheduleJobAlpha1(ctx, &job) + if err != nil { + fmt.Printf("failed to schedule job for %v: %v", droidJob.DroidName, err) + } + + fmt.Println("schedulejob - success") + + time.Sleep(3 * time.Second) +} diff --git a/jobs/go/sdk/maintenance-scheduler/go.mod b/jobs/go/sdk/job-scheduler/go.mod similarity index 100% rename from jobs/go/sdk/maintenance-scheduler/go.mod rename to jobs/go/sdk/job-scheduler/go.mod diff --git a/jobs/go/sdk/maintenance-scheduler/go.sum b/jobs/go/sdk/job-scheduler/go.sum similarity index 100% rename from jobs/go/sdk/maintenance-scheduler/go.sum rename to jobs/go/sdk/job-scheduler/go.sum diff --git a/jobs/go/sdk/job-service/app.go b/jobs/go/sdk/job-service/app.go new file mode 100644 index 000000000..f7fee41ad --- /dev/null +++ b/jobs/go/sdk/job-service/app.go @@ -0,0 +1,84 @@ +package main + +/* +dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . +*/ + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "log" + "os" + + "github.com/dapr/go-sdk/service/common" + daprs "github.com/dapr/go-sdk/service/grpc" +) + +//var daprClient daprc.Client + +// Define a Droid struct +type Droid struct { + Name string + Jobs []string +} + +type MaintenanceJob struct { + JobName string + DroidName string + DroidJob string +} + +func main() { + + // Define the droids and their maintenance jobs + droids := []Droid{ + {Name: "R2-D2", Jobs: []string{"Oil Change"}}, + {Name: "C-3PO", Jobs: []string{"Memory Wipe"}}, + {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check"}}, + } + + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "5280" + } + + // Create a new Dapr service + server, err := daprs.NewService(":" + appPort) + if err != nil { + log.Fatalf("failed to start the server: %v", err) + } + + for _, droid := range droids { + // setup job event handler + if err = server.AddJobEventHandler(droid.Name, droidMaintenanceHandler); err != nil { + log.Fatalf("failed to register job event handler: %v", err) + } + + fmt.Println("Handler created for ", droid.Name) + } + + log.Println("starting server") + if err = server.Start(); err != nil { + log.Fatalf("failed to start server: %v", err) + } + +} + +func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { + var jobData common.Job + if err := json.Unmarshal(job.Data, &jobData); err != nil { + return fmt.Errorf("failed to unmarshal job: %v", err) + } + decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) + if err != nil { + return fmt.Errorf("failed to decode job payload: %v", err) + } + var jobPayload MaintenanceJob + if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { + return fmt.Errorf("failed to unmarshal payload: %v", err) + } + fmt.Printf("Maintenance job %v received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobPayload.JobName, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) + return nil +} diff --git a/jobs/go/sdk/job-service/go.mod b/jobs/go/sdk/job-service/go.mod new file mode 100644 index 000000000..cf39294c0 --- /dev/null +++ b/jobs/go/sdk/job-service/go.mod @@ -0,0 +1,24 @@ +module dapr_job_example + +go 1.22.4 + +require ( + github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 + google.golang.org/protobuf v1.34.2 +) + +require ( + github.com/dapr/dapr v1.14.0-rc.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect + google.golang.org/grpc v1.64.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 +replace github.com/dapr/go-sdk => /Users/rocha/Developer/go-sdk diff --git a/jobs/go/sdk/job-service/go.sum b/jobs/go/sdk/job-service/go.sum new file mode 100644 index 000000000..7eba25360 --- /dev/null +++ b/jobs/go/sdk/job-service/go.sum @@ -0,0 +1,41 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= +github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/jobs/go/sdk/maintenance-scheduler/app.go b/jobs/go/sdk/maintenance-scheduler/app.go deleted file mode 100644 index ff3a74f5e..000000000 --- a/jobs/go/sdk/maintenance-scheduler/app.go +++ /dev/null @@ -1,161 +0,0 @@ -/* -Copyright 2021 The Dapr Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -/* -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 --scheduler-host-address=127.0.0.1:50006 -- go run . -*/ - -import ( - "context" - "encoding/base64" - "encoding/json" - "fmt" - "log" - "os" - "time" - - daprc "github.com/dapr/go-sdk/client" - - "github.com/dapr/go-sdk/service/common" - daprs "github.com/dapr/go-sdk/service/grpc" - - "google.golang.org/protobuf/types/known/anypb" -) - -var daprClient daprc.Client - -// Define a Droid struct -type Droid struct { - Name string - Jobs []string -} - -type MaintenanceJob struct { - JobName string - DroidName string - DroidJob string -} - -func main() { - - // Define the droids and their maintenance jobs - droids := []Droid{ - {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, - {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, - {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, - } - - appPort := os.Getenv("APP_PORT") - if appPort == "" { - appPort = "5280" - } - - // Create a new Dapr service - server, err := daprs.NewService(":" + appPort) - if err != nil { - log.Fatalf("failed to start the server: %v", err) - } - - log.Println("starting server") - go func() { - if err = server.Start(); err != nil { - log.Fatalf("failed to start server: %v", err) - } - }() - - //Create new Dapr client - daprClient, err := daprc.NewClient() - if err != nil { - panic(err) - } - defer daprClient.Close() - - // Brief intermission to allow for the server to initialize. - time.Sleep(10 * time.Second) - - // Setup handler and schedule jobs - for _, droid := range droids { - for _, job := range droid.Jobs { - - // create maintenance job - maintenanceJob := MaintenanceJob{ - JobName: droid.Name + " - " + job, - DroidName: droid.Name, - DroidJob: job, - } - - jobData, err := json.Marshal(maintenanceJob) - if err != nil { - log.Fatalf("failed to marshall job %v: %v", maintenanceJob.JobName, err) - } - - // setup job event handler - if err = server.AddJobEventHandler(maintenanceJob.JobName, droidMaintenanceHandler); err != nil { - log.Fatalf("failed to register job event handler: %v", err) - } - - ctx := context.Background() - // schedule job - scheduleJob(ctx, maintenanceJob, jobData) - - break - - } - - break - } -} - -func scheduleJob(ctx context.Context, maintenanceJob MaintenanceJob, jobData []byte) { - // schedule job - job := daprc.Job{ - Name: maintenanceJob.JobName, - Schedule: "@every 10s", - Repeats: 10, - TTL: "60s", - DueTime: "1s", - Data: &anypb.Any{ - Value: jobData, - }, - } - - fmt.Printf("Scheduling job %+v\n", job) - - err := daprClient.ScheduleJobAlpha1(ctx, &job) - if err != nil { - fmt.Printf("failed to schedule job %v: %v", maintenanceJob.JobName, err) - } - - fmt.Println("schedulejob - success") - - time.Sleep(3 * time.Second) -} - -func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { - var jobData common.Job - if err := json.Unmarshal(job.Data, &jobData); err != nil { - return fmt.Errorf("failed to unmarshal job: %v", err) - } - decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) - if err != nil { - return fmt.Errorf("failed to decode job payload: %v", err) - } - var jobPayload MaintenanceJob - if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { - return fmt.Errorf("failed to unmarshal payload: %v", err) - } - fmt.Printf("Maintenance job %v received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobPayload.JobName, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) - return nil -} From 2f7c8ae483debfcf1e778e54d3f545f52f1a7b39 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 16 Jul 2024 01:26:48 -0700 Subject: [PATCH 49/74] refactoring Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 4 +- jobs/go/sdk/README.md | 177 ++++++++++++++++++++++++------- jobs/go/sdk/dapr.yaml | 2 + jobs/go/sdk/job-scheduler/app.go | 62 ++++++----- jobs/go/sdk/job-service/app.go | 19 +++- 5 files changed, 200 insertions(+), 64 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 5100739dc..7e58012b3 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -1,4 +1,4 @@ -# Dapr Hobs +# Dapr Jobs In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -9,7 +9,7 @@ Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/ This quickstart includes two apps: - `job-scheduler.go`, responsible for scheduling, retrieving and deleting jobs. -- `job-service`, responsible for handling the scheduled jobs. +- `job-service.go`, responsible for handling the scheduled jobs. ## Run the app with the template file diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 109c537f4..ea1943d5d 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,54 +1,159 @@ -# Dapr Job (SDK) +# Dapr Hobs -// Run dapr in debug mode - Cassie's example +In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -In this quickstart, you'll create a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. +Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. -Visit [this](https://docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. +> **Note:** This example leverages the SDK only. If you are looking for the example using the HTTP requests (recommended) [click here](../http/). -> **Note:** This example leverages the Dapr SDK. If you are looking for the example using HTTP REST only [click here](../http). +This quickstart includes two apps: -This quickstart includes one service: - -- Go service `app` +- `job-scheduler.go`, responsible for scheduling, retrieving and deleting jobs. +- `job-service.go`, responsible for handling the scheduled jobs. -### Run the Go service app with Dapr +## Run the app with the template file -This example will schedule 6 different droid manintenance jobs: +This section shows how to run both applications at once using [multi-app run template files](https://docs.dapr.io/developing-applications/local-development/multi-app-dapr-run/multi-app-overview/) with `dapr run -f .`. This enables to you test the interactions between multiple applications and will `schedule`, `run`, `get`, and `delete` jobs within a single process. -```go - -droids := []Droid{ - {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, - {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, - {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, -} -``` - -Open a terminal window and run, navigate to the `/maintenance-scheduler` folder and run: +Open a new terminal window and run the multi app run template: ```bash -cd maintenance-scheduler -dapr run --app-id maintenance-scheduler --app-port 5200 --dapr-http-port 5280 --dapr-grpc-port 5281 -- go run . +dapr run -f . +``` + +The terminal console output should look similar to this, where: + +- The `R2-D2` job is being scheduled. +- The `R2-D2` job is being executed after 2 seconds. +- The `C-3PO` job is being scheduled. +- The `C-3PO` job is being retrieved. + +```text +== APP - job-scheduler == Job Scheduled: R2-D2 +== APP - job-service == Received job request... +== APP - job-service == Starting droid: R2-D2 +== APP - job-service == Executing maintenance job: Oil Change +== APP - job-scheduler == Job Scheduled: C-3PO +== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"ttype.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} +``` + +After 30 seconds, the terminal output should present the `C-3PO` job being processed: + +```text +== APP - job-service == Received job request... +== APP - job-service == Starting droid: C-3PO +== APP - job-service == Executing maintenance job: Limb Calibration +``` + +2. Stop and clean up application processes + +```bash +dapr stop -f . ``` + +## Run the Jobs APIs individually + +### Schedule Jobs + +1. Open a terminal and run the `job-service` app: + +```bash +dapr run --app-id job-service --app-port 5200 --dapr-http-port 5280 -- go run . +``` + +2. On a new terminal window, schedule the `R2-D2` Job using the Jobs API. + +```bash +curl -X POST \ + http://localhost:5280/v1.0-alpha1/jobs/r2-d2 \ + -H "Content-Type: application/json" \ + -d '{ + "job": { + "data": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "R2-D2:Oil Change" + }, + "dueTime": "2s" + } +}' +``` + +Back at the `job-service` app terminal window, the output should be: + +```text +== APP - job-app == Received job request... +== APP - job-app == Starting droid: R2-D2 +== APP - job-app == Executing maintenance job: Oil Change +``` + +3. On the same terminal window, schedule the `C-3PO` Job using the Jobs API. + +```bash +curl -X POST \ + http://localhost:5280/v1.0-alpha1/jobs/c-3po \ + -H "Content-Type: application/json" \ + -d '{ + "job": { + "data": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "C-3PO:Limb Calibration" + }, + "dueTime": "30s" + } +}' +``` + +### Get a scheduled job + +1. On the same terminal window, run the command below to get the recently scheduled `C-3PO` job. + +```bash +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +You should see the following: + +```text +{"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "expression":"C-3PO:Limb Calibration"}} +``` + +### Delete a scheduled job + +1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. + +```bash +curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +2. Run the command below to attempt to retrieve the deleted job: + +```bash +curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +``` + +Back at the `job-service` app terminal window, the output should be: + +```text +ERRO[0249] Error getting job c-3po due to: rpc error: code = Unknown desc = job not found: app||default||job-service||c-3po instance=diagrid.local scope=dapr.api type=log ver=1.14.0-rc.2 +``` \ No newline at end of file diff --git a/jobs/go/sdk/dapr.yaml b/jobs/go/sdk/dapr.yaml index 0b10d1f49..c4dc5c092 100644 --- a/jobs/go/sdk/dapr.yaml +++ b/jobs/go/sdk/dapr.yaml @@ -4,6 +4,8 @@ apps: appID: job-service appPort: 5200 daprHTTPPort: 5280 + daprGRPCPort: 5281 + appProtocol: grpc command: ["go", "run", "."] - appDirPath: ./job-scheduler/ appID: job-scheduler diff --git a/jobs/go/sdk/job-scheduler/app.go b/jobs/go/sdk/job-scheduler/app.go index c3619a683..c99e8d858 100644 --- a/jobs/go/sdk/job-scheduler/app.go +++ b/jobs/go/sdk/job-scheduler/app.go @@ -38,18 +38,26 @@ type Droid struct { Jobs []string } -type DroidJob struct { - DroidName string - DroidJob string +type Metadata struct { + DroidName string `json:"droidName"` +} + +type DroidTask struct { + Task string `json:"task"` + Metadata Metadata `json:"metadata"` } func main() { // Define the droids and their maintenance jobs + // droids := []Droid{ + // {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, + // {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, + // {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + // } + droids := []Droid{ - {Name: "R2-D2", Jobs: []string{"Oil Change", "Circuitry Check"}}, - {Name: "C-3PO", Jobs: []string{"Memory Wipe", "Limb Calibration"}}, - {Name: "BB-8", Jobs: []string{"Internal Gyroscope Check", "Map Data Update"}}, + {Name: "R2-D2", Jobs: []string{"Oil Change"}}, } //Create new Dapr client @@ -64,32 +72,33 @@ func main() { for _, job := range droid.Jobs { //create maintenance job - droidJob := DroidJob{ - DroidName: droid.Name, - DroidJob: job, - } - - jobData, err := json.Marshal(droidJob) - if err != nil { - log.Fatalf("failed to marshall job %v: %v", droidJob.DroidJob, err) + task := DroidTask{ + Task: job, + Metadata: Metadata{ + DroidName: droid.Name, + }, } ctx := context.Background() //schedule job - scheduleJob(ctx, droidJob, jobData) + scheduleJob(ctx, task) } } } -func scheduleJob(ctx context.Context, droidJob DroidJob, jobData []byte) { +func scheduleJob(ctx context.Context, task DroidTask) { + + jobData, err := json.Marshal(task) + if err != nil { + log.Fatalf("failed to marshall job %v: %v", task.Metadata.DroidName, err) + } + // schedule job job := daprc.Job{ - Name: droidJob.DroidName, - Schedule: "@every 10s", + Name: task.Metadata.DroidName, + Schedule: "@every 5s", Repeats: 10, - TTL: "60s", - DueTime: "1s", Data: &anypb.Any{ Value: jobData, }, @@ -97,12 +106,17 @@ func scheduleJob(ctx context.Context, droidJob DroidJob, jobData []byte) { fmt.Printf("Scheduling job %+v\n", job) - err := daprClient.ScheduleJobAlpha1(ctx, &job) + err = daprClient.ScheduleJobAlpha1(ctx, &job) if err != nil { - fmt.Printf("failed to schedule job for %v: %v", droidJob.DroidName, err) + fmt.Println("failed to schedule job. err: ", err) } - fmt.Println("schedulejob - success") - time.Sleep(3 * time.Second) + + resp, err := daprClient.GetJobAlpha1(ctx, task.Metadata.DroidName) + if err != nil { + fmt.Println("failed to get job. err: ", task.Metadata.DroidName, err) + } + fmt.Println("getjob - resp: ", resp) // parse + } diff --git a/jobs/go/sdk/job-service/app.go b/jobs/go/sdk/job-service/app.go index f7fee41ad..e740951de 100644 --- a/jobs/go/sdk/job-service/app.go +++ b/jobs/go/sdk/job-service/app.go @@ -1,3 +1,16 @@ +/* +Copyright 2021 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package main /* @@ -16,8 +29,6 @@ import ( daprs "github.com/dapr/go-sdk/service/grpc" ) -//var daprClient daprc.Client - // Define a Droid struct type Droid struct { Name string @@ -64,9 +75,13 @@ func main() { log.Fatalf("failed to start server: %v", err) } + // Brief intermission to allow for the server to initialize. + //time.Sleep(5 * time.Second) + } func droidMaintenanceHandler(ctx context.Context, job *common.JobEvent) error { + fmt.Println("Received job event") var jobData common.Job if err := json.Unmarshal(job.Data, &jobData); err != nil { return fmt.Errorf("failed to unmarshal job: %v", err) From 092bdb41596d8a892275dcb35dd100ca031b71e0 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Wed, 17 Jul 2024 19:49:21 -0700 Subject: [PATCH 50/74] finishing sdk example Signed-off-by: Fernando Rocha --- jobs/go/http/job-service/job-service.go | 6 +- jobs/go/sdk/README.md | 136 ++++++------- jobs/go/sdk/dapr.yaml | 1 - jobs/go/sdk/job-scheduler/app.go | 122 ----------- jobs/go/sdk/job-scheduler/go.mod | 12 +- jobs/go/sdk/job-scheduler/go.sum | 4 +- jobs/go/sdk/job-scheduler/job-scheduler.go | 153 ++++++++++++++ jobs/go/sdk/job-service/app.go | 99 --------- jobs/go/sdk/job-service/go.mod | 6 +- jobs/go/sdk/job-service/go.sum | 4 +- jobs/go/sdk/job-service/job-service.go | 223 +++++++++++++++++++++ 11 files changed, 450 insertions(+), 316 deletions(-) delete mode 100644 jobs/go/sdk/job-scheduler/app.go create mode 100644 jobs/go/sdk/job-scheduler/job-scheduler.go delete mode 100644 jobs/go/sdk/job-service/app.go create mode 100644 jobs/go/sdk/job-service/job-service.go diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 8c841f7f7..fc72be67e 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -24,10 +24,6 @@ import ( "strings" ) -/* -dapr run --app-id job-app --app-port 5200 --dapr-http-port 5280 --log-level debug --scheduler-host-address=127.0.0.1:50006 -- go run . -*/ - type Job struct { TypeURL string `json:"type_url"` Value string `json:"value"` @@ -41,7 +37,7 @@ type DroidJob struct { func main() { appPort := os.Getenv("APP_PORT") if appPort == "" { - appPort = "5280" + appPort = "5200" } // Setup job handler diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index ea1943d5d..193969d82 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -1,4 +1,4 @@ -# Dapr Hobs +# Dapr Jobs In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. @@ -20,14 +20,19 @@ Open a new terminal window and run the multi app run template: com.service @@ -19,12 +19,12 @@ org.json json - 20211205 + 20240303 com.fasterxml.jackson.core jackson-databind - 2.13.0 + 2.17.1 org.springframework.boot @@ -33,7 +33,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -42,7 +42,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/bindings/java/sdk/batch/pom.xml b/bindings/java/sdk/batch/pom.xml index e69fdbb2f..99d1ef406 100644 --- a/bindings/java/sdk/batch/pom.xml +++ b/bindings/java/sdk/batch/pom.xml @@ -4,7 +4,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service @@ -19,7 +19,7 @@ com.squareup.okhttp3 okhttp - 4.9.0 + 4.12.0 org.springframework.boot @@ -38,13 +38,13 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true com.fasterxml.jackson.core jackson-databind - 2.13.0 + 2.17.1 @@ -53,12 +53,12 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.3.1 diff --git a/configuration/java/http/README.md b/configuration/java/http/README.md index 9d051c86f..4eceaab1d 100644 --- a/configuration/java/http/README.md +++ b/configuration/java/http/README.md @@ -13,10 +13,10 @@ This quickstart includes one service: ## Prerequisites - [Maven 3.x](https://maven.apache.org/install.html) -- Java JDK 11 (or greater): - - [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - - [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - - [OpenJDK 11](https://jdk.java.net/11/) +- Java JDK 17 (or greater): + - [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + - [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + - [OpenJDK 17](https://jdk.java.net/17/) - Locally running redis container - a redis container named `dapr_redis` is automatically created when you run `dapr init` ## Add configuration items to the config store diff --git a/configuration/java/http/order-processor/pom.xml b/configuration/java/http/order-processor/pom.xml index 4133cac6f..fa385cedb 100644 --- a/configuration/java/http/order-processor/pom.xml +++ b/configuration/java/http/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 @@ -25,7 +25,7 @@ org.json json - 20220924 + 20240303 @@ -33,7 +33,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/configuration/java/sdk/README.md b/configuration/java/sdk/README.md index 9e10db014..2b1f0fd20 100644 --- a/configuration/java/sdk/README.md +++ b/configuration/java/sdk/README.md @@ -11,10 +11,10 @@ This quickstart includes one service: ## Prerequisites - [Maven 3.x](https://maven.apache.org/install.html) -- Java JDK 11 (or greater): - - [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - - [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - - [OpenJDK 11](https://jdk.java.net/11/) +- Java JDK 17 (or greater): + - [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + - [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + - [OpenJDK 17](https://jdk.java.net/17/) - Locally running redis container - a redis container named `dapr_redis` is automatically created when you run `dapr init` ## Add configuration items to the config store diff --git a/configuration/java/sdk/order-processor/pom.xml b/configuration/java/sdk/order-processor/pom.xml index 1c39418e3..bd2be05d2 100644 --- a/configuration/java/sdk/order-processor/pom.xml +++ b/configuration/java/sdk/order-processor/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ io.projectreactor reactor-core - 3.4.0 + 3.6.7 @@ -31,7 +31,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java b/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java index dfd962ff3..a13b86241 100644 --- a/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java +++ b/configuration/java/sdk/order-processor/src/main/java/com/service/OrderProcessingServiceApplication.java @@ -1,7 +1,6 @@ package com.service; import io.dapr.client.DaprClientBuilder; -import io.dapr.client.DaprPreviewClient; import io.dapr.client.DaprClient; import io.dapr.client.domain.ConfigurationItem; import io.dapr.client.domain.SubscribeConfigurationResponse; diff --git a/pub_sub/java/http/README.md b/pub_sub/java/http/README.md index 1324d7967..dbda087a7 100644 --- a/pub_sub/java/http/README.md +++ b/pub_sub/java/http/README.md @@ -17,10 +17,10 @@ And one subscriber: ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. ## Run all apps with multi-app run template file: diff --git a/pub_sub/java/http/checkout/pom.xml b/pub_sub/java/http/checkout/pom.xml index 2c262b906..c0ab87867 100644 --- a/pub_sub/java/http/checkout/pom.xml +++ b/pub_sub/java/http/checkout/pom.xml @@ -11,13 +11,13 @@ 17 17 - 1.6.1 + 2.0.13 org.json json - 20211205 + 20240303 org.slf4j @@ -35,7 +35,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/pub_sub/java/http/order-processor/pom.xml b/pub_sub/java/http/order-processor/pom.xml index 8e127b431..5cef1ed2d 100644 --- a/pub_sub/java/http/order-processor/pom.xml +++ b/pub_sub/java/http/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service @@ -24,7 +24,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -33,7 +33,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/pub_sub/java/sdk/README.md b/pub_sub/java/sdk/README.md index 7bed80ac5..4425cd446 100644 --- a/pub_sub/java/sdk/README.md +++ b/pub_sub/java/sdk/README.md @@ -17,10 +17,10 @@ And one subscriber: ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. ## Run all apps with multi-app run template file: diff --git a/pub_sub/java/sdk/checkout/pom.xml b/pub_sub/java/sdk/checkout/pom.xml index 8d5abf89d..61467fa37 100644 --- a/pub_sub/java/sdk/checkout/pom.xml +++ b/pub_sub/java/sdk/checkout/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ com.squareup.okhttp3 okhttp - 4.9.0 + 4.12.0 org.slf4j @@ -37,7 +37,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -47,7 +47,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 diff --git a/pub_sub/java/sdk/order-processor/pom.xml b/pub_sub/java/sdk/order-processor/pom.xml index adee52775..011fd2be5 100644 --- a/pub_sub/java/sdk/order-processor/pom.xml +++ b/pub_sub/java/sdk/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service @@ -34,7 +34,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -44,12 +44,12 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.4 + 3.3.1 org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.3.1 diff --git a/secrets_management/java/http/order-processor/pom.xml b/secrets_management/java/http/order-processor/pom.xml index 3c8a4f69d..521809649 100644 --- a/secrets_management/java/http/order-processor/pom.xml +++ b/secrets_management/java/http/order-processor/pom.xml @@ -21,7 +21,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/secrets_management/java/sdk/order-processor/pom.xml b/secrets_management/java/sdk/order-processor/pom.xml index 53c96875c..f13f28a87 100644 --- a/secrets_management/java/sdk/order-processor/pom.xml +++ b/secrets_management/java/sdk/order-processor/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/service_invocation/java/http/README.md b/service_invocation/java/http/README.md index 6fa25dbd3..ff93315e8 100644 --- a/service_invocation/java/http/README.md +++ b/service_invocation/java/http/README.md @@ -15,10 +15,10 @@ And one order processor service: ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. ## Run all apps with multi-app run template file: diff --git a/service_invocation/java/http/checkout/pom.xml b/service_invocation/java/http/checkout/pom.xml index c9a1d12fe..2796decff 100644 --- a/service_invocation/java/http/checkout/pom.xml +++ b/service_invocation/java/http/checkout/pom.xml @@ -11,13 +11,13 @@ 17 17 - 1.6.1 + 2.0.13 org.json json - 20211205 + 20240303 @@ -25,7 +25,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/service_invocation/java/http/order-processor/pom.xml b/service_invocation/java/http/order-processor/pom.xml index d1f6531a0..d88682cdb 100644 --- a/service_invocation/java/http/order-processor/pom.xml +++ b/service_invocation/java/http/order-processor/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 3.3.1 com.service diff --git a/state_management/java/http/README.md b/state_management/java/http/README.md index f77fef506..d3e4be489 100644 --- a/state_management/java/http/README.md +++ b/state_management/java/http/README.md @@ -9,10 +9,10 @@ Visit [this](https://docs.dapr.io/developing-applications/building-blocks/state- ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. This quickstart includes one service: Java client service `order-processor` diff --git a/state_management/java/http/order-processor/pom.xml b/state_management/java/http/order-processor/pom.xml index 86e3f98e0..f112a4e99 100644 --- a/state_management/java/http/order-processor/pom.xml +++ b/state_management/java/http/order-processor/pom.xml @@ -12,19 +12,19 @@ 17 17 - 1.6.1 + 2.0.13 org.projectlombok lombok - 1.18.24 + 1.18.32 true com.fasterxml.jackson.core jackson-databind - 2.9.8 + 2.17.1 @@ -32,7 +32,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/state_management/java/sdk/README.md b/state_management/java/sdk/README.md index 89b5abbe9..473c71230 100644 --- a/state_management/java/sdk/README.md +++ b/state_management/java/sdk/README.md @@ -9,10 +9,10 @@ Visit [this](https://docs.dapr.io/developing-applications/building-blocks/state- ## Pre-requisites * [Dapr and Dapr Cli](https://docs.dapr.io/getting-started/install-dapr-cli/). -* Java JDK 11 (or greater): - * [Microsoft JDK 11](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11) - * [Oracle JDK 11](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11) - * [OpenJDK 11](https://jdk.java.net/11/) +* Java JDK 17 (or greater): + * [Microsoft JDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17) + * [Oracle JDK 17](https://www.oracle.com/java/technologies/downloads/?er=221886#java17) + * [OpenJDK 17](https://jdk.java.net/17/) * [Apache Maven](https://maven.apache.org/install.html) version 3.x. This quickstart includes one service: Java client service `order-processor` diff --git a/state_management/java/sdk/order-processor/pom.xml b/state_management/java/sdk/order-processor/pom.xml index 7880fa049..9dcf72eef 100644 --- a/state_management/java/sdk/order-processor/pom.xml +++ b/state_management/java/sdk/order-processor/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.32 true @@ -32,7 +32,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 diff --git a/workflows/java/sdk/order-processor/pom.xml b/workflows/java/sdk/order-processor/pom.xml index 6388ec247..108bea7f4 100644 --- a/workflows/java/sdk/order-processor/pom.xml +++ b/workflows/java/sdk/order-processor/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.6.1 + 2.0.13 @@ -22,7 +22,7 @@ org.slf4j slf4j-simple - 1.7.36 + 2.0.13 @@ -31,7 +31,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.6.3 + 3.3.1 From 112aa95102d298e60b3a50f97bff165a61d13c82 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 22 Jul 2024 13:26:35 -0700 Subject: [PATCH 59/74] fixing sdk implementation Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 1 - jobs/go/sdk/README.md | 4 ++-- jobs/go/sdk/job-scheduler/go.mod | 5 +---- jobs/go/sdk/job-scheduler/go.sum | 2 ++ jobs/go/sdk/job-service/go.mod | 5 +---- jobs/go/sdk/job-service/go.sum | 4 ++++ jobs/go/sdk/job-service/job-service.go | 4 +--- 7 files changed, 11 insertions(+), 14 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 35a6388a5..46aea5ad0 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -23,7 +23,6 @@ expected_stdout_lines: - '== APP - job-service == Received job request...' - '== APP - job-service == Executing maintenance job: Oil Change' - '== APP - job-scheduler == Job Scheduled: C-3PO' - - '== APP - job-scheduler == Job details: {"name":"C-3PO", "dueTime":"30s", "data":{"@type":"type.googleapis.com/google.protobuf.StringValue", "value":"C-3PO:Limb Calibration"}}' - '== APP - job-service == Received job request...' - '== APP - job-service == Executing maintenance job: Limb Calibration' expected_stderr_lines: diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 6121660bb..955c44366 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -112,7 +112,7 @@ The output should be: == APP == Registered job handler for: R2-D2 == APP == Registered job handler for: C-3PO == APP == Registered job handler for: BB-8 -== APP == Starting server on port: 5200 +== APP == Starting server on port: 6200 ``` 2. On a new terminal window, run the `job-scheduler` app: @@ -124,7 +124,7 @@ dapr run --app-id job-scheduler --app-port 6300 -- go run . The output should be: ```text -== APP == dapr client initializing for: 127.0.0.1:63896 +== APP == dapr client initializing for: == APP == Get job response: {"droid":"C-3PO","Task":"Memory Wipe"} == APP == Get job response: {"droid":"BB-8","Task":"Internal Gyroscope Check"} == APP == Job deleted: BB-8 diff --git a/jobs/go/sdk/job-scheduler/go.mod b/jobs/go/sdk/job-scheduler/go.mod index b45ba4396..0660c25b8 100644 --- a/jobs/go/sdk/job-scheduler/go.mod +++ b/jobs/go/sdk/job-scheduler/go.mod @@ -2,7 +2,7 @@ module dapr_job_example go 1.22.5 -require github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 +require github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 require ( github.com/dapr/dapr v1.14.0-rc.2 // indirect @@ -17,6 +17,3 @@ require ( google.golang.org/protobuf v1.34.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 -replace github.com/dapr/go-sdk => /Users/rocha/Developer/dapr/go-sdk diff --git a/jobs/go/sdk/job-scheduler/go.sum b/jobs/go/sdk/job-scheduler/go.sum index b7cefaca8..2d3213c68 100644 --- a/jobs/go/sdk/job-scheduler/go.sum +++ b/jobs/go/sdk/job-scheduler/go.sum @@ -1,6 +1,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 h1:zFl/d1LAz/dwCApp5HRsRC8eabB0SkAqEAqyB5f4XYA= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164/go.mod h1:Xit2/1Go+fYy/TXrpf8oEefluvXtuvmC+nKEd3wJdQE= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= diff --git a/jobs/go/sdk/job-service/go.mod b/jobs/go/sdk/job-service/go.mod index 89212104b..2245c2f13 100644 --- a/jobs/go/sdk/job-service/go.mod +++ b/jobs/go/sdk/job-service/go.mod @@ -3,7 +3,7 @@ module dapr_job_example go 1.22.5 require ( - github.com/dapr/go-sdk v0.0.0-00010101000000-000000000000 + github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 google.golang.org/protobuf v1.34.2 ) @@ -19,6 +19,3 @@ require ( google.golang.org/grpc v1.65.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -//replace github.com/dapr/go-sdk => github.com/mikeee/dapr_go-sdk v0.0.0-9008fd7e91b1562678ec84f3383950dbda4b7449 -replace github.com/dapr/go-sdk => /Users/rocha/Developer/dapr/go-sdk diff --git a/jobs/go/sdk/job-service/go.sum b/jobs/go/sdk/job-service/go.sum index b7cefaca8..c5e81fe8a 100644 --- a/jobs/go/sdk/job-service/go.sum +++ b/jobs/go/sdk/job-service/go.sum @@ -1,6 +1,10 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dapr/dapr v1.14.0-rc.2 h1:wuXninZLTyokeztCinVIVAc9mpVYJS8QyxecPCLdlY8= github.com/dapr/dapr v1.14.0-rc.2/go.mod h1:uZMuD9K7y+LKSsQUoSAvv1Yn8Cim9X/9ZQ9XuTobyP8= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164 h1:zFl/d1LAz/dwCApp5HRsRC8eabB0SkAqEAqyB5f4XYA= +github.com/dapr/go-sdk v1.10.0-rc-1.0.20240722191953-77c213de6164/go.mod h1:Xit2/1Go+fYy/TXrpf8oEefluvXtuvmC+nKEd3wJdQE= +github.com/dapr/go-sdk v1.10.1 h1:g6mM2RXyGkrzsqWFfCy8rw+UAt1edQEgRaQXT+XP4PE= +github.com/dapr/go-sdk v1.10.1/go.mod h1:lPjyF/xubh35fbdNdKkxBbFxFNCmta4zmvsk0JxuUG0= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 9ce2b244f..1e6c76f53 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -29,10 +29,8 @@ import ( "github.com/dapr/go-sdk/service/common" "google.golang.org/protobuf/types/known/anypb" - daprs "github.com/dapr/go-sdk/service/grpc" - //daprs "github.com/dapr/go-sdk/service/http" - daprc "github.com/dapr/go-sdk/client" + daprs "github.com/dapr/go-sdk/service/grpc" ) type App struct { From 1bae77b181d83fb09308cd265ebc00b1184af9a3 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 22 Jul 2024 14:45:00 -0700 Subject: [PATCH 60/74] Update README.md Co-authored-by: Cassie Coyle Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 46aea5ad0..d67823646 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -2,7 +2,7 @@ In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. This API is responsible for scheduling and running jobs at a specific time or interval. -Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. +Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Jobs API. > **Note:** This example leverages HTTP `requests` only. If you are looking for the example using the Dapr Client SDK (recommended) [click here](../sdk/). From 44a715afabfc194fb68f63e5514883550465c51f Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Mon, 22 Jul 2024 23:26:16 -0700 Subject: [PATCH 61/74] fixing ports on README files Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 4 ++-- jobs/go/sdk/README.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index d67823646..1540dac8f 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -136,13 +136,13 @@ You should see the following: 1. On the same terminal window, run the command below to deleted the recently scheduled `C-3PO` job. ```bash -curl -X DELETE http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +curl -X DELETE http://localhost:6280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` 2. Run the command below to attempt to retrieve the deleted job: ```bash -curl -X GET http://localhost:5280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" +curl -X GET http://localhost:6280/v1.0-alpha1/jobs/c-3po -H "Content-Type: application/json" ``` Back at the `job-service` app terminal window, the output should be: diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 955c44366..ea38f916f 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -58,11 +58,11 @@ The terminal console output should look similar to this, where: ```text -== APP - job-service == dapr client initializing for: 127.0.0.1:5281 +== APP - job-service == dapr client initializing for: 127.0.0.1:6281 == APP - job-service == Registered job handler for: R2-D2 == APP - job-service == Registered job handler for: C-3PO == APP - job-service == Registered job handler for: BB-8 -== APP - job-service == Starting server on port: 5200 +== APP - job-service == Starting server on port: 6200 == APP - job-service == Job scheduled: R2-D2 == APP - job-service == Job scheduled: C-3PO == APP - job-service == 2024/07/17 18:09:59 job:{name:"C-3PO" due_time:"10s" data:{value:"{\"droid\":\"C-3PO\",\"Task\":\"Memory Wipe\"}"}} @@ -108,7 +108,7 @@ dapr run --app-id job-service --app-port 6200 --dapr-http-port 6280 --dapr-grpc- The output should be: ```text -== APP == dapr client initializing for: 127.0.0.1:5281 +== APP == dapr client initializing for: 127.0.0.1:6281 == APP == Registered job handler for: R2-D2 == APP == Registered job handler for: C-3PO == APP == Registered job handler for: BB-8 From 9ce907bfcf6f95306c8d7677f61146ab1267db42 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:12:38 -0700 Subject: [PATCH 62/74] Update jobs/go/http/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/http/job-service/job-service.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index ba7af6f29..1738d8bdf 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -59,8 +59,6 @@ func handleJob(w http.ResponseWriter, r *http.Request) { return } - //fmt.Println("Raw request body:", string(rawBody)) - var jobData Job if err := json.Unmarshal(rawBody, &jobData); err != nil { http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) From cf42714de8acc470d8493a1720476caed8b8f336 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:21 -0700 Subject: [PATCH 63/74] Update jobs/go/sdk/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/sdk/job-service/job-service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 1e6c76f53..4f5b94711 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -185,7 +185,7 @@ func deleteJob(ctx context.Context, in *common.InvocationEvent) (out *common.Con return nil, err } - err = app.daprClient.DeleteJobAlpha1(context.Background(), string(in.Data)) + err = app.daprClient.DeleteJobAlpha1(ctx, string(in.Data)) if err != nil { fmt.Println("failed to delete job. err: ", err) } From cf6d433c96fdd9270ea9f228975a1d61a027c79c Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:32 -0700 Subject: [PATCH 64/74] Update jobs/go/sdk/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/sdk/job-service/job-service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 4f5b94711..18c21e82f 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -164,7 +164,7 @@ func getJob(ctx context.Context, in *common.InvocationEvent) (out *common.Conten return nil, err } - job, err := app.daprClient.GetJobAlpha1(context.Background(), string(in.Data)) + job, err := app.daprClient.GetJobAlpha1(ctx, string(in.Data)) if err != nil { fmt.Println("failed to get job. err: ", err) } From 5f2de03085b522d4612045f1519488ffbfcee5ab Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:41 -0700 Subject: [PATCH 65/74] Update jobs/go/sdk/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/sdk/job-service/job-service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/job-service/job-service.go b/jobs/go/sdk/job-service/job-service.go index 18c21e82f..f056f2236 100644 --- a/jobs/go/sdk/job-service/job-service.go +++ b/jobs/go/sdk/job-service/job-service.go @@ -138,7 +138,7 @@ func scheduleJob(ctx context.Context, in *common.InvocationEvent) (out *common.C }, } - err = app.daprClient.ScheduleJobAlpha1(context.Background(), &job) + err = app.daprClient.ScheduleJobAlpha1(ctx, &job) if err != nil { fmt.Println("failed to schedule job. err: ", err) return nil, err From 587ca433cad3ae8f1e79b2ff49b5bca7b1547beb Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:15:50 -0700 Subject: [PATCH 66/74] Update jobs/go/http/job-service/job-service.go Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- jobs/go/http/job-service/job-service.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/jobs/go/http/job-service/job-service.go b/jobs/go/http/job-service/job-service.go index 1738d8bdf..0eca44437 100644 --- a/jobs/go/http/job-service/job-service.go +++ b/jobs/go/http/job-service/job-service.go @@ -73,8 +73,6 @@ func handleJob(w http.ResponseWriter, r *http.Request) { return } - //fmt.Println("decoded value:", string(decodedValue)) - // Creating Droid Job from decoded value droidJob := setDroidJob(string(decodedValue)) From 428d07d5699c3ef06765ba84db4b69ca3f52e579 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:16:43 -0700 Subject: [PATCH 67/74] Update .github/env/global.env Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- .github/env/global.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/env/global.env b/.github/env/global.env index 70f766058..6abaee063 100644 --- a/.github/env/global.env +++ b/.github/env/global.env @@ -1,4 +1,4 @@ - DAPR_CLI_VERSION: 1.13.0 + DAPR_CLI_VERSION: 1.14.0-rc.6 DAPR_RUNTIME_VERSION: 1.13.5 DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v${DAPR_CLI_VERSION}/install/ DAPR_DEFAULT_IMAGE_REGISTRY: ghcr From aef0b47b8e2f7b83f93b16162cb053ec6b1ffabf Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:16:49 -0700 Subject: [PATCH 68/74] Update .github/env/global.env Co-authored-by: Mike Nguyen Signed-off-by: Fernando Rocha Signed-off-by: Fernando Rocha --- .github/env/global.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/env/global.env b/.github/env/global.env index 6abaee063..8ac1fd2a8 100644 --- a/.github/env/global.env +++ b/.github/env/global.env @@ -1,5 +1,5 @@ DAPR_CLI_VERSION: 1.14.0-rc.6 - DAPR_RUNTIME_VERSION: 1.13.5 + DAPR_RUNTIME_VERSION: 1.14.0-rc.5 DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v${DAPR_CLI_VERSION}/install/ DAPR_DEFAULT_IMAGE_REGISTRY: ghcr MACOS_PYTHON_VERSION: 3.10 From 5c706f46c45b4ed63700752dab10dd9fce344d5a Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 08:19:02 -0700 Subject: [PATCH 69/74] fixing README typo Signed-off-by: Fernando Rocha --- jobs/go/sdk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index ea38f916f..27dc67615 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -4,7 +4,7 @@ In this quickstart, you'll schedule, get, and delete a job using Dapr's Job API. Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/jobs/) link for more information about Dapr and the Job API. -> **Note:** This example leverages the SDK only. If you are looking for the example using the HTTP requests (recommended) [click here](../http/). +> **Note:** This example leverages the SDK only. If you are looking for the example using the HTTP requests [click here](../http/). This quickstart includes two apps: From 10d61e02ae67daa6a4163bff755cca21b2223837 Mon Sep 17 00:00:00 2001 From: Paul Yuknewicz Date: Tue, 9 Jul 2024 09:18:51 -0700 Subject: [PATCH 70/74] Changing Dapr runtime version to 1.13.5 to support test efforts (#1049) Signed-off-by: Paul Yuknewicz --- .github/env/global.env | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/env/global.env b/.github/env/global.env index 8ac1fd2a8..366dc03d7 100644 --- a/.github/env/global.env +++ b/.github/env/global.env @@ -1,5 +1,5 @@ - DAPR_CLI_VERSION: 1.14.0-rc.6 - DAPR_RUNTIME_VERSION: 1.14.0-rc.5 - DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v${DAPR_CLI_VERSION}/install/ - DAPR_DEFAULT_IMAGE_REGISTRY: ghcr - MACOS_PYTHON_VERSION: 3.10 +DAPR_CLI_VERSION: 1.14.0-rc.6 +DAPR_RUNTIME_VERSION: 1.14.0-rc.5 +DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v${DAPR_CLI_VERSION}/install/ +DAPR_DEFAULT_IMAGE_REGISTRY: ghcr +MACOS_PYTHON_VERSION: 3.10 From 4e1fccf469d6897a8ca6f2edfa5e17c3221b27e4 Mon Sep 17 00:00:00 2001 From: Anton Troshin Date: Mon, 22 Jul 2024 16:26:26 -0500 Subject: [PATCH 71/74] Update tutorials pub-sub csharp-subscriber image to dotnet 8.0 (#1001) * Update tutorials pub-sub csharp-subscriber image to dotnet 8.0 Signed-off-by: Anton Troshin * Update Dockerfile Signed-off-by: Artur Souza --------- Signed-off-by: Anton Troshin Signed-off-by: Artur Souza Co-authored-by: Artur Souza Signed-off-by: Fernando Rocha --- tutorials/pub-sub/csharp-subscriber/Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tutorials/pub-sub/csharp-subscriber/Dockerfile b/tutorials/pub-sub/csharp-subscriber/Dockerfile index fc2f1bf5a..e7c0c2a1b 100644 --- a/tutorials/pub-sub/csharp-subscriber/Dockerfile +++ b/tutorials/pub-sub/csharp-subscriber/Dockerfile @@ -1,7 +1,6 @@ # Note: we cannot do a staged dotnet docker build here for arm/arm64. -# Build runtime image -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY /out . -ENTRYPOINT ["dotnet", "csharp-subscriber.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "csharp-subscriber.dll"] From 6dabd02ac432a0bbf49ebaa1b8370c88522be0a4 Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 12:16:42 -0700 Subject: [PATCH 72/74] Increasing sleep to validate tests Signed-off-by: Fernando Rocha --- jobs/go/sdk/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jobs/go/sdk/README.md b/jobs/go/sdk/README.md index 27dc67615..4321e9b77 100644 --- a/jobs/go/sdk/README.md +++ b/jobs/go/sdk/README.md @@ -37,8 +37,8 @@ expected_stderr_lines: output_match_mode: substring match_order: none background: true -sleep: 60 -timeout_seconds: 120 +sleep: 120 +timeout_seconds: 180 --> ```bash From 7f8cebd1fb0e0dc5045dad3c80db87d1a790629b Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Tue, 23 Jul 2024 12:57:40 -0700 Subject: [PATCH 73/74] Update jobs/go/http/README.md Co-authored-by: Cassie Coyle Signed-off-by: Fernando Rocha --- jobs/go/http/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/go/http/README.md b/jobs/go/http/README.md index 1540dac8f..f775d43df 100644 --- a/jobs/go/http/README.md +++ b/jobs/go/http/README.md @@ -9,7 +9,7 @@ Visit [this](https://v1-14.docs.dapr.io/developing-applications/building-blocks/ This quickstart includes two apps: - `job-scheduler.go`, responsible for scheduling, retrieving and deleting jobs. -- `job-service.go`, responsible for handling the scheduled jobs. +- `job-service.go`, responsible for handling the triggered jobs. ## Run the app with the template file From 0427e3fdd3a3d4445ea9a7da9bff841a27df8e1a Mon Sep 17 00:00:00 2001 From: Fernando Rocha Date: Wed, 24 Jul 2024 07:58:53 -0700 Subject: [PATCH 74/74] Adding timers between calls Signed-off-by: Fernando Rocha --- jobs/go/sdk/job-scheduler/job-scheduler.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/jobs/go/sdk/job-scheduler/job-scheduler.go b/jobs/go/sdk/job-scheduler/job-scheduler.go index 9418da5ad..19364c04d 100644 --- a/jobs/go/sdk/job-scheduler/job-scheduler.go +++ b/jobs/go/sdk/job-scheduler/job-scheduler.go @@ -41,8 +41,8 @@ func main() { droidJobs := []DroidJob{ {Name: "R2-D2", Job: "Oil Change", DueTime: "5s"}, - {Name: "C-3PO", Job: "Memory Wipe", DueTime: "10s"}, - {Name: "BB-8", Job: "Internal Gyroscope Check", DueTime: "15s"}, + {Name: "C-3PO", Job: "Memory Wipe", DueTime: "15s"}, + {Name: "BB-8", Job: "Internal Gyroscope Check", DueTime: "30s"}, } //Create new Dapr client @@ -62,12 +62,16 @@ func main() { log.Fatalln("Error scheduling job: ", err) } + time.Sleep(3 * time.Second) + // Schedule C-3PO job err = schedule(droidJobs[1]) if err != nil { log.Fatalln("Error scheduling job: ", err) } + time.Sleep(5 * time.Second) + // Get C-3PO job resp, err := get(droidJobs[1]) if err != nil { @@ -81,6 +85,8 @@ func main() { log.Fatalln("Error scheduling job: ", err) } + time.Sleep(5 * time.Second) + // Get BB-8 job resp, err = get(droidJobs[2]) if err != nil { @@ -88,6 +94,8 @@ func main() { } fmt.Println("Get job response: ", resp) + time.Sleep(5 * time.Second) + // Delete BB-8 job err = delete(droidJobs[2]) if err != nil {