From e2e905aeb8a776687258c42cb910b545d41a3017 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Mon, 21 Oct 2024 14:06:21 -0500 Subject: [PATCH 1/9] robust jobs api longhaul test Signed-off-by: Cassandra Coyle --- deploy/dapr-multi-app/dapr.yaml | 6 +- scheduler-jobs/Dockerfile | 28 ++ scheduler-jobs/go.mod | 21 ++ scheduler-jobs/go.sum | 43 +++ scheduler-jobs/instructions.md | 17 + scheduler-jobs/scheduler-jobs.go | 316 +++++++++++++++++++ scheduler-jobs/scheduler_debugger_config.png | Bin 0 -> 118875 bytes scheduler-jobs/sidecar_debugger_config.png | Bin 0 -> 152928 bytes 8 files changed, 430 insertions(+), 1 deletion(-) create mode 100644 scheduler-jobs/Dockerfile create mode 100644 scheduler-jobs/go.mod create mode 100644 scheduler-jobs/go.sum create mode 100644 scheduler-jobs/instructions.md create mode 100644 scheduler-jobs/scheduler-jobs.go create mode 100644 scheduler-jobs/scheduler_debugger_config.png create mode 100644 scheduler-jobs/sidecar_debugger_config.png diff --git a/deploy/dapr-multi-app/dapr.yaml b/deploy/dapr-multi-app/dapr.yaml index 16d16843..1fa33388 100644 --- a/deploy/dapr-multi-app/dapr.yaml +++ b/deploy/dapr-multi-app/dapr.yaml @@ -30,4 +30,8 @@ apps: - appID: pubsub-workflow appDirPath: ../../pubsub-workflow appPort: 3005 - command: ["dotnet","run", "--DaprHTTPAppPort=3005"] \ No newline at end of file + command: ["dotnet","run", "--DaprHTTPAppPort=3005"] + - appID: scheduler-jobs + appDirPath: ../../scheduler-jobs + appPort: 3006 + command: [ "go","run", "scheduler-jobs.go"] \ No newline at end of file diff --git a/scheduler-jobs/Dockerfile b/scheduler-jobs/Dockerfile new file mode 100644 index 00000000..4b735471 --- /dev/null +++ b/scheduler-jobs/Dockerfile @@ -0,0 +1,28 @@ +FROM golang:1.23 as builder + +# Working directory inside the container +WORKDIR /scheduler-jobs + +COPY go.mod go.sum ./ +RUN go mod download + +# Copy the app code +COPY . . + +# Build the app +RUN CGO_ENABLED=0 GOOS=linux go build -o scheduler-jobs . + +# Initialize a new build stage. Use a minimal base image for the final container +FROM alpine:latest + +# Install certificates for HTTPS support +RUN apk --no-cache add ca-certificates + +# Copy the binary from the builder image -> final image +COPY --from=builder /scheduler-jobs/scheduler-jobs /usr/local/bin/scheduler-jobs + +# Port the app will listen on +EXPOSE 3006 + +# Entrypoint to run the app +ENTRYPOINT ["scheduler-jobs"] diff --git a/scheduler-jobs/go.mod b/scheduler-jobs/go.mod new file mode 100644 index 00000000..bbd8621f --- /dev/null +++ b/scheduler-jobs/go.mod @@ -0,0 +1,21 @@ +module github.com/dapr/test-infra/scheduler-jobs + +go 1.23.1 + +require ( + github.com/dapr/dapr v1.14.4 + github.com/dapr/go-sdk v1.11.0 + google.golang.org/grpc v1.67.1 +) + +require ( + 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.28.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/scheduler-jobs/go.sum b/scheduler-jobs/go.sum new file mode 100644 index 00000000..6c1df8f9 --- /dev/null +++ b/scheduler-jobs/go.sum @@ -0,0 +1,43 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dapr/dapr v1.14.4 h1:OEyAFvpW4AK+MWyX5xp9zVLiC+oY/5ziDzh16F+aoWU= +github.com/dapr/dapr v1.14.4/go.mod h1:pZGJvUGT4IDhEuWVXBvJ73TkPnLAW34SDagth7G3f8w= +github.com/dapr/go-sdk v1.11.0 h1:clANpOQd6MsfvSa6snaX8MVk6eRx26Vsj5GxGdQ6mpE= +github.com/dapr/go-sdk v1.11.0/go.mod h1:btZ/tX8eYnx0fg3HiJUku8J5QBRXHsp3kAB1BUiTxXY= +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.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +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/scheduler-jobs/instructions.md b/scheduler-jobs/instructions.md new file mode 100644 index 00000000..acd807da --- /dev/null +++ b/scheduler-jobs/instructions.md @@ -0,0 +1,17 @@ +# How-To Run Locally: + +To run locally as a process: `go run scheduler-app.go` + +Run Scheduler: +![scheduler_debugger_config.png](scheduler_debugger_config.png) + +Run Dapr sidecar: +![sidecar_debugger_config.png](sidecar_debugger_config.png) + +To run locally as a container: +```shell +docker build -t scheduler-jobs . +docker run -p 8383:8383 --name scheduler-jobs scheduler-jobs # optionally add -d to run in background +# check container is running +docker ps +``` \ No newline at end of file diff --git a/scheduler-jobs/scheduler-jobs.go b/scheduler-jobs/scheduler-jobs.go new file mode 100644 index 00000000..448e9f77 --- /dev/null +++ b/scheduler-jobs/scheduler-jobs.go @@ -0,0 +1,316 @@ +package main + +import ( + "context" + "fmt" + "log" + "net" + "os" + "os/signal" + "strconv" + "strings" + "sync/atomic" + "syscall" + "time" + + "google.golang.org/grpc" + + rtv1 "github.com/dapr/dapr/pkg/proto/runtime/v1" + "github.com/dapr/go-sdk/client" +) + +const appPort = ":3006" +const daprGRPCPort = "3501" + +var oneshot atomic.Int64 +var indefinite atomic.Int64 +var repeat atomic.Int64 +var createDelete atomic.Int64 + +const maxOneshotTriggerCount = 100 +const maxIndefiniteTriggerCount = 100 +const maxRepeatTriggerCount = 5 +const maxCreateDeleteTriggerCount = 1 + +// Channel to trigger scheduling new jobs after reaching the max count +var oneshotDoneCh = make(chan struct{}, 1) +var indefiniteDoneCh = make(chan struct{}, 1) +var repeatDoneCh = make(chan struct{}, 1) +var receivedSingleJobDoneCh = make(chan struct{}, 1) +var createDeleteDoneCh = make(chan struct{}, 1) + +type appServer struct { + client client.Client +} + +// startServer starts a gRPC server for receiving callbacks +func startServer(ctx context.Context) error { + lis, err := net.Listen("tcp", appPort) + if err != nil { + return fmt.Errorf("failed to listen on %v: %w", appPort, err) + } + + s := grpc.NewServer() + rtv1.RegisterAppCallbackAlphaServer(s, &appServer{}) + + errCh := make(chan error, 1) + + go func() { + log.Printf("Starting gRPC server on port %s...\n", appPort) + if err := s.Serve(lis); err != nil { + errCh <- fmt.Errorf("failed to serve: %w", err) + } + }() + + select { + case <-ctx.Done(): + log.Println("Context canceled, shutting down gRPC server...") + s.GracefulStop() + return nil + case err := <-errCh: + return err + } +} + +func (s *appServer) OnBulkTopicEventAlpha1(ctx context.Context, in *rtv1.TopicEventBulkRequest) (*rtv1.TopicEventBulkResponse, error) { + return nil, nil +} + +func (s *appServer) OnJobEventAlpha1(ctx context.Context, in *rtv1.JobEventRequest) (*rtv1.JobEventResponse, error) { + if strings.HasPrefix(in.GetMethod(), "job/") { + if strings.Contains(in.GetMethod(), "oneshot") { + count := oneshot.Add(1) + if count == maxOneshotTriggerCount { + // Reset the oneshot counter + oneshot.Store(0) + log.Println("Reached max oneshot job count, scheduling new jobs...") + // Send signal to start scheduling another batch of one shot jobs + oneshotDoneCh <- struct{}{} + } + } else if strings.Contains(in.GetMethod(), "indefinite") { + count := indefinite.Add(1) + if count == maxIndefiniteTriggerCount { + // Reset the oneshot counter + indefinite.Store(0) + log.Println("Reached max indefinite job count, scheduling new jobs...") + // Send signal to start scheduling another batch of indefinite jobs + indefiniteDoneCh <- struct{}{} + } + } else if strings.Contains(in.GetMethod(), "repeat-job") { + count := repeat.Add(1) + if count == maxRepeatTriggerCount { + // Reset the repeat counter + repeat.Store(0) + log.Println("Reached max repeat job count, scheduling new jobs...") + // Send signal to start scheduling another repeat job + repeatDoneCh <- struct{}{} + } + } else if strings.Contains(in.GetMethod(), "create-delete-job") { + count := createDelete.Add(1) + log.Printf("create-delete-job triggered count: %d\n", count) + + if count == maxCreateDeleteTriggerCount { + log.Println("Received the single create-delete-job, deleting it...") + // Send signal to delete the job + receivedSingleJobDoneCh <- struct{}{} + } else { + log.Printf("Received too many single repeat, create-delete-job jobs. Count: %d...\n", createDelete.Load()) + } + } + } + return nil, nil +} + +func scheduleOneshotJobs(daprClient client.Client) { + for i := 0; i < 100; i++ { + name := "oneshot-job-" + strconv.Itoa(i) + req := &client.Job{ + Name: name, + Schedule: "@every 30s", + Repeats: 1, // one shot job + DueTime: "5s", + TTL: "40s", + Data: nil, + } + err := daprClient.ScheduleJobAlpha1(context.Background(), req) + if err != nil { + log.Printf("Error scheduling oneshot job '%s': %s\n", name, err) + } + } +} + +func scheduleIndefiniteJobs(daprClient client.Client) { + for i := 0; i < 100; i++ { + name := "indefinite-job-" + strconv.Itoa(i) + req := &client.Job{ + Name: name, + Schedule: "@every 30s", + DueTime: "1s", + TTL: "40s", + Data: nil, + } + err := daprClient.ScheduleJobAlpha1(context.Background(), req) + if err != nil { + log.Printf("Error scheduling indefinite job '%s': %s\n", name, err) + } + } +} + +func scheduleRepeatedJob(daprClient client.Client) { + name := "repeat-job" + req := &client.Job{ + Name: name, + Schedule: "@every 1s", + DueTime: "0s", + Repeats: maxRepeatTriggerCount, + TTL: "10s", + Data: nil, + } + err := daprClient.ScheduleJobAlpha1(context.Background(), req) + if err != nil { + log.Printf("Error scheduling repeat job '%s': %s\n", name, err) + } +} + +func scheduleSingleJob(daprClient client.Client) { + name := "create-delete-job" + req := &client.Job{ + Name: name, + Schedule: "@every 1s", + DueTime: "1s", + Repeats: maxCreateDeleteTriggerCount, + TTL: "3s", + Data: nil, + } + err := daprClient.ScheduleJobAlpha1(context.Background(), req) + if err != nil { + log.Printf("Error scheduling single job '%s': %s\n", name, err) + } +} + +func deleteSingleJob(daprClient client.Client) { + name := "create-delete-job" + err := daprClient.DeleteJobAlpha1(context.Background(), name) + if err != nil { + log.Printf("Error deleting single job '%s': %s\n", name, err) + } + createDelete.Store(0) + // signal to start the create/delete process again after waiting 2 minutes + createDeleteDoneCh <- struct{}{} +} + +func main() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + go func(ctx context.Context) { + if err := startServer(ctx); err != nil { + log.Fatalf("Error starting server: %v", err) + } + }(ctx) + + // --dapr-grpc-port=3501 + daprClient, err := client.NewClientWithPort(daprGRPCPort) + if err != nil { + log.Fatalf("Error getting dapr client: %v", err) + } + defer daprClient.Close() + + // allow time for sidecar to connect otherwise if the job is scheduled beforehand then it gets dropped on the + // scheduler side bc there's no connection to send the job back on + log.Println("waiting a few seconds to let connections establish") + time.Sleep(5 * time.Second) + + // Schedule initial batch of jobs + go scheduleOneshotJobs(daprClient) + go scheduleIndefiniteJobs(daprClient) + go scheduleRepeatedJob(daprClient) + + // Schedule additional oneshot jobs once 100 are triggered + go func(ctx context.Context) { + select { + case <-ctx.Done(): + return + case <-oneshotDoneCh: + log.Println("Received input that maxOneshotTriggerCount was reached. Sleeping...") + time.Sleep(10 * time.Second) + log.Println("Scheduling next batch of oneshot jobs...") + go scheduleOneshotJobs(daprClient) + } + }(ctx) + + // Schedule additional indefinite jobs once 100 are triggered + go func(ctx context.Context) { + select { + case <-ctx.Done(): + return + case <-indefiniteDoneCh: + log.Println("Received input that maxIndefiniteTriggerCount was reached. Sleeping...") + time.Sleep(10 * time.Second) + log.Println("Scheduling next batch of indefinite jobs...") + go scheduleIndefiniteJobs(daprClient) + } + }(ctx) + + // Schedule job to trigger immediately every second for 1s + go func(ctx context.Context) { + select { + case <-ctx.Done(): + return + case <-repeatDoneCh: + log.Println("Received input that maxRepeatTriggerCount was reached. Sleeping...") + time.Sleep(60 * time.Second) + log.Println("Scheduling next repeated job...") + go scheduleRepeatedJob(daprClient) + } + }(ctx) + + // Handle receivedSingleJobDoneCh, this handles the scheduled job from the next go routine + go func(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + case <-receivedSingleJobDoneCh: + log.Println("Received input that the create-delete-job triggered, now deleting the job...") + // received triggered job, now delete it & set atomic int to 0 + deleteSingleJob(daprClient) + log.Println("Successfully deleted create-delete-job.") + } + } + }(ctx) + + go scheduleSingleJob(daprClient) + + // Reschedule the create-delete job after deletion, ensure triggers once + go func(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + case <-createDeleteDoneCh: + log.Println("Received input that the create-delete-job was deleted. Sleeping for 5 seconds...") + time.Sleep(5 * time.Second) + log.Println("Scheduling create-delete-job...") + scheduleSingleJob(daprClient) + log.Println("Successfully scheduled create-delete-job.") + } + } + }(ctx) + + // Block until ctrl-c or sigterm + waitForShutdown(cancel) +} + +// waitForShutdown keeps the app alive until an interrupt or termination signal is received +func waitForShutdown(cancelFunc context.CancelFunc) { + sigCh := make(chan os.Signal, 1) + // Notify the channel on Interrupt (Ctrl+C) or SIGTERM (for Docker/K8s graceful shutdown) + signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) + + // Block until we receive a signal + <-sigCh + + log.Println("Shutting down...") + cancelFunc() +} diff --git a/scheduler-jobs/scheduler_debugger_config.png b/scheduler-jobs/scheduler_debugger_config.png new file mode 100644 index 0000000000000000000000000000000000000000..93489f512da4a87a741a3d682f25e6697e8a9df1 GIT binary patch literal 118875 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

