From 41a041d9ca68ccf2f0e786e9af5481e6b5400acc Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 4 Dec 2024 15:09:16 +0100 Subject: [PATCH 01/34] feat(process): Add rest-trigger for template --- .../trigger/rest-trigger/Dockerfile | 43 ++ .../trigger/rest-trigger/README.md | 78 ++ .../trigger/rest-trigger/app.yaml | 51 ++ .../trigger/rest-trigger/config.yaml | 8 + .../trigger/rest-trigger/develop.Dockerfile | 33 + src/demo-workflow/trigger/rest-trigger/go.mod | 89 +++ src/demo-workflow/trigger/rest-trigger/go.sum | 723 ++++++++++++++++++ .../trigger/rest-trigger/main.go | 191 +++++ .../trigger/rest-trigger/minikube_build.sh | 4 + .../trigger/rest-trigger/package.json | 3 + 10 files changed, 1223 insertions(+) create mode 100644 src/demo-workflow/trigger/rest-trigger/Dockerfile create mode 100644 src/demo-workflow/trigger/rest-trigger/README.md create mode 100644 src/demo-workflow/trigger/rest-trigger/app.yaml create mode 100644 src/demo-workflow/trigger/rest-trigger/config.yaml create mode 100644 src/demo-workflow/trigger/rest-trigger/develop.Dockerfile create mode 100644 src/demo-workflow/trigger/rest-trigger/go.mod create mode 100644 src/demo-workflow/trigger/rest-trigger/go.sum create mode 100644 src/demo-workflow/trigger/rest-trigger/main.go create mode 100755 src/demo-workflow/trigger/rest-trigger/minikube_build.sh create mode 100644 src/demo-workflow/trigger/rest-trigger/package.json diff --git a/src/demo-workflow/trigger/rest-trigger/Dockerfile b/src/demo-workflow/trigger/rest-trigger/Dockerfile new file mode 100644 index 0000000..ec10a36 --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/Dockerfile @@ -0,0 +1,43 @@ +FROM golang:1.22.0-alpine3.19 AS builder + +# Build the binary statically. +ENV CGO_ENABLED=0 + +WORKDIR /app +COPY go.* ./ +RUN go mod download +COPY . . +RUN go build -o process . + +FROM alpine:3.10.2 + +# Create kai user. +ENV USER=kai +ENV UID=10001 + +RUN apk add -U --no-cache ca-certificates +RUN mkdir -p /var/log/app + +RUN adduser \ + --disabled-password \ + --gecos "" \ + --home "/nonexistent" \ + --shell "/sbin/nologin" \ + --no-create-home \ + --uid "${UID}" \ + "${USER}" + +WORKDIR /app +COPY config.yaml config.yaml + +COPY --from=builder /app/process process + +RUN chown -R kai:0 /app \ + && chmod -R g+w /app \ + && mkdir /var/log/app -p \ + && chown -R kai:0 /var/log/app \ + && chmod -R g+w /var/log/app + +USER kai + +CMD ["sh","-c","/app/process 2>&1 | tee -a /var/log/app/app.log"] diff --git a/src/demo-workflow/trigger/rest-trigger/README.md b/src/demo-workflow/trigger/rest-trigger/README.md new file mode 100644 index 0000000..04716a4 --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/README.md @@ -0,0 +1,78 @@ +# REST trigger + +The REST webhook trigger is a predefined KAI process that creates a REST server instance. +It will stay listening for client requests through port 8080. + +## How to setup + +There is an optional "path" configuration for users to specify the path in which the REST service will be deployed. +If no "path" is setup, the trigger will be in the default "trigger" path. + +Processes communicating with this trigger must be prepared to do so. Processes listening to +the REST trigger need to unmmarshal protobuf based JSON messages, and processes sending messages to +the trigger need to marshal protobuf based JSON messages. + +Both output and input messages towards this process require the usage of specific keys in the JSON. + +### Configuration + +The configuration should be defined inside the `centralized configuration scope`: + +| Key | Optional | Type | Value | +|-----------|-----------|------|----------------------------------------------------------------| +| path | yes | str | Where the REST service will be deployed ("trigger" by default). | + +#### Configuration Example + +```yaml +centralized_configuration: + process: + config: + path: 'mypath' +``` + +### Trigger's Output (JSON) + +| Key | Type | Value | +|-----------|---------|-------------------------------------------------------------------------------------------| +| method | str | The REST method used | +| body | []byte | Optional. For POST and PUT methods the body is taken from the request's body | + +#### Trigger's Output Example + +```json +{ + "method": "POST", + "body": {"keyA": "valueA", "keyB": "valueB"}, +} +``` + +### Trigger's Input from other processes (JSON) + +| Key | Type | Value | +|-------------|------|----------------------------------------------------------------------------| +| status_code | str | Status code for the workflow execution, used later in http server response | +| message | str | A message sent by the user | + +#### Trigger's Input Example + +```json +{ + "status_code": "200", + "message": "All good!", +} +``` + +### Trigger's Output to client (JSON) + +| Key | Type | Value | +|-----------|------|------------------------------------------------------------------------| +| message | str | A message | + +#### Trigger's Output to client + +```json +{ + "message": "All good!", +} +``` diff --git a/src/demo-workflow/trigger/rest-trigger/app.yaml b/src/demo-workflow/trigger/rest-trigger/app.yaml new file mode 100644 index 0000000..6cd123b --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/app.yaml @@ -0,0 +1,51 @@ +metadata: + product_id: REST_Trigger_product + version_tag: v1.0.0 + workflow_name: REST_Trigger_workflow + workflow_type: data + process_name: REST_Trigger_process + process_type: trigger + +nats: + url: 'nats://localhost:4222' + stream: trigger + output: rest-trigger-output + +minio: + internal_folder: ".kai" + endpoint: "localhost:9000" + access_key_id: minioadmin + access_key_secret: minioadmin + use_ssl: false + bucket: test-bucket + +auth: + endpoint: "http://auth.kai.local" + client: "kai" + client_secret: "kai_pwd" + realm: "konstellation" + +predictions: + endpoint: localhost:6379 + username: default + password: redispw + index: predictionsIdx + +model_registry: + folder_name: ".models" + +measurements: + endpoint: "localhost:4317" + insecure: true + timeout: 5 + metrics_interval: 10 + +centralized_configuration: + global: + bucket: global + product: + bucket: product + workflow: + bucket: workflow + process: + bucket: process diff --git a/src/demo-workflow/trigger/rest-trigger/config.yaml b/src/demo-workflow/trigger/rest-trigger/config.yaml new file mode 100644 index 0000000..c6933cc --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/config.yaml @@ -0,0 +1,8 @@ +runner: + logger: + level: Debug # Info, Debug, Warn, Error, Fatal, Panic + encoding: json # console, json + output_paths: + - stdout + error_output_paths: + - stderr diff --git a/src/demo-workflow/trigger/rest-trigger/develop.Dockerfile b/src/demo-workflow/trigger/rest-trigger/develop.Dockerfile new file mode 100644 index 0000000..5ebde24 --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/develop.Dockerfile @@ -0,0 +1,33 @@ +FROM alpine:3.10.2 + +# Create kai user. +ENV USER=kai +ENV UID=10001 + +RUN apk add -U --no-cache ca-certificates +RUN mkdir -p /var/log/app + +RUN adduser \ + --disabled-password \ + --gecos "" \ + --home "/nonexistent" \ + --shell "/sbin/nologin" \ + --no-create-home \ + --uid "${UID}" \ + "${USER}" + +WORKDIR /app +COPY app.yaml app.yaml +COPY config.yaml config.yaml + +COPY build/process process + +RUN chown -R kai:0 /app \ + && chmod -R g+w /app \ + && mkdir /var/log/app -p \ + && chown -R kai:0 /var/log/app \ + && chmod -R g+w /var/log/app + +USER kai + +CMD ["sh","-c","/app/process 2>&1 | tee -a /var/log/app/app.log"] diff --git a/src/demo-workflow/trigger/rest-trigger/go.mod b/src/demo-workflow/trigger/rest-trigger/go.mod new file mode 100644 index 0000000..5093f9e --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/go.mod @@ -0,0 +1,89 @@ +module github.com/konstellation-io/kai-processes/rest-trigger + +go 1.22 + +require ( + github.com/gin-gonic/gin v1.9.1 + github.com/google/uuid v1.3.1 + github.com/konstellation-io/kai-sdk/go-sdk/v2 v2.1.1 + google.golang.org/protobuf v1.31.0 +) + +require ( + github.com/Masterminds/semver/v3 v3.2.1 // indirect + github.com/Nerzal/gocloak/v13 v13.8.0 // indirect + github.com/bytedance/sonic v1.9.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-logr/zapr v1.2.4 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/go-resty/resty/v2 v2.7.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/minio-go/v7 v7.0.63 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/nats-io/nats.go v1.31.0 // indirect + github.com/nats-io/nkeys v0.4.6 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/redis/go-redis/v9 v9.3.0 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/sagikazarmark/locafero v0.3.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/segmentio/ksuid v1.0.4 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.10.0 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.17.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/testcontainers/testcontainers-go v0.26.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/arch v0.3.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect + google.golang.org/grpc v1.59.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/src/demo-workflow/trigger/rest-trigger/go.sum b/src/demo-workflow/trigger/rest-trigger/go.sum new file mode 100644 index 0000000..a5a1bf8 --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/go.sum @@ -0,0 +1,723 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Nerzal/gocloak/v13 v13.8.0 h1:7s9cK8X3vy8OIic+pG4POE9vGy02tSHkMhvWXv0P2m8= +github.com/Nerzal/gocloak/v13 v13.8.0/go.mod h1:rRBtEdh5N0+JlZZEsrfZcB2sRMZWbgSxI2EIv9jpJp4= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= +github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/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/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/konstellation-io/kai-sdk/go-sdk/v2 v2.1.1 h1:yT0tTMAbSJV3mDkAHYB614egkjaVoGYl2JU4SdhpauM= +github.com/konstellation-io/kai-sdk/go-sdk/v2 v2.1.1/go.mod h1:+ZzgGoOJ+cKGdkiJeb0EoSDAWDc61hsahpVTAn66txY= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ= +github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E= +github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= +github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= +github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/redis/go-redis/v9 v9.3.0 h1:RiVDjmig62jIWp7Kk4XVLs0hzV6pI3PyTnnL0cnn0u0= +github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= +github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= +github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= +github.com/shirou/gopsutil/v3 v3.23.9 h1:ZI5bWVeu2ep4/DIxB4U9okeYJ7zp/QLTO4auRb/ty/E= +github.com/shirou/gopsutil/v3 v3.23.9/go.mod h1:x/NWSb71eMcjFIO0vhyGW5nZ7oSIgVjrCnADckb85GA= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= +github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= +github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/testcontainers/testcontainers-go v0.26.0 h1:uqcYdoOHBy1ca7gKODfBd9uTHVK3a7UL848z09MVZ0c= +github.com/testcontainers/testcontainers-go v0.26.0/go.mod h1:ICriE9bLX5CLxL9OFQ2N+2N+f+803LNJ1utJb1+Inx0= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= +go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/src/demo-workflow/trigger/rest-trigger/main.go b/src/demo-workflow/trigger/rest-trigger/main.go new file mode 100644 index 0000000..b6dc0df --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/main.go @@ -0,0 +1,191 @@ +package main + +import ( + "context" + "encoding/json" + "errors" + "io" + "net/http" + "os/signal" + "strconv" + "syscall" + "time" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/konstellation-io/kai-sdk/go-sdk/v2/runner" + "github.com/konstellation-io/kai-sdk/go-sdk/v2/runner/trigger" + "github.com/konstellation-io/kai-sdk/go-sdk/v2/sdk" + centralizedConfiguration "github.com/konstellation-io/kai-sdk/go-sdk/v2/sdk/centralized-configuration" + "google.golang.org/protobuf/types/known/anypb" + "google.golang.org/protobuf/types/known/structpb" +) + +var path = "/trigger" + +func main() { + runner. + NewRunner(). + TriggerRunner(). + WithInitializer(restInitializer). + WithRunner(restServerRunner). + Run() +} + +func restInitializer(kaiSDK sdk.KaiSDK) { + kaiSDK.Logger.Info("Initializer, loading config") + pathConfig, err := kaiSDK.CentralizedConfig.GetConfig("path", centralizedConfiguration.ProcessScope) + if err == nil { + kaiSDK.Logger.Info("Initializer, config loaded", "path", pathConfig) + path = pathConfig + } +} + +func restServerRunner(tr *trigger.Runner, kaiSDK sdk.KaiSDK) { + kaiSDK.Logger.Info("Starting http server", "port", 8080) + + bgCtx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer stop() + + r := gin.Default() + r.GET(path, getHandler(kaiSDK, tr.GetResponseChannel)) + r.POST(path, postHandler(kaiSDK, tr.GetResponseChannel)) + r.PUT(path, putHandler(kaiSDK, tr.GetResponseChannel)) + r.DELETE(path, deleteHandler(kaiSDK, tr.GetResponseChannel)) + + srv := &http.Server{ + Addr: ":8080", + Handler: r, + } + + go func() { + if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + kaiSDK.Logger.Error(err, "Error running http server") + } + }() + + <-bgCtx.Done() + stop() + kaiSDK.Logger.Info("Shutting down server...") + + // The kaiSDK is used to inform the server it has 5 seconds to finish + // the request it is currently handling + bgCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := srv.Shutdown(bgCtx); err != nil { + kaiSDK.Logger.Error(err, "Error shutting down server") + } + + kaiSDK.Logger.Info("Server stopped") +} + +func postHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { + return responseHandler(kaiSDK, getResponseChannel, "POST") +} + +func putHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { + return responseHandler(kaiSDK, getResponseChannel, "PUT") +} + +func getHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { + return responseHandler(kaiSDK, getResponseChannel, "GET") +} + +func deleteHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { + return responseHandler(kaiSDK, getResponseChannel, "DELETE") +} + +func responseHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any, restMethod string) func(c *gin.Context) { + return func(c *gin.Context) { + + reqID := uuid.New().String() + kaiSDK.Logger.Info("REST triggered, sending message", "requestID", reqID) + + m, err := prepareMessageOutput(restMethod, c.Request.Body) + if err != nil { + kaiSDK.Logger.Error(err, "error preparing message output") + return + } + + err = kaiSDK.Messaging.SendOutputWithRequestID(m, reqID) + if err != nil { + kaiSDK.Logger.Error(err, "Error sending output") + return + } + + responseChannel := getResponseChannel(reqID) + response := <-responseChannel + + kaiSDK.Logger.Info("response recieved", "response", response) + + httpCode, respessage, err := unmarshalResponse(response) + if err != nil { + kaiSDK.Logger.Error(err, "error unmarshalling response") + return + } + + c.JSON(httpCode, gin.H{ + "message": respessage, + }) + } +} + +func unmarshalResponse(response *anypb.Any) (int, string, error) { + var respData struct { + StatusCode string `json:"status_code"` + Message string `json:"message"` + } + + responsePb := new(structpb.Value) + + err := response.UnmarshalTo(responsePb) + if err != nil { + return 0, "", err + } + + responsePbJSON, err := responsePb.MarshalJSON() + if err != nil { + return 0, "", err + } + + err = json.Unmarshal(responsePbJSON, &respData) + if err != nil { + return 0, "", err + } + + httpCode, err := strconv.Atoi(respData.StatusCode) + if err != nil { + return 0, "", err + } + + return httpCode, respData.Message, nil +} + +func prepareMessageOutput(restMethod string, body io.ReadCloser) (*structpb.Value, error) { + var m *structpb.Value + var err error + + if restMethod == "POST" || restMethod == "PUT" { + jsonData, err := io.ReadAll(body) + if err != nil { + return nil, err + } + + m, err = structpb.NewValue(map[string]interface{}{ + "method": restMethod, + "body": jsonData, + }) + if err != nil { + return nil, err + } + } else { + m, err = structpb.NewValue(map[string]interface{}{ + "method": restMethod, + }) + if err != nil { + return nil, err + } + } + + return m, nil +} diff --git a/src/demo-workflow/trigger/rest-trigger/minikube_build.sh b/src/demo-workflow/trigger/rest-trigger/minikube_build.sh new file mode 100755 index 0000000..23c11bc --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/minikube_build.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +CGO_ENABLED=0 go build -o build/process main.go +minikube image build -t konstellation/demo-rest-trigger . -f develop.Dockerfile -p kai-local diff --git a/src/demo-workflow/trigger/rest-trigger/package.json b/src/demo-workflow/trigger/rest-trigger/package.json new file mode 100644 index 0000000..0ba4af6 --- /dev/null +++ b/src/demo-workflow/trigger/rest-trigger/package.json @@ -0,0 +1,3 @@ +{ + "name": "rest-trigger" +} From fee0d397cd115bb390129b93c5c9a3505d299da8 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 12:37:56 +0100 Subject: [PATCH 02/34] WIP --- src/demo-workflow/exit/training/main.py | 1 + .../trigger/rest-trigger/Dockerfile | 43 -- .../trigger/rest-trigger/README.md | 78 -- .../trigger/rest-trigger/app.yaml | 51 -- .../trigger/rest-trigger/config.yaml | 8 - .../trigger/rest-trigger/develop.Dockerfile | 33 - src/demo-workflow/trigger/rest-trigger/go.mod | 89 --- src/demo-workflow/trigger/rest-trigger/go.sum | 723 ------------------ .../trigger/rest-trigger/main.go | 191 ----- .../trigger/rest-trigger/minikube_build.sh | 4 - .../trigger/rest-trigger/package.json | 3 - 11 files changed, 1 insertion(+), 1223 deletions(-) delete mode 100644 src/demo-workflow/trigger/rest-trigger/Dockerfile delete mode 100644 src/demo-workflow/trigger/rest-trigger/README.md delete mode 100644 src/demo-workflow/trigger/rest-trigger/app.yaml delete mode 100644 src/demo-workflow/trigger/rest-trigger/config.yaml delete mode 100644 src/demo-workflow/trigger/rest-trigger/develop.Dockerfile delete mode 100644 src/demo-workflow/trigger/rest-trigger/go.mod delete mode 100644 src/demo-workflow/trigger/rest-trigger/go.sum delete mode 100644 src/demo-workflow/trigger/rest-trigger/main.go delete mode 100755 src/demo-workflow/trigger/rest-trigger/minikube_build.sh delete mode 100644 src/demo-workflow/trigger/rest-trigger/package.json diff --git a/src/demo-workflow/exit/training/main.py b/src/demo-workflow/exit/training/main.py index 3b0ac3f..9da1e9b 100644 --- a/src/demo-workflow/exit/training/main.py +++ b/src/demo-workflow/exit/training/main.py @@ -3,6 +3,7 @@ from runner import Runner#, RunnerOptions, LoggerOptions async def initializer(): + kai pass async def handler(): diff --git a/src/demo-workflow/trigger/rest-trigger/Dockerfile b/src/demo-workflow/trigger/rest-trigger/Dockerfile deleted file mode 100644 index ec10a36..0000000 --- a/src/demo-workflow/trigger/rest-trigger/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -FROM golang:1.22.0-alpine3.19 AS builder - -# Build the binary statically. -ENV CGO_ENABLED=0 - -WORKDIR /app -COPY go.* ./ -RUN go mod download -COPY . . -RUN go build -o process . - -FROM alpine:3.10.2 - -# Create kai user. -ENV USER=kai -ENV UID=10001 - -RUN apk add -U --no-cache ca-certificates -RUN mkdir -p /var/log/app - -RUN adduser \ - --disabled-password \ - --gecos "" \ - --home "/nonexistent" \ - --shell "/sbin/nologin" \ - --no-create-home \ - --uid "${UID}" \ - "${USER}" - -WORKDIR /app -COPY config.yaml config.yaml - -COPY --from=builder /app/process process - -RUN chown -R kai:0 /app \ - && chmod -R g+w /app \ - && mkdir /var/log/app -p \ - && chown -R kai:0 /var/log/app \ - && chmod -R g+w /var/log/app - -USER kai - -CMD ["sh","-c","/app/process 2>&1 | tee -a /var/log/app/app.log"] diff --git a/src/demo-workflow/trigger/rest-trigger/README.md b/src/demo-workflow/trigger/rest-trigger/README.md deleted file mode 100644 index 04716a4..0000000 --- a/src/demo-workflow/trigger/rest-trigger/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# REST trigger - -The REST webhook trigger is a predefined KAI process that creates a REST server instance. -It will stay listening for client requests through port 8080. - -## How to setup - -There is an optional "path" configuration for users to specify the path in which the REST service will be deployed. -If no "path" is setup, the trigger will be in the default "trigger" path. - -Processes communicating with this trigger must be prepared to do so. Processes listening to -the REST trigger need to unmmarshal protobuf based JSON messages, and processes sending messages to -the trigger need to marshal protobuf based JSON messages. - -Both output and input messages towards this process require the usage of specific keys in the JSON. - -### Configuration - -The configuration should be defined inside the `centralized configuration scope`: - -| Key | Optional | Type | Value | -|-----------|-----------|------|----------------------------------------------------------------| -| path | yes | str | Where the REST service will be deployed ("trigger" by default). | - -#### Configuration Example - -```yaml -centralized_configuration: - process: - config: - path: 'mypath' -``` - -### Trigger's Output (JSON) - -| Key | Type | Value | -|-----------|---------|-------------------------------------------------------------------------------------------| -| method | str | The REST method used | -| body | []byte | Optional. For POST and PUT methods the body is taken from the request's body | - -#### Trigger's Output Example - -```json -{ - "method": "POST", - "body": {"keyA": "valueA", "keyB": "valueB"}, -} -``` - -### Trigger's Input from other processes (JSON) - -| Key | Type | Value | -|-------------|------|----------------------------------------------------------------------------| -| status_code | str | Status code for the workflow execution, used later in http server response | -| message | str | A message sent by the user | - -#### Trigger's Input Example - -```json -{ - "status_code": "200", - "message": "All good!", -} -``` - -### Trigger's Output to client (JSON) - -| Key | Type | Value | -|-----------|------|------------------------------------------------------------------------| -| message | str | A message | - -#### Trigger's Output to client - -```json -{ - "message": "All good!", -} -``` diff --git a/src/demo-workflow/trigger/rest-trigger/app.yaml b/src/demo-workflow/trigger/rest-trigger/app.yaml deleted file mode 100644 index 6cd123b..0000000 --- a/src/demo-workflow/trigger/rest-trigger/app.yaml +++ /dev/null @@ -1,51 +0,0 @@ -metadata: - product_id: REST_Trigger_product - version_tag: v1.0.0 - workflow_name: REST_Trigger_workflow - workflow_type: data - process_name: REST_Trigger_process - process_type: trigger - -nats: - url: 'nats://localhost:4222' - stream: trigger - output: rest-trigger-output - -minio: - internal_folder: ".kai" - endpoint: "localhost:9000" - access_key_id: minioadmin - access_key_secret: minioadmin - use_ssl: false - bucket: test-bucket - -auth: - endpoint: "http://auth.kai.local" - client: "kai" - client_secret: "kai_pwd" - realm: "konstellation" - -predictions: - endpoint: localhost:6379 - username: default - password: redispw - index: predictionsIdx - -model_registry: - folder_name: ".models" - -measurements: - endpoint: "localhost:4317" - insecure: true - timeout: 5 - metrics_interval: 10 - -centralized_configuration: - global: - bucket: global - product: - bucket: product - workflow: - bucket: workflow - process: - bucket: process diff --git a/src/demo-workflow/trigger/rest-trigger/config.yaml b/src/demo-workflow/trigger/rest-trigger/config.yaml deleted file mode 100644 index c6933cc..0000000 --- a/src/demo-workflow/trigger/rest-trigger/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -runner: - logger: - level: Debug # Info, Debug, Warn, Error, Fatal, Panic - encoding: json # console, json - output_paths: - - stdout - error_output_paths: - - stderr diff --git a/src/demo-workflow/trigger/rest-trigger/develop.Dockerfile b/src/demo-workflow/trigger/rest-trigger/develop.Dockerfile deleted file mode 100644 index 5ebde24..0000000 --- a/src/demo-workflow/trigger/rest-trigger/develop.Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM alpine:3.10.2 - -# Create kai user. -ENV USER=kai -ENV UID=10001 - -RUN apk add -U --no-cache ca-certificates -RUN mkdir -p /var/log/app - -RUN adduser \ - --disabled-password \ - --gecos "" \ - --home "/nonexistent" \ - --shell "/sbin/nologin" \ - --no-create-home \ - --uid "${UID}" \ - "${USER}" - -WORKDIR /app -COPY app.yaml app.yaml -COPY config.yaml config.yaml - -COPY build/process process - -RUN chown -R kai:0 /app \ - && chmod -R g+w /app \ - && mkdir /var/log/app -p \ - && chown -R kai:0 /var/log/app \ - && chmod -R g+w /var/log/app - -USER kai - -CMD ["sh","-c","/app/process 2>&1 | tee -a /var/log/app/app.log"] diff --git a/src/demo-workflow/trigger/rest-trigger/go.mod b/src/demo-workflow/trigger/rest-trigger/go.mod deleted file mode 100644 index 5093f9e..0000000 --- a/src/demo-workflow/trigger/rest-trigger/go.mod +++ /dev/null @@ -1,89 +0,0 @@ -module github.com/konstellation-io/kai-processes/rest-trigger - -go 1.22 - -require ( - github.com/gin-gonic/gin v1.9.1 - github.com/google/uuid v1.3.1 - github.com/konstellation-io/kai-sdk/go-sdk/v2 v2.1.1 - google.golang.org/protobuf v1.31.0 -) - -require ( - github.com/Masterminds/semver/v3 v3.2.1 // indirect - github.com/Nerzal/gocloak/v13 v13.8.0 // indirect - github.com/bytedance/sonic v1.9.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-logr/logr v1.3.0 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-logr/zapr v1.2.4 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/go-resty/resty/v2 v2.7.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/minio/md5-simd v1.1.2 // indirect - github.com/minio/minio-go/v7 v7.0.63 // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/nats-io/nats.go v1.31.0 // indirect - github.com/nats-io/nkeys v0.4.6 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/redis/go-redis/v9 v9.3.0 // indirect - github.com/rs/xid v1.5.0 // indirect - github.com/sagikazarmark/locafero v0.3.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/segmentio/ksuid v1.0.4 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.17.0 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/testcontainers/testcontainers-go v0.26.0 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect - go.opentelemetry.io/otel v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect - go.opentelemetry.io/otel/metric v1.21.0 // indirect - go.opentelemetry.io/otel/sdk v1.21.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.21.0 // indirect - go.opentelemetry.io/otel/trace v1.21.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/grpc v1.59.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/src/demo-workflow/trigger/rest-trigger/go.sum b/src/demo-workflow/trigger/rest-trigger/go.sum deleted file mode 100644 index a5a1bf8..0000000 --- a/src/demo-workflow/trigger/rest-trigger/go.sum +++ /dev/null @@ -1,723 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= -github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/Nerzal/gocloak/v13 v13.8.0 h1:7s9cK8X3vy8OIic+pG4POE9vGy02tSHkMhvWXv0P2m8= -github.com/Nerzal/gocloak/v13 v13.8.0/go.mod h1:rRBtEdh5N0+JlZZEsrfZcB2sRMZWbgSxI2EIv9jpJp4= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= -github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= -github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= -github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/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/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/konstellation-io/kai-sdk/go-sdk/v2 v2.1.1 h1:yT0tTMAbSJV3mDkAHYB614egkjaVoGYl2JU4SdhpauM= -github.com/konstellation-io/kai-sdk/go-sdk/v2 v2.1.1/go.mod h1:+ZzgGoOJ+cKGdkiJeb0EoSDAWDc61hsahpVTAn66txY= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ= -github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4= -github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= -github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= -github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E= -github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= -github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= -github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/redis/go-redis/v9 v9.3.0 h1:RiVDjmig62jIWp7Kk4XVLs0hzV6pI3PyTnnL0cnn0u0= -github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= -github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= -github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/shirou/gopsutil/v3 v3.23.9 h1:ZI5bWVeu2ep4/DIxB4U9okeYJ7zp/QLTO4auRb/ty/E= -github.com/shirou/gopsutil/v3 v3.23.9/go.mod h1:x/NWSb71eMcjFIO0vhyGW5nZ7oSIgVjrCnADckb85GA= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= -github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= -github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/testcontainers/testcontainers-go v0.26.0 h1:uqcYdoOHBy1ca7gKODfBd9uTHVK3a7UL848z09MVZ0c= -github.com/testcontainers/testcontainers-go v0.26.0/go.mod h1:ICriE9bLX5CLxL9OFQ2N+2N+f+803LNJ1utJb1+Inx0= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= -go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= -go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= -go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/src/demo-workflow/trigger/rest-trigger/main.go b/src/demo-workflow/trigger/rest-trigger/main.go deleted file mode 100644 index b6dc0df..0000000 --- a/src/demo-workflow/trigger/rest-trigger/main.go +++ /dev/null @@ -1,191 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "errors" - "io" - "net/http" - "os/signal" - "strconv" - "syscall" - "time" - - "github.com/gin-gonic/gin" - "github.com/google/uuid" - "github.com/konstellation-io/kai-sdk/go-sdk/v2/runner" - "github.com/konstellation-io/kai-sdk/go-sdk/v2/runner/trigger" - "github.com/konstellation-io/kai-sdk/go-sdk/v2/sdk" - centralizedConfiguration "github.com/konstellation-io/kai-sdk/go-sdk/v2/sdk/centralized-configuration" - "google.golang.org/protobuf/types/known/anypb" - "google.golang.org/protobuf/types/known/structpb" -) - -var path = "/trigger" - -func main() { - runner. - NewRunner(). - TriggerRunner(). - WithInitializer(restInitializer). - WithRunner(restServerRunner). - Run() -} - -func restInitializer(kaiSDK sdk.KaiSDK) { - kaiSDK.Logger.Info("Initializer, loading config") - pathConfig, err := kaiSDK.CentralizedConfig.GetConfig("path", centralizedConfiguration.ProcessScope) - if err == nil { - kaiSDK.Logger.Info("Initializer, config loaded", "path", pathConfig) - path = pathConfig - } -} - -func restServerRunner(tr *trigger.Runner, kaiSDK sdk.KaiSDK) { - kaiSDK.Logger.Info("Starting http server", "port", 8080) - - bgCtx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) - defer stop() - - r := gin.Default() - r.GET(path, getHandler(kaiSDK, tr.GetResponseChannel)) - r.POST(path, postHandler(kaiSDK, tr.GetResponseChannel)) - r.PUT(path, putHandler(kaiSDK, tr.GetResponseChannel)) - r.DELETE(path, deleteHandler(kaiSDK, tr.GetResponseChannel)) - - srv := &http.Server{ - Addr: ":8080", - Handler: r, - } - - go func() { - if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - kaiSDK.Logger.Error(err, "Error running http server") - } - }() - - <-bgCtx.Done() - stop() - kaiSDK.Logger.Info("Shutting down server...") - - // The kaiSDK is used to inform the server it has 5 seconds to finish - // the request it is currently handling - bgCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := srv.Shutdown(bgCtx); err != nil { - kaiSDK.Logger.Error(err, "Error shutting down server") - } - - kaiSDK.Logger.Info("Server stopped") -} - -func postHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { - return responseHandler(kaiSDK, getResponseChannel, "POST") -} - -func putHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { - return responseHandler(kaiSDK, getResponseChannel, "PUT") -} - -func getHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { - return responseHandler(kaiSDK, getResponseChannel, "GET") -} - -func deleteHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any) func(c *gin.Context) { - return responseHandler(kaiSDK, getResponseChannel, "DELETE") -} - -func responseHandler(kaiSDK sdk.KaiSDK, getResponseChannel func(requestID string) <-chan *anypb.Any, restMethod string) func(c *gin.Context) { - return func(c *gin.Context) { - - reqID := uuid.New().String() - kaiSDK.Logger.Info("REST triggered, sending message", "requestID", reqID) - - m, err := prepareMessageOutput(restMethod, c.Request.Body) - if err != nil { - kaiSDK.Logger.Error(err, "error preparing message output") - return - } - - err = kaiSDK.Messaging.SendOutputWithRequestID(m, reqID) - if err != nil { - kaiSDK.Logger.Error(err, "Error sending output") - return - } - - responseChannel := getResponseChannel(reqID) - response := <-responseChannel - - kaiSDK.Logger.Info("response recieved", "response", response) - - httpCode, respessage, err := unmarshalResponse(response) - if err != nil { - kaiSDK.Logger.Error(err, "error unmarshalling response") - return - } - - c.JSON(httpCode, gin.H{ - "message": respessage, - }) - } -} - -func unmarshalResponse(response *anypb.Any) (int, string, error) { - var respData struct { - StatusCode string `json:"status_code"` - Message string `json:"message"` - } - - responsePb := new(structpb.Value) - - err := response.UnmarshalTo(responsePb) - if err != nil { - return 0, "", err - } - - responsePbJSON, err := responsePb.MarshalJSON() - if err != nil { - return 0, "", err - } - - err = json.Unmarshal(responsePbJSON, &respData) - if err != nil { - return 0, "", err - } - - httpCode, err := strconv.Atoi(respData.StatusCode) - if err != nil { - return 0, "", err - } - - return httpCode, respData.Message, nil -} - -func prepareMessageOutput(restMethod string, body io.ReadCloser) (*structpb.Value, error) { - var m *structpb.Value - var err error - - if restMethod == "POST" || restMethod == "PUT" { - jsonData, err := io.ReadAll(body) - if err != nil { - return nil, err - } - - m, err = structpb.NewValue(map[string]interface{}{ - "method": restMethod, - "body": jsonData, - }) - if err != nil { - return nil, err - } - } else { - m, err = structpb.NewValue(map[string]interface{}{ - "method": restMethod, - }) - if err != nil { - return nil, err - } - } - - return m, nil -} diff --git a/src/demo-workflow/trigger/rest-trigger/minikube_build.sh b/src/demo-workflow/trigger/rest-trigger/minikube_build.sh deleted file mode 100755 index 23c11bc..0000000 --- a/src/demo-workflow/trigger/rest-trigger/minikube_build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -CGO_ENABLED=0 go build -o build/process main.go -minikube image build -t konstellation/demo-rest-trigger . -f develop.Dockerfile -p kai-local diff --git a/src/demo-workflow/trigger/rest-trigger/package.json b/src/demo-workflow/trigger/rest-trigger/package.json deleted file mode 100644 index 0ba4af6..0000000 --- a/src/demo-workflow/trigger/rest-trigger/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "rest-trigger" -} From 75c73a56b5e00f81b989a8ea32c19131ad6e7ddf Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 14:58:56 +0100 Subject: [PATCH 03/34] fix(pre-commit): Fix pre-commit configuration --- .pre-commit-config.yaml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 613d4d9..fa046d5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,8 +19,13 @@ repos: args: - --fix - id: ruff-format -- repo: https://github.com/dnephin/pre-commit-golang - rev: v0.5.1 - hooks: - - id: golangci-lint - args: ['--config', '.github/.golangci.yml', 'src/...'] + - repo: https://github.com/dnephin/pre-commit-golang + rev: v0.5.1 + hooks: + - id: golangci-lint + args: + [ + "--config", + ".github/.golangci.yml", + "src/demo-workflow/triggers/rest-trigger/...", + ] From c41e8fc90230a301cac5afa1d572f0ff7bdee1c1 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 14:59:37 +0100 Subject: [PATCH 04/34] feat(yaml): Rename environment folder --- .kai/dev/.kai-project-template.yaml | 48 ---------------------------- .kai/local/kai-project-template.yaml | 47 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 48 deletions(-) delete mode 100644 .kai/dev/.kai-project-template.yaml create mode 100644 .kai/local/kai-project-template.yaml diff --git a/.kai/dev/.kai-project-template.yaml b/.kai/dev/.kai-project-template.yaml deleted file mode 100644 index 9a0d936..0000000 --- a/.kai/dev/.kai-project-template.yaml +++ /dev/null @@ -1,48 +0,0 @@ -version: v0.1.0 -description: kai-project-template -config: {} -workflows: - - name: demo-workflow - type: training - config: {} - processes: - - name: trigger - type: trigger - image: PLACEHOLDER - replicas: 1 - gpu: false - config: - path: /demo - port: "8080" - objectStore: null - secrets: [] - subscriptions: [] - networking: - targetPort: 8080 - destinationPort: 8080 - protocol: HTTP - resourceLimits: - CPU: - request: "0.5" - limit: "1" - memory: - request: 400M - limit: 800M - tolerations: {} - - name: training - type: exit - image: PLACEHOLDER - replicas: 1 - gpu: false - objectStore: null - secrets: [] - subscriptions: - - trigger - networking: null - resourceLimits: - CPU: - request: "0.5" - limit: "1" - memory: - request: 400M - limit: 800M diff --git a/.kai/local/kai-project-template.yaml b/.kai/local/kai-project-template.yaml new file mode 100644 index 0000000..ae6f9b8 --- /dev/null +++ b/.kai/local/kai-project-template.yaml @@ -0,0 +1,47 @@ +version: v0.1.0 +description: kai-project-template +config: {} +workflows: + - name: demo-workflow + type: training + config: {} + processes: + - name: trigger + type: trigger + image: PLACEHOLDER + replicas: 1 + gpu: false + config: + path: /demo + port: "8080" + objectStore: null + secrets: [] + subscriptions: [] + networking: + targetPort: 8080 + destinationPort: 8080 + protocol: HTTP + resourceLimits: + CPU: + request: "0.5" + limit: "1" + memory: + request: 400M + limit: 800M + - name: training + type: exit + image: PLACEHOLDER + replicas: 1 + gpu: false + objectStore: null + secrets: [] + subscriptions: + - trigger + networking: null + resourceLimits: + CPU: + request: "0.5" + limit: "1" + memory: + request: 400M + limit: 800M From eb2811ab7c19c275ad55f9d9b5eecfcc12422bb6 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:00:13 +0100 Subject: [PATCH 05/34] feat(linter): Uncomment linter --- .github/workflows/linter.yml | 56 ++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index ec166d8..b263012 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -1,34 +1,34 @@ -# name: "Linter" +name: "Linter" -# on: -# pull_request: -# branches: -# - main +on: + pull_request: + branches: + - main -# jobs: -# quality-checks: -# runs-on: ubuntu-latest +jobs: + quality-checks: + runs-on: ubuntu-latest -# permissions: -# contents: read -# pull-requests: read -# checks: write + permissions: + contents: read + pull-requests: read + checks: write -# steps: -# - uses: actions/checkout@v4 -# with: -# fetch-depth: 0 -# persist-credentials: false + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false -# - name: Setup Go -# uses: actions/setup-go@v5 -# with: -# go-version: 1.23.2 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: 1.23.2 -# - name: API Go Lint -# uses: golangci/golangci-lint-action@v6 -# with: -# version: v1.62.2 -# working-directory: ./src -# args: --config ../.github/.golangci.yml -# github-token: ${{ secrets.GITHUB_TOKEN }} + - name: API Go Lint + uses: golangci/golangci-lint-action@v6 + with: + version: v1.62.2 + working-directory: ./src/demo-workflow/triggers/rest-trigger + args: --config ../../../../.github/.golangci.yml + github-token: ${{ secrets.GITHUB_TOKEN }} From 61c98bdb7a24c8e0abad615571e92c75ab2e241d Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:03:44 +0100 Subject: [PATCH 06/34] feat(scripts): Create scripts --- scripts/push_processes_images.sh | 13 +++++++++++++ scripts/update_process_env.sh | 4 ++++ 2 files changed, 17 insertions(+) create mode 100755 scripts/push_processes_images.sh create mode 100755 scripts/update_process_env.sh diff --git a/scripts/push_processes_images.sh b/scripts/push_processes_images.sh new file mode 100755 index 0000000..d0dcb0a --- /dev/null +++ b/scripts/push_processes_images.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +PRODUCT_NAME="kai-project-template" +VERSION="v0.1.0" + +SOURCE_PATH="$PWD/src" +DEMO_WORKFLOW_PATH="$SOURCE_PATH/demo-workflow" + +echo "Pushing demo workflow processes to registry..." +kli process-registry register trigger trigger --dockerfile "$DEMO_WORKFLOW_PATH/triggers/rest-trigger/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/triggers/rest-trigger" --version $VERSION +kli process-registry register exit exit --dockerfile "$DEMO_WORKFLOW_PATH/exits/training/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/exits/training" --version $VERSION + +echo "Done" diff --git a/scripts/update_process_env.sh b/scripts/update_process_env.sh new file mode 100755 index 0000000..5d7aa97 --- /dev/null +++ b/scripts/update_process_env.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cd ../src/demo-workflow/triggers/rest-trigger +uv From 432c1c2cec3139ddd7ac9ea75b9d27928d034c28 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:04:41 +0100 Subject: [PATCH 07/34] feat(make): Create make functions --- Makefile | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Makefile b/Makefile index e69de29..983ff11 100644 --- a/Makefile +++ b/Makefile @@ -0,0 +1,46 @@ +VERSION ?= v0.1.0 +ENV ?= local +PRODUCT_NAME ?= kai-project-template + +# AutoDoc +# ------------------------------------------------------------------------- +.PHONY: help +help: ## This help + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) +.DEFAULT_GOAL := help + +.PHONY: login +login: ## Login to the aio platform + kli server login --client-id kai-kli-oidc --realm konstellation + +.PHONY: update-process-env +update-process-env: ## Update process environment + ./scripts/update_process_env.sh + +.PHONY: create-product +create-product: ## Push processes images + kli product create $(PRODUCT_NAME) --description "Kai Project Template" + +.PHONY: push-processes-images +push-processes-images: ## Push processes images + ./scripts/push_processes_images.sh + +.PHONY: push-product-version +push-product-version: ## Push new product version + kli product version push .kai/$(ENV)/$(PRODUCT_NAME).yaml + +.PHONY: start-product-version +start-product-version: ## Start the product version + kli product version start $(PRODUCT_NAME) $(VERSION) + +.PHONY: stop-product-version +stop-product-version: ## Stop the product version + kli product version stop $(PRODUCT_NAME) $(VERSION) + +.PHONY: publish-product-version +publish-product-version: ## Publish the product version skipping the unpublished step + kli product version publish $(PRODUCT_NAME) $(VERSION) --force + +.PHONY: unpublish-product-version +unpublish-product-version: ## Unpublish the product version + kli product version unpublish $(PRODUCT_NAME) $(VERSION) From 3b1e3c7a0de5d7cdb17d395172b64fa7d5e717f4 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:06:38 +0100 Subject: [PATCH 08/34] WIP --- src/demo-workflow/exits/training/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/demo-workflow/exits/training/pyproject.toml b/src/demo-workflow/exits/training/pyproject.toml index 948c8c4..04f1c5a 100644 --- a/src/demo-workflow/exits/training/pyproject.toml +++ b/src/demo-workflow/exits/training/pyproject.toml @@ -61,7 +61,7 @@ exclude = [ line-length = 88 indent-width = 4 -target-version = "py313" +target-version = "py312" [tool.ruff.lint] select = ["E4", "E7", "E9", "F", "Q"] From f2106f26698f92dc1428dcfcc4c08361d9768c63 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:07:19 +0100 Subject: [PATCH 09/34] feat(exit): Adapt code for exit main.py --- src/demo-workflow/exits/training/main.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/demo-workflow/exits/training/main.py b/src/demo-workflow/exits/training/main.py index 9da1e9b..e13c132 100644 --- a/src/demo-workflow/exits/training/main.py +++ b/src/demo-workflow/exits/training/main.py @@ -1,21 +1,22 @@ import asyncio from sdk import kai_sdk -from runner import Runner#, RunnerOptions, LoggerOptions +from runner import runner as Runner -async def initializer(): - kai + +async def initializer(sdk: kai_sdk): pass -async def handler(): + +async def handler(sdk: kai_sdk): pass -async def finalizer(): + +async def finalizer(sdk: kai_sdk): pass + async def init(): - runner = await Runner( - options=RunnerOptions(logger_options=LoggerOptions(level="DEBUG")) - ).initialize() + runner = await Runner().initialize() await ( runner.exit_runner() .with_initializer(initializer) @@ -24,6 +25,7 @@ async def init(): .run() ) + if __name__ == "__main__": loop = asyncio.new_event_loop() loop.run_until_complete(init()) From f05d1ba871cc0d9d80093e51f23397bdc853ebe1 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:07:52 +0100 Subject: [PATCH 10/34] feat(exit): Adapt dockerfile for exit --- src/demo-workflow/exits/training/Dockerfile | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/demo-workflow/exits/training/Dockerfile b/src/demo-workflow/exits/training/Dockerfile index 6747cc7..e962beb 100644 --- a/src/demo-workflow/exits/training/Dockerfile +++ b/src/demo-workflow/exits/training/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11.5-slim-bullseye +FROM python:3.13.1-slim-bullseye LABEL maintainer="Intelygenz - KAI Team" @@ -6,21 +6,19 @@ LABEL maintainer="Intelygenz - KAI Team" ARG USER=kai ARG UID=1001 -ENV PATH="/root/.local/bin:$PATH" \ - POETRY_VIRTUALENVS_CREATE=false +ENV PATH="/root/.local/bin:$PATH" ENV PYTHONUNBUFFERED=1 WORKDIR /tmp -COPY ["pyproject.toml", "poetry.lock", "./"] +COPY ["pyproject.toml", "uv.lock", "./"] RUN apt update &&\ apt install -yq --no-install-recommends curl git && \ apt-get clean && apt-get autoremove -y && \ useradd -m -b /sdk --shell /bin/bash --uid ${UID} ${USER} && \ - curl https://install.python-poetry.org -o poetry-install.py && \ - python poetry-install.py --version 1.7.1 && \ - poetry install --only main --no-interaction --no-ansi + curl -LsSf https://astral.sh/uv/install.sh | sh && \ + uv sync WORKDIR /app From ac5771d7739d4ca02563f2117a05db756658cde6 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:25:09 +0100 Subject: [PATCH 11/34] wip --- scripts/update_process_env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update_process_env.sh b/scripts/update_process_env.sh index 5d7aa97..59b2eb5 100755 --- a/scripts/update_process_env.sh +++ b/scripts/update_process_env.sh @@ -1,4 +1,4 @@ #!/bin/bash cd ../src/demo-workflow/triggers/rest-trigger -uv +uv sync From 52cb50300d6afc0a678e354889465b53578d3f7d Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:26:05 +0100 Subject: [PATCH 12/34] feat(script): Modify script for get product_name and version from arguments (for make) --- scripts/push_processes_images.sh | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/scripts/push_processes_images.sh b/scripts/push_processes_images.sh index d0dcb0a..6edff9b 100755 --- a/scripts/push_processes_images.sh +++ b/scripts/push_processes_images.sh @@ -1,7 +1,30 @@ #!/bin/bash -PRODUCT_NAME="kai-project-template" -VERSION="v0.1.0" +# Show help +function show_help() { + echo "Uso: $0 " + echo + echo "Descripción:" + echo " Script para registrar imágenes de procesos en el registro." + echo + echo "Argumentos:" + echo " Nombre del producto." + echo " Versión del producto." + echo + echo "Ejemplo:" + echo " $0 kai-project-template v0.1.0" + exit 1 +} + +# Validate input arguments +if [ "$#" -ne 2 ]; then + echo "Error: Número incorrecto de argumentos." + show_help +fi + +# Leer argumentos +PRODUCT_NAME=$1 +VERSION=$2 SOURCE_PATH="$PWD/src" DEMO_WORKFLOW_PATH="$SOURCE_PATH/demo-workflow" From aa8ca7bc43f3c42a1771c4d81e0a318355bd03cd Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:27:03 +0100 Subject: [PATCH 13/34] feat(makefile): Read variables from input and file, avoid redundant magic strings --- Makefile | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 983ff11..82682d4 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,18 @@ -VERSION ?= v0.1.0 +# This variable have the environment to use, by default is local, but you can change when you run the make command ENV ?= local -PRODUCT_NAME ?= kai-project-template + +# Read the PRODUCT_NAME variable based on the file inside the corresponding directory +PRODUCT_NAME := $(shell basename $(wildcard .kai/$(ENV)/*.yaml) .yaml) + +# Read the VERSION variable based on the file inside the corresponding directory +VERSION := $(shell grep 'version:' .kai/$(ENV)/$(PRODUCT_NAME).yaml | awk '{print $$2}') + +# Test for the see the value of the variables +.PHONY: show-vars +show-vars: + @echo "ENV: $(ENV)" + @echo "PRODUCT_NAME: $(PRODUCT_NAME)" + @echo "VERSION: $(VERSION)" # AutoDoc # ------------------------------------------------------------------------- @@ -23,7 +35,7 @@ create-product: ## Push processes images .PHONY: push-processes-images push-processes-images: ## Push processes images - ./scripts/push_processes_images.sh + ./scripts/push_processes_images.sh $(PRODUCT_NAME) $(VERSION) .PHONY: push-product-version push-product-version: ## Push new product version From 61f4a1c9f3048d22b0fad2fc74b8bf17e1b16d8e Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 5 Dec 2024 15:30:02 +0100 Subject: [PATCH 14/34] fix(script): Prepare update_process_env --- scripts/update_process_env.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/update_process_env.sh b/scripts/update_process_env.sh index 59b2eb5..42d0b09 100755 --- a/scripts/update_process_env.sh +++ b/scripts/update_process_env.sh @@ -1,4 +1,6 @@ #!/bin/bash -cd ../src/demo-workflow/triggers/rest-trigger +cd ../src/demo-workflow/exits/training uv sync + +# TODO: Pending, update process rest-trigger From 349e2acfc27c858f951a65b82f96fd4b234261c9 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 09:42:20 +0100 Subject: [PATCH 15/34] feat(Makefile): Fix some instructions and add others --- Makefile | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 82682d4..fd17e1d 100644 --- a/Makefile +++ b/Makefile @@ -43,11 +43,11 @@ push-product-version: ## Push new product version .PHONY: start-product-version start-product-version: ## Start the product version - kli product version start $(PRODUCT_NAME) $(VERSION) + kli product version start $(PRODUCT_NAME) $(VERSION) "starting $(VERSION) version..." .PHONY: stop-product-version stop-product-version: ## Stop the product version - kli product version stop $(PRODUCT_NAME) $(VERSION) + kli product version stop $(PRODUCT_NAME) $(VERSION) "stopping $(VERSION) version..." .PHONY: publish-product-version publish-product-version: ## Publish the product version skipping the unpublished step @@ -56,3 +56,13 @@ publish-product-version: ## Publish the product version skipping the unpublished .PHONY: unpublish-product-version unpublish-product-version: ## Unpublish the product version kli product version unpublish $(PRODUCT_NAME) $(VERSION) + +##### HELPERS ##### + +.PHONY: list-product-processes # +list-product-processes: ## List workflow processes + kli process-registry ls $(PRODUCT_NAME) + +.PHONY: list-product-versions +list-product-versions: ## List product versions + kli product version list $(PRODUCT_NAME) From 240b8489319db2cfd591e633fa9e3f1c0ac23d4b Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 09:42:52 +0100 Subject: [PATCH 16/34] doc(Readme): Add info to Readme file --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index f0c45e3..b3cf5bf 100644 --- a/README.md +++ b/README.md @@ -28,27 +28,27 @@ Before starting, make sure to meet the following requirements: - Verify that all necessary components [KAI Requirements](https://github.com/konstellation-io/kai?tab=readme-ov-file#requirements) are installed. There is no specific version until now. - Download the latest version of KAI from the [github](https://github.com/konstellation-io/kai) repository. - Deploy KAI locally using `kaictl.sh` script, avoid errors for a previous version installed using flag `dracarys`. - ```bash - ./kaictl.sh dev --dracarys - ``` - - Modify the `/etc/hosts` file to include the following line, ensuring that `auth.kai.local` points to your `minikube` IP address: - ```bash - auth.kai.local + ```bash + ./kaictl.sh dev --dracarys + ``` + - Modify the `/etc/hosts` file to include the following line, ensuring that `auth.kai.local` points to your `minikube` IP address: + ```bash + auth.kai.local ``` 2. **Create a User in Keycloak**: - - Access the Keycloak admin console (`auth.kai.loal`) using the administrator credentials. - - Create a new user and assign them to the `admin` group. + - Access the Keycloak admin console (`auth.kai.local`) using the administrator credentials. + - Create a new user in the Konstellation realm and assign them to the `admin` group. - Remove refresh token from the user created. 3. **Install Kai-Kli**: - If `Go` is not installed, install it. There is no specific version until now. - At this moment there is no binary release, so you need to generate the `kai-kli` binary locally by download [github](https://github.com/konstellation-io/kai-kli) repository and running the following command in the repository root: - ```bash - make generate + ```bash + make generate ``` - Using the CLI generated in the previous step for create configuration for the KAI server created in the first step: - ```bash + ```bash kli server add local kai.local --insecure # Add the local server without security kli server login # Login to the server with the user created in Keycloak ``` @@ -62,4 +62,4 @@ Before starting, make sure to meet the following requirements: prometheus.kai.local registry.kai.local vault.kai.local - ``` \ No newline at end of file + ``` From 18a33894611ec08204a6080552549001e6ac220c Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 09:43:19 +0100 Subject: [PATCH 17/34] feat(yaml): Using real images --- .kai/local/kai-project-template.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.kai/local/kai-project-template.yaml b/.kai/local/kai-project-template.yaml index ae6f9b8..162a99d 100644 --- a/.kai/local/kai-project-template.yaml +++ b/.kai/local/kai-project-template.yaml @@ -1,4 +1,4 @@ -version: v0.1.0 +version: v0.1.7 description: kai-project-template config: {} workflows: @@ -8,7 +8,7 @@ workflows: processes: - name: trigger type: trigger - image: PLACEHOLDER + image: registry.kai.local/kai-project-template_trigger:v0.1.5 replicas: 1 gpu: false config: @@ -30,7 +30,7 @@ workflows: limit: 800M - name: training type: exit - image: PLACEHOLDER + image: registry.kai.local/kai-project-template_exit:v0.1.7 replicas: 1 gpu: false objectStore: null From 070c43bbe6d261ffe51db4023dc660474de810e7 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 09:44:13 +0100 Subject: [PATCH 18/34] fix(Dockerfile): Fix uv install in dockerfile --- src/demo-workflow/exits/training/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/demo-workflow/exits/training/Dockerfile b/src/demo-workflow/exits/training/Dockerfile index e962beb..f064ed7 100644 --- a/src/demo-workflow/exits/training/Dockerfile +++ b/src/demo-workflow/exits/training/Dockerfile @@ -18,7 +18,8 @@ RUN apt update &&\ apt-get clean && apt-get autoremove -y && \ useradd -m -b /sdk --shell /bin/bash --uid ${UID} ${USER} && \ curl -LsSf https://astral.sh/uv/install.sh | sh && \ - uv sync + uv export --no-dev > /tmp/requirements.txt && \ + uv pip install --system --requirements /tmp/requirements.txt WORKDIR /app From 0ac5be6fa1a432fc358c2e9ef82970bc3f468cb9 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 09:45:23 +0100 Subject: [PATCH 19/34] fix(training): Fix runner import --- src/demo-workflow/exits/training/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/demo-workflow/exits/training/main.py b/src/demo-workflow/exits/training/main.py index e13c132..272d31b 100644 --- a/src/demo-workflow/exits/training/main.py +++ b/src/demo-workflow/exits/training/main.py @@ -1,6 +1,6 @@ import asyncio from sdk import kai_sdk -from runner import runner as Runner +from runner.runner import Runner async def initializer(sdk: kai_sdk): From 13b8e33af53619768f851f2167426d53a011d0b7 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 11:39:51 +0100 Subject: [PATCH 20/34] feat(makefile): Update instructions --- Makefile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index fd17e1d..0fb75ce 100644 --- a/Makefile +++ b/Makefile @@ -4,15 +4,15 @@ ENV ?= local # Read the PRODUCT_NAME variable based on the file inside the corresponding directory PRODUCT_NAME := $(shell basename $(wildcard .kai/$(ENV)/*.yaml) .yaml) -# Read the VERSION variable based on the file inside the corresponding directory -VERSION := $(shell grep 'version:' .kai/$(ENV)/$(PRODUCT_NAME).yaml | awk '{print $$2}') +# Read the PRODUCT_VERSION variable based on the file inside the corresponding directory +PRODUCT_VERSION := $(shell grep 'version:' .kai/$(ENV)/$(PRODUCT_NAME).yaml | awk '{print $$2}') # Test for the see the value of the variables .PHONY: show-vars show-vars: @echo "ENV: $(ENV)" @echo "PRODUCT_NAME: $(PRODUCT_NAME)" - @echo "VERSION: $(VERSION)" + @echo "PRODUCT_VERSION: $(PRODUCT_VERSION)" # AutoDoc # ------------------------------------------------------------------------- @@ -35,7 +35,7 @@ create-product: ## Push processes images .PHONY: push-processes-images push-processes-images: ## Push processes images - ./scripts/push_processes_images.sh $(PRODUCT_NAME) $(VERSION) + ./scripts/push_processes_images.sh $(PRODUCT_NAME) $(PRODUCT_VERSION) .PHONY: push-product-version push-product-version: ## Push new product version @@ -43,24 +43,24 @@ push-product-version: ## Push new product version .PHONY: start-product-version start-product-version: ## Start the product version - kli product version start $(PRODUCT_NAME) $(VERSION) "starting $(VERSION) version..." + kli product version start $(PRODUCT_NAME) $(PRODUCT_VERSION) "starting $(PRODUCT_VERSION) version..." .PHONY: stop-product-version stop-product-version: ## Stop the product version - kli product version stop $(PRODUCT_NAME) $(VERSION) "stopping $(VERSION) version..." + kli product version stop $(PRODUCT_NAME) $(PRODUCT_VERSION) "stopping $(PRODUCT_VERSION) version..." .PHONY: publish-product-version publish-product-version: ## Publish the product version skipping the unpublished step - kli product version publish $(PRODUCT_NAME) $(VERSION) --force + kli product version publish $(PRODUCT_NAME) $(PRODUCT_VERSION) --force .PHONY: unpublish-product-version unpublish-product-version: ## Unpublish the product version - kli product version unpublish $(PRODUCT_NAME) $(VERSION) + kli product version unpublish $(PRODUCT_NAME) $(PRODUCT_VERSION) ##### HELPERS ##### -.PHONY: list-product-processes # -list-product-processes: ## List workflow processes +.PHONY: list-processes-images # +list-processes-images: ## List workflow processes kli process-registry ls $(PRODUCT_NAME) .PHONY: list-product-versions From 09f27812fd6d94244b25cdb8b0d582457b6bd285 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 11:40:25 +0100 Subject: [PATCH 21/34] feat(script): Update script for ask the image versions --- scripts/push_processes_images.sh | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/scripts/push_processes_images.sh b/scripts/push_processes_images.sh index 6edff9b..869544e 100755 --- a/scripts/push_processes_images.sh +++ b/scripts/push_processes_images.sh @@ -2,35 +2,37 @@ # Show help function show_help() { - echo "Uso: $0 " + echo "Use: $0 " echo - echo "Descripción:" - echo " Script para registrar imágenes de procesos en el registro." + echo "Description:" + echo " Script for pushing demo workflow processes to the registry." echo - echo "Argumentos:" - echo " Nombre del producto." - echo " Versión del producto." + echo "Args:" + echo " Name of the product." echo - echo "Ejemplo:" - echo " $0 kai-project-template v0.1.0" + echo "Sample:" + echo " $0 kai-project-template" exit 1 } # Validate input arguments -if [ "$#" -ne 2 ]; then - echo "Error: Número incorrecto de argumentos." +if [ "$#" -ne 1 ]; then + echo "Error: Error in the number of arguments." show_help fi -# Leer argumentos +# Read arguments PRODUCT_NAME=$1 -VERSION=$2 SOURCE_PATH="$PWD/src" DEMO_WORKFLOW_PATH="$SOURCE_PATH/demo-workflow" echo "Pushing demo workflow processes to registry..." -kli process-registry register trigger trigger --dockerfile "$DEMO_WORKFLOW_PATH/triggers/rest-trigger/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/triggers/rest-trigger" --version $VERSION -kli process-registry register exit exit --dockerfile "$DEMO_WORKFLOW_PATH/exits/training/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/exits/training" --version $VERSION +echo "Enter the version of the trigger: " +read TRIGGER_VERSION +kli process-registry register trigger trigger --dockerfile "$DEMO_WORKFLOW_PATH/triggers/rest-trigger/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/triggers/rest-trigger" --version $TRIGGER_VERSION +echo "Enter the version of the exit: " +read EXIT_VERSION +kli process-registry register exit exit --dockerfile "$DEMO_WORKFLOW_PATH/exits/training/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/exits/training" --version $EXIT_VERSION echo "Done" From 1661a688118069e709c76241ab0aff4034f2f938 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 11:49:32 +0100 Subject: [PATCH 22/34] doc(Readme): Update Readme documentation --- README.md | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index b3cf5bf..f782e43 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,6 @@ Before starting, make sure to meet the following requirements: ```bash ./kaictl.sh dev --dracarys ``` - - Modify the `/etc/hosts` file to include the following line, ensuring that `auth.kai.local` points to your `minikube` IP address: - ```bash - auth.kai.local - ``` 2. **Create a User in Keycloak**: - Access the Keycloak admin console (`auth.kai.local`) using the administrator credentials. @@ -52,14 +48,5 @@ Before starting, make sure to meet the following requirements: kli server add local kai.local --insecure # Add the local server without security kli server login # Login to the server with the user created in Keycloak ``` - - In case of error, check `/etc/hosts` file and verify if this ips are correct: - ```bash - api.kai.local - monitoring.kai.local - auth.kai.local - storage.kai.local - storage-console.kai.local - prometheus.kai.local - registry.kai.local - vault.kai.local - ``` +4. **When start product** + - When you create a product and want to start it, you need to include information about email, name and surname in the Keycloak (`auth.kai.local`) user (`kai-project-template`) auto-generated. If not, minio will not initialize corretly. From bf9987406d0cd882f4bed1c4ff79c09662115467 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 12 Dec 2024 15:11:55 +0100 Subject: [PATCH 23/34] feat(Makefile): Adding instructions to makefile --- Makefile | 10 +++++++--- scripts/send_request.sh | 10 ++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100755 scripts/send_request.sh diff --git a/Makefile b/Makefile index 0fb75ce..704e819 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ create-product: ## Push processes images .PHONY: push-processes-images push-processes-images: ## Push processes images - ./scripts/push_processes_images.sh $(PRODUCT_NAME) $(PRODUCT_VERSION) + ./scripts/push_processes_images.sh $(PRODUCT_NAME) .PHONY: push-product-version push-product-version: ## Push new product version @@ -51,11 +51,15 @@ stop-product-version: ## Stop the product version .PHONY: publish-product-version publish-product-version: ## Publish the product version skipping the unpublished step - kli product version publish $(PRODUCT_NAME) $(PRODUCT_VERSION) --force + kli product version publish $(PRODUCT_NAME) $(PRODUCT_VERSION) "publishing $(PRODUCT_VERSION) version..." --force + +.PHONY: send-request +send-request: ## Send a request to the product version + ./scripts/send_request.sh .PHONY: unpublish-product-version unpublish-product-version: ## Unpublish the product version - kli product version unpublish $(PRODUCT_NAME) $(PRODUCT_VERSION) + kli product version unpublish $(PRODUCT_NAME) $(PRODUCT_VERSION) "unpublishing $(PRODUCT_VERSION) version..." ##### HELPERS ##### diff --git a/scripts/send_request.sh b/scripts/send_request.sh new file mode 100755 index 0000000..93f8092 --- /dev/null +++ b/scripts/send_request.sh @@ -0,0 +1,10 @@ +#!/bin/bash + + +URL="kai-project-template.kai.local/demo-workflow-trigger" + +# Call the URL +echo "Making a GET request to $URL..." +response=$(curl -s $URL) + +echo "Response: $response" From 6f73eea5695d3be8e15546bfd130da9845424b42 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 16 Dec 2024 15:01:10 +0100 Subject: [PATCH 24/34] ref(root): Refactor files in root folder --- .kai/local/kai-project-template.yaml | 30 +++++++++++++++++----- .pre-commit-config.yaml | 7 +++++ Makefile | 4 --- scripts/push_processes_images.sh | 38 ---------------------------- scripts/send_request.sh | 2 +- 5 files changed, 32 insertions(+), 49 deletions(-) delete mode 100755 scripts/push_processes_images.sh diff --git a/.kai/local/kai-project-template.yaml b/.kai/local/kai-project-template.yaml index 162a99d..e7a12e2 100644 --- a/.kai/local/kai-project-template.yaml +++ b/.kai/local/kai-project-template.yaml @@ -1,4 +1,4 @@ -version: v0.1.7 +version: v0.1.0 description: kai-project-template config: {} workflows: @@ -8,15 +8,16 @@ workflows: processes: - name: trigger type: trigger - image: registry.kai.local/kai-project-template_trigger:v0.1.5 + image: PLACEHOLDER replicas: 1 gpu: false config: - path: /demo + path: /rest-trigger port: "8080" objectStore: null secrets: [] - subscriptions: [] + subscriptions: + - exit networking: targetPort: 8080 destinationPort: 8080 @@ -29,8 +30,8 @@ workflows: request: 400M limit: 800M - name: training - type: exit - image: registry.kai.local/kai-project-template_exit:v0.1.7 + type: task + image: PLACEHODER replicas: 1 gpu: false objectStore: null @@ -45,3 +46,20 @@ workflows: memory: request: 400M limit: 800M + - name: exit + type: exit + image: PLACEHODER + replicas: 1 + gpu: false + objectStore: null + secrets: [] + subscriptions: + - training + networking: null + resourceLimits: + CPU: + request: "0.5" + limit: "1" + memory: + request: 400M + limit: 800M diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fa046d5..9ebdae8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,3 +29,10 @@ repos: ".github/.golangci.yml", "src/demo-workflow/triggers/rest-trigger/...", ] + - repo: local + hooks: + - id: linter + name: linter + entry: make tidy + language: system + types: [file, python] diff --git a/Makefile b/Makefile index 704e819..90df21c 100644 --- a/Makefile +++ b/Makefile @@ -33,10 +33,6 @@ update-process-env: ## Update process environment create-product: ## Push processes images kli product create $(PRODUCT_NAME) --description "Kai Project Template" -.PHONY: push-processes-images -push-processes-images: ## Push processes images - ./scripts/push_processes_images.sh $(PRODUCT_NAME) - .PHONY: push-product-version push-product-version: ## Push new product version kli product version push .kai/$(ENV)/$(PRODUCT_NAME).yaml diff --git a/scripts/push_processes_images.sh b/scripts/push_processes_images.sh deleted file mode 100755 index 869544e..0000000 --- a/scripts/push_processes_images.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Show help -function show_help() { - echo "Use: $0 " - echo - echo "Description:" - echo " Script for pushing demo workflow processes to the registry." - echo - echo "Args:" - echo " Name of the product." - echo - echo "Sample:" - echo " $0 kai-project-template" - exit 1 -} - -# Validate input arguments -if [ "$#" -ne 1 ]; then - echo "Error: Error in the number of arguments." - show_help -fi - -# Read arguments -PRODUCT_NAME=$1 - -SOURCE_PATH="$PWD/src" -DEMO_WORKFLOW_PATH="$SOURCE_PATH/demo-workflow" - -echo "Pushing demo workflow processes to registry..." -echo "Enter the version of the trigger: " -read TRIGGER_VERSION -kli process-registry register trigger trigger --dockerfile "$DEMO_WORKFLOW_PATH/triggers/rest-trigger/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/triggers/rest-trigger" --version $TRIGGER_VERSION -echo "Enter the version of the exit: " -read EXIT_VERSION -kli process-registry register exit exit --dockerfile "$DEMO_WORKFLOW_PATH/exits/training/Dockerfile" --product $PRODUCT_NAME --src "$DEMO_WORKFLOW_PATH/exits/training" --version $EXIT_VERSION - -echo "Done" diff --git a/scripts/send_request.sh b/scripts/send_request.sh index 93f8092..e6c2451 100755 --- a/scripts/send_request.sh +++ b/scripts/send_request.sh @@ -1,7 +1,7 @@ #!/bin/bash -URL="kai-project-template.kai.local/demo-workflow-trigger" +URL="kai-project-template.kai.local/demo-workflow-trigger/rest-trigger" # Call the URL echo "Making a GET request to $URL..." From ab04fafa9a3cf22112284fefd3c3c60d3a9d1964 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 16 Dec 2024 15:05:21 +0100 Subject: [PATCH 25/34] ref(training): Refactor files for training process --- .pre-commit-config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9ebdae8..89b2405 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,10 +29,10 @@ repos: ".github/.golangci.yml", "src/demo-workflow/triggers/rest-trigger/...", ] - - repo: local - hooks: - - id: linter - name: linter - entry: make tidy - language: system - types: [file, python] + # - repo: local + # hooks: + # - id: linter + # name: linter + # entry: make tidy + # language: system + # types: [file, python] From e4d68a80230df937cac508e84bb2e00df5db7cc5 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 16 Dec 2024 15:05:39 +0100 Subject: [PATCH 26/34] ref(training): Refactor files for training process --- src/demo-workflow/tasks/training/.krtignore | 2 + src/demo-workflow/tasks/training/Dockerfile | 36 + src/demo-workflow/tasks/training/Makefile | 20 + src/demo-workflow/tasks/training/README.md | 8 + src/demo-workflow/tasks/training/__init__.py | 0 src/demo-workflow/tasks/training/main.py | 41 ++ .../tasks/training/pyproject.toml | 101 +++ src/demo-workflow/tasks/training/uv.lock | 682 ++++++++++++++++++ 8 files changed, 890 insertions(+) create mode 100644 src/demo-workflow/tasks/training/.krtignore create mode 100644 src/demo-workflow/tasks/training/Dockerfile create mode 100644 src/demo-workflow/tasks/training/Makefile create mode 100644 src/demo-workflow/tasks/training/README.md create mode 100644 src/demo-workflow/tasks/training/__init__.py create mode 100644 src/demo-workflow/tasks/training/main.py create mode 100644 src/demo-workflow/tasks/training/pyproject.toml create mode 100644 src/demo-workflow/tasks/training/uv.lock diff --git a/src/demo-workflow/tasks/training/.krtignore b/src/demo-workflow/tasks/training/.krtignore new file mode 100644 index 0000000..9773ff1 --- /dev/null +++ b/src/demo-workflow/tasks/training/.krtignore @@ -0,0 +1,2 @@ +.venv +.ruff_cache diff --git a/src/demo-workflow/tasks/training/Dockerfile b/src/demo-workflow/tasks/training/Dockerfile new file mode 100644 index 0000000..f064ed7 --- /dev/null +++ b/src/demo-workflow/tasks/training/Dockerfile @@ -0,0 +1,36 @@ +FROM python:3.13.1-slim-bullseye + +LABEL maintainer="Intelygenz - KAI Team" + + +ARG USER=kai +ARG UID=1001 + +ENV PATH="/root/.local/bin:$PATH" +ENV PYTHONUNBUFFERED=1 + +WORKDIR /tmp + +COPY ["pyproject.toml", "uv.lock", "./"] + +RUN apt update &&\ + apt install -yq --no-install-recommends curl git && \ + apt-get clean && apt-get autoremove -y && \ + useradd -m -b /sdk --shell /bin/bash --uid ${UID} ${USER} && \ + curl -LsSf https://astral.sh/uv/install.sh | sh && \ + uv export --no-dev > /tmp/requirements.txt && \ + uv pip install --system --requirements /tmp/requirements.txt + +WORKDIR /app + +RUN chown -R kai:0 /app \ + && chmod -R g+w /app \ + && mkdir /var/log/app -p \ + && chown -R kai:0 /var/log/app \ + && chmod -R g+w /var/log/app + +USER ${USER} + +COPY *.py process/ + +CMD ["bash", "-c", "/usr/local/bin/python /app/process/main.py"] diff --git a/src/demo-workflow/tasks/training/Makefile b/src/demo-workflow/tasks/training/Makefile new file mode 100644 index 0000000..b511c7f --- /dev/null +++ b/src/demo-workflow/tasks/training/Makefile @@ -0,0 +1,20 @@ +# This Makefile contains all helpers for the REST trigger process + +# This variable have the environment to use, by default is local, but you can change when you run the make command +ENV ?= local +PROCESS_VERSION ?= v0.0.1 + +# Read the PRODUCT_NAME variable based on the file inside the corresponding directory +PRODUCT_NAME := $(shell basename $(wildcard ./../../../../.kai/$(ENV)/*.yaml) .yaml) +PROCESS_ID = training + + +.PHONY: push-image +push-image: ## Login to the aio platform + kli process-registry register task $(PROCESS_ID) --dockerfile "Dockerfile" --product $(PRODUCT_NAME) --src "." --version $(PROCESS_VERSION) + +##### LINTER + +.PHONY: linter-py +linter-py: ## Run ruff format + uv run ruff format diff --git a/src/demo-workflow/tasks/training/README.md b/src/demo-workflow/tasks/training/README.md new file mode 100644 index 0000000..56770f7 --- /dev/null +++ b/src/demo-workflow/tasks/training/README.md @@ -0,0 +1,8 @@ +# Training process + +This process is an example of a training process for a machine learning model. + +## Pre-requisites + +- python 3.13. Please refer to [installation](https://www.python.org/about/gettingstarted/) +- uv: It is used as the package/project manager for this project. Please refer to [installation](https://docs.astral.sh/uv/getting-started/installation/) diff --git a/src/demo-workflow/tasks/training/__init__.py b/src/demo-workflow/tasks/training/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/demo-workflow/tasks/training/main.py b/src/demo-workflow/tasks/training/main.py new file mode 100644 index 0000000..6138c4e --- /dev/null +++ b/src/demo-workflow/tasks/training/main.py @@ -0,0 +1,41 @@ +import asyncio +from sdk.kai_sdk import KaiSDK +from runner.runner import Runner +from google.protobuf.any_pb2 import Any +from google.protobuf.struct_pb2 import Value + + +async def initializer(sdk: KaiSDK): + sdk.logger.info("Initializing training process") + + +async def handler(sdk: KaiSDK, message: Any): + sdk.logger.info("Received message: %s, start creating response", message) + response = Value() + response.struct_value.fields["status"].string_value = "200" + response.struct_value.fields[ + "message" + ].string_value = "Training completed successfully" + await sdk.messaging.send_output(response=response) + + +async def finalizer(sdk: KaiSDK): + sdk.logger.info("Finalizing training process") + + +async def init(): + runner = await Runner().initialize() + await ( + runner.exit_runner() + .with_initializer(initializer) + .with_handler(handler) + .with_finalizer(finalizer) + .run() + ) + + +if __name__ == "__main__": + loop = asyncio.new_event_loop() + loop.run_until_complete(init()) + loop.run_forever() + loop.close() diff --git a/src/demo-workflow/tasks/training/pyproject.toml b/src/demo-workflow/tasks/training/pyproject.toml new file mode 100644 index 0000000..04f1c5a --- /dev/null +++ b/src/demo-workflow/tasks/training/pyproject.toml @@ -0,0 +1,101 @@ +[project] +name = "training" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = "~=3.13" +authors = ["Intelygenz - KAI Team"] +maintainers = ["Intelygenz - KAI Team"] + +dependencies = [ + "nats-py==2.6.0", + "protobuf==4.23.4", + "loguru==0.7.0", + "kai-runner", +] + +[dependency-groups] +dev = [ + "ruff==0.8.1", +] + +[tool.uv] +default-groups = ["dev"] + +[tool.uv.sources] +kai-runner = { git = "https://github.com/konstellation-io/kai-pysdk.git" } + +[tool.ruff] +# Exclude a variety of commonly ignored directories. +exclude = [ + "*_pb2.py", + ".bzr", + ".direnv", + ".eggs", + ".git", + ".git-rewrite", + ".hg", + ".ipynb_checkpoints", + ".mypy_cache", + ".nox", + ".pants.d", + ".pyenv", + ".pytest_cache", + ".pytype", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + ".vscode", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "site-packages", + "venv", +] + +# Same as Black. +line-length = 88 +indent-width = 4 + +target-version = "py312" + +[tool.ruff.lint] +select = ["E4", "E7", "E9", "F", "Q"] +ignore = [] + +fixable = ["ALL"] +unfixable = [] + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[tool.ruff.format] +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" + +# Enable auto-formatting of code examples in docstrings. Markdown, +# reStructuredText code/literal blocks and doctests are all supported. +# +# This is currently disabled by default, but it is planned for this +# to be opt-out in the future. +docstring-code-format = false + +# Set the line length limit used when formatting code snippets in +# docstrings. +# +# This only has an effect when the `docstring-code-format` setting is +# enabled. +docstring-code-line-length = "dynamic" diff --git a/src/demo-workflow/tasks/training/uv.lock b/src/demo-workflow/tasks/training/uv.lock new file mode 100644 index 0000000..51a11ed --- /dev/null +++ b/src/demo-workflow/tasks/training/uv.lock @@ -0,0 +1,682 @@ +version = 1 +requires-python = ">=3.13, <4" + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124 }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658 }, + { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583 }, + { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168 }, + { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709 }, + { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613 }, + { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583 }, + { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475 }, + { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698 }, + { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817 }, + { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 }, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "deprecated" +version = "1.2.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/a3/53e7d78a6850ffdd394d7048a31a6f14e44900adedf190f9a165f6b69439/deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d", size = 2977612 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/8f/c7f227eb42cfeaddce3eb0c96c60cbca37797fa7b34f8e1aeadf6c5c0983/Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320", size = 9941 }, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178 }, +] + +[[package]] +name = "distconfig3" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/9e/5d46d30668e353b618a00bdeb704cd6fa55e64cc902078e49cdd22874487/distconfig3-1.0.1.tar.gz", hash = "sha256:7d2c7f30a57ef494c5683270587ba7593318746c6e22b9b8953e288c9c303c65", size = 11819 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/68/7258f0df8576bd1709a481b96f56a46cd5894bd075b79ccfd233e86ff395/distconfig3-1.0.1-py2.py3-none-any.whl", hash = "sha256:823e35ae044677e8aa77bed8d9be0780862a2500c63cf95ce85544b9d3d9fc89", size = 19723 }, +] + +[[package]] +name = "ecdsa" +version = "0.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/d0/ec8ac1de7accdcf18cfe468653ef00afd2f609faf67c423efbd02491051b/ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8", size = 197791 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/e7/ed3243b30d1bec41675b6394a1daae46349dc2b855cb83be846a5a918238/ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a", size = 149266 }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.66.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/a7/8e9cccdb1c49870de6faea2a2764fa23f627dd290633103540209f03524c/googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c", size = 114376 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/0f/c0713fb2b3d28af4b2fded3291df1c4d4f79a00d15c2374a9e010870016c/googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed", size = 221682 }, +] + +[[package]] +name = "grpcio" +version = "1.68.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/ec/b76ff6d86bdfd1737a5ec889394b54c18b1ec3832d91041e25023fbcb67d/grpcio-1.68.1.tar.gz", hash = "sha256:44a8502dd5de653ae6a73e2de50a401d84184f0331d0ac3daeb044e66d5c5054", size = 12694654 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/1a/15ccc08da339a5536690e6f877963422a5abf3f6dfeed96b3175f5c816b9/grpcio-1.68.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:a47faedc9ea2e7a3b6569795c040aae5895a19dde0c728a48d3c5d7995fda385", size = 5149822 }, + { url = "https://files.pythonhosted.org/packages/bc/fe/91bb4b160cd251d5b5ee722e6342355f76d1ffe176c50a6ef0e8256fbb47/grpcio-1.68.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:390eee4225a661c5cd133c09f5da1ee3c84498dc265fd292a6912b65c421c78c", size = 11085016 }, + { url = "https://files.pythonhosted.org/packages/55/2d/0bb2478410f5896da1090b9f43c2979dd72e7e97d10bc223bfbdddcf8eca/grpcio-1.68.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:66a24f3d45c33550703f0abb8b656515b0ab777970fa275693a2f6dc8e35f1c1", size = 5645634 }, + { url = "https://files.pythonhosted.org/packages/f5/6c/e2d22d963b695f87a09965246beb1c3224b09ffc666fc0b285820926499a/grpcio-1.68.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c08079b4934b0bf0a8847f42c197b1d12cba6495a3d43febd7e99ecd1cdc8d54", size = 6291096 }, + { url = "https://files.pythonhosted.org/packages/6f/f6/21d9204e2c4c0804ad72be8c830c44f0e1355e649c173f87508b7f0e5488/grpcio-1.68.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8720c25cd9ac25dd04ee02b69256d0ce35bf8a0f29e20577427355272230965a", size = 5906528 }, + { url = "https://files.pythonhosted.org/packages/39/2a/bf6ae4fef13755ca236d587d630b82207cfad43cf956870adead97fd1ef1/grpcio-1.68.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:04cfd68bf4f38f5bb959ee2361a7546916bd9a50f78617a346b3aeb2b42e2161", size = 6634215 }, + { url = "https://files.pythonhosted.org/packages/5b/83/9c96a6adfbea5e8a9ed408410c0259942713be64173b8816c7bf6ac2d830/grpcio-1.68.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c28848761a6520c5c6071d2904a18d339a796ebe6b800adc8b3f474c5ce3c3ad", size = 6200750 }, + { url = "https://files.pythonhosted.org/packages/b4/3e/af42f87759c6301c4fed894b3dd801b13162ba1d8e2942412e788ac749eb/grpcio-1.68.1-cp313-cp313-win32.whl", hash = "sha256:77d65165fc35cff6e954e7fd4229e05ec76102d4406d4576528d3a3635fc6172", size = 3637594 }, + { url = "https://files.pythonhosted.org/packages/7e/d1/3bef33a3d5d26d4ea9284e1b464f481d6d21ed8ae1c3da381b05f62c701d/grpcio-1.68.1-cp313-cp313-win_amd64.whl", hash = "sha256:a8040f85dcb9830d8bbb033ae66d272614cec6faceee88d37a88a9bd1a7a704e", size = 4391184 }, +] + +[[package]] +name = "hiredis" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/e5/789cfa8993ced0061a6ef7ea758302ef5cf3439629bf0d39c85a6ede4641/hiredis-3.1.0.tar.gz", hash = "sha256:51d40ac3611091020d7dea6b05ed62cb152bff595fa4f931e7b6479d777acf7c", size = 87616 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/b0/0b4f96f537d259b818e4ee7657616eb6fabc0612eb4150d2253f84e33f8f/hiredis-3.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:b87cddd8107487863fed6994de51e5594a0be267b0b19e213694e99cdd614623", size = 81311 }, + { url = "https://files.pythonhosted.org/packages/79/85/bd6cb6f7645a3803111a4f07fb2b55a23b836725bc8ec74ac7623fe8bef4/hiredis-3.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:d302deff8cb63a7feffc1844e4dafc8076e566bbf10c5aaaf0f4fe791b8a6bd0", size = 44550 }, + { url = "https://files.pythonhosted.org/packages/13/48/b53c5d10d3fd073a2046d096d9d415d61b3564f74b0499ec757ddaf7cddc/hiredis-3.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a018340c073cf88cb635b2bedff96619df2f666018c655e7911f46fa2c1c178", size = 42471 }, + { url = "https://files.pythonhosted.org/packages/dd/a0/f9da8e920c1871edf703dfa05dd6781a3c53e5574cd2e4b38a438053a533/hiredis-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e8ba6414ac1ae536129e18c069f3eb497df5a74e136e3566471620a4fa5f95", size = 168219 }, + { url = "https://files.pythonhosted.org/packages/42/59/82a3625dc9fc77f43b38d272eef8c731e359e535a13b29b83ce220d47f5d/hiredis-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a86b9fef256c2beb162244791fdc025aa55f936d6358e86e2020e512fe2e4972", size = 179065 }, + { url = "https://files.pythonhosted.org/packages/b2/aa/66933e4101198f2e2ae379c091fb9a8131cd3dce7a1e6d8fa5ff51244239/hiredis-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7acdc68e29a446ad17aadaff19c981a36b3bd8c894c3520412c8a7ab1c3e0de7", size = 168508 }, + { url = "https://files.pythonhosted.org/packages/7a/da/e1475f4d51225cbc4b04e3be22ecb6da80a536b747aa4bb263af318d8555/hiredis-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7e06baea05de57e1e7548064f505a6964e992674fe61b8f274afe2ac93b6371", size = 168989 }, + { url = "https://files.pythonhosted.org/packages/34/d7/52dd39b5abb81eb24726934c3b9138cc9a30231fb93da8a3e2f829e3598c/hiredis-3.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35b5fc061c8a0dbfdb440053280504d6aaa8d9726bd4d1d0e1cfcbbdf0d60b73", size = 164488 }, + { url = "https://files.pythonhosted.org/packages/13/dd/aecfd9f24015b7e892304d6feb888db25b01492f05730f8f45155887de1f/hiredis-3.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c89d2dcb271d24c44f02264233b75d5db8c58831190fa92456a90b87fa17b748", size = 162476 }, + { url = "https://files.pythonhosted.org/packages/ff/77/4a5357b29e4c9f573439246d27cabad470ea4367a60a86f01c2a31c7c63f/hiredis-3.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:aa36688c10a08f626fddcf68c2b1b91b0e90b070c26e550a4151a877f5c2d431", size = 161380 }, + { url = "https://files.pythonhosted.org/packages/aa/5e/b357511490626e9c39b3148612bda945f2cd0c8dcd149f36fd7b9512bff4/hiredis-3.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3982a9c16c1c4bc05a00b65d01ffb8d80ea1a7b6b533be2f1a769d3e989d2c0", size = 173505 }, + { url = "https://files.pythonhosted.org/packages/3e/82/50c015dcf04ea85a89c4603684da9d95c7850931b5320c02c6f3d7ddd78f/hiredis-3.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d1a6f889514ee2452300c9a06862fceedef22a2891f1c421a27b1ba52ef130b2", size = 165928 }, + { url = "https://files.pythonhosted.org/packages/82/10/bd8f39423b0cb9624ccaf08d5e9c04f72dd46e9e9fc82e95cec42a42428d/hiredis-3.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8a45ff7915392a55d9386bb235ea1d1eb9960615f301979f02143fc20036b699", size = 163902 }, + { url = "https://files.pythonhosted.org/packages/0b/77/00b420ad567875e5a4b37a16f1a89fef1a22c6a9e1a12195c77bb5b101dd/hiredis-3.1.0-cp313-cp313-win32.whl", hash = "sha256:539e5bb725b62b76a5319a4e68fc7085f01349abc2316ef3df608ea0883c51d2", size = 20211 }, + { url = "https://files.pythonhosted.org/packages/cc/04/eaa88433249ddfc282018d3da4198d0b0018e48768e137bfad304aacb1ec/hiredis-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9020fd7e58f489fda6a928c31355add0e665fd6b87b21954e675cf9943eafa32", size = 22004 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "importlib-metadata" +version = "6.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/eb/58c2ab27ee628ad801f56d4017fe62afab0293116f6d0b08f1d5bd46e06f/importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443", size = 54593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/9b/ecce94952ab5ea74c31dcf9ccf78ccd484eebebef06019bf8cb579ab4519/importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b", size = 23427 }, +] + +[[package]] +name = "kai-runner" +version = "1.0.0" +source = { git = "https://github.com/konstellation-io/kai-pysdk.git#1d2407bb1b9bcbcadfee3fa0c5f425e7524cd77b" } +dependencies = [ + { name = "grpcio" }, + { name = "loguru" }, + { name = "minio" }, + { name = "nats-py" }, + { name = "opentelemetry-exporter-otlp-proto-grpc" }, + { name = "opentelemetry-sdk" }, + { name = "protobuf" }, + { name = "python-keycloak" }, + { name = "redis", extra = ["hiredis"] }, + { name = "semver" }, + { name = "vyper-config" }, +] + +[[package]] +name = "loguru" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/1d/697cbb4ae54217784c1c4805696efb2fd7a1cbbe4827264a80a49e52b828/loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1", size = 131961 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/bd/337f7a0cd2628c4c77512d78e26f93b13c327a2ddf2132001dd78c000bf4/loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3", size = 59951 }, +] + +[[package]] +name = "minio" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi" }, + { name = "certifi" }, + { name = "pycryptodome" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/2e/6b2a5f77f313438656b40cc23c0333567357f24b18996ef98bb2ba383333/minio-7.2.0.tar.gz", hash = "sha256:4b015b018d10c1505f7c3e724fa7c2267760ac7bee6463a624cbf22cd272877b", size = 125936 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/1d/8d82eefdad2794b486538c10b3ac3235bf5030097ced83abf5f46b58d408/minio-7.2.0-py3-none-any.whl", hash = "sha256:10656272c16156fa08436ce2b27e25e4134ef5142a8c259513ee26fb514531a6", size = 83537 }, +] + +[[package]] +name = "nats-py" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/13/717eea9ffdc81231b97e636cb7a16d1f55a1d79de661781b710781ee58b5/nats-py-2.6.0.tar.gz", hash = "sha256:7c535fb62d8dc9c743b4afb42775d9f36924f6a1ca1486efdd2e29f1e4ee30b8", size = 94639 } + +[[package]] +name = "opentelemetry-api" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "importlib-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/12/6e12a4c35a94a74da099cbfd73e7bdd3373240bf24f968df8b69bac37b47/opentelemetry_api-1.23.0.tar.gz", hash = "sha256:14a766548c8dd2eb4dfc349739eb4c3893712a0daa996e5dbf945f9da665da9d", size = 57894 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/e4/0bfd837c625517dd4c908789a89063247e5769be02b47bf432cde53964e2/opentelemetry_api-1.23.0-py3-none-any.whl", hash = "sha256:cc03ea4025353048aadb9c64919099663664672ea1c6be6ddd8fee8e4cd5e774", size = 58364 }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-proto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/42/0b6e37b44fa08f4aacd8e008b691daf3e8dbf329093eaddc1931bd3a687e/opentelemetry_exporter_otlp_proto_common-1.23.0.tar.gz", hash = "sha256:35e4ea909e7a0b24235bd0aaf17fba49676527feb1823b46565ff246d5a1ab18", size = 16932 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/ec/b0f12fb97b940ff2977ff77dc913242e2a577179b7f5b276487459a2749e/opentelemetry_exporter_otlp_proto_common-1.23.0-py3-none-any.whl", hash = "sha256:2a9e7e9d5a8b026b572684b6b24dcdefcaa58613d5ce3d644130b0c373c056c1", size = 17632 }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/1a/e9efba977df23b9ee516f256325b9907e87383ce82d19ea51e9dc5114222/opentelemetry_exporter_otlp_proto_grpc-1.23.0.tar.gz", hash = "sha256:aa1a012eea5342bfef51fcf3f7f22601dcb0f0984a07ffe6025b2fbb6d91a2a9", size = 25128 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/29/19c639b565c340e25cd7b581e0311a3ccddbeca7906c500f23247f75d321/opentelemetry_exporter_otlp_proto_grpc-1.23.0-py3-none-any.whl", hash = "sha256:40f9e3e7761eb34f2a1001f4543028783ac26e2db27e420d5374f2cca0182dad", size = 18244 }, +] + +[[package]] +name = "opentelemetry-proto" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/32/49c65c36c1af4583d64bac130bc325a57d6ed95cf637bb3c88e352ec4452/opentelemetry_proto-1.23.0.tar.gz", hash = "sha256:e6aaf8b7ace8d021942d546161401b83eed90f9f2cc6f13275008cea730e4651", size = 33414 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6a/8e5f11827772d1acb27fb2ac33ce12175fb485254de292c8aacd82153bf2/opentelemetry_proto-1.23.0-py3-none-any.whl", hash = "sha256:4c017deca052cb287a6003b7c989ed8b47af65baeb5d57ebf93dde0793f78509", size = 50772 }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/79/34a06c586fdf1de7d5046c0e09c73c8a32029c996f24781f76ef795bb213/opentelemetry_sdk-1.23.0.tar.gz", hash = "sha256:9ddf60195837b59e72fd2033d6a47e2b59a0f74f0ec37d89387d89e3da8cab7f", size = 137647 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/3d/1e991d0badf159dbc090fa4137361ccf77f177c6ee555cf84e3d6ee79b26/opentelemetry_sdk-1.23.0-py3-none-any.whl", hash = "sha256:a93c96990ac0f07c6d679e2f1015864ff7a4f5587122dd5af968034436efb1fd", size = 105699 }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.44b0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/21/6febb2b73bdd1515da7bc53e8f2775d51305590b319f225b79360921e060/opentelemetry_semantic_conventions-0.44b0.tar.gz", hash = "sha256:2e997cb28cd4ca81a25a9a43365f593d0c2b76be0685015349a89abdf1aa4ffa", size = 34338 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/0d/3b059755eaaf024261309c3b42fb4d14b2b6e36f58011a63c11817b0a5df/opentelemetry_semantic_conventions-0.44b0-py3-none-any.whl", hash = "sha256:7c434546c9cbd797ab980cc88bf9ff3f4a5a28f941117cad21694e43d5d92019", size = 36832 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "protobuf" +version = "4.23.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/1c/de86d82a5fc780feca36ef52c1231823bb3140266af8a04ed6286957aa6e/protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9", size = 400173 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/a7/872807299eb114956c665fb1717ce106a8874db08a724651ac4f78c1198c/protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b", size = 402981 }, + { url = "https://files.pythonhosted.org/packages/80/70/dc63d340d27b8ff22022d7dd14b8d6d68b479a003eacdc4507150a286d9a/protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12", size = 422467 }, + { url = "https://files.pythonhosted.org/packages/cb/d3/a164038605494d49acc4f9cda1c0bc200b96382c53edd561387263bb181d/protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd", size = 400308 }, + { url = "https://files.pythonhosted.org/packages/71/42/3a7fc57f360f728f38eca6656e8d00edaf22bc0ffc35dd2936f23e5fbb3e/protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a", size = 303455 }, + { url = "https://files.pythonhosted.org/packages/01/cb/445b3e465abdb8042a41957dc8f60c54620dc7540dbcf9b458a921531ca2/protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597", size = 304498 }, + { url = "https://files.pythonhosted.org/packages/b0/07/fb712cce15ba456f7c24b82b97c8a7db2233f07037ffe61c9011660c592a/protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff", size = 173332 }, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pycryptodome" +version = "3.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/52/13b9db4a913eee948152a079fe58d035bd3d1a519584155da8e786f767e6/pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297", size = 4818071 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/88/5e83de10450027c96c79dc65ac45e9d0d7a7fef334f39d3789a191f33602/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4", size = 2495937 }, + { url = "https://files.pythonhosted.org/packages/66/e1/8f28cd8cf7f7563319819d1e172879ccce2333781ae38da61c28fe22d6ff/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b", size = 1634629 }, + { url = "https://files.pythonhosted.org/packages/6a/c1/f75a1aaff0c20c11df8dc8e2bf8057e7f73296af7dfd8cbb40077d1c930d/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e", size = 2168708 }, + { url = "https://files.pythonhosted.org/packages/ea/66/6f2b7ddb457b19f73b82053ecc83ba768680609d56dd457dbc7e902c41aa/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8", size = 2254555 }, + { url = "https://files.pythonhosted.org/packages/2c/2b/152c330732a887a86cbf591ed69bd1b489439b5464806adb270f169ec139/pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1", size = 2294143 }, + { url = "https://files.pythonhosted.org/packages/55/92/517c5c498c2980c1b6d6b9965dffbe31f3cd7f20f40d00ec4069559c5902/pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a", size = 2160509 }, + { url = "https://files.pythonhosted.org/packages/39/1f/c74288f54d80a20a78da87df1818c6464ac1041d10988bb7d982c4153fbc/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2", size = 2329480 }, + { url = "https://files.pythonhosted.org/packages/39/1b/d0b013bf7d1af7cf0a6a4fce13f5fe5813ab225313755367b36e714a63f8/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93", size = 2254397 }, + { url = "https://files.pythonhosted.org/packages/14/71/4cbd3870d3e926c34706f705d6793159ac49d9a213e3ababcdade5864663/pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764", size = 1775641 }, + { url = "https://files.pythonhosted.org/packages/43/1d/81d59d228381576b92ecede5cd7239762c14001a828bdba30d64896e9778/pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53", size = 1812863 }, + { url = "https://files.pythonhosted.org/packages/25/b3/09ff7072e6d96c9939c24cf51d3c389d7c345bf675420355c22402f71b68/pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca", size = 1691593 }, + { url = "https://files.pythonhosted.org/packages/a8/91/38e43628148f68ba9b68dedbc323cf409e537fd11264031961fd7c744034/pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd", size = 1765997 }, +] + +[[package]] +name = "python-jose" +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ecdsa" }, + { name = "pyasn1" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/19/b2c86504116dc5f0635d29f802da858404d77d930a25633d2e86a64a35b3/python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a", size = 129068 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/2d/e94b2f7bab6773c70efc70a61d66e312e1febccd9e0db6b9e0adf58cbad1/python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a", size = 33530 }, +] + +[[package]] +name = "python-keycloak" +version = "3.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecation" }, + { name = "python-jose" }, + { name = "requests" }, + { name = "requests-toolbelt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/49/00e658ad23b545560ba792cff7ff42d0071abbd48e5c0e441b16b6475ebf/python_keycloak-3.7.0.tar.gz", hash = "sha256:29eee9490ba354af81fcdf86ec81d840515d8b53002de831715e05d07298886a", size = 48306 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/ea/9d824e2e904296319fb63e7ae44249f38f1ae3159a5f7d278ea5712e99cc/python_keycloak-3.7.0-py3-none-any.whl", hash = "sha256:92aa0a7e965cc5422d335c36efa0519f3188d9b8048cc8083f8f6e23c13178a5", size = 60339 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "redis" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/4c/3c3b766f4ecbb3f0bec91ef342ee98d179e040c25b6ecc99e510c2570f2a/redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f", size = 4578353 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/34/a01250ac1fc9bf9161e07956d2d580413106ce02d5591470130a25c599e3/redis-5.0.1-py3-none-any.whl", hash = "sha256:ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f", size = 250272 }, +] + +[package.optional-dependencies] +hiredis = [ + { name = "hiredis" }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + +[[package]] +name = "rsa" +version = "4.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/65/7d973b89c4d2351d7fb232c2e452547ddfa243e93131e7cfa766da627b52/rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21", size = 29711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", size = 34315 }, +] + +[[package]] +name = "ruff" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/d0/8ff5b189d125f4260f2255d143bf2fa413b69c2610c405ace7a0a8ec81ec/ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f", size = 3313222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/d6/1a6314e568db88acdbb5121ed53e2c52cebf3720d3437a76f82f923bf171/ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5", size = 10532605 }, + { url = "https://files.pythonhosted.org/packages/89/a8/a957a8812e31facffb6a26a30be0b5b4af000a6e30c7d43a22a5232a3398/ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087", size = 10278243 }, + { url = "https://files.pythonhosted.org/packages/a8/23/9db40fa19c453fabf94f7a35c61c58f20e8200b4734a20839515a19da790/ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209", size = 9917739 }, + { url = "https://files.pythonhosted.org/packages/e2/a0/6ee2d949835d5701d832fc5acd05c0bfdad5e89cfdd074a171411f5ccad5/ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871", size = 10779153 }, + { url = "https://files.pythonhosted.org/packages/7a/25/9c11dca9404ef1eb24833f780146236131a3c7941de394bc356912ef1041/ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1", size = 10304387 }, + { url = "https://files.pythonhosted.org/packages/c8/b9/84c323780db1b06feae603a707d82dbbd85955c8c917738571c65d7d5aff/ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5", size = 11360351 }, + { url = "https://files.pythonhosted.org/packages/6b/e1/9d4bbb2ace7aad14ded20e4674a48cda5b902aed7a1b14e6b028067060c4/ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d", size = 12022879 }, + { url = "https://files.pythonhosted.org/packages/75/28/752ff6120c0e7f9981bc4bc275d540c7f36db1379ba9db9142f69c88db21/ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26", size = 11610354 }, + { url = "https://files.pythonhosted.org/packages/ba/8c/967b61c2cc8ebd1df877607fbe462bc1e1220b4a30ae3352648aec8c24bd/ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1", size = 12813976 }, + { url = "https://files.pythonhosted.org/packages/7f/29/e059f945d6bd2d90213387b8c360187f2fefc989ddcee6bbf3c241329b92/ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c", size = 11154564 }, + { url = "https://files.pythonhosted.org/packages/55/47/cbd05e5a62f3fb4c072bc65c1e8fd709924cad1c7ec60a1000d1e4ee8307/ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa", size = 10760604 }, + { url = "https://files.pythonhosted.org/packages/bb/ee/4c3981c47147c72647a198a94202633130cfda0fc95cd863a553b6f65c6a/ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540", size = 10391071 }, + { url = "https://files.pythonhosted.org/packages/6b/e6/083eb61300214590b188616a8ac6ae1ef5730a0974240fb4bec9c17de78b/ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9", size = 10896657 }, + { url = "https://files.pythonhosted.org/packages/77/bd/aacdb8285d10f1b943dbeb818968efca35459afc29f66ae3bd4596fbf954/ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5", size = 11228362 }, + { url = "https://files.pythonhosted.org/packages/39/72/fcb7ad41947f38b4eaa702aca0a361af0e9c2bf671d7fd964480670c297e/ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790", size = 8803476 }, + { url = "https://files.pythonhosted.org/packages/e4/ea/cae9aeb0f4822c44651c8407baacdb2e5b4dcd7b31a84e1c5df33aa2cc20/ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6", size = 9614463 }, + { url = "https://files.pythonhosted.org/packages/eb/76/fbb4bd23dfb48fa7758d35b744413b650a9fd2ddd93bca77e30376864414/ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737", size = 8959621 }, +] + +[[package]] +name = "semver" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/6c/a536cc008f38fd83b3c1b98ce19ead13b746b5588c9a0cb9dd9f6ea434bc/semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc", size = 214988 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/77/0cc7a8a3bc7e53d07e8f47f147b92b0960e902b8254859f4aee5c4d7866b/semver-3.0.2-py3-none-any.whl", hash = "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4", size = 17099 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 }, +] + +[[package]] +name = "training" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "kai-runner" }, + { name = "loguru" }, + { name = "nats-py" }, + { name = "protobuf" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "kai-runner", git = "https://github.com/konstellation-io/kai-pysdk.git" }, + { name = "loguru", specifier = "==0.7.0" }, + { name = "nats-py", specifier = "==2.6.0" }, + { name = "protobuf", specifier = "==4.23.4" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "ruff", specifier = "==0.8.1" }] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, +] + +[[package]] +name = "vyper-config" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distconfig3" }, + { name = "pyyaml" }, + { name = "toml" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/9b/fbff32d3e3e57d9e653c1af593318240976571897d1a1cb6c80b549569f0/vyper-config-1.1.1.tar.gz", hash = "sha256:0aa3615b5d33ca9c1a1b1947a3311e08a5742dc549c866b5e6558da6528c5cff", size = 14431 } + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/dd/f95a13d2b235a28d613ba23ebad55191514550debb968b46aab99f2e3a30/win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2", size = 3676 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/e6/a7d828fef907843b2a5773ebff47fb79ac0c1c88d60c0ca9530ee941e248/win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad", size = 3604 }, +] + +[[package]] +name = "wrapt" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/a1/fc03dca9b0432725c2e8cdbf91a349d2194cf03d8523c124faebe581de09/wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801", size = 55542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/9c/38294e1bb92b055222d1b8b6591604ca4468b77b1250f59c15256437644f/wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181", size = 38904 }, + { url = "https://files.pythonhosted.org/packages/78/b6/76597fb362cbf8913a481d41b14b049a8813cd402a5d2f84e57957c813ae/wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393", size = 88608 }, + { url = "https://files.pythonhosted.org/packages/bc/69/b500884e45b3881926b5f69188dc542fb5880019d15c8a0df1ab1dfda1f7/wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4", size = 80879 }, + { url = "https://files.pythonhosted.org/packages/52/31/f4cc58afe29eab8a50ac5969963010c8b60987e719c478a5024bce39bc42/wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b", size = 89119 }, + { url = "https://files.pythonhosted.org/packages/aa/9c/05ab6bf75dbae7a9d34975fb6ee577e086c1c26cde3b6cf6051726d33c7c/wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721", size = 86778 }, + { url = "https://files.pythonhosted.org/packages/0e/6c/4b8d42e3db355603d35fe5c9db79c28f2472a6fd1ccf4dc25ae46739672a/wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90", size = 79793 }, + { url = "https://files.pythonhosted.org/packages/69/23/90e3a2ee210c0843b2c2a49b3b97ffcf9cad1387cb18cbeef9218631ed5a/wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a", size = 87606 }, + { url = "https://files.pythonhosted.org/packages/5f/06/3683126491ca787d8d71d8d340e775d40767c5efedb35039d987203393b7/wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045", size = 36651 }, + { url = "https://files.pythonhosted.org/packages/f1/bc/3bf6d2ca0d2c030d324ef9272bea0a8fdaff68f3d1fa7be7a61da88e51f7/wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838", size = 38835 }, + { url = "https://files.pythonhosted.org/packages/ce/b5/251165c232d87197a81cd362eeb5104d661a2dd3aa1f0b33e4bf61dda8b8/wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b", size = 40146 }, + { url = "https://files.pythonhosted.org/packages/89/33/1e1bdd3e866eeb73d8c4755db1ceb8a80d5bd51ee4648b3f2247adec4e67/wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379", size = 113444 }, + { url = "https://files.pythonhosted.org/packages/9f/7c/94f53b065a43f5dc1fbdd8b80fd8f41284315b543805c956619c0b8d92f0/wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d", size = 101246 }, + { url = "https://files.pythonhosted.org/packages/62/5d/640360baac6ea6018ed5e34e6e80e33cfbae2aefde24f117587cd5efd4b7/wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f", size = 109320 }, + { url = "https://files.pythonhosted.org/packages/e3/cf/6c7a00ae86a2e9482c91170aefe93f4ccda06c1ac86c4de637c69133da59/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c", size = 110193 }, + { url = "https://files.pythonhosted.org/packages/cd/cc/aa718df0d20287e8f953ce0e2f70c0af0fba1d3c367db7ee8bdc46ea7003/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b", size = 100460 }, + { url = "https://files.pythonhosted.org/packages/f7/16/9f3ac99fe1f6caaa789d67b4e3c562898b532c250769f5255fa8b8b93983/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab", size = 106347 }, + { url = "https://files.pythonhosted.org/packages/64/85/c77a331b2c06af49a687f8b926fc2d111047a51e6f0b0a4baa01ff3a673a/wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf", size = 37971 }, + { url = "https://files.pythonhosted.org/packages/05/9b/b2469f8be9efed24283fd7b9eeb8e913e9bc0715cf919ea8645e428ab7af/wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a", size = 40755 }, + { url = "https://files.pythonhosted.org/packages/4b/d9/a8ba5e9507a9af1917285d118388c5eb7a81834873f45df213a6fe923774/wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371", size = 23592 }, +] + +[[package]] +name = "zipp" +version = "3.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, +] From fad4b327d53301c2beae8de5693b4f796fa76e0d Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 16 Dec 2024 15:05:57 +0100 Subject: [PATCH 27/34] ref(exit): Refactor files for exit process --- .../training => exists/exit}/.krtignore | 0 .../training => exists/exit}/Dockerfile | 0 src/demo-workflow/exists/exit/Makefile | 20 +++++++++++++++++++ .../{exits/training => exists/exit}/README.md | 2 +- .../training => exists/exit}/__init__.py | 0 .../{exits/training => exists/exit}/main.py | 16 ++++++++------- .../training => exists/exit}/pyproject.toml | 0 .../{exits/training => exists/exit}/uv.lock | 0 8 files changed, 30 insertions(+), 8 deletions(-) rename src/demo-workflow/{exits/training => exists/exit}/.krtignore (100%) rename src/demo-workflow/{exits/training => exists/exit}/Dockerfile (100%) create mode 100644 src/demo-workflow/exists/exit/Makefile rename src/demo-workflow/{exits/training => exists/exit}/README.md (92%) rename src/demo-workflow/{exits/training => exists/exit}/__init__.py (100%) rename src/demo-workflow/{exits/training => exists/exit}/main.py (52%) rename src/demo-workflow/{exits/training => exists/exit}/pyproject.toml (100%) rename src/demo-workflow/{exits/training => exists/exit}/uv.lock (100%) diff --git a/src/demo-workflow/exits/training/.krtignore b/src/demo-workflow/exists/exit/.krtignore similarity index 100% rename from src/demo-workflow/exits/training/.krtignore rename to src/demo-workflow/exists/exit/.krtignore diff --git a/src/demo-workflow/exits/training/Dockerfile b/src/demo-workflow/exists/exit/Dockerfile similarity index 100% rename from src/demo-workflow/exits/training/Dockerfile rename to src/demo-workflow/exists/exit/Dockerfile diff --git a/src/demo-workflow/exists/exit/Makefile b/src/demo-workflow/exists/exit/Makefile new file mode 100644 index 0000000..c9544e8 --- /dev/null +++ b/src/demo-workflow/exists/exit/Makefile @@ -0,0 +1,20 @@ +# This Makefile contains all helpers for the REST trigger process + +# This variable have the environment to use, by default is local, but you can change when you run the make command +ENV ?= local +PROCESS_VERSION ?= v0.0.1 + +# Read the PRODUCT_NAME variable based on the file inside the corresponding directory +PRODUCT_NAME := $(shell basename $(wildcard ./../../../../.kai/$(ENV)/*.yaml) .yaml) +PROCESS_ID = exit + + +.PHONY: push-image +push-image: ## Login to the aio platform + kli process-registry register exit $(PROCESS_ID) --dockerfile "Dockerfile" --product $(PRODUCT_NAME) --src "." --version $(PROCESS_VERSION) + +##### LINTER + +.PHONY: linter-py +linter-py: ## Run ruff format + uv run ruff format diff --git a/src/demo-workflow/exits/training/README.md b/src/demo-workflow/exists/exit/README.md similarity index 92% rename from src/demo-workflow/exits/training/README.md rename to src/demo-workflow/exists/exit/README.md index 890346f..56770f7 100644 --- a/src/demo-workflow/exits/training/README.md +++ b/src/demo-workflow/exists/exit/README.md @@ -5,4 +5,4 @@ This process is an example of a training process for a machine learning model. ## Pre-requisites - python 3.13. Please refer to [installation](https://www.python.org/about/gettingstarted/) -- uv: It is used as the package/project manager for this project. Please refer to [installation](https://docs.astral.sh/uv/getting-started/installation/) \ No newline at end of file +- uv: It is used as the package/project manager for this project. Please refer to [installation](https://docs.astral.sh/uv/getting-started/installation/) diff --git a/src/demo-workflow/exits/training/__init__.py b/src/demo-workflow/exists/exit/__init__.py similarity index 100% rename from src/demo-workflow/exits/training/__init__.py rename to src/demo-workflow/exists/exit/__init__.py diff --git a/src/demo-workflow/exits/training/main.py b/src/demo-workflow/exists/exit/main.py similarity index 52% rename from src/demo-workflow/exits/training/main.py rename to src/demo-workflow/exists/exit/main.py index 272d31b..bf4f741 100644 --- a/src/demo-workflow/exits/training/main.py +++ b/src/demo-workflow/exists/exit/main.py @@ -1,18 +1,20 @@ import asyncio -from sdk import kai_sdk +from sdk.kai_sdk import KaiSDK from runner.runner import Runner +from google.protobuf.any_pb2 import Any -async def initializer(sdk: kai_sdk): - pass +async def initializer(sdk: KaiSDK): + sdk.logger.info("Initializing exit process") -async def handler(sdk: kai_sdk): - pass +async def handler(sdk: KaiSDK, message: Any): + sdk.logger.info("Received message: %s", message) + await sdk.messaging.send_output(response=message) -async def finalizer(sdk: kai_sdk): - pass +async def finalizer(sdk: KaiSDK): + sdk.logger.info("Finalizing exit process") async def init(): diff --git a/src/demo-workflow/exits/training/pyproject.toml b/src/demo-workflow/exists/exit/pyproject.toml similarity index 100% rename from src/demo-workflow/exits/training/pyproject.toml rename to src/demo-workflow/exists/exit/pyproject.toml diff --git a/src/demo-workflow/exits/training/uv.lock b/src/demo-workflow/exists/exit/uv.lock similarity index 100% rename from src/demo-workflow/exits/training/uv.lock rename to src/demo-workflow/exists/exit/uv.lock From 9d8b326b3c1f42fb383c1fdadba6a18837049210 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 16 Dec 2024 15:06:44 +0100 Subject: [PATCH 28/34] ref(trigger): Refactor files for trigger process --- .pre-commit-config.yaml | 20 +- .../triggers/rest-trigger/.golangci.yml | 250 ++++++++++++++++++ .../triggers/rest-trigger/Makefile | 20 ++ .../triggers/rest-trigger/main.go | 16 +- 4 files changed, 294 insertions(+), 12 deletions(-) create mode 100644 src/demo-workflow/triggers/rest-trigger/.golangci.yml create mode 100644 src/demo-workflow/triggers/rest-trigger/Makefile diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 89b2405..3e43385 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,16 +19,16 @@ repos: args: - --fix - id: ruff-format - - repo: https://github.com/dnephin/pre-commit-golang - rev: v0.5.1 - hooks: - - id: golangci-lint - args: - [ - "--config", - ".github/.golangci.yml", - "src/demo-workflow/triggers/rest-trigger/...", - ] + # - repo: https://github.com/dnephin/pre-commit-golang + # rev: v0.5.1 + # hooks: + # - id: golangci-lint + # args: + # [ + # "--config", + # ".github/.golangci.yml", + # "src/demo-workflow/triggers/rest-trigger/...", + # ] # - repo: local # hooks: # - id: linter diff --git a/src/demo-workflow/triggers/rest-trigger/.golangci.yml b/src/demo-workflow/triggers/rest-trigger/.golangci.yml new file mode 100644 index 0000000..91d9c84 --- /dev/null +++ b/src/demo-workflow/triggers/rest-trigger/.golangci.yml @@ -0,0 +1,250 @@ +run: + # Timeout for analysis, e.g. 30s, 5m. + # Default: 1m + timeout: 3m + +# All available linters https://golangci-lint.run/usage/linters/ +# All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml +linters-settings: + cyclop: + # The maximal code complexity to report. + # Default: 10 + max-complexity: 15 + # The maximal average package complexity. + # If it's higher than 0.0 (float) the check is enabled + # Default: 0.0 + package-average: 10.0 + + dupl: + threshold: 100 + + errcheck: + # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. + # Such cases aren't reported by default. + # Default: false + check-type-assertions: true + + exhaustive: + # Program elements to check for exhaustiveness. + # Default: [ switch ] + check: + - switch + - map + + funlen: + # Checks the number of lines in a function. + # If lower than 0, disable the check. + # Default: 60 + lines: 100 + # Checks the number of statements in a function. + # If lower than 0, disable the check. + # Default: 40 + statements: 50 + # Ignore comments when counting lines. + # Default false + ignore-comments: true + + goconst: + min-len: 2 + min-occurrences: 2 + + gocognit: + # Minimal code complexity to report. + # Default: 30 (but we recommend 10-20) + min-complexity: 20 + + gocritic: + # Settings passed to gocritic. + # The settings key is the name of a supported gocritic checker. + # The list of supported checkers can be find in https://go-critic.github.io/overview. + settings: + captLocal: + # Whether to restrict checker to params only. + # Default: true + paramsOnly: false + underef: + # Whether to skip (*x).method() calls where x is a pointer receiver. + # Default: true + skipRecvDeref: false + + gocyclo: + min-complexity: 15 + + goimports: + local-prefixes: github.com/golangci/golangci-lint + + govet: + # Enable all analyzers. + # Default: false + enable-all: true + # Disable analyzers by name. + # Run `go tool vet help` to see all analyzers. + # Default: [] + disable: + - fieldalignment + # Settings per analyzer. + settings: + shadow: + # Whether to be strict about shadowing; can be noisy. + # Default: false + strict: true + + inamedparam: + # Skips check for interface methods with only a single parameter. + # Default: false + skip-single-param: true + + lll: + line-length: 140 + + misspell: + locale: US + ignore-words: + - konstellation + + mnd: + # List of function patterns to exclude from analysis. + # Values always ignored: `time.Date`, + # `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`, + # `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`. + # Default: [] + ignored-functions: + - args.Error + - flag.Arg + - flag.Duration.* + - flag.Float.* + - flag.Int.* + - flag.Uint.* + - os.Chmod + - os.Mkdir.* + - os.OpenFile + - os.WriteFile + + nolintlint: + # Exclude following linters from requiring an explanation. + # Default: [] + allow-no-explanation: [funlen, gocognit, lll] + # Enable to require an explanation of nonzero length after each nolint directive. + # Default: false + require-explanation: true + # Enable to require nolint directives to mention the specific linter being suppressed. + # Default: false + require-specific: true + + perfsprint: + # Optimizes into strings concatenation. + # Default: true + strconcat: false + + reassign: + # Patterns for global variable names that are checked for reassignment. + # See https://github.com/curioswitch/go-reassign#usage + # Default: ["EOF", "Err.*"] + patterns: + - '.*' + + sloglint: + # Enforce not using global loggers. + # Values: + # - "": disabled + # - "all": report all global loggers + # - "default": report only the default slog logger + # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global + # Default: "" + no-global: 'all' + # Enforce using methods that accept a context. + # Values: + # - "": disabled + # - "all": report all contextless calls + # - "scope": report only if a context exists in the scope of the outermost function + # https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only + # Default: "" + context: 'scope' + +linters: + # please, do not use `enable-all`: it's deprecated and will be removed soon. + disable-all: true + enable: + - asciicheck # checks that your code does not contain non-ASCII identifiers + - bodyclose # checks that HTTP response body is closed + - copyloopvar # detects places where loop variables are copied https://github.com/karamaru-alpha/copyloopvar + - dogsled # finds assignments/declarations with too many blank identifiers + - dupl # checks for duplicated code + - durationcheck # check for two durations multiplied together + - err113 # checks the errors handling expressions + - errcheck # ENABLED by default checks for unchecked errors in Go code. + - errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13 (case, == and using %v instead of %w) + - exhaustive # checks exhaustiveness of enum switch statements + - funlen # detects long functions + - gochecknoglobals # checks that no global variables exist + - gochecknoinits # checks that no init functions are present in Go code + - gocognit # calculates the cognitive complexity of functions + - goconst # finds repeated strings that could be replaced by a constant + - gocritic # provides diagnostics that check for bugs, performance and style issues + - gocyclo # calculates cyclomatic complexities of functions + - godot # checks if comments end in a period + - godox # finds FIXME, TODO, etc. comments + - gofmt # checks whether code was gofmt-ed + - goimports # check import statements are formatted according to the 'goimport' command + - goprintffuncname # checks that printf-like functions are named with f at the end + - gosec # inspects source code for security problems + - gosimple # ENABLED by default linter for Go source code that specializes in simplifying code + - govet # ENABLED by default examines Go source code and reports suspicious constructs + # unsupported by gitlab ci 26/11/24 - iface # detect the incorrect use of interfaces https://github.com/uudashr/iface + - ineffassign # ENABLED by default detects when assignments to existing variables are not used + - inamedparam # checks for interface methods with only a single parameter + - lll # checks line length + - misspell # finds misspelled words + - nestif # checks for deeply nested if statements + - noctx # finds sending http.Request without context.Context + - nolintlint # reports ill-formed, insufficiently specific, or unused nolint directives + - perfsprint # optimizes string concatenation + - prealloc # finds slice declarations that could potentially be preallocated + - protogetter # reports direct reads from proto message fields when getters should be used + - reassign # checks that package variables are not reassigned + - revive # add extra rules to golint: https://github.com/mgechev/revive?tab=readme-ov-file#golangci-lint + - sloglint # checks for global loggers and contextless slog calls + - staticcheck # ENABLED by default using static analysis, it finds bugs and performance issues, offers simplifications, and enforces style rules + - stylecheck # add extra golint style checks: https://pkg.go.dev/honnef.co/go/tools/stylecheck + - testifylint # checks for common mistakes when using the testify package + - testpackage # checks that test files are in a separate _test package + - tparallel # detects inappropriate usage of t.Parallel() method in your Go test codes + - unconvert # remove unnecessary type conversions + - unparam # finds unused function parameters + - unused # ENABLED by default checks Go code for unused constants, variables, functions and types + - usestdlibvars # checks if the standard library variables can be used + - whitespace # checks for unnecessary newlines at the start and end of functions, if, for, etc + - wsl # add or remove empty lines +issues: + # Excluding configuration per-path, per-linter, per-text and per-source + exclude-rules: + - path: _test\.go + linters: + - mnd + # https://github.com/go-critic/go-critic/issues/926 + - linters: + - gocritic + text: 'unnecessaryDefer:' + - text: 'shadow: declaration of "(err|ctx)" shadows declaration at' + linters: [govet] + # Disable default exclude rules + exclude-use-default: false + exclude: + # EXC0001 errcheck: Almost all programs ignore errors on these functions and in most cases it's ok + - Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked + # EXC0004 govet: Common false positives + - (possible misuse of unsafe.Pointer|should have signature) + # EXC0006 gosec: Too many false-positives on 'unsafe' usage + - Use of unsafe calls should be audited + # EXC0007 gosec: Too many false-positives for parametrized shell calls + - Subprocess launch(ed with variable|ing should be audited) + # EXC0008 gosec: Duplicated errcheck checks + - (G104|G307) + # EXC0009 gosec: Too many issues in popular repos + - (Expect directory permissions to be 0750 or less|Expect file permissions to be 0600 or less) + # EXC0010 gosec: False positive is triggered by 'src, err := ioutil.ReadFile(filename)' + - Potential file inclusion via variable + # EXC0011 stylecheck: Annoying issue about not having a comment. The rare codebase has such comments + - (comment on exported (method|function|type|const)|should have( a package)? comment|comment should be of the form) + exclude-dirs: + - scripts diff --git a/src/demo-workflow/triggers/rest-trigger/Makefile b/src/demo-workflow/triggers/rest-trigger/Makefile new file mode 100644 index 0000000..737c8a3 --- /dev/null +++ b/src/demo-workflow/triggers/rest-trigger/Makefile @@ -0,0 +1,20 @@ +# This Makefile contains all helpers for the REST trigger process + +# This variable have the environment to use, by default is local, but you can change when you run the make command +ENV ?= local +PROCESS_VERSION ?= v0.0.1 + +# Read the PRODUCT_NAME variable based on the file inside the corresponding directory +PRODUCT_NAME := $(shell basename $(wildcard ./../../../../.kai/$(ENV)/*.yaml) .yaml) +PROCESS_ID = rest-trigger + + +.PHONY: push-image +push-image: ## Login to the aio platform + kli process-registry register trigger $(PROCESS_ID) --dockerfile "Dockerfile" --product $(PRODUCT_NAME) --src "." --version $(PROCESS_VERSION) + +##### LINTER + +.PHONY: linter-go +linter-go: ## Run golangci-lint, goimports and gofmt + golangci-lint run ./... --config ./../../../../.github/.golangci.yml && goimports -w . && gofmt -s -w -e -d . diff --git a/src/demo-workflow/triggers/rest-trigger/main.go b/src/demo-workflow/triggers/rest-trigger/main.go index b6dc0df..55df45b 100644 --- a/src/demo-workflow/triggers/rest-trigger/main.go +++ b/src/demo-workflow/triggers/rest-trigger/main.go @@ -21,6 +21,7 @@ import ( "google.golang.org/protobuf/types/known/structpb" ) +var port = 8080 var path = "/trigger" func main() { @@ -34,6 +35,17 @@ func main() { func restInitializer(kaiSDK sdk.KaiSDK) { kaiSDK.Logger.Info("Initializer, loading config") + // Read the port from the centralized configuration + portConfig, err := kaiSDK.CentralizedConfig.GetConfig("port", centralizedConfiguration.ProcessScope) + if err == nil { + kaiSDK.Logger.Info("Initializer, config loaded", "port", portConfig) + port, err = strconv.Atoi(portConfig) + if err != nil { + kaiSDK.Logger.Error(errors.New("error parsing port"), "error parsing port") + } + } + + // Read the path from the centralized configuration pathConfig, err := kaiSDK.CentralizedConfig.GetConfig("path", centralizedConfiguration.ProcessScope) if err == nil { kaiSDK.Logger.Info("Initializer, config loaded", "path", pathConfig) @@ -42,7 +54,7 @@ func restInitializer(kaiSDK sdk.KaiSDK) { } func restServerRunner(tr *trigger.Runner, kaiSDK sdk.KaiSDK) { - kaiSDK.Logger.Info("Starting http server", "port", 8080) + kaiSDK.Logger.Info("Starting http server", "port", port) bgCtx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() @@ -54,7 +66,7 @@ func restServerRunner(tr *trigger.Runner, kaiSDK sdk.KaiSDK) { r.DELETE(path, deleteHandler(kaiSDK, tr.GetResponseChannel)) srv := &http.Server{ - Addr: ":8080", + Addr: ":" + strconv.Itoa(port), Handler: r, } From fba7ec77d4994e27b0e207980055cb81d1364879 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 17 Dec 2024 12:01:32 +0100 Subject: [PATCH 29/34] ref(exit): Refactor files for exit process --- src/demo-workflow/{exists => exits}/exit/.krtignore | 0 src/demo-workflow/{exists => exits}/exit/Dockerfile | 0 src/demo-workflow/{exists => exits}/exit/Makefile | 4 ++++ src/demo-workflow/{exists => exits}/exit/README.md | 0 src/demo-workflow/{exists => exits}/exit/__init__.py | 0 src/demo-workflow/{exists => exits}/exit/main.py | 0 src/demo-workflow/{exists => exits}/exit/pyproject.toml | 0 src/demo-workflow/{exists => exits}/exit/uv.lock | 0 8 files changed, 4 insertions(+) rename src/demo-workflow/{exists => exits}/exit/.krtignore (100%) rename src/demo-workflow/{exists => exits}/exit/Dockerfile (100%) rename src/demo-workflow/{exists => exits}/exit/Makefile (87%) rename src/demo-workflow/{exists => exits}/exit/README.md (100%) rename src/demo-workflow/{exists => exits}/exit/__init__.py (100%) rename src/demo-workflow/{exists => exits}/exit/main.py (100%) rename src/demo-workflow/{exists => exits}/exit/pyproject.toml (100%) rename src/demo-workflow/{exists => exits}/exit/uv.lock (100%) diff --git a/src/demo-workflow/exists/exit/.krtignore b/src/demo-workflow/exits/exit/.krtignore similarity index 100% rename from src/demo-workflow/exists/exit/.krtignore rename to src/demo-workflow/exits/exit/.krtignore diff --git a/src/demo-workflow/exists/exit/Dockerfile b/src/demo-workflow/exits/exit/Dockerfile similarity index 100% rename from src/demo-workflow/exists/exit/Dockerfile rename to src/demo-workflow/exits/exit/Dockerfile diff --git a/src/demo-workflow/exists/exit/Makefile b/src/demo-workflow/exits/exit/Makefile similarity index 87% rename from src/demo-workflow/exists/exit/Makefile rename to src/demo-workflow/exits/exit/Makefile index c9544e8..37844b7 100644 --- a/src/demo-workflow/exists/exit/Makefile +++ b/src/demo-workflow/exits/exit/Makefile @@ -13,6 +13,10 @@ PROCESS_ID = exit push-image: ## Login to the aio platform kli process-registry register exit $(PROCESS_ID) --dockerfile "Dockerfile" --product $(PRODUCT_NAME) --src "." --version $(PROCESS_VERSION) +.PHONY: test-command +test-command: + echo $(ENV) && echo $(PROCESS_VERSION) && echo $(PROCESS_ID) + ##### LINTER .PHONY: linter-py diff --git a/src/demo-workflow/exists/exit/README.md b/src/demo-workflow/exits/exit/README.md similarity index 100% rename from src/demo-workflow/exists/exit/README.md rename to src/demo-workflow/exits/exit/README.md diff --git a/src/demo-workflow/exists/exit/__init__.py b/src/demo-workflow/exits/exit/__init__.py similarity index 100% rename from src/demo-workflow/exists/exit/__init__.py rename to src/demo-workflow/exits/exit/__init__.py diff --git a/src/demo-workflow/exists/exit/main.py b/src/demo-workflow/exits/exit/main.py similarity index 100% rename from src/demo-workflow/exists/exit/main.py rename to src/demo-workflow/exits/exit/main.py diff --git a/src/demo-workflow/exists/exit/pyproject.toml b/src/demo-workflow/exits/exit/pyproject.toml similarity index 100% rename from src/demo-workflow/exists/exit/pyproject.toml rename to src/demo-workflow/exits/exit/pyproject.toml diff --git a/src/demo-workflow/exists/exit/uv.lock b/src/demo-workflow/exits/exit/uv.lock similarity index 100% rename from src/demo-workflow/exists/exit/uv.lock rename to src/demo-workflow/exits/exit/uv.lock From e8dae1eb36e947aaf2ff5dda004e2fd2fdb99891 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 17 Dec 2024 12:03:56 +0100 Subject: [PATCH 30/34] ref(makefile): Refactor instructions in makefile for more versatile use --- Makefile | 9 +++++++++ src/demo-workflow/exits/exit/Makefile | 6 +----- src/demo-workflow/tasks/training/Makefile | 2 +- src/demo-workflow/triggers/rest-trigger/Makefile | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 90df21c..42a63fc 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,9 @@ PRODUCT_NAME := $(shell basename $(wildcard .kai/$(ENV)/*.yaml) .yaml) # Read the PRODUCT_VERSION variable based on the file inside the corresponding directory PRODUCT_VERSION := $(shell grep 'version:' .kai/$(ENV)/$(PRODUCT_NAME).yaml | awk '{print $$2}') +# Sub folders of process +SUBDIRS = src/demo-workflow/triggers/rest-trigger src/demo-workflow/tasks/training src/demo-workflow/exits/exit + # Test for the see the value of the variables .PHONY: show-vars show-vars: @@ -33,6 +36,12 @@ update-process-env: ## Update process environment create-product: ## Push processes images kli product create $(PRODUCT_NAME) --description "Kai Project Template" +.PHONY: push-all-process-images +push-all-process-images: ## Push all process image by default + @for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir push-image; \ + done + .PHONY: push-product-version push-product-version: ## Push new product version kli product version push .kai/$(ENV)/$(PRODUCT_NAME).yaml diff --git a/src/demo-workflow/exits/exit/Makefile b/src/demo-workflow/exits/exit/Makefile index 37844b7..c61c47f 100644 --- a/src/demo-workflow/exits/exit/Makefile +++ b/src/demo-workflow/exits/exit/Makefile @@ -10,13 +10,9 @@ PROCESS_ID = exit .PHONY: push-image -push-image: ## Login to the aio platform +push-image: ## Push process image in this folder kli process-registry register exit $(PROCESS_ID) --dockerfile "Dockerfile" --product $(PRODUCT_NAME) --src "." --version $(PROCESS_VERSION) -.PHONY: test-command -test-command: - echo $(ENV) && echo $(PROCESS_VERSION) && echo $(PROCESS_ID) - ##### LINTER .PHONY: linter-py diff --git a/src/demo-workflow/tasks/training/Makefile b/src/demo-workflow/tasks/training/Makefile index b511c7f..b466841 100644 --- a/src/demo-workflow/tasks/training/Makefile +++ b/src/demo-workflow/tasks/training/Makefile @@ -10,7 +10,7 @@ PROCESS_ID = training .PHONY: push-image -push-image: ## Login to the aio platform +push-image: ## Push process image in this folder kli process-registry register task $(PROCESS_ID) --dockerfile "Dockerfile" --product $(PRODUCT_NAME) --src "." --version $(PROCESS_VERSION) ##### LINTER diff --git a/src/demo-workflow/triggers/rest-trigger/Makefile b/src/demo-workflow/triggers/rest-trigger/Makefile index 737c8a3..9fe71af 100644 --- a/src/demo-workflow/triggers/rest-trigger/Makefile +++ b/src/demo-workflow/triggers/rest-trigger/Makefile @@ -10,7 +10,7 @@ PROCESS_ID = rest-trigger .PHONY: push-image -push-image: ## Login to the aio platform +push-image: ## Push process image in this folder kli process-registry register trigger $(PROCESS_ID) --dockerfile "Dockerfile" --product $(PRODUCT_NAME) --src "." --version $(PROCESS_VERSION) ##### LINTER From 70b1efc39b9375ecf90144cb033646d19b48ddb4 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 17 Dec 2024 12:54:23 +0100 Subject: [PATCH 31/34] WIP --- .kai/local/kai-project-template.yaml | 8 ++++---- Makefile | 2 +- scripts/send_request.sh | 2 +- src/demo-workflow/exits/exit/Makefile | 2 +- src/demo-workflow/exits/exit/main.py | 4 ++-- src/demo-workflow/tasks/training/Makefile | 2 +- src/demo-workflow/tasks/training/main.py | 10 ++-------- 7 files changed, 12 insertions(+), 18 deletions(-) diff --git a/.kai/local/kai-project-template.yaml b/.kai/local/kai-project-template.yaml index e7a12e2..a0224c3 100644 --- a/.kai/local/kai-project-template.yaml +++ b/.kai/local/kai-project-template.yaml @@ -1,4 +1,4 @@ -version: v0.1.0 +version: v0.1.3 description: kai-project-template config: {} workflows: @@ -8,7 +8,7 @@ workflows: processes: - name: trigger type: trigger - image: PLACEHOLDER + image: registry.kai.local/kai-project-template_rest-trigger:v0.0.1 replicas: 1 gpu: false config: @@ -31,7 +31,7 @@ workflows: limit: 800M - name: training type: task - image: PLACEHODER + image: registry.kai.local/kai-project-template_training:v0.0.3 replicas: 1 gpu: false objectStore: null @@ -48,7 +48,7 @@ workflows: limit: 800M - name: exit type: exit - image: PLACEHODER + image: registry.kai.local/kai-project-template_exit:v0.0.2 replicas: 1 gpu: false objectStore: null diff --git a/Makefile b/Makefile index 42a63fc..daa8161 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ create-product: ## Push processes images .PHONY: push-all-process-images push-all-process-images: ## Push all process image by default @for dir in $(SUBDIRS); do \ - $(MAKE) -C $$dir push-image; \ + $(MAKE) -C $$dir push-image; \admin/master/console/#/konstellation/users/2cb1e3b2-3ffd-4cda-84e7-a0c16d042706/credentials done .PHONY: push-product-version diff --git a/scripts/send_request.sh b/scripts/send_request.sh index e6c2451..dad820b 100755 --- a/scripts/send_request.sh +++ b/scripts/send_request.sh @@ -5,6 +5,6 @@ URL="kai-project-template.kai.local/demo-workflow-trigger/rest-trigger" # Call the URL echo "Making a GET request to $URL..." -response=$(curl -s $URL) +response=$(curl $URL) echo "Response: $response" diff --git a/src/demo-workflow/exits/exit/Makefile b/src/demo-workflow/exits/exit/Makefile index c61c47f..0137f66 100644 --- a/src/demo-workflow/exits/exit/Makefile +++ b/src/demo-workflow/exits/exit/Makefile @@ -2,7 +2,7 @@ # This variable have the environment to use, by default is local, but you can change when you run the make command ENV ?= local -PROCESS_VERSION ?= v0.0.1 +PROCESS_VERSION ?= v0.0.2 # Read the PRODUCT_NAME variable based on the file inside the corresponding directory PRODUCT_NAME := $(shell basename $(wildcard ./../../../../.kai/$(ENV)/*.yaml) .yaml) diff --git a/src/demo-workflow/exits/exit/main.py b/src/demo-workflow/exits/exit/main.py index bf4f741..566cafa 100644 --- a/src/demo-workflow/exits/exit/main.py +++ b/src/demo-workflow/exits/exit/main.py @@ -9,8 +9,8 @@ async def initializer(sdk: KaiSDK): async def handler(sdk: KaiSDK, message: Any): - sdk.logger.info("Received message: %s", message) - await sdk.messaging.send_output(response=message) + sdk.logger.info(f"Received message: {message}") + await sdk.messaging.send_any(response=message) async def finalizer(sdk: KaiSDK): diff --git a/src/demo-workflow/tasks/training/Makefile b/src/demo-workflow/tasks/training/Makefile index b466841..83e0d43 100644 --- a/src/demo-workflow/tasks/training/Makefile +++ b/src/demo-workflow/tasks/training/Makefile @@ -2,7 +2,7 @@ # This variable have the environment to use, by default is local, but you can change when you run the make command ENV ?= local -PROCESS_VERSION ?= v0.0.1 +PROCESS_VERSION ?= v0.0.3 # Read the PRODUCT_NAME variable based on the file inside the corresponding directory PRODUCT_NAME := $(shell basename $(wildcard ./../../../../.kai/$(ENV)/*.yaml) .yaml) diff --git a/src/demo-workflow/tasks/training/main.py b/src/demo-workflow/tasks/training/main.py index 6138c4e..6372540 100644 --- a/src/demo-workflow/tasks/training/main.py +++ b/src/demo-workflow/tasks/training/main.py @@ -2,7 +2,6 @@ from sdk.kai_sdk import KaiSDK from runner.runner import Runner from google.protobuf.any_pb2 import Any -from google.protobuf.struct_pb2 import Value async def initializer(sdk: KaiSDK): @@ -10,13 +9,8 @@ async def initializer(sdk: KaiSDK): async def handler(sdk: KaiSDK, message: Any): - sdk.logger.info("Received message: %s, start creating response", message) - response = Value() - response.struct_value.fields["status"].string_value = "200" - response.struct_value.fields[ - "message" - ].string_value = "Training completed successfully" - await sdk.messaging.send_output(response=response) + sdk.logger.info(f"Received message in training: {message}") + await sdk.messaging.send_any(response=message) async def finalizer(sdk: KaiSDK): From 6bdcdb7ceee4f1861d2388360faff6528bc0e744 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 17 Dec 2024 12:55:03 +0100 Subject: [PATCH 32/34] WIP --- src/demo-workflow/triggers/rest-trigger/.golangci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/demo-workflow/triggers/rest-trigger/.golangci.yml b/src/demo-workflow/triggers/rest-trigger/.golangci.yml index 91d9c84..57576e1 100644 --- a/src/demo-workflow/triggers/rest-trigger/.golangci.yml +++ b/src/demo-workflow/triggers/rest-trigger/.golangci.yml @@ -141,7 +141,7 @@ linters-settings: # See https://github.com/curioswitch/go-reassign#usage # Default: ["EOF", "Err.*"] patterns: - - '.*' + - ".*" sloglint: # Enforce not using global loggers. @@ -151,7 +151,7 @@ linters-settings: # - "default": report only the default slog logger # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global # Default: "" - no-global: 'all' + no-global: "all" # Enforce using methods that accept a context. # Values: # - "": disabled @@ -159,7 +159,7 @@ linters-settings: # - "scope": report only if a context exists in the scope of the outermost function # https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only # Default: "" - context: 'scope' + context: "scope" linters: # please, do not use `enable-all`: it's deprecated and will be removed soon. @@ -224,7 +224,7 @@ issues: # https://github.com/go-critic/go-critic/issues/926 - linters: - gocritic - text: 'unnecessaryDefer:' + text: "unnecessaryDefer:" - text: 'shadow: declaration of "(err|ctx)" shadows declaration at' linters: [govet] # Disable default exclude rules From 0a6e68505e119e30e3d919fc8dadbfaebce03695 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 17 Dec 2024 13:13:23 +0100 Subject: [PATCH 33/34] fix(exit): Using send_any if you send Any type --- .kai/local/kai-project-template.yaml | 4 ++-- src/demo-workflow/tasks/training/Makefile | 2 +- src/demo-workflow/tasks/training/main.py | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.kai/local/kai-project-template.yaml b/.kai/local/kai-project-template.yaml index a0224c3..0a2e8a2 100644 --- a/.kai/local/kai-project-template.yaml +++ b/.kai/local/kai-project-template.yaml @@ -1,4 +1,4 @@ -version: v0.1.3 +version: v0.1.4 description: kai-project-template config: {} workflows: @@ -31,7 +31,7 @@ workflows: limit: 800M - name: training type: task - image: registry.kai.local/kai-project-template_training:v0.0.3 + image: registry.kai.local/kai-project-template_training:v0.0.4 replicas: 1 gpu: false objectStore: null diff --git a/src/demo-workflow/tasks/training/Makefile b/src/demo-workflow/tasks/training/Makefile index 83e0d43..517438d 100644 --- a/src/demo-workflow/tasks/training/Makefile +++ b/src/demo-workflow/tasks/training/Makefile @@ -2,7 +2,7 @@ # This variable have the environment to use, by default is local, but you can change when you run the make command ENV ?= local -PROCESS_VERSION ?= v0.0.3 +PROCESS_VERSION ?= v0.0.4 # Read the PRODUCT_NAME variable based on the file inside the corresponding directory PRODUCT_NAME := $(shell basename $(wildcard ./../../../../.kai/$(ENV)/*.yaml) .yaml) diff --git a/src/demo-workflow/tasks/training/main.py b/src/demo-workflow/tasks/training/main.py index 6372540..5e45021 100644 --- a/src/demo-workflow/tasks/training/main.py +++ b/src/demo-workflow/tasks/training/main.py @@ -2,6 +2,7 @@ from sdk.kai_sdk import KaiSDK from runner.runner import Runner from google.protobuf.any_pb2 import Any +from google.protobuf.struct_pb2 import Value async def initializer(sdk: KaiSDK): @@ -10,7 +11,12 @@ async def initializer(sdk: KaiSDK): async def handler(sdk: KaiSDK, message: Any): sdk.logger.info(f"Received message in training: {message}") - await sdk.messaging.send_any(response=message) + response = Value() + response.struct_value.fields["status_code"].string_value = "200" + response.struct_value.fields[ + "message" + ].string_value = "Training completed successfully" + await sdk.messaging.send_output(response=response) async def finalizer(sdk: KaiSDK): From cbc73b4036b23d0caa71acdea9037efe17c11327 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 18 Dec 2024 10:14:16 +0100 Subject: [PATCH 34/34] doc(demo): Included workflow's documentation --- README.md | 104 ++++++++++++++++++++++++++++++++++++++++++++ images/Workflow.png | Bin 0 -> 49703 bytes 2 files changed, 104 insertions(+) create mode 100644 images/Workflow.png diff --git a/README.md b/README.md index f782e43..eb2f47a 100644 --- a/README.md +++ b/README.md @@ -50,3 +50,107 @@ Before starting, make sure to meet the following requirements: ``` 4. **When start product** - When you create a product and want to start it, you need to include information about email, name and surname in the Keycloak (`auth.kai.local`) user (`kai-project-template`) auto-generated. If not, minio will not initialize corretly. + + +# Demo Workflow + +In this template have been included a simple workflow for showing the basic use of KLI for process and product management. + +![Workflow Diagram](images/Workflow.png) + +# Deployment + +This section contains the instructions to deploy the workflow processes using the provided `Makefile` commands. + +## Prerequisites + +1. **Kai CLI**: Install the Kai CLI tool (`kli`) on your machine. +2. **Docker**: Ensure Docker is installed and running. +3. **Make**: Ensure `make` is installed to run the Makefile commands. + +--- + +## Deployment Steps + +### 1. Login to the KAI Platform +Log in to the platform to authenticate your session: +```bash +make login +``` + +### 2. Create the Product +Create the product for the workflow +```bash +make create-product +``` + +### 3. Push Process images +Depending of what you need, use root Makefile or Makefile inside each process folder. The Makefile inside each process you can use +```bash +make -C src/demo-workflow// push-image +``` +The env and version are optionals, you can change directly in the Makefile. +In you need to push all images, use the root Makefile that push with the defaults env and version +```bash +make push-all-process-images +``` + +### 4. Update Product Configuration +Manually update the .kai//.yaml file with the correct versions for each process and product. +Ensure the versions match the ones used in the previous step. +```yaml +version: v0.1.4 +description: kai-project-template +config: {} +workflows: + - name: demo-workflow + type: training + config: {} + processes: + - name: trigger + type: trigger + image: registry.kai.local/kai-project-template_rest-trigger:v0.0.1 +.... +``` +### 5. Push the Product Version +After updating the configuration, push the product version: +```bash +make push-product-version +``` + +### 6. KAI current problem with automatic user +Before starting the product for the first time, check in the Keycloak configuration whether the KAI user has their email, first name, and last name set up. If not, these fields must be completed; otherwise, the process creation will fail. + +### 7. Start the Product Version +Start the specific product version +```bash +make start-product-version +``` + +### 8. Publish the Product Version +Start the specific product version +```bash +make publish-product-version +``` + +### 9. Test the workflow +Start the specific product version +```bash +make publish-product-version +``` + +--- + +## Helper Commands + +- **List Workflow Processes**: Display all the process images and the state of each one. + ```bash + make list-processes-images + ``` + +- **List Product Versions**: Show all versions of the product. + ```bash + make list-product-versions + ``` + +--- \ No newline at end of file diff --git a/images/Workflow.png b/images/Workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..c6cf7b44f72c8b443017f5df6bfcbc921090a459 GIT binary patch literal 49703 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

4F4#Bi9Qmy1D1IOEOnm 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 literal 0 HcmV?d00001