JMnynNo);93<^55hDQd=Il6 z8K&b`vZhWGVp!v~)^EPS`d&lW_Ux^a{$U2Ym;4M-QTOkaF)Dp3s|vTj`@2#r)!~Dx znMv)`-R5L{JD>RD0bC}kIZr+pV-Rk0b2gWl%kuOdZfbE#yuG)pmBao_4~=&y0q?U{ z4YwtR9vRw2@u6ec0H#P@QFQUL2{xNIg_494KFncLmrS^WYH3Am9ryQ&=mX>Phpn z3zDyn`Zy==Kf7KL1gis3bs#R2)UyT`3$P2$D#C*glwU^cu& zEh$n@&1+#{YDzg{TTmJfOci+#vp!4%_Xi~?oRcFo%r5b}kP``iaIlH;@=m9Uu9W+7 z`zNQkvv?<}O1b`ip+=3p7MYS_VNX+}OV^G)9sVBvmA~%k{MCU{j}eEO7RpvD?ZclJ zE_~B{b0B`aV*S-CuelqHYP!PGSOO9}-4nvYYC;S$ocj|$4*JWxWx2MJAjlr}tRRy4 zEh{Zj!msTcCLQ)*cvhtwjsB=bDDX&f* zB%^~m9!#X(W6w+LpPl$Ltdoq^puA2@81$KEGHFqZ8pEH~ru?ShBgyBF-1hK)M{4LO z#R>r$q-F&@A_t=h9ZW#CK@JY_U!5o3Uk`Z1Dl*2~^8bGSzJ#0*-N|iPGkKr>xo~bH zxJ>(-n}ETLk-Vi`spOM;48p6B!*eCQk)tmFcZ1FKCS>Ir_a%kk|ob z?J*0qw1+4$t*h%rHL`$>>>En%lcJd;W-A0QpOw(B9n8KLEijKJ@^h<(Kg{!9jtcm_ zl}Fbf-F+>6>g6s5{&JTC%hDM0d?wXC$Lv=2u?&E( zkD)~M(SCEgKWz+0+m9R)8!CI`ytpt2BsrD+AG@8Z6xY`mLW`JS8Nn<_t&&v~pW z$&ZxXiWLZ}SrQ4YDdFcn{y<~+OsG2NV{1TXo7Qmw--n(}+8WFT2rBzy@vgXX!kdC+ z6~)NdZ(@T!x8;n>6b{Gb8PHtKOcQ~! zsSY(GbsJu?K`SMn&F9N&yeoajegVlg^^T_bbxEzZlybtI>=fV0K5Y%Rm#2<})cT~R zJfV(uvT9$8XfKC9N}4OWtB(szqa~G~@o+!$xdR~`W-V_?c*ESg{bY(6E0Ho_&=;AZ zq~agAm;2>hzM9~#f5@K|MmJmUeeL>Z%I`Vj z;&SB*RR===zHGMt>nlq9n{3#}_3PyX=3&RbDTe3&^|bRF@dgLz+W)u**@t)^WqG$o z{EU!1DD@BZz(rM0rTG4d_+U{h@KX|dZf!O**r8;8pd`fr$L8W2D?4gPJa>rm7u>jZ L>uT<0o6!FOfGgfM literal 0 HcmV?d00001 diff --git a/scheduler-jobs/sidecar_debugger_config.png b/scheduler-jobs/sidecar_debugger_config.png new file mode 100644 index 0000000000000000000000000000000000000000..5476b16bf3e5592182b109180d555b59ac2cc81e GIT binary patch literal 152928 zcmeFY^;^^J8$Yblk^`k-gn~thFmjUy0RamorJK`Fr zD`ZC0l%zWx_rj{LTzPjzOI7KGpV@ZPX&`G?eSti&D{V5c*d|d@K#)mOS(&+q`I_p0 zEES8+Ls=^i%EUO&fyrLkg=n&YlMnKJbAhXUeX?smMo*`IAYN@Hespf7+{e3_k4)rj z7T5e}_?a2<^Bh^_FfmNSAHk$d{ol_Q2GjauFXHWHga6(5=aKuN;G*9Dy^a=&j)460 z`mJv^TRtV;(+pD8M7z-+x`BetrvJTWz(WHg4Ot>j{lvW_vL!-hEcd1Hh4#6K(aXV6 zC?d;{%YxHoX9m~o^u8vevGgS&ehmuNb3IYL%E_KWjw2|n+-gvODud!_0_#_@T<25BExOkcg`j3`OkYw_j%*k zvgS5mo;nppN(A$Owd=mS_(;B4ixLmq9pBYHS>Hj$!kO=*cC(7YdJW<5_}Z60Cu#|4 zZ~nF;tsMlwpXqs*2Id1>UC^~15fC6hn~2rSfVIv3#>LLQr-I0Il_y8qr0eKv@#@dY zwOx7{DB;T^8zZTG2}e(b;-XRY5i!Z`N{6|9%VY#a5J7;ahLUhk%?G? zQ&MI8B{-wr*^VoByYVb$=HT;B6CL z+?9c^ihC!!@(alijCaRf(AKE&4av2c_>2aVn#?8^6cfN_BW+Ts9&i_3p(|rkTh)k) z=#g@oFqZAEfg-&o3W5tG^#4}+W<_K)H#R>=BC~jZRG#uswHI|}U=A2ox8@34X}+YI z#Z$!0jI{XlMEJ?NqVgkNtI0)MrM;0&&SY!QOstxW(rpSys?vRuUh^;uu_!+ybPrpV zWEZvL5pfi1-(CUD6x!HwW`lPWMy~Jd+OMxlPM&8DF<$<&c189G9AwU1 z(%2gFfP%9|W5ir_oF{gNKnDNytL>gfs_t^Sd{K*lbW>>&uz+Ao$8LXOa4KR9UqP%+ zf7b@}=II#`RT~bJ%^lwc+PZ;l4hV=E^Z$0WtMn~AX_wc!wnrjo8n2zgr;StZu&7_n zbPvBDHFaY)uPeU6pO!UEJe;ZH#tT(>a={2L)utW!U7udVU(#0@lS^OQ7`*)j?>e$* zf1s*JUYd~CX>Nsb-^^ki2gyW;*5r32y2 z0$iQOQJ)RzDyfk+N}T=1)$W2C2+2k0%8v$}XaUp5GS=5coF@6R`R^r&`iq&>_Z_Il z3Op&!_j1EtBuzdg=Y1XmC}3jHh~=~r;97Yse(Qi?(cuWa|B5x24zN-7`Ho7w%A+>d z1C{L95KS_qPMY+nGe*YQ)|{ONJ-f2Jnl8qq2DrSlRWf@qlX3smm!W7e^?2T`sj5AD zf)FFioV0TVk{jZAV!}dvRnpwMja|A6@V==6Pp{RS5^8jvdS-JPQsZ-ZvjJfK{rO&( zL1-4#X?#T0G^j=pD_qS8l${z_s#(OH0IPf+7kxB<<3fq})edoL)?SN$0zHlTb$C?y~x; z&W9UV&Hk`zL{%^XEUqqPcb=cPn*nv!id=s?&IEVO#d_!R*R?!}Qt?FSBidsp9AQlp}nb@m5Tj z=x5fDVXtK+P8>%Apr>e5KBe^GJmAenBxKVmZ~=mk`xtdaL-FD5w1;IGRWToWb@2T> zFYH}HE0`oS)4tP=D6QX;yMcUWmV56{ie{Uq?b`MGw4-q%0b=%gW5DMT4s5C%J~|tY z&p$ZGCq;g5QY8$Fk_zeKlb(AfN-u8+2$TsB{zWG3{qg?-j)}NhY?ryf8j}N4^6Q$N z>eXT$g%8(Zs$c&y5yCKl_o+YLFG%{%DYN`2&`GyI0-7{aqQxVMtWoCd`!ziSR`)~= zLZjbM>wS&shGz)x$~stDTNr%bS+nBWk@u3eKrnuC1D|&j@SOu;F z+Rz$l`(zh@!tNN&D!=ymv5h~11Sa;hgQ-ei^O!G34j$lK6Zb!FV{j@-fi?$y+@)tM2TaDe{ufUp z?iTcaNv(FxdoLDLYe6KaNJT)}MI%I1Nefvw^Wp5lTVR5Jkjb^yZdzDK9AxD72gX*~ z1Zs;?OU*k=F0<9M^xZw>>t#zL9)@7QBDHrCe<$=_s(Gp8A0k%} znhx$gxV?m6)YN~~WAI91tRQ#bi=voAJ8^=NG zTe@afDUD3vKv0d_FthyWFI}fh3juCv4>|*QVxbOgk6+6{s&sI{dsndI?gTYVb)COO zLIl0d5U-+nLGxwNnbUVPu;^Dhr7QQ#qCwQKUr>$nXl3db)HWx-C#1Ga)NQN3U0u1UB4Qf9 z=ofL997JAGad3UQ8AeoM$wVXKe(o7LC3r8Z%~8X-;n9)ntC7MZ8nMcaR{gRCSY}!H z&`n}3)koo#mDh(Ib%(2rBP(s(JaWF@&t;xe>wf>H!>z)R^1#%!S-tAeT;~J@6yR>Q zeDafxz=UD|%6?%YY^TzmPQNgU-+F|J~7@I}LA8)vBlqY=@?)a7Wm^S(DM6L`1* zzDu#2rCef)6}MA3>Cs%e7Fu^^;e}cLp3Dg3d{gfnNdrrQ5nJ0<#YVnJc*g%_aaiyj zu`rUhvH2l&c7C^$8Wx?n+G7J{J%Cb|MuTg%I_6vf-Fu7A;Ly;i-cbpdWX{ z1QnbxH$`6Q7_(>>Jdrd_{hpC;LB7Va*mX91HzQh+#MaO+{(ic$?P&U&#~}8R4B~q; zy6c9CDzZp3g2~Vb-0r+R*?^e*D_o4EF_pCIFQ@Kmz1e262X+v0w%97rHFmkIE5cHt z)z8&#uLxPjvCB@4tjNHAWijaH-x~e&rk4>oDHni~$MOujP}?|LO;wyqtqE2|5&Cp- zqrh-68O9uULYSIR?8#Hz%5LTDRm=lwSiUxoIM0`3V!+W8U23OgfbL*Qe+&#ABNj-p zA%J=Y$q3)s?h1*}k_U;*I`^_Ud(s{YQ<(!n_ciL1 ze@E+DG+TUePj{@8O@m%ao5vTGVhFLxpXYVNBXgnih*yZb-#5y6y8^Dm(N?-^-f{y+M`|0IPk zeE$( zUFN@c;#5gDYdM(-oL5lhPt6jxW`$?JdF^b}du`qR--Jz&cXBHR9DDnp-Trr?@b_-v zrLIIk=IZyaxc)5&j>882Z>H@ZuzPx~k9Djt+)Ms{E@Ic|e>j?7 z)v7f$kHq8u8_n^b(P&^OWN;jm?cYV0TV9tC2>~XcnZ^*Tx}oD*Qzw7*r`fy#h?Dp| zV)3Id*a?!HG|_02&N=O{?2KgXG>5thEh5g};ZDvMw)*C?@x*;h%U)?Iq{KJSz9`r* zJl>GRuuap|H~oG)&x&q%A38Zi!(iH6XM?B-;gFa;7ODLm{$@pvgP)`zx?_~)*VJzi z%6|H05nORaG_Knb8?Jp34u;<>(Ra2qCJM9ewZ~oGAqfaNAj`h?fSSt#enHbU(b>Nz z&}StYO*YoHb-7E-hWh&J^*&Jig>@b^j83$$KXu1;&{W?=KD;~klSfU^ifIXn<;S_= zk0~#pl%(%ZePk0w+K=ktR0q^bB;8;-~2gF z2|~tlUSQs8kGClJu6@`VbHTWm(5X) zNzm?cgGQn&Yu2p&Ld}3_K<$2_UH$gknU`7BgAzAC=gltU){_UGhiN@fZsORJ4`w#AUxJViTGI9|n z%=PiS>eG&sbJ?*Y3OIckhb9iruM_{A9Dq;u{2{SA1@)8CddIswcm znV9$MB1x5k!<~6!FA;xE_KC?Zz733`A&%GXH=mxF?#$d7K6siX+ZB9v>?_pn@l-+4 z+?J5pa2j%YC)S&3Fl!zc^wzaG5L4{C(;SA(b!hK3 zGHm`+J5~NCsBJGUy@mtLHaL&jy5lG~!8n25sASuwe>+wRF0CyMR>U1Gg?z~DJ+6K` z%zV1BW?skJbbhPnh8|a-U#fdQ6kRJdTJp@lp|LwwIyBWBJcCJ7lILf>ON}Q=b&G=kplSTxwOoYGF1Z` zAs7cQ&iFx&U%m4-$sMu=9s^XjVW$!KCc(zieIm0N|$g=^UBse5j!7!B|># z|HShOiIHN;=3Dxqe7C(m%x@w#C*FFa2iSx62yMIlHS@md)y}?=9X83JRvnW3TYlwx z$Of6CZl1I~)ogg6y%8~X0k30d^lCMr@I*HWUWEKQ)A&{=%hhW=>6u_$)QCN5KA2Hq ziEvN@lPJtT9;Az9P|H_~NvRt|;-+kDS5mD)i!w$I_*=<-4Y@kYd_dWe1VIo#-?NWJ z;v)+n&9lVv}%)?(2dZ%FR&V&jNy;aZ_Un( zkrpm(A*_i_PYx0ZwM!$dCy$+nH$S|Kf(BB6KIDFC9k2Z}0s1x7(_MYY#_MG_U{+S8 zeT`^MPbWqfPZ0qMT7y}Ejzcpd78tp}J?&SjgZKZ|kc3ik)Q74`J&tmCCt@gKXB%-5 z;nH+*RCyUZGBS(aPn@w!X|8V6qD>!>q%sO@VVfJot342UhBy}!0e+EzU!s#U5}{#~ zT`N>4WpQ}4`UMHj-`rk%J@2D{M(8$Q9%~PJkWsE0r7wea5CQp>e}CCH8NM*t6%F>E zbdD=jla=$?wGGKB!6qQxf`e_Sy!E-a^T6dS(ynv6a{+5)6NTncD{2v}E75Zc)86aO z$NJBVETlW8sR(x&N*Dx~DJKx`L4WjKaF6%8TI+MWfrhTkAZZIhe|OB15yprv zm~-|<34u# zqAc>xpRwkR>I{WD!Xe>B?>f)Mz73{SC;f_hRSD6|tF0=yT#huIal&TRWL*r54mPi6 z2CSZ`%6>9MrzTw$3D0eusiY}ys)&1#WyBIBG0FmFUAe!;h1$h@Y#{)ZWi$vGBdVO$s!i$?@*7~ zZQ6~inX7c6tA`MmJfr|I$dEqfoxpaO62pIM(S%%pFgVj{KScC_^%nsul>D?i?3f$4B$=AlSN~Y54r)rn(B7DJO z_>P?-dig@VowYK02(N-y-?dkn!33MrK2I?txBhZW;r4l9oVb(gT1k^s82zW;fasbW zKl$QPB)8XLpdNll=3t)LOe0{jFVPkJ zoAFTw`Y&vir>FNq>_MJAopC%lnAuav!@s!17J`@j z+LxG<&F@wI@PHWF*5%Z=vNR*Pwo8l0RnN+ltsROrms8ya-Q0}1eB`wmJs%FI^JRk& zX4>i7722=yQZGb8I3cKk%0Z;{G*c>Xz>(GkFg-Z@6q~-0KgQLyK-;4Srk3Xp$12H< z^M+Zas%xth(y1nZ575td5lWXB$xYnA&7VAsjs@( zMg=arvVz8^1Z@0Q>r(ns@^!fs*vCfKQbf6+O_$AQk&j5W!zviRE_u4nGWePccYbhc z%VN`NCik$4kzAwa$kEM3UwtIk<<%;z~@+v<*PZ%7`D{6*Z{5IeY*Xoc?7wlS;ibXkp*3U)X@Y+N`M>+)Y5 zq&4k?<#&~XhuXv($d4psfztpNv!F9?`DSOV_!h!tzOHLz`SpOBev57AlcUy+wta!m zDM<7m_xujO(DF}g*IUeXlj+MtNaE^hua*}8@Z4qEyFxCOGEY3Q_Y@gyI+SJGu=6vZ zHD32LYxq;e zEMKx3yLNswsZrk)=5G9GwlfOPX^d+#3yO-aa@&8Xaf=@_dq$grmhKFxGOeQMd@bw0 z4p`)L``TNZ8Y1JZ1(~T~nPS|DKIad{$LLM2kqOrNeENM83hH_W{5p8Nv=y;qk>2~W zTowRJSL`6-Td5no2x5j0l$h&II7MkfGH>x##pD>}ufi@p}cvP#D)?<|y z3uFhkYTKyX#7|n25#Ty&%!?`EiPBOa!BTR91H&^SWIn}fC4Z3J?~btS+v&12+@>b8 z`E(ZXy}>{HfGi8}0KU#~{^=n9Sg)oV0^7N=k(88Nx2x#rs863W904Jx;Ffe*bw0%m z!X#FXfFZud%DB8?_vcpP(b&fw4^0tPg*xdD%H*hP1L<7f4N(407VFRMawNWGm?HXulVGb$!6^sFqqaph*)w&kjYy2@!B4br1k zB9*X_f}Hx|mIN?BfD{b?l=fb~!cPj3_~+t7^LA{~IR_8|-Y)$d{x*#79d0cW$={~_ zg}SvP#uPu;-$n}~q1fLFOt0ob*2wMy*WTWL-gwvQs6a`upf4+k@QsH2QHXM{f6M;6 z)zBo8Uo2WJGQC%wPJv?Cu{c80oIDOZpG?uQu#;zOP`qGx^?g%tr&Gx|S64hZH74y5 zK)%S=HN>h@x6F!32&;4q*LJE2!LXjXe}sTk1~j$>U?XejHS?gq_;oSsp4N0(;<&^n zRMl2h`hWr-HV7jTAKjzuVgXhI#OW-t?7f)6qdlXB;m!9SUGYsmmqI_S$jvubGoQEi zuU^KKc(k*#nAWK?E!Il7g)g1U@Qevw*bZc-Fum4l@MyntU*0=9ZVU)TF!AT1fGaA| z%jXt~swKkP3vn#ot-6fEpM82>gdD`FR z?$Juea0Wf7J^4-o=pXP1@jt&m(C2l=f*?=7$hGZqY)NAemS`K2{Zic+TMVmcOK6mP z_9-&%Z6YqHCg^M|xm-f4g5gy1hoP#m%uR4>OA4SN4R8hAOL>?g^M z^!Z22F#sLiCgnu2ZTa15LT`O`=>WR*6tl%l_(Fx;aC*p^ouv$k0t;W>Kkvxb7^2>g zj9;*Uh&^w5=PtJ{%q-5d)0IG_bmwa?t!ro1Q5!pqx$m9Jk^lO03m``Rd{K2@%4xV~ z``ZHqyU433lqgwKYhUw><;`3N5?Yy?o2|h z3Q9$ZZ@oKSf0dSU8VLHS(xZ2U3~cwc8*GNd?6HMcs|QQ4J}wg&x@I03DhQnPW`W*E z_pyK63d?57cI61?FOy`Q;f!6>qAD6BWtLZ5P!*X>MZ3zpA=&Ok3zJ7X1l}L3 zl#a(35|=9$^5zNT-#Wk7NVa-8@%8fXmBH{_^1f!o(PtRN818H zcPKCEp7`gz3)5D6ro@eSH^dI~iVn+5q=7xUH)g|0nNx_i+v<(uwG&{78>NNO?!C6P zX;tT>V#EEaqjlz56YpS62><>wT8s^HHq(RJPol60JF{rJ2TFKHJ0BB> z`$T({IKl)lAf*ZV30fE)c$1)xNVm4U2J%ydm&Nwar0yp&+r-X^*S=ouGq&E)_t{?K zb~Q5bGl@m(8o#{`+6hgEfF9+ZmnG2RTj9V;uku8YQxeV9GGoMx23bB)K63chS)AlW zblGxHP)}RjBd6;ymp&r*V8;i)?(i?^K!=By?9=}CmhvG&x$$tANh9CvEFeiA2Xpq`C4|@%H!%60?v2gStQrfDM{MY+&!DstF3h7}{RDIl;2hs!lE##DmPi zXpi4o?9^)Kn2^bM;JTay_loCk=-STa#Y%aHEg;_h@y2w(Mg$nin*HLmS!p}~I5-{ThZ5RD?@?g=&{)?ZgA9Ll4cHjTzq-Pw& ziR3#M0Ask?Me)s!$8wd3cwok(O}-GxRnV!F-0SGXDq3K0*Kr%!C%CUnq5e93YYAS2C2Rqz^4@^#^% zH6QYIlY}!QotNZV)JJmShFSlF6Yr9Q;a19%(Sr3~?z^omYYJ5kDujNil~X{c0r4Ng zn(O)x?rXjm%y|y@^;0eD6POD4A%9OjOE3+q0TI5xz9+F@``{1mBO`h^MVM#6N}eqE zJh)MR%?4t{+*x$gziwXgrlx$#FDiuApQ&3(?#O9f@^B=Rt#w(27)6kl6liRE(9~A9 z+)GzXsw;m98n{CM?17c_RVF1!N;&gN&iu(bM(+(WxmmK;UScjD-3g22-e%q zhMp7PSw{Zrkf#it6i1UaJ7^b|u>JdDUpKTRR|}v6+5snvY@N*H_lM>+O!A39VCf^) z31yrW#DxiH043MM3S>wCTtdq^F9SOTx!c%71FspRri54IB@ESQq@tjGMtN~epS5_H z7FyU5j0adqa6miQ_7@Mtzq6AuHaPFv&7FkmPATOK30AeOMf6;7n@!`81UsX+baqDG zsMp?P!xw3#bisG;eAJB#gCFi5w3?%jdYqsX(vfHS@G4{Rr z)k>g7F!|&Q6?b=c{k6p}FrCAdaNwV*rz-X@77+-Fg}3*B`%6LM>_R^flx_6%ksKX2 zsYdN(D9ico;d#IwC{9j?ky;M@i+PjwM|U_!B?p_WbNLxAv3Y|mqtoo~JQTXxDaz-c zka+g6)lC(R)N6atvd7`)=jnUJ?g5Kpcun=!yso%t`bW<~JQ+Yf@hbUz+c&aQxo8>b z#f-*YsgJatQZsW8N)IfywqE(F-VdJ3_giGVAQf_T3ef1mhaN|O^{?X=wU&PA=1w5- z&@J$A=X9GNk%4~K{ik23n0STM0wMvf#cBOMc~{GH9adW3bir`D=kXUtN)REjaPZ9+ zg{tUI0n=1PXwGjba><}hY1c1*1PDcth`X*gRG0UCB5D9Lbbz*6cS}2B?A6`s7S>#u zHY$6II4T-{_sWH+Ll-x}v*k)L=MQ%oC8|AnbEcZ-WHJvH1IKZ+g_cqL2Q6_fZ3QCZ zqGcH#>N#L0^E6THCUE|VYS1S_*aD?)*X?`wv+vEzz0=9H*tL$k2TST3rNZ-XmU2`s zZ?Px_`{Sppd*=z(A$gu^UhFOufi2T}qXn3jxc#5K^Aw;iiT5XM<_9Z6+H=%T8jsuU z6p}P)`RPIt2Wk^_ZQ%AhoA0Zc22&hmbli#l+3;ueKp*<#Fn2comIp8-H3(JAs^U;HFQ zK(VJ~>@8lG$1@WNg3?!eiVVLg^kj9>UWOB~ET~mzu>C)NZVhwIC#(kY+EqB1MQoM0 zcv|x&E0#cy>7I&!oCEu+av0|dp#cI5Z#{>)>?k>uZ(gzzQD4E_m)S8&z(}?c)pUtW zrS=cBF!EbW?aIg#ab>w^v=)|+X`E1}q=oLl--|s9Mq-7k9IIP`^7>%sdS)Ob3w);FEqx;CpmUoIl zPGc=wQ6e+We0n)%cYy*Lf?@2;ucA75OBXtTDJAQKFNeE;Wj>V4fEPJ`OB_thr|ZW0 zwzb4hjuSXe1$rb2Z-ct}9vtL2FUQ5VN$CZya=vx$@Z+BE*oty7sf-Op!(D7zy$LUe zcu6Scs{LodE^;5dy`*6iPi!3ozdq{d^iln;sHnSQ;5Vae8lvR$-!@w(C!gn)&dy3o z9XNM(XptfGEq!vJqWT{BL))Zx%-YfVssZ z6VJf5&@Vi3IKiI%4_LOR7VUxUlmg>J2vvxt~;Iy_uNT%Nqjxu-lZ9aGk+mi1tX(MB=W zb_;q@>sRCyaWg`|)w+r*0(_7|V7is+x)}+91b^gWwOP$+Ra+*td>y;Enk;BQ)Y3ff zumN78x!DLoP3~3;mg+geVexQj>BfU8t`oQ0dLy<**!!gsYki!p1)4Tb6V*&4l~=eS_hrGmVaN^ z^e6{oZMXCEn#+RxRhBN@jVrOX>Kb=N@d;v3Hk#Jc2^PXq92XD!6xY%-6Y-c7$kz~^ z7fY56tMA2EObBZQf2JYMN=bPo{&xh~pLg~w813)Ck<`P{YFstjWm{3vFM8G@Ara!d zS7zR7#he#}09x$ZmLvP8!>Dox*|Izz5I)Syob~r-`9y2>)-{&rNVc^_*VB#C1gps5 zqI|TD9*Es3l_0rdg(=9e;yDkU`K4buT9v||L{OzYSShsCAu16Z_h>1Wlr5&m}BO!#stlciL zBbGGjKK4i=V1+vRaYQargD4ZE#nZgqDb&d_yw4&1l8s<%Wd3oVqU-los-=}n?l&1$ zB)}`2$N>Z>b+R)Ur%A_Q*T|TdvhDyKDo=oy>Ye`4Ud#P2o^i|G2ltQib|*91_%N-bt!}QRhp3cv2!f#0px${T@?VZQ2_z`gQ8Xx}z`NGBLiWLv>+Co!ZU4PJ88GaejE>-5&Sj+lpVO2Z_R1vn$2UkI8luTG7(@rC{ z>vi~vn*5>5Je7=ib3rg)rd6RB*GU3oK0KR4q=71s=9x0xS_c_2kro#2l5Fu% z{x#(QmF}6>zNzEBcS0j7akrEso610#PZ2i61 zyiE!~K&w-@lL@I#(!x}6B&>pB1o^mf(*p>EpIU1Ou#;>&*J`QZ6g zj#_Ek2%3#sEQH2&CBh@#0!%JgFo1cS(-b2{Lh5PfcDCvEt;Qmp*FVTYvzY$+g{$H2 z*wCxxi>$KXyQqZy{M2`HEHV^4OD|-xBG;}#ZPnw_-U={XV{KMvT4;^PAPbM`<+Pc3 zK{}`M`lrB)4oDf5`+PPSaHNk7=E!5Clhz-c4^~8}v!p`OHEd6y$n~+8jO5_Sr+2g&+eRTX$28 z6l*^3jIROlLy>DCXNQnUioX62w7dI-nZF&X@bNXYe6cB1UMbmM(W?{Y%W~OI)1n4c zqPhI<4477MJ@ih~!5un9mI(o&s()#b1|iiZ(c~sC7xT2~;FmY#vR%mm)Z_5bg+CTt@%#qGUQ^YQqZp z><o~Xu9}7n2|aP5hT+~}ieN;W`@Gk;Pf@_7o6XBtRn5MKiUBx)v~nKQ zsWV?4(!J;^DWhV33v7R4%}BSmyMjEFW|e>Amg?pI{c*bmeBf7&M?3z>Bj> zq4bW6b#a*UB|^((*j+|kup73l%`k*BQjZIe2B&jDRHbF^kaD7;9M2+^>RdUT^HhGj zPz2D_efB2;f>+}piH2Ezp54%0vayxMGv8Y-kbfbKyD4-P}HzX*ZSqy=B9^8c0s8{_ZvHSflK0`Wz(cIsFItLE^jOet| zx)t<*6Xg?N+LW*W9DHMBwyp8)n50#yZ6J2Xc6@UB=Zs7^Z59nQhW zrOW%p_%VWq9^v~u7@p1OMgXDcxfs5DJAsXmD*EAdhhN932*5Fof3-{U2-9{YvMeYT z$N^&kbfCk%uYBhUQsNns~~<5?itNk#p&!!dTTigjk}r?_n9`B&`n>Mm`R@6k7I8O0Qu=`6kE9>X)phxsu6~m(;2k$4eRU#mr*62|C z_l(N&Pj=WLT=$20!-#;h^Ajsas0;x*-JGYpCUQ^Ioq{6rgrBjL-i-lx$|v{H6XP?U zqRv9_^ITGst6qFf+4R7qhd#1X%?jgk9m!!$@@h4trIE#HTstRy|uTiaG^lm^o@3Z|TTG~~`qLsaXj4Tn- zsEB<=&~;wT{QeuJqSg_zu2s0d^Ffy#tm@lz6`nK`tG1|sD>Lu#>DMSP{uG=Cz(|ce z{q0=5;zoAx)s17%}LLQT9(=|DT|BVg)QA*Mu0`x0vbkrHv|^CXG1p;UT51{>E}B+I4M$bW67Tt|15P6fAwsLfv|!kGRC}UDE4PR-k|W3(@JWc zvRdHUggXtCR(AJug$~X`gDw{P-4*azL4dVs4#%H*C0tYYTs~~Uzqgv<1c6gLp}_o5T!-JMD^~<;zSod25Nt| zCK30iGM;fH+h3eAPed{qQ-2HlZr?MAmCq&KN7W4#`^NK^$S8Q2kNpBS`O*wWOD23i z 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 G5&s7WR@ZX? literal 0 HcmV?d00001 From c6bd94715da78eb841a0b260a3bf781b24ebac04 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Mon, 21 Oct 2024 14:07:50 -0500 Subject: [PATCH 2/9] fix file name Signed-off-by: Cassandra Coyle --- scheduler-jobs/instructions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scheduler-jobs/instructions.md b/scheduler-jobs/instructions.md index acd807da..b9ad66dd 100644 --- a/scheduler-jobs/instructions.md +++ b/scheduler-jobs/instructions.md @@ -1,6 +1,6 @@ # How-To Run Locally: -To run locally as a process: `go run scheduler-app.go` +To run locally as a process: `go run scheduler-jobs.go` Run Scheduler: ![scheduler_debugger_config.png](scheduler_debugger_config.png) From 439192edb60d105a2b3f24d8082feb09789f2fa5 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Fri, 25 Oct 2024 12:51:22 -0500 Subject: [PATCH 3/9] add actor reminder test apps: client + server Signed-off-by: Cassandra Coyle --- go.mod | 23 +++ scheduler-jobs/go.sum => go.sum | 36 ++-- scheduler-actor-reminders/README.md | 51 +++++ scheduler-actor-reminders/api/api.go | 96 +++++++++ .../client/player-actor-client.go | 184 ++++++++++++++++++ scheduler-actor-reminders/dapr/config.yaml | 8 + .../server/player-actor.go | 60 ++++++ scheduler-jobs/{instructions.md => README.md} | 2 +- scheduler-jobs/go.mod | 21 -- 9 files changed, 443 insertions(+), 38 deletions(-) create mode 100644 go.mod rename scheduler-jobs/go.sum => go.sum (58%) create mode 100644 scheduler-actor-reminders/README.md create mode 100644 scheduler-actor-reminders/api/api.go create mode 100644 scheduler-actor-reminders/client/player-actor-client.go create mode 100644 scheduler-actor-reminders/dapr/config.yaml create mode 100644 scheduler-actor-reminders/server/player-actor.go rename scheduler-jobs/{instructions.md => README.md} (75%) delete mode 100644 scheduler-jobs/go.mod diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..ec97e6fb --- /dev/null +++ b/go.mod @@ -0,0 +1,23 @@ +module test-infra + +go 1.23.1 + +require ( + github.com/dapr/dapr v1.14.4 + github.com/dapr/go-sdk v1.11.0 + github.com/dapr/go-sdk/examples/actor v0.0.0-20240626135542-c417f950fe1d + google.golang.org/grpc v1.67.1 +) + +require ( + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/protobuf v1.35.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/scheduler-jobs/go.sum b/go.sum similarity index 58% rename from scheduler-jobs/go.sum rename to go.sum index 6c1df8f9..389c5065 100644 --- a/scheduler-jobs/go.sum +++ b/go.sum @@ -1,10 +1,15 @@ -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dapr/dapr v1.14.4 h1:OEyAFvpW4AK+MWyX5xp9zVLiC+oY/5ziDzh16F+aoWU= github.com/dapr/dapr v1.14.4/go.mod h1:pZGJvUGT4IDhEuWVXBvJ73TkPnLAW34SDagth7G3f8w= github.com/dapr/go-sdk v1.11.0 h1:clANpOQd6MsfvSa6snaX8MVk6eRx26Vsj5GxGdQ6mpE= github.com/dapr/go-sdk v1.11.0/go.mod h1:btZ/tX8eYnx0fg3HiJUku8J5QBRXHsp3kAB1BUiTxXY= +github.com/dapr/go-sdk/examples/actor v0.0.0-20240626135542-c417f950fe1d h1:J7u+R5/FXuh1y757FHAnA75g3w8ADzm4idO1kQmKH80= +github.com/dapr/go-sdk/examples/actor v0.0.0-20240626135542-c417f950fe1d/go.mod h1:Vg/MQZ6O3JVTtp6NgNtAGRmyCamXjZDp6OBqkLfF8W8= 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/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= 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= @@ -13,29 +18,28 @@ 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/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= 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= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= 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.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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= diff --git a/scheduler-actor-reminders/README.md b/scheduler-actor-reminders/README.md new file mode 100644 index 00000000..e7893381 --- /dev/null +++ b/scheduler-actor-reminders/README.md @@ -0,0 +1,51 @@ +# Scheduler Actor Reminders + +## Overview +This project tests the Dapr Scheduler for handling Actor Reminders using an example `PlayerActor` actor. The example +simulates a game session where a player's health increases or decays periodically, managed through Dapr Actor reminders. + +## Project Structure +The `client` directory implements the client code that interacts with `PlayerActor`, specifically setting up reminders, +monitoring health, and handling shutdown. It invokes actor methods, but does not manage the actor lifecycle. + +The `server` directory implements the `PlayerActor` server code, which manages a game session for a player, including +health-based reminders. This code defines the actor lifecycle and its reminder-based state changes. + +## Reminders +Two reminders manage the actor's health: +- `healthReminder`: + - Increases the player's health if it is below full health. +- `healthDecayReminder`: + - Decreases the player's health periodically, simulating a natural decay over time. + +When the player's health reaches 0, the client unregisters the reminders, revives the player, and restarts the reminders. + +This tests the Scheduler for the underlying storage for Actor Reminders. + +## How To Run the Code: +Run the server with: +```shell +dapr run --app-id player-actor --app-port 8383 --dapr-http-port 3500 --log-level debug --config ../dapr/config.yaml -- go run player-actor.go +``` + +Run the client with: +```shell +dapr run --app-id player-actor --app-port 50051 --dapr-http-port 3501 --dapr-grpc-port 50001 --log-level debug --config ../dapr/config.yaml -- go run player-actor-client.go +``` + +Note the config is using `SchedulerReminders` + +Or + +Build app images from `scheduler-actor-reminders` directory: +```shell +docker build -t player-actor-server -f Dockerfile-server . +docker build -t player-actor-client -f Dockerfile-client . +``` + +Run app containers: +```shell +# optionally add -d to both commands to run in background +docker run --name player-actor-server -p 8383:8383 player-actor-server +docker run --name player-actor-client -p 50051:50051 player-actor-client +``` \ No newline at end of file diff --git a/scheduler-actor-reminders/api/api.go b/scheduler-actor-reminders/api/api.go new file mode 100644 index 00000000..4871b691 --- /dev/null +++ b/scheduler-actor-reminders/api/api.go @@ -0,0 +1,96 @@ +package api + +import ( + "context" + "fmt" + + "github.com/dapr/go-sdk/actor" + dapr "github.com/dapr/go-sdk/client" + "github.com/dapr/go-sdk/examples/actor/api" +) + +const playerActorType = "playerActorType" + +type PlayerActor struct { + actor.ServerImplBaseCtx + DaprClient dapr.Client + Health int +} + +func (p *PlayerActor) Type() string { + return playerActorType +} + +type GetPlayerRequest struct { + ActorID string +} + +type GetPlayerResponse struct { + ActorID string + Health int +} + +// GetUser retrieving the state of the PlayerActor +func (p *PlayerActor) GetUser(ctx context.Context, player *GetPlayerRequest) (*GetPlayerResponse, error) { + if player.ActorID == p.ID() { + fmt.Printf("Player Actor ID: %s has a health level of: %d\n", p.ID(), p.Health) + return &GetPlayerResponse{ + ActorID: p.ID(), + Health: p.Health, + }, nil + } + return nil, nil +} + +// Invoke invokes an action on the actor +func (p *PlayerActor) Invoke(ctx context.Context, req string) (string, error) { + fmt.Println("get req = ", req) + return req, nil +} + +// RevivePlayer revives the actor players health back to 100 +func (p *PlayerActor) RevivePlayer(ctx context.Context, id string) error { + if id == p.ID() { + fmt.Printf("Reviving player: %s\n", id) + p.Health = 100 + } + + return nil +} + +// ReminderCall executes logic to handle what happens when the reminder is triggered +// Dapr automatically calls this method when a reminder fires for the player actor +func (p *PlayerActor) ReminderCall(reminderName string, state []byte, dueTime string, period string) { + fmt.Println("receive reminder = ", reminderName, " state = ", string(state), "duetime = ", dueTime, "period = ", period) + if reminderName == "healthReminder" { + // Increase health if below 100 + if p.Health < 100 { + p.Health += 10 + if p.Health > 100 { + p.Health = 100 + } + fmt.Printf("Player Actor health increased. Current health: %d\n", p.Health) + } + } else if reminderName == "healthDecayReminder" { + // Decrease health + p.Health -= 5 + if p.Health < 0 { + fmt.Println("Player Actor died...") + } + fmt.Printf("Health decreased. Current health: %d\n", p.Health) + } + +} + +// StartReminder registers a reminder for the actor +func (p *PlayerActor) StartReminder(ctx context.Context, req *api.ReminderRequest) error { + fmt.Println("Starting reminder:", req.ReminderName) + return p.DaprClient.RegisterActorReminder(ctx, &dapr.RegisterActorReminderRequest{ + ActorType: p.Type(), + ActorID: p.ID(), + Name: req.ReminderName, + DueTime: req.Duration, + Period: req.Period, + Data: []byte(req.Data), + }) +} diff --git a/scheduler-actor-reminders/client/player-actor-client.go b/scheduler-actor-reminders/client/player-actor-client.go new file mode 100644 index 00000000..8932d4e9 --- /dev/null +++ b/scheduler-actor-reminders/client/player-actor-client.go @@ -0,0 +1,184 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "os" + "os/signal" + "syscall" + "time" + + "test-infra/scheduler-actor-reminders/api" + + dapr "github.com/dapr/go-sdk/client" +) + +func main() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, err := dapr.NewClient() + if err != nil { + panic(err) + } + defer client.Close() + + // Actor ID for the player 'session' + actorID := "player-1" + deathSignal := make(chan bool) + + // Start monitoring actor player's health + go monitorPlayerHealth(ctx, client, actorID, deathSignal) + + // Start player actor health increase reminder + err = client.RegisterActorReminder(ctx, &dapr.RegisterActorReminderRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Name: "healthReminder", + DueTime: "10s", + Period: "20s", // Every 20 seconds, increase health + Data: []byte(`"Health increase reminder"`), + }) + if err != nil { + log.Fatalf("error starting health increase reminder: %v", err) + } + fmt.Println("Started healthReminder for actor:", actorID) + + // Start player actor health decay reminder + err = client.RegisterActorReminder(ctx, &dapr.RegisterActorReminderRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Name: "healthDecayReminder", + DueTime: "0s", + Period: "2s", // Every 2 seconds, decay health + Data: []byte(`"Health decay reminder"`), + }) + if err != nil { + log.Fatalf("failed to start health decay reminder: %w", err) + } + + go func() { + for { + select { + case <-ctx.Done(): + return + case <-deathSignal: + fmt.Println("Player is dead. Unregistering reminders...") + + fmt.Println("Unregistering health increase reminder for actor...") + err = client.UnregisterActorReminder(ctx, &dapr.UnregisterActorReminderRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Name: "healthReminder", + }) + if err != nil { + log.Fatalf("error unregistering actor reminder: %v", err) + } + + fmt.Println("Unregistering health decay reminder for actor...") + err = client.UnregisterActorReminder(ctx, &dapr.UnregisterActorReminderRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Name: "healthDecayReminder", + }) + if err != nil { + log.Fatalf("error unregistering actor reminder: %v", err) + } + + fmt.Println("Player reminders unregistered. Reviving player...") + req := &dapr.InvokeActorRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Method: "RevivePlayer", + Data: []byte(`"player-1"`), + } + _, err = client.InvokeActor(ctx, req) + if err != nil { + log.Fatalf("error invoking actor method RevivePlayer: %v", err) + } + fmt.Println("Player revived, health reset to 100. Restarting reminders...") + + // Restart reminders + err = client.RegisterActorReminder(ctx, &dapr.RegisterActorReminderRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Name: "healthReminder", + DueTime: "10s", + Period: "20s", + Data: []byte(`"Health increase reminder"`), + }) + if err != nil { + log.Fatalf("error starting actor reminder: %v", err) + } + fmt.Println("Started health increase reminder for actor:", actorID) + + err = client.RegisterActorReminder(ctx, &dapr.RegisterActorReminderRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Name: "healthDecayReminder", + DueTime: "0s", + Period: "2s", // Every 5 seconds, decay health + Data: []byte(`"Health decay reminder"`), + }) + if err != nil { + log.Fatalf("error starting health decay reminder: %v", err) + } + fmt.Println("Started health decay reminder for actor:", actorID) + } + } + }() + + // Graceful shutdown on Ctrl+C or SIGTERM (for Docker/K8s graceful shutdown) + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) + <-signalChan + fmt.Println("Shutting down...") +} + +// monitorPlayerHealth continuously checks the player's health every 5 seconds +// and signals via a channel if the player is dead (health <= 0). +func monitorPlayerHealth(ctx context.Context, client dapr.Client, actorID string, deathSignal chan bool) { + for { + select { + case <-ctx.Done(): + return + default: + // Check actor player's health + getPlayerRequest := &api.GetPlayerRequest{ActorID: actorID} + requestData, err := json.Marshal(getPlayerRequest) + if err != nil { + log.Fatalf("error marshaling request data: %v", err) + } + + req := &dapr.InvokeActorRequest{ + ActorType: "playerActorType", + ActorID: actorID, + Method: "GetUser", + Data: requestData, + } + resp, err := client.InvokeActor(ctx, req) + if err != nil { + log.Fatalf("error invoking actor method GetUser: %v", err) + } + + playerResp := &api.GetPlayerResponse{} + err = json.Unmarshal(resp.Data, playerResp) + if err != nil { + log.Fatalf("error unmarshaling player state: %v", err) + } + fmt.Printf("Player health: %v\n", playerResp.Health) + + // If health is zero or below, signal player death + if playerResp.Health <= 0 { + deathSignal <- true + } else { + fmt.Printf("Player is alive with health: %d\n", playerResp.Health) + } + + // Sleep for 5 seconds before checking health again + time.Sleep(5 * time.Second) + } + } +} diff --git a/scheduler-actor-reminders/dapr/config.yaml b/scheduler-actor-reminders/dapr/config.yaml new file mode 100644 index 00000000..3c0de60f --- /dev/null +++ b/scheduler-actor-reminders/dapr/config.yaml @@ -0,0 +1,8 @@ +apiVersion: dapr.io/v1alpha1 +kind: Configuration +metadata: + name: schedulerreminders +spec: + features: + - name: SchedulerReminders + enabled: true \ No newline at end of file diff --git a/scheduler-actor-reminders/server/player-actor.go b/scheduler-actor-reminders/server/player-actor.go new file mode 100644 index 00000000..e26a89b0 --- /dev/null +++ b/scheduler-actor-reminders/server/player-actor.go @@ -0,0 +1,60 @@ +package main + +import ( + "context" + "log" + http2 "net/http" + "os" + "os/signal" + "syscall" + + "test-infra/scheduler-actor-reminders/api" + + "github.com/dapr/go-sdk/actor" + dapr "github.com/dapr/go-sdk/client" + "github.com/dapr/go-sdk/service/http" +) + +func playerActorFactory() actor.ServerContext { + client, err := dapr.NewClient() + if err != nil { + panic(err) + } + + return &api.PlayerActor{ + DaprClient: client, + Health: 100, // initial health + } +} + +func main() { + _, cancel := context.WithCancel(context.Background()) + defer cancel() + + daprService := http.NewService(":50051") + // Register actor factory, meaning register actor methods to be called by client + daprService.RegisterActorImplFactoryContext(playerActorFactory) + + go func() { + log.Println("Starting Dapr actor runtime...") + if err := daprService.Start(); err != nil && err.Error() != http2.ErrServerClosed.Error() { + log.Fatalf("error starting Dapr actor runtime: %v", err) + } + }() + + waitForShutdown(cancel) + if err := daprService.GracefulStop(); err != nil { + log.Fatalf("error stopping Dapr actor runtime: %v", err) + } +} + +// waitForShutdown keeps the app alive until an interrupt or termination signal is received +func waitForShutdown(cancelFunc context.CancelFunc) { + sigCh := make(chan os.Signal, 1) + // Notify the channel on Interrupt (Ctrl+C) or SIGTERM (for Docker/K8s graceful shutdown) + signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) + <-sigCh + + log.Println("Shutting down...") + cancelFunc() +} diff --git a/scheduler-jobs/instructions.md b/scheduler-jobs/README.md similarity index 75% rename from scheduler-jobs/instructions.md rename to scheduler-jobs/README.md index b9ad66dd..fc225500 100644 --- a/scheduler-jobs/instructions.md +++ b/scheduler-jobs/README.md @@ -1,6 +1,6 @@ # How-To Run Locally: -To run locally as a process: `go run scheduler-jobs.go` +To run locally as a process: `go run scheduler-jobs.go`, assuming you have a scheduler and dapr running accordingly (see below). Run Scheduler: ![scheduler_debugger_config.png](scheduler_debugger_config.png) diff --git a/scheduler-jobs/go.mod b/scheduler-jobs/go.mod deleted file mode 100644 index bbd8621f..00000000 --- a/scheduler-jobs/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module github.com/dapr/test-infra/scheduler-jobs - -go 1.23.1 - -require ( - github.com/dapr/dapr v1.14.4 - github.com/dapr/go-sdk v1.11.0 - google.golang.org/grpc v1.67.1 -) - -require ( - 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.28.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/text v0.17.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) From ab84339e52d47755f84dab3ebaa077a0da502569 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Fri, 25 Oct 2024 13:09:23 -0500 Subject: [PATCH 4/9] update ports and add dockerfile Signed-off-by: Cassandra Coyle --- deploy/dapr-multi-app/dapr.yaml | 10 +++++++- docker-compose.yml | 20 ++++++++++++++- scheduler-actor-reminders/Dockerfile-client | 25 +++++++++++++++++++ scheduler-actor-reminders/Dockerfile-server | 25 +++++++++++++++++++ scheduler-actor-reminders/README.md | 8 +++--- .../server/player-actor.go | 2 +- scheduler-jobs/README.md | 2 +- 7 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 scheduler-actor-reminders/Dockerfile-client create mode 100644 scheduler-actor-reminders/Dockerfile-server diff --git a/deploy/dapr-multi-app/dapr.yaml b/deploy/dapr-multi-app/dapr.yaml index 1fa33388..e1f08490 100644 --- a/deploy/dapr-multi-app/dapr.yaml +++ b/deploy/dapr-multi-app/dapr.yaml @@ -34,4 +34,12 @@ apps: - appID: scheduler-jobs appDirPath: ../../scheduler-jobs appPort: 3006 - command: [ "go","run", "scheduler-jobs.go"] \ No newline at end of file + command: [ "go","run", "scheduler-jobs.go"] + - appID: scheduler-jobs + appDirPath: ../../scheduler-actor-reminders/server + appPort: 3007 + command: [ "go","run", "player-actor.go"] + - appID: scheduler-actor-reminders-client + appDirPath: ../../scheduler-actor-reminders/client + appPort: 3008 + command: [ "go","run", "player-actor-client.go"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index d02bc07f..452580e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -47,4 +47,22 @@ services: image: workflow-gen build: context: . - dockerfile: workflow-gen/Dockerfile \ No newline at end of file + dockerfile: workflow-gen/Dockerfile + + scheduler-jobs: + image: scheduler-jobs + build: + context: . + dockerfile: scheduler-jobs/Dockerfile + + scheduler-actor-reminders-server: + image: player-actor-server + build: + context: . + dockerfile: scheduler-actor-reminders/Dockerfile-server + + scheduler-actor-reminders-client: + image: player-actor-client + build: + context: . + dockerfile: scheduler-actor-reminders/Dockerfile-client diff --git a/scheduler-actor-reminders/Dockerfile-client b/scheduler-actor-reminders/Dockerfile-client new file mode 100644 index 00000000..c219d22e --- /dev/null +++ b/scheduler-actor-reminders/Dockerfile-client @@ -0,0 +1,25 @@ +FROM golang:1.23 as builder + +# Set the working directory inside the container +WORKDIR /client + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . + +# Build the client app binary +RUN CGO_ENABLED=0 go build -o player-actor-client ./client/player-actor-client.go + +# Final stage +FROM alpine:latest + +WORKDIR /client + +# Copy binary from the builder stage +COPY --from=builder /client/player-actor-client . + +EXPOSE 3008 + +# Start the client +CMD ["/client/player-actor-client"] diff --git a/scheduler-actor-reminders/Dockerfile-server b/scheduler-actor-reminders/Dockerfile-server new file mode 100644 index 00000000..2a71e46a --- /dev/null +++ b/scheduler-actor-reminders/Dockerfile-server @@ -0,0 +1,25 @@ +FROM golang:1.23 as builder + +# Set the working directory inside the container +WORKDIR /server + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . + +# Build the server app binary +RUN CGO_ENABLED=0 go build -o player-actor ./server/player-actor.go + +# Final stage +FROM alpine:latest + +WORKDIR /server + +# Copy binary from the builder stage +COPY --from=builder /server/player-actor . + +EXPOSE 3007 + +# Start the server +CMD ["/server/player-actor"] diff --git a/scheduler-actor-reminders/README.md b/scheduler-actor-reminders/README.md index e7893381..2be457ff 100644 --- a/scheduler-actor-reminders/README.md +++ b/scheduler-actor-reminders/README.md @@ -25,12 +25,12 @@ This tests the Scheduler for the underlying storage for Actor Reminders. ## How To Run the Code: Run the server with: ```shell -dapr run --app-id player-actor --app-port 8383 --dapr-http-port 3500 --log-level debug --config ../dapr/config.yaml -- go run player-actor.go +dapr run --app-id player-actor --app-port 3007 --dapr-http-port 3500 --log-level debug --config ../dapr/config.yaml -- go run player-actor.go ``` Run the client with: ```shell -dapr run --app-id player-actor --app-port 50051 --dapr-http-port 3501 --dapr-grpc-port 50001 --log-level debug --config ../dapr/config.yaml -- go run player-actor-client.go +dapr run --app-id player-actor --app-port 3008 --dapr-http-port 3501 --dapr-grpc-port 50001 --log-level debug --config ../dapr/config.yaml -- go run player-actor-client.go ``` Note the config is using `SchedulerReminders` @@ -46,6 +46,6 @@ docker build -t player-actor-client -f Dockerfile-client . Run app containers: ```shell # optionally add -d to both commands to run in background -docker run --name player-actor-server -p 8383:8383 player-actor-server -docker run --name player-actor-client -p 50051:50051 player-actor-client +docker run --name player-actor-server -p 3007:3007 player-actor-server +docker run --name player-actor-client -p 3008:3008 player-actor-client ``` \ No newline at end of file diff --git a/scheduler-actor-reminders/server/player-actor.go b/scheduler-actor-reminders/server/player-actor.go index e26a89b0..3ecd585e 100644 --- a/scheduler-actor-reminders/server/player-actor.go +++ b/scheduler-actor-reminders/server/player-actor.go @@ -31,7 +31,7 @@ func main() { _, cancel := context.WithCancel(context.Background()) defer cancel() - daprService := http.NewService(":50051") + daprService := http.NewService(":3007") // Register actor factory, meaning register actor methods to be called by client daprService.RegisterActorImplFactoryContext(playerActorFactory) diff --git a/scheduler-jobs/README.md b/scheduler-jobs/README.md index fc225500..d3749fab 100644 --- a/scheduler-jobs/README.md +++ b/scheduler-jobs/README.md @@ -11,7 +11,7 @@ Run Dapr sidecar: To run locally as a container: ```shell docker build -t scheduler-jobs . -docker run -p 8383:8383 --name scheduler-jobs scheduler-jobs # optionally add -d to run in background +docker run -p 3006:3006 --name scheduler-jobs scheduler-jobs # optionally add -d to run in background # check container is running docker ps ``` \ No newline at end of file From 2cd4dd62e1266c06ffcdaee15af88b52e0320cc2 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Wed, 30 Oct 2024 10:01:48 -0500 Subject: [PATCH 5/9] add workflow app Signed-off-by: Cassandra Coyle --- deploy/dapr-multi-app/dapr.yaml | 8 +- docker-compose.yml | 6 + go.mod | 23 --- scheduler-actor-reminders/go.mod | 23 +++ go.sum => scheduler-actor-reminders/go.sum | 36 ++-- scheduler-jobs/go.mod | 21 ++ scheduler-jobs/go.sum | 43 ++++ scheduler-workflow/Dockerfile | 28 +++ scheduler-workflow/README.md | 47 +++++ scheduler-workflow/dapr/config.yaml | 8 + scheduler-workflow/go.mod | 28 +++ scheduler-workflow/go.sum | 64 ++++++ scheduler-workflow/workflow.go | 225 +++++++++++++++++++++ 13 files changed, 517 insertions(+), 43 deletions(-) delete mode 100644 go.mod create mode 100644 scheduler-actor-reminders/go.mod rename go.sum => scheduler-actor-reminders/go.sum (63%) create mode 100644 scheduler-jobs/go.mod create mode 100644 scheduler-jobs/go.sum create mode 100644 scheduler-workflow/Dockerfile create mode 100644 scheduler-workflow/README.md create mode 100644 scheduler-workflow/dapr/config.yaml create mode 100644 scheduler-workflow/go.mod create mode 100644 scheduler-workflow/go.sum create mode 100644 scheduler-workflow/workflow.go diff --git a/deploy/dapr-multi-app/dapr.yaml b/deploy/dapr-multi-app/dapr.yaml index e1f08490..0fbfe1a0 100644 --- a/deploy/dapr-multi-app/dapr.yaml +++ b/deploy/dapr-multi-app/dapr.yaml @@ -35,11 +35,15 @@ apps: appDirPath: ../../scheduler-jobs appPort: 3006 command: [ "go","run", "scheduler-jobs.go"] - - appID: scheduler-jobs + - appID: scheduler-actor-reminders-server appDirPath: ../../scheduler-actor-reminders/server appPort: 3007 command: [ "go","run", "player-actor.go"] - appID: scheduler-actor-reminders-client appDirPath: ../../scheduler-actor-reminders/client appPort: 3008 - command: [ "go","run", "player-actor-client.go"] \ No newline at end of file + command: [ "go","run", "player-actor-client.go"] + - appID: scheduler-workflow + appDirPath: ../../scheduler-workflow + appPort: 3009 + command: [ "go","run", "scheduler-workflow.go"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 452580e2..97483ded 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -66,3 +66,9 @@ services: build: context: . dockerfile: scheduler-actor-reminders/Dockerfile-client + + scheduler-workflow: + image: scheduler-workflow + build: + context: . + dockerfile: scheduler-workflow/Dockerfile \ No newline at end of file diff --git a/go.mod b/go.mod deleted file mode 100644 index ec97e6fb..00000000 --- a/go.mod +++ /dev/null @@ -1,23 +0,0 @@ -module test-infra - -go 1.23.1 - -require ( - github.com/dapr/dapr v1.14.4 - github.com/dapr/go-sdk v1.11.0 - github.com/dapr/go-sdk/examples/actor v0.0.0-20240626135542-c417f950fe1d - google.golang.org/grpc v1.67.1 -) - -require ( - github.com/go-chi/chi/v5 v5.1.0 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect - google.golang.org/protobuf v1.35.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/scheduler-actor-reminders/go.mod b/scheduler-actor-reminders/go.mod new file mode 100644 index 00000000..e958c928 --- /dev/null +++ b/scheduler-actor-reminders/go.mod @@ -0,0 +1,23 @@ +module test-infra/scheduler-actor-reminders + +go 1.23.1 + +require ( + github.com/dapr/go-sdk v1.11.0 + github.com/dapr/go-sdk/examples/actor v0.0.0-20240626135542-c417f950fe1d +) + +require ( + github.com/dapr/dapr v1.14.0 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/rogpeppe/go-internal v1.13.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.65.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/scheduler-actor-reminders/go.sum similarity index 63% rename from go.sum rename to scheduler-actor-reminders/go.sum index 389c5065..53e70fb9 100644 --- a/go.sum +++ b/scheduler-actor-reminders/go.sum @@ -1,5 +1,5 @@ -github.com/dapr/dapr v1.14.4 h1:OEyAFvpW4AK+MWyX5xp9zVLiC+oY/5ziDzh16F+aoWU= -github.com/dapr/dapr v1.14.4/go.mod h1:pZGJvUGT4IDhEuWVXBvJ73TkPnLAW34SDagth7G3f8w= +github.com/dapr/dapr v1.14.0 h1:SIQsNX1kH31JRDIS4k8IZ6eomM/BAcOP844PhQIT+BQ= +github.com/dapr/dapr v1.14.0/go.mod h1:oDNgaPHQIDZ3G4n4g89TElXWgkluYwcar41DI/oF4gw= github.com/dapr/go-sdk v1.11.0 h1:clANpOQd6MsfvSa6snaX8MVk6eRx26Vsj5GxGdQ6mpE= github.com/dapr/go-sdk v1.11.0/go.mod h1:btZ/tX8eYnx0fg3HiJUku8J5QBRXHsp3kAB1BUiTxXY= github.com/dapr/go-sdk/examples/actor v0.0.0-20240626135542-c417f950fe1d h1:J7u+R5/FXuh1y757FHAnA75g3w8ADzm4idO1kQmKH80= @@ -20,26 +20,26 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 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.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +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.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +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.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +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= diff --git a/scheduler-jobs/go.mod b/scheduler-jobs/go.mod new file mode 100644 index 00000000..dca9f9fc --- /dev/null +++ b/scheduler-jobs/go.mod @@ -0,0 +1,21 @@ +module test-infra/scheduler-jobs + +go 1.23.1 + +require ( + github.com/dapr/dapr v1.14.4 + github.com/dapr/go-sdk v1.11.0 + google.golang.org/grpc v1.67.1 +) + +require ( + 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.28.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/scheduler-jobs/go.sum b/scheduler-jobs/go.sum new file mode 100644 index 00000000..6c1df8f9 --- /dev/null +++ b/scheduler-jobs/go.sum @@ -0,0 +1,43 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dapr/dapr v1.14.4 h1:OEyAFvpW4AK+MWyX5xp9zVLiC+oY/5ziDzh16F+aoWU= +github.com/dapr/dapr v1.14.4/go.mod h1:pZGJvUGT4IDhEuWVXBvJ73TkPnLAW34SDagth7G3f8w= +github.com/dapr/go-sdk v1.11.0 h1:clANpOQd6MsfvSa6snaX8MVk6eRx26Vsj5GxGdQ6mpE= +github.com/dapr/go-sdk v1.11.0/go.mod h1:btZ/tX8eYnx0fg3HiJUku8J5QBRXHsp3kAB1BUiTxXY= +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.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +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/scheduler-workflow/Dockerfile b/scheduler-workflow/Dockerfile new file mode 100644 index 00000000..46ee0593 --- /dev/null +++ b/scheduler-workflow/Dockerfile @@ -0,0 +1,28 @@ +FROM golang:1.23 as builder + +# Working directory inside the container +WORKDIR /scheduler-workflow + +COPY go.mod go.sum ./ +RUN go mod download + +# Copy the app code +COPY . . + +# Build the app +RUN CGO_ENABLED=0 GOOS=linux go build -o scheduler-workflow . + +# Initialize a new build stage. Use a minimal base image for the final container +FROM alpine:latest + +# Install certificates for HTTPS support +RUN apk --no-cache add ca-certificates + +# Copy the binary from the builder image -> final image +COPY --from=builder /scheduler-workflow/scheduler-workflow /usr/local/bin/scheduler-workflow + +# Port the app will listen on +EXPOSE 3009 + +# Entrypoint to run the app +ENTRYPOINT ["scheduler-workflow"] diff --git a/scheduler-workflow/README.md b/scheduler-workflow/README.md new file mode 100644 index 00000000..df3376db --- /dev/null +++ b/scheduler-workflow/README.md @@ -0,0 +1,47 @@ +# Scheduler Workflow + +## Overview + +The long-haul test workflow performs the following operations repeatedly: + +1. Initialize and Register Workflows & Activities: + - A worker is set up and registers the `TestWorkflow` and `TestActivity`, which will execute in each iteration of the + long-haul test. + +2. Start Workflow Iterations: + - In each iteration, a new workflow instance is started with an incremental identifier (e.g., `longhaul-instance-0`, + `longhaul-instance-1`, etc.). + +3. Workflow Lifecycle Management: + - The workflow is paused and then resumed, simulating real-world scenarios where workflows may need to be temporarily + halted and restarted. + - An external event, named `testEvent`, is raised, allowing the workflow to proceed to the next stage upon receiving + the event. + +4. Stage Tracking: + - Within `TestActivity`, a `stage` variable is incremented to track the current step of the workflow. This allows us + to observe the workflow's progress and simulate step-based processing. Once stage reaches `100`, it resets to `0`. + +5. Workflow Completion & Cleanup: + - The test monitors each workflow’s status, polling every 5s, and waits until the workflow completes or fails. + - Upon completion (or failure), the workflow is: + - Terminated to ensure it doesn’t continue running or consuming resources. + - Purged to remove the instance from the Dapr state, maintaining a clean test environment over time. + +6. Iteration Limit: + - After `100` iterations, the workflow `instanceID` counter resets to `0` to avoid excessive resource buildup. + +## How To Run the Code: + +Run the server with: +```shell +dapr run --app-id scheduler-workflow --app-port 8484 --dapr-http-port 3502 --log-level debug --config dapr/config.yaml -- go run workflow.go +``` + +To run locally as a container, assuming scheduler + dapr are running as well: +```shell +docker build -t scheduler-workflow . +docker run -p 8383:8383 --name scheduler-jobs scheduler-workflow # optionally add -d to run in background +# check container is running +docker ps +``` \ No newline at end of file diff --git a/scheduler-workflow/dapr/config.yaml b/scheduler-workflow/dapr/config.yaml new file mode 100644 index 00000000..3c0de60f --- /dev/null +++ b/scheduler-workflow/dapr/config.yaml @@ -0,0 +1,8 @@ +apiVersion: dapr.io/v1alpha1 +kind: Configuration +metadata: + name: schedulerreminders +spec: + features: + - name: SchedulerReminders + enabled: true \ No newline at end of file diff --git a/scheduler-workflow/go.mod b/scheduler-workflow/go.mod new file mode 100644 index 00000000..47482637 --- /dev/null +++ b/scheduler-workflow/go.mod @@ -0,0 +1,28 @@ +module test-infra/scheduler-workflow + +go 1.23.1 + +require github.com/dapr/go-sdk v1.11.0 + +require ( + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/dapr/dapr v1.14.0 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/marusama/semaphore/v2 v2.5.0 // indirect + github.com/microsoft/durabletask-go v0.5.0 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + go.opentelemetry.io/otel/trace 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.65.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/scheduler-workflow/go.sum b/scheduler-workflow/go.sum new file mode 100644 index 00000000..d148b725 --- /dev/null +++ b/scheduler-workflow/go.sum @@ -0,0 +1,64 @@ +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dapr/dapr v1.14.0 h1:SIQsNX1kH31JRDIS4k8IZ6eomM/BAcOP844PhQIT+BQ= +github.com/dapr/dapr v1.14.0/go.mod h1:oDNgaPHQIDZ3G4n4g89TElXWgkluYwcar41DI/oF4gw= +github.com/dapr/go-sdk v1.11.0 h1:clANpOQd6MsfvSa6snaX8MVk6eRx26Vsj5GxGdQ6mpE= +github.com/dapr/go-sdk v1.11.0/go.mod h1:btZ/tX8eYnx0fg3HiJUku8J5QBRXHsp3kAB1BUiTxXY= +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/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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/marusama/semaphore/v2 v2.5.0 h1:o/1QJD9DBYOWRnDhPwDVAXQn6mQYD0gZaS1Tpx6DJGM= +github.com/marusama/semaphore/v2 v2.5.0/go.mod h1:z9nMiNUekt/LTpTUQdpp+4sJeYqUGpwMHfW0Z8V8fnQ= +github.com/microsoft/durabletask-go v0.5.0 h1:4DWBgg05wnkV/VwakaiPqZ4cARvATP74ZQJFcXVMC18= +github.com/microsoft/durabletask-go v0.5.0/go.mod h1:goe2gmMgLptCijMDQ7JsekaR86KjPUG64V9JDXvKBhE= +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= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +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.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +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/scheduler-workflow/workflow.go b/scheduler-workflow/workflow.go new file mode 100644 index 00000000..1636404a --- /dev/null +++ b/scheduler-workflow/workflow.go @@ -0,0 +1,225 @@ +package main + +import ( + "context" + "fmt" + "log" + http2 "net/http" + "os" + "os/signal" + "syscall" + "time" + + dapr "github.com/dapr/go-sdk/client" + "github.com/dapr/go-sdk/service/http" + "github.com/dapr/go-sdk/workflow" +) + +const appPort = ":8484" + +var stage int + +func main() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, err := dapr.NewClient() + if err != nil { + panic(err) + } + defer client.Close() + + daprService := http.NewService(appPort) + go func() { + log.Println("Starting app service...") + if err := daprService.Start(); err != nil && err.Error() != http2.ErrServerClosed.Error() { + log.Fatalf("error starting app service: %v", err) + } + }() + + worker, err := workflow.NewWorker() + if err != nil { + log.Fatal(err) + } + fmt.Println("Workflow worker initialized") + + defer func() { + if err := worker.Shutdown(); err != nil { + log.Printf("Failed to shutdown workflow worker: %v", err) + } + }() + + if err := worker.RegisterWorkflow(TestWorkflow); err != nil { + log.Fatalf("Failed to register workflow: %v", err) + } + if err := worker.RegisterActivity(TestActivity); err != nil { + log.Fatalf("Failed to register activity: %v", err) + } + + // Start workflow runner + if err := worker.Start(); err != nil { + log.Fatalf("Failed to start worker: %v", err) + } + fmt.Println("Workflow worker started") + + go startLonghaulWorkflow(ctx, client) + waitForShutdown(cancel) +} + +func TestWorkflow(ctx *workflow.WorkflowContext) (any, error) { + var input int + if err := ctx.GetInput(&input); err != nil { + return nil, err + } + var output string + if err := ctx.CallActivity(TestActivity, workflow.ActivityInput(input)).Await(&output); err != nil { + return nil, err + } + + err := ctx.WaitForExternalEvent("testEvent", time.Second*60).Await(&output) + if err != nil { + return nil, err + } + + if err := ctx.CallActivity(TestActivity, workflow.ActivityInput(input)).Await(&output); err != nil { + return nil, err + } + + return output, nil +} + +func TestActivity(ctx workflow.ActivityContext) (any, error) { + var input int + if err := ctx.GetInput(&input); err != nil { + return "", err + } + + if stage >= 100 { + stage = 0 + } + + stage++ + return fmt.Sprintf("Stage: %d", stage), nil +} + +// startLonghaulWorkflow performs the following operations on a workflow: +// start, pause, resume, raise event, terminate, purge +func startLonghaulWorkflow(ctx context.Context, client dapr.Client) { + i := 0 + for { + select { + case <-ctx.Done(): + return + default: + fmt.Printf("Starting workflow iteration %d\n", i) + instanceID := fmt.Sprintf("longhaul-instance-%d", i) + workflowReq := &dapr.StartWorkflowRequest{ + InstanceID: instanceID, + WorkflowComponent: "", + WorkflowName: "TestWorkflow", + Input: i, + SendRawInput: false, + } + + respStart, err := client.StartWorkflowBeta1(ctx, workflowReq) + if err != nil { + log.Printf("Iteration %d: Failed to start workflow: %v\n", i, err) + continue + } + fmt.Printf("Workflow started with ID: '%s'\n", respStart.InstanceID) + + err = client.PauseWorkflowBeta1(ctx, &dapr.PauseWorkflowRequest{ + InstanceID: instanceID, + WorkflowComponent: "", + }) + if err != nil { + log.Fatalf("Failed to pause workflow: %v\n", err) + } + fmt.Printf("Workflow '%s' paused\n", instanceID) + + err = client.ResumeWorkflowBeta1(ctx, &dapr.ResumeWorkflowRequest{ + InstanceID: instanceID, + WorkflowComponent: "", + }) + if err != nil { + log.Fatalf("Failed to resume workflow: %v\n", err) + } + fmt.Printf("Workflow '%s' resumed\n", instanceID) + + // Raise event to advance the workflow + err = client.RaiseEventWorkflowBeta1(ctx, &dapr.RaiseEventWorkflowRequest{ + InstanceID: instanceID, + WorkflowComponent: "", + EventName: "testEvent", + EventData: "testData", + }) + if err != nil { + log.Fatalf("Failed to raise event: %v\n", err) + } + fmt.Printf("Workflow '%s' event raised\n", instanceID) + fmt.Printf("[wfclient] stage: %d\n", stage) + + // Wait for workflow to complete + // Poll every 5 seconds to check the workflow status + waitForWorkflowCompletion(ctx, client, instanceID) + + // Terminate and purge after completion + err = client.TerminateWorkflowBeta1(ctx, &dapr.TerminateWorkflowRequest{ + InstanceID: instanceID, + }) + if err != nil { + log.Printf("Failed to terminate workflow %s: %v\n", instanceID, err) + } else { + fmt.Printf("Workflow '%s' terminated\n", instanceID) + } + + err = client.PurgeWorkflowBeta1(ctx, &dapr.PurgeWorkflowRequest{ + InstanceID: instanceID, + }) + if err != nil { + log.Printf("Failed to purge workflow %s: %v\n", instanceID, err) + } else { + fmt.Printf("Workflow '%s' purged\n", instanceID) + } + + i++ + if i >= 100 { + i = 0 + } + } + } +} + +// waitForWorkflowCompletion polls every 5s to check the workflow status +func waitForWorkflowCompletion(ctx context.Context, client dapr.Client, instanceID string) { + for { + respGet, err := client.GetWorkflowBeta1(ctx, &dapr.GetWorkflowRequest{ + InstanceID: instanceID, + }) + if err != nil { + log.Printf("Error retrieving workflow status for %s: %v\n", instanceID, err) + continue + } + + switch respGet.RuntimeStatus { + case workflow.StatusCompleted.String(): + fmt.Printf("Workflow '%s' completed\n", instanceID) + return + case workflow.StatusFailed.String(): + log.Printf("Workflow '%s' failed\n", instanceID) + return + } + time.Sleep(5 * time.Second) + } +} + +// waitForShutdown keeps the app alive until an interrupt or termination signal is received +func waitForShutdown(cancelFunc context.CancelFunc) { + sigCh := make(chan os.Signal, 1) + // Notify the channel on Interrupt (Ctrl+C) or SIGTERM (for Docker/K8s graceful shutdown) + signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) + <-sigCh + + log.Println("Shutting down...") + cancelFunc() +} From 07aaad2f8219d1decf7309fa720bdbb2df26356c Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Wed, 30 Oct 2024 10:32:32 -0500 Subject: [PATCH 6/9] add bicep per app Signed-off-by: Cassandra Coyle --- .../scheduler-actor-reminders-client.bicep | 39 +++++++++++++++++++ .../scheduler-actor-reminders-server.bicep | 39 +++++++++++++++++++ .../containerapps/apps/scheduler-jobs.bicep | 39 +++++++++++++++++++ .../apps/scheduler-workflow.bicep | 39 +++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 deploy/containerapps/apps/scheduler-actor-reminders-client.bicep create mode 100644 deploy/containerapps/apps/scheduler-actor-reminders-server.bicep create mode 100644 deploy/containerapps/apps/scheduler-jobs.bicep create mode 100644 deploy/containerapps/apps/scheduler-workflow.bicep diff --git a/deploy/containerapps/apps/scheduler-actor-reminders-client.bicep b/deploy/containerapps/apps/scheduler-actor-reminders-client.bicep new file mode 100644 index 00000000..e90772f6 --- /dev/null +++ b/deploy/containerapps/apps/scheduler-actor-reminders-client.bicep @@ -0,0 +1,39 @@ +param appName string = 'scheduler-actor-reminders-client' +param containerPort int = 3008 +param environmentName string +param location string + +resource environment 'Microsoft.App/managedEnvironments@2022-03-01' existing = { + name: environmentName +} + +resource schedulerActorRemindersClient 'Microsoft.App/containerApps@2022-03-01' = { + name: appName + location: location + properties: { + managedEnvironmentId: environment.id + template: { + containers: [ + { + name: appName + image: 'dapriotest/${appName}:dev' + } + ] + scale: { + minReplicas: 1 + maxReplicas: 1 + } + } + configuration: { + ingress: { + external: false + targetPort: containerPort + } + dapr: { + enabled: true + appId: appName + appPort: containerPort + } + } + } +} \ No newline at end of file diff --git a/deploy/containerapps/apps/scheduler-actor-reminders-server.bicep b/deploy/containerapps/apps/scheduler-actor-reminders-server.bicep new file mode 100644 index 00000000..1c67c66b --- /dev/null +++ b/deploy/containerapps/apps/scheduler-actor-reminders-server.bicep @@ -0,0 +1,39 @@ +param appName string = 'scheduler-actor-reminders-server' +param containerPort int = 3007 +param environmentName string +param location string + +resource environment 'Microsoft.App/managedEnvironments@2022-03-01' existing = { + name: environmentName +} + +resource schedulerActorRemindersServer 'Microsoft.App/containerApps@2022-03-01' = { + name: appName + location: location + properties: { + managedEnvironmentId: environment.id + template: { + containers: [ + { + name: appName + image: 'dapriotest/${appName}:dev' + } + ] + scale: { + minReplicas: 1 + maxReplicas: 1 + } + } + configuration: { + ingress: { + external: false + targetPort: containerPort + } + dapr: { + enabled: true + appId: appName + appPort: containerPort + } + } + } +} \ No newline at end of file diff --git a/deploy/containerapps/apps/scheduler-jobs.bicep b/deploy/containerapps/apps/scheduler-jobs.bicep new file mode 100644 index 00000000..9ce68d9d --- /dev/null +++ b/deploy/containerapps/apps/scheduler-jobs.bicep @@ -0,0 +1,39 @@ +param appName string = 'scheduler-jobs' +param containerPort int = 3006 +param environmentName string +param location string + +resource environment 'Microsoft.App/managedEnvironments@2022-03-01' existing = { + name: environmentName +} + +resource schedulerJobs 'Microsoft.App/containerApps@2022-03-01' = { + name: appName + location: location + properties: { + managedEnvironmentId: environment.id + template: { + containers: [ + { + name: appName + image: 'dapriotest/${appName}:dev' + } + ] + scale: { + minReplicas: 1 + maxReplicas: 1 + } + } + configuration: { + ingress: { + external: false + targetPort: containerPort + } + dapr: { + enabled: true + appId: appName + appPort: containerPort + } + } + } +} \ No newline at end of file diff --git a/deploy/containerapps/apps/scheduler-workflow.bicep b/deploy/containerapps/apps/scheduler-workflow.bicep new file mode 100644 index 00000000..481529ee --- /dev/null +++ b/deploy/containerapps/apps/scheduler-workflow.bicep @@ -0,0 +1,39 @@ +param appName string = 'scheduler-workflow' +param containerPort int = 3009 +param environmentName string +param location string + +resource environment 'Microsoft.App/managedEnvironments@2022-03-01' existing = { + name: environmentName +} + +resource schedulerWorkflow 'Microsoft.App/containerApps@2022-03-01' = { + name: appName + location: location + properties: { + managedEnvironmentId: environment.id + template: { + containers: [ + { + name: appName + image: 'dapriotest/${appName}:dev' + } + ] + scale: { + minReplicas: 1 + maxReplicas: 1 + } + } + configuration: { + ingress: { + external: false + targetPort: containerPort + } + dapr: { + enabled: true + appId: appName + appPort: containerPort + } + } + } +} \ No newline at end of file From ac21c482d48275af8818e54531318dc2c1adf4c2 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Wed, 30 Oct 2024 10:53:43 -0500 Subject: [PATCH 7/9] add workflow deploy yaml updates Signed-off-by: Cassandra Coyle --- .github/workflows/dapr-deploy.yml | 5 +- .github/workflows/dapr-longhaul-weekly.yml | 5 +- .../scheduler-actor-reminder-client.yml | 54 +++++++++++++++++++ .../scheduler-actor-reminders-server.yml | 54 +++++++++++++++++++ longhaul-test/scheduler-jobs-deploy.yml | 54 +++++++++++++++++++ longhaul-test/scheduler-workflow-deploy.yml | 54 +++++++++++++++++++ 6 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 longhaul-test/scheduler-actor-reminder-client.yml create mode 100644 longhaul-test/scheduler-actor-reminders-server.yml create mode 100644 longhaul-test/scheduler-jobs-deploy.yml create mode 100644 longhaul-test/scheduler-workflow-deploy.yml diff --git a/.github/workflows/dapr-deploy.yml b/.github/workflows/dapr-deploy.yml index 44684157..d1437227 100644 --- a/.github/workflows/dapr-deploy.yml +++ b/.github/workflows/dapr-deploy.yml @@ -69,4 +69,7 @@ jobs: kubectl apply -f ./longhaul-test/pubsub-workflow-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/pubsub-workflow-app -n ${{ env.APP_NAMESPACE }} kubectl apply -f ./longhaul-test/snapshot-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/snapshot-app -n ${{ env.APP_NAMESPACE }} kubectl apply -f ./longhaul-test/validation-worker-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/validation-worker-app -n ${{ env.APP_NAMESPACE }} - kubectl apply -f ./longhaul-test/workflow-gen-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/workflow-gen-app -n ${{ env.APP_NAMESPACE }} + kubectl apply -f ./longhaul-test/scheduler-jobs-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-jobs-app -n ${{ env.APP_NAMESPACE }} + kubectl apply -f ./longhaul-test/scheduler-actor-reminders-server-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-actor-reminders-server-app -n ${{ env.APP_NAMESPACE }} + kubectl apply -f ./longhaul-test/scheduler-actor-reminders-client-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-actor-reminders-client-app -n ${{ env.APP_NAMESPACE }} + kubectl apply -f ./longhaul-test/scheduler-workflow-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-workflow-app -n ${{ env.APP_NAMESPACE }} \ No newline at end of file diff --git a/.github/workflows/dapr-longhaul-weekly.yml b/.github/workflows/dapr-longhaul-weekly.yml index eade4c84..9ee9091f 100644 --- a/.github/workflows/dapr-longhaul-weekly.yml +++ b/.github/workflows/dapr-longhaul-weekly.yml @@ -148,4 +148,7 @@ jobs: kubectl apply -f ./longhaul-test/snapshot-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/snapshot-app -n ${{ env.APP_NAMESPACE }} kubectl apply -f ./longhaul-test/validation-worker-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/validation-worker-app -n ${{ env.APP_NAMESPACE }} kubectl apply -f ./longhaul-test/workflow-gen-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/workflow-gen-app -n ${{ env.APP_NAMESPACE }} - + kubectl apply -f ./longhaul-test/scheduler-jobs-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-jobs-app -n ${{ env.APP_NAMESPACE }} + kubectl apply -f ./longhaul-test/scheduler-actor-reminders-server-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-actor-reminders-server-app -n ${{ env.APP_NAMESPACE }} + kubectl apply -f ./longhaul-test/scheduler-actor-reminders-client-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-actor-reminders-client-app -n ${{ env.APP_NAMESPACE }} + kubectl apply -f ./longhaul-test/scheduler-workflow-deploy.yml -n ${{ env.APP_NAMESPACE }} && kubectl rollout restart deploy/scheduler-workflow-app -n ${{ env.APP_NAMESPACE }} \ No newline at end of file diff --git a/longhaul-test/scheduler-actor-reminder-client.yml b/longhaul-test/scheduler-actor-reminder-client.yml new file mode 100644 index 00000000..e37e77aa --- /dev/null +++ b/longhaul-test/scheduler-actor-reminder-client.yml @@ -0,0 +1,54 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +kind: Service +apiVersion: v1 +metadata: + name: scheduler-actor-reminders-client + labels: + app: scheduler-actor-reminders-client +spec: + selector: + app: scheduler-actor-reminders-client + ports: + - protocol: TCP + port: 9988 + targetPort: 9988 + type: ClusterIP + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: scheduler-actor-reminders-client-app + labels: + app: scheduler-actor-reminders-client +spec: + replicas: 1 + selector: + matchLabels: + app: scheduler-actor-reminders-client + template: + metadata: + labels: + app: scheduler-actor-reminders-client + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "scheduler-actor-reminders-client" + dapr.io/enable-profiling: "true" + dapr.io/log-as-json: "true" + prometheus.io/scrape: 'true' + prometheus.io/port: '9988' + spec: + containers: + - name: scheduler-actor-reminders-client + image: daprtests.azurecr.io/scheduler-actor-reminders-client:dev + ports: + - name: dapr + containerPort: 3008 + - name: prom + containerPort: 9988 + + imagePullPolicy: Always diff --git a/longhaul-test/scheduler-actor-reminders-server.yml b/longhaul-test/scheduler-actor-reminders-server.yml new file mode 100644 index 00000000..76f9d75f --- /dev/null +++ b/longhaul-test/scheduler-actor-reminders-server.yml @@ -0,0 +1,54 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +kind: Service +apiVersion: v1 +metadata: + name: scheduler-actor-reminders-server + labels: + app: scheduler-actor-reminders-server +spec: + selector: + app: scheduler-actor-reminders-server + ports: + - protocol: TCP + port: 9988 + targetPort: 9988 + type: ClusterIP + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: scheduler-actor-reminders-server-app + labels: + app: scheduler-actor-reminders-server +spec: + replicas: 1 + selector: + matchLabels: + app: scheduler-actor-reminders-server + template: + metadata: + labels: + app: scheduler-actor-reminders-server + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "scheduler-actor-reminders-server" + dapr.io/enable-profiling: "true" + dapr.io/log-as-json: "true" + prometheus.io/scrape: 'true' + prometheus.io/port: '9988' + spec: + containers: + - name: scheduler-actor-reminders-server + image: daprtests.azurecr.io/scheduler-actor-reminders-server:dev + ports: + - name: dapr + containerPort: 3007 + - name: prom + containerPort: 9988 + + imagePullPolicy: Always diff --git a/longhaul-test/scheduler-jobs-deploy.yml b/longhaul-test/scheduler-jobs-deploy.yml new file mode 100644 index 00000000..b36f2c03 --- /dev/null +++ b/longhaul-test/scheduler-jobs-deploy.yml @@ -0,0 +1,54 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +kind: Service +apiVersion: v1 +metadata: + name: scheduler-jobs + labels: + app: scheduler-jobs +spec: + selector: + app: scheduler-jobs + ports: + - protocol: TCP + port: 9988 + targetPort: 9988 + type: ClusterIP + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: scheduler-jobs-app + labels: + app: scheduler-jobs +spec: + replicas: 1 + selector: + matchLabels: + app: scheduler-jobs + template: + metadata: + labels: + app: scheduler-jobs + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "scheduler-jobs" + dapr.io/enable-profiling: "true" + dapr.io/log-as-json: "true" + prometheus.io/scrape: 'true' + prometheus.io/port: '9988' + spec: + containers: + - name: scheduler-jobs + image: daprtests.azurecr.io/scheduler-jobs:dev + ports: + - name: dapr + containerPort: 3006 + - name: prom + containerPort: 9988 + + imagePullPolicy: Always diff --git a/longhaul-test/scheduler-workflow-deploy.yml b/longhaul-test/scheduler-workflow-deploy.yml new file mode 100644 index 00000000..bb28910b --- /dev/null +++ b/longhaul-test/scheduler-workflow-deploy.yml @@ -0,0 +1,54 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +kind: Service +apiVersion: v1 +metadata: + name: scheduler-workflow + labels: + app: scheduler-workflow +spec: + selector: + app: scheduler-workflow + ports: + - protocol: TCP + port: 9988 + targetPort: 9988 + type: ClusterIP + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: scheduler-workflow-app + labels: + app: scheduler-workflow +spec: + replicas: 1 + selector: + matchLabels: + app: scheduler-workflow + template: + metadata: + labels: + app: scheduler-workflow + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "scheduler-workflow" + dapr.io/enable-profiling: "true" + dapr.io/log-as-json: "true" + prometheus.io/scrape: 'true' + prometheus.io/port: '9988' + spec: + containers: + - name: scheduler-workflow + image: daprtests.azurecr.io/scheduler-workflow:dev + ports: + - name: dapr + containerPort: 3009 + - name: prom + containerPort: 9988 + + imagePullPolicy: Always From 9e2fde4088c88b9bdb1ba23fd0f2348d6e8de6ab Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Wed, 30 Oct 2024 11:37:05 -0500 Subject: [PATCH 8/9] add redeploy config and aks/app bicep files Signed-off-by: Cassandra Coyle --- .../scheduler-actor-reminders-client.yml | 84 +++++++++++++++++++ .../scheduler-actor-reminders-server.yml | 84 +++++++++++++++++++ .github/workflows/scheduler-jobs-build.yml | 84 +++++++++++++++++++ .../workflows/scheduler-workflow-build.yml | 84 +++++++++++++++++++ .../scheduler-actor-reminders-client.bicep | 82 ++++++++++++++++++ .../scheduler-actor-reminders-server.bicep | 82 ++++++++++++++++++ deploy/aks/apps/scheduler-jobs-deploy.bicep | 82 ++++++++++++++++++ .../aks/apps/scheduler-workflow-deploy.bicep | 82 ++++++++++++++++++ 8 files changed, 664 insertions(+) create mode 100644 .github/workflows/scheduler-actor-reminders-client.yml create mode 100644 .github/workflows/scheduler-actor-reminders-server.yml create mode 100644 .github/workflows/scheduler-jobs-build.yml create mode 100644 .github/workflows/scheduler-workflow-build.yml create mode 100644 deploy/aks/apps/scheduler-actor-reminders-client.bicep create mode 100644 deploy/aks/apps/scheduler-actor-reminders-server.bicep create mode 100644 deploy/aks/apps/scheduler-jobs-deploy.bicep create mode 100644 deploy/aks/apps/scheduler-workflow-deploy.bicep diff --git a/.github/workflows/scheduler-actor-reminders-client.yml b/.github/workflows/scheduler-actor-reminders-client.yml new file mode 100644 index 00000000..143f0182 --- /dev/null +++ b/.github/workflows/scheduler-actor-reminders-client.yml @@ -0,0 +1,84 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +name: build-scheduler-actor-reminders-client + +on: + push: + branches: + - master + paths: + - 'scheduler-actor-reminders-client/**' + - '.github/workflows/scheduler-actor-reminders-client-build.yml' + - '.github/workflows/dapr-deploy.yml' + pull_request: + branches: + - master + paths: + - 'scheduler-actor-reminders-client/**' + +jobs: + build: + name: build scheduler-actor-reminders-client + runs-on: ubuntu-latest + env: + APP_REGISTRY: daprtests.azurecr.io + APP_IMAGE_NAME: scheduler-actor-reminders-client + # TODO: APP_VER needs to be versioned correctly + APP_VER: dev + APP_DIR: ./scheduler-actor-reminders-client + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: docker login + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: ${{ secrets.DOCKER_REGISTRY }} + username: ${{ secrets.DOCKER_REGISTRY_ID }} + password: ${{ secrets.DOCKER_REGISTRY_PASS }} + - name: Build scheduler-actor-reminders-client app docker image + run: | + docker compose build ${{ env.APP_IMAGE_NAME }} + docker tag ${{ env.APP_IMAGE_NAME }} ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Push scheduler-actor-reminders-client app image to dockerhub + if: github.event_name != 'pull_request' + run: | + docker push ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Copy deployment yaml to archieve + run: | + mkdir -p ${{ env.ARTIFACT_DIR }} + cp ./longhaul-test/*.yml ${{ env.ARTIFACT_DIR }} + - name: Upload artifacts + uses: actions/upload-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + deploy: + name: deploy scheduler-actor-reminders-client to test cluster + needs: build + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + env: + APP_NAMESPACE: longhaul-test + TEST_CLUSTER_NAME: aks-longhaul-release + TEST_RESOURCE_GROUP: aks-longhaul-release + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: download artifacts + uses: actions/download-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + - name: Login Azure + run: | + az login --service-principal -u ${{ secrets.AZURE_LOGIN_USER }} -p ${{ secrets.AZURE_LOGIN_PASS }} --tenant ${{ secrets.AZURE_TENANT }} --output none + - name: Set up kubeconf for longhaul test environment + run: | + az aks get-credentials -n ${{ env.TEST_CLUSTER_NAME }} -g ${{ env.TEST_RESOURCE_GROUP }} + - name: Deploy apps to longhaul test environment + run: | + kubectl apply -n ${{ env.APP_NAMESPACE }} -f ${{ env.ARTIFACT_DIR }}/scheduler-actor-reminders-client-deploy.yml & kubectl rollout restart -n ${{ env.APP_NAMESPACE }} deploy/scheduler-actor-reminders-client-app diff --git a/.github/workflows/scheduler-actor-reminders-server.yml b/.github/workflows/scheduler-actor-reminders-server.yml new file mode 100644 index 00000000..1d3a232b --- /dev/null +++ b/.github/workflows/scheduler-actor-reminders-server.yml @@ -0,0 +1,84 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +name: build-scheduler-actor-reminders-server + +on: + push: + branches: + - master + paths: + - 'scheduler-actor-reminders-server/**' + - '.github/workflows/scheduler-actor-reminders-server-build.yml' + - '.github/workflows/dapr-deploy.yml' + pull_request: + branches: + - master + paths: + - 'scheduler-actor-reminders-server/**' + +jobs: + build: + name: build scheduler-actor-reminders-server + runs-on: ubuntu-latest + env: + APP_REGISTRY: daprtests.azurecr.io + APP_IMAGE_NAME: scheduler-actor-reminders-server + # TODO: APP_VER needs to be versioned correctly + APP_VER: dev + APP_DIR: ./scheduler-actor-reminders-server + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: docker login + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: ${{ secrets.DOCKER_REGISTRY }} + username: ${{ secrets.DOCKER_REGISTRY_ID }} + password: ${{ secrets.DOCKER_REGISTRY_PASS }} + - name: Build scheduler-actor-reminders-server app docker image + run: | + docker compose build ${{ env.APP_IMAGE_NAME }} + docker tag ${{ env.APP_IMAGE_NAME }} ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Push scheduler-actor-reminders-server app image to dockerhub + if: github.event_name != 'pull_request' + run: | + docker push ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Copy deployment yaml to archieve + run: | + mkdir -p ${{ env.ARTIFACT_DIR }} + cp ./longhaul-test/*.yml ${{ env.ARTIFACT_DIR }} + - name: Upload artifacts + uses: actions/upload-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + deploy: + name: deploy scheduler-actor-reminders-server to test cluster + needs: build + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + env: + APP_NAMESPACE: longhaul-test + TEST_CLUSTER_NAME: aks-longhaul-release + TEST_RESOURCE_GROUP: aks-longhaul-release + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: download artifacts + uses: actions/download-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + - name: Login Azure + run: | + az login --service-principal -u ${{ secrets.AZURE_LOGIN_USER }} -p ${{ secrets.AZURE_LOGIN_PASS }} --tenant ${{ secrets.AZURE_TENANT }} --output none + - name: Set up kubeconf for longhaul test environment + run: | + az aks get-credentials -n ${{ env.TEST_CLUSTER_NAME }} -g ${{ env.TEST_RESOURCE_GROUP }} + - name: Deploy apps to longhaul test environment + run: | + kubectl apply -n ${{ env.APP_NAMESPACE }} -f ${{ env.ARTIFACT_DIR }}/scheduler-actor-reminders-server-deploy.yml & kubectl rollout restart -n ${{ env.APP_NAMESPACE }} deploy/scheduler-actor-reminders-server-app diff --git a/.github/workflows/scheduler-jobs-build.yml b/.github/workflows/scheduler-jobs-build.yml new file mode 100644 index 00000000..dbaeca85 --- /dev/null +++ b/.github/workflows/scheduler-jobs-build.yml @@ -0,0 +1,84 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +name: build-scheduler-jobs + +on: + push: + branches: + - master + paths: + - 'scheduler-jobs/**' + - '.github/workflows/scheduler-jobs-build.yml' + - '.github/workflows/dapr-deploy.yml' + pull_request: + branches: + - master + paths: + - 'scheduler-jobs/**' + +jobs: + build: + name: build scheduler-jobs + runs-on: ubuntu-latest + env: + APP_REGISTRY: daprtests.azurecr.io + APP_IMAGE_NAME: scheduler-jobs + # TODO: APP_VER needs to be versioned correctly + APP_VER: dev + APP_DIR: ./scheduler-jobs + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: docker login + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: ${{ secrets.DOCKER_REGISTRY }} + username: ${{ secrets.DOCKER_REGISTRY_ID }} + password: ${{ secrets.DOCKER_REGISTRY_PASS }} + - name: Build scheduler-jobs app docker image + run: | + docker compose build ${{ env.APP_IMAGE_NAME }} + docker tag ${{ env.APP_IMAGE_NAME }} ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Push scheduler-jobs app image to dockerhub + if: github.event_name != 'pull_request' + run: | + docker push ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Copy deployment yaml to archieve + run: | + mkdir -p ${{ env.ARTIFACT_DIR }} + cp ./longhaul-test/*.yml ${{ env.ARTIFACT_DIR }} + - name: Upload artifacts + uses: actions/upload-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + deploy: + name: deploy scheduler-jobs to test cluster + needs: build + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + env: + APP_NAMESPACE: longhaul-test + TEST_CLUSTER_NAME: aks-longhaul-release + TEST_RESOURCE_GROUP: aks-longhaul-release + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: download artifacts + uses: actions/download-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + - name: Login Azure + run: | + az login --service-principal -u ${{ secrets.AZURE_LOGIN_USER }} -p ${{ secrets.AZURE_LOGIN_PASS }} --tenant ${{ secrets.AZURE_TENANT }} --output none + - name: Set up kubeconf for longhaul test environment + run: | + az aks get-credentials -n ${{ env.TEST_CLUSTER_NAME }} -g ${{ env.TEST_RESOURCE_GROUP }} + - name: Deploy apps to longhaul test environment + run: | + kubectl apply -n ${{ env.APP_NAMESPACE }} -f ${{ env.ARTIFACT_DIR }}/scheduler-jobs-deploy.yml & kubectl rollout restart -n ${{ env.APP_NAMESPACE }} deploy/scheduler-jobs-app diff --git a/.github/workflows/scheduler-workflow-build.yml b/.github/workflows/scheduler-workflow-build.yml new file mode 100644 index 00000000..7c513915 --- /dev/null +++ b/.github/workflows/scheduler-workflow-build.yml @@ -0,0 +1,84 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +name: build-scheduler-workflow + +on: + push: + branches: + - master + paths: + - 'scheduler-workflow/**' + - '.github/workflows/scheduler-workflow-build.yml' + - '.github/workflows/dapr-deploy.yml' + pull_request: + branches: + - master + paths: + - 'scheduler-workflow/**' + +jobs: + build: + name: build scheduler-workflow + runs-on: ubuntu-latest + env: + APP_REGISTRY: daprtests.azurecr.io + APP_IMAGE_NAME: scheduler-workflow + # TODO: APP_VER needs to be versioned correctly + APP_VER: dev + APP_DIR: ./scheduler-workflow + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: docker login + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: ${{ secrets.DOCKER_REGISTRY }} + username: ${{ secrets.DOCKER_REGISTRY_ID }} + password: ${{ secrets.DOCKER_REGISTRY_PASS }} + - name: Build scheduler-workflow app docker image + run: | + docker compose build ${{ env.APP_IMAGE_NAME }} + docker tag ${{ env.APP_IMAGE_NAME }} ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Push scheduler-workflow app image to dockerhub + if: github.event_name != 'pull_request' + run: | + docker push ${{ env.APP_REGISTRY }}/${{ env.APP_IMAGE_NAME }}:${{ env.APP_VER }} + - name: Copy deployment yaml to archieve + run: | + mkdir -p ${{ env.ARTIFACT_DIR }} + cp ./longhaul-test/*.yml ${{ env.ARTIFACT_DIR }} + - name: Upload artifacts + uses: actions/upload-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + deploy: + name: deploy scheduler-workflow to test cluster + needs: build + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + env: + APP_NAMESPACE: longhaul-test + TEST_CLUSTER_NAME: aks-longhaul-release + TEST_RESOURCE_GROUP: aks-longhaul-release + ARTIFACT_DIR: ./deploy_artifact + steps: + - name: download artifacts + uses: actions/download-artifact@master + with: + name: longhaul-test + path: ${{ env.ARTIFACT_DIR }} + - name: Login Azure + run: | + az login --service-principal -u ${{ secrets.AZURE_LOGIN_USER }} -p ${{ secrets.AZURE_LOGIN_PASS }} --tenant ${{ secrets.AZURE_TENANT }} --output none + - name: Set up kubeconf for longhaul test environment + run: | + az aks get-credentials -n ${{ env.TEST_CLUSTER_NAME }} -g ${{ env.TEST_RESOURCE_GROUP }} + - name: Deploy apps to longhaul test environment + run: | + kubectl apply -n ${{ env.APP_NAMESPACE }} -f ${{ env.ARTIFACT_DIR }}/scheduler-workflow-deploy.yml & kubectl rollout restart -n ${{ env.APP_NAMESPACE }} deploy/scheduler-workflow-app diff --git a/deploy/aks/apps/scheduler-actor-reminders-client.bicep b/deploy/aks/apps/scheduler-actor-reminders-client.bicep new file mode 100644 index 00000000..c8bf0b84 --- /dev/null +++ b/deploy/aks/apps/scheduler-actor-reminders-client.bicep @@ -0,0 +1,82 @@ +@secure() +param kubeConfig string +param kubernetesNamespace string + +import 'kubernetes@1.0.0' with { + namespace: 'default' + kubeConfig: kubeConfig +} + +resource coreService_workflowGen 'core/Service@v1' = { + metadata: { + name: 'scheduler-actor-reminders-client' + labels: { + app: 'scheduler-actor-reminders-client' + } + namespace: kubernetesNamespace + } + spec: { + selector: { + app: 'scheduler-actor-reminders-client' + } + ports: [ + { + protocol: 'TCP' + port: 9988 + targetPort: 9988 + } + ] + type: 'ClusterIP' + } +} + +resource appsDeployment_workflowGenApp 'apps/Deployment@v1' = { + metadata: { + name: 'scheduler-actor-reminders-client-app' + labels: { + app: 'scheduler-actor-reminders-client' + } + namespace: kubernetesNamespace + } + spec: { + replicas: 1 + selector: { + matchLabels: { + app: 'scheduler-actor-reminders-client' + } + } + template: { + metadata: { + labels: { + app: 'scheduler-actor-reminders-client' + } + annotations: { + 'dapr.io/enabled': 'true' + 'dapr.io/app-id': 'scheduler-actor-reminders-client' + 'dapr.io/enable-profiling': 'true' + 'dapr.io/log-as-json': 'true' + 'prometheus.io/scrape': 'true' + 'prometheus.io/port': '9988' + } + } + spec: { + containers: [ + { + name: 'scheduler-actor-reminders-client' + image: 'daprtests.azurecr.io/scheduler-actor-reminders-client:dev' + ports: [ + { + containerPort: 3008 + } + { + name: 'prom' + containerPort: 9988 + } + ] + imagePullPolicy: 'Always' + } + ] + } + } + } +} diff --git a/deploy/aks/apps/scheduler-actor-reminders-server.bicep b/deploy/aks/apps/scheduler-actor-reminders-server.bicep new file mode 100644 index 00000000..5f8ed554 --- /dev/null +++ b/deploy/aks/apps/scheduler-actor-reminders-server.bicep @@ -0,0 +1,82 @@ +@secure() +param kubeConfig string +param kubernetesNamespace string + +import 'kubernetes@1.0.0' with { + namespace: 'default' + kubeConfig: kubeConfig +} + +resource coreService_workflowGen 'core/Service@v1' = { + metadata: { + name: 'scheduler-actor-reminders-server' + labels: { + app: 'scheduler-actor-reminders-server' + } + namespace: kubernetesNamespace + } + spec: { + selector: { + app: 'scheduler-actor-reminders-server' + } + ports: [ + { + protocol: 'TCP' + port: 9988 + targetPort: 9988 + } + ] + type: 'ClusterIP' + } +} + +resource appsDeployment_workflowGenApp 'apps/Deployment@v1' = { + metadata: { + name: 'scheduler-actor-reminders-server-app' + labels: { + app: 'scheduler-actor-reminders-server' + } + namespace: kubernetesNamespace + } + spec: { + replicas: 1 + selector: { + matchLabels: { + app: 'scheduler-actor-reminders-server' + } + } + template: { + metadata: { + labels: { + app: 'scheduler-actor-reminders-server' + } + annotations: { + 'dapr.io/enabled': 'true' + 'dapr.io/app-id': 'scheduler-actor-reminders-server' + 'dapr.io/enable-profiling': 'true' + 'dapr.io/log-as-json': 'true' + 'prometheus.io/scrape': 'true' + 'prometheus.io/port': '9988' + } + } + spec: { + containers: [ + { + name: 'scheduler-actor-reminders-server' + image: 'daprtests.azurecr.io/scheduler-actor-reminders-server:dev' + ports: [ + { + containerPort: 3007 + } + { + name: 'prom' + containerPort: 9988 + } + ] + imagePullPolicy: 'Always' + } + ] + } + } + } +} diff --git a/deploy/aks/apps/scheduler-jobs-deploy.bicep b/deploy/aks/apps/scheduler-jobs-deploy.bicep new file mode 100644 index 00000000..90ed7a25 --- /dev/null +++ b/deploy/aks/apps/scheduler-jobs-deploy.bicep @@ -0,0 +1,82 @@ +@secure() +param kubeConfig string +param kubernetesNamespace string + +import 'kubernetes@1.0.0' with { + namespace: 'default' + kubeConfig: kubeConfig +} + +resource coreService_workflowGen 'core/Service@v1' = { + metadata: { + name: 'scheduler-jobs' + labels: { + app: 'scheduler-jobs' + } + namespace: kubernetesNamespace + } + spec: { + selector: { + app: 'scheduler-jobs' + } + ports: [ + { + protocol: 'TCP' + port: 9988 + targetPort: 9988 + } + ] + type: 'ClusterIP' + } +} + +resource appsDeployment_workflowGenApp 'apps/Deployment@v1' = { + metadata: { + name: 'scheduler-jobs-app' + labels: { + app: 'scheduler-jobs' + } + namespace: kubernetesNamespace + } + spec: { + replicas: 1 + selector: { + matchLabels: { + app: 'scheduler-jobs' + } + } + template: { + metadata: { + labels: { + app: 'scheduler-jobs' + } + annotations: { + 'dapr.io/enabled': 'true' + 'dapr.io/app-id': 'scheduler-jobs' + 'dapr.io/enable-profiling': 'true' + 'dapr.io/log-as-json': 'true' + 'prometheus.io/scrape': 'true' + 'prometheus.io/port': '9988' + } + } + spec: { + containers: [ + { + name: 'scheduler-jobs' + image: 'daprtests.azurecr.io/scheduler-jobs:dev' + ports: [ + { + containerPort: 3006 + } + { + name: 'prom' + containerPort: 9988 + } + ] + imagePullPolicy: 'Always' + } + ] + } + } + } +} diff --git a/deploy/aks/apps/scheduler-workflow-deploy.bicep b/deploy/aks/apps/scheduler-workflow-deploy.bicep new file mode 100644 index 00000000..bd3331b6 --- /dev/null +++ b/deploy/aks/apps/scheduler-workflow-deploy.bicep @@ -0,0 +1,82 @@ +@secure() +param kubeConfig string +param kubernetesNamespace string + +import 'kubernetes@1.0.0' with { + namespace: 'default' + kubeConfig: kubeConfig +} + +resource coreService_workflowGen 'core/Service@v1' = { + metadata: { + name: 'scheduler-workflow' + labels: { + app: 'scheduler-workflow' + } + namespace: kubernetesNamespace + } + spec: { + selector: { + app: 'scheduler-workflow' + } + ports: [ + { + protocol: 'TCP' + port: 9988 + targetPort: 9988 + } + ] + type: 'ClusterIP' + } +} + +resource appsDeployment_workflowGenApp 'apps/Deployment@v1' = { + metadata: { + name: 'scheduler-workflow-app' + labels: { + app: 'scheduler-workflow' + } + namespace: kubernetesNamespace + } + spec: { + replicas: 1 + selector: { + matchLabels: { + app: 'scheduler-workflow' + } + } + template: { + metadata: { + labels: { + app: 'scheduler-workflow' + } + annotations: { + 'dapr.io/enabled': 'true' + 'dapr.io/app-id': 'scheduler-workflow' + 'dapr.io/enable-profiling': 'true' + 'dapr.io/log-as-json': 'true' + 'prometheus.io/scrape': 'true' + 'prometheus.io/port': '9988' + } + } + spec: { + containers: [ + { + name: 'scheduler-workflow' + image: 'daprtests.azurecr.io/scheduler-workflow:dev' + ports: [ + { + containerPort: 3009 + } + { + name: 'prom' + containerPort: 9988 + } + ] + imagePullPolicy: 'Always' + } + ] + } + } + } +} From 16c161c4fcde79f8309f669a9b076cf451b77de0 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Wed, 6 Nov 2024 08:46:37 -0600 Subject: [PATCH 9/9] tweak compose Signed-off-by: Cassandra Coyle --- docker-compose.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 97483ded..d5b2388a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -52,23 +52,23 @@ services: scheduler-jobs: image: scheduler-jobs build: - context: . - dockerfile: scheduler-jobs/Dockerfile + context: ./scheduler-jobs + dockerfile: Dockerfile scheduler-actor-reminders-server: image: player-actor-server build: - context: . - dockerfile: scheduler-actor-reminders/Dockerfile-server + context: ./scheduler-actor-reminders + dockerfile: Dockerfile-server scheduler-actor-reminders-client: image: player-actor-client build: - context: . - dockerfile: scheduler-actor-reminders/Dockerfile-client + context: ./scheduler-actor-reminders + dockerfile: Dockerfile-client scheduler-workflow: image: scheduler-workflow build: - context: . - dockerfile: scheduler-workflow/Dockerfile \ No newline at end of file + context: ./scheduler-workflow + dockerfile: Dockerfile \ No newline at end of file