From cd925d69f28bc68bdb030680ed3092f5b2e4e9cd Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Fri, 24 Jan 2025 14:02:29 -0500 Subject: [PATCH 01/10] upgrade: Cedana C/R to use new API --- go.mod | 69 +++++-- go.sum | 90 +++++++++ pkg/common/config.default.yaml | 31 ++- pkg/worker/cedana.go | 345 +++++++++++---------------------- pkg/worker/worker.go | 7 +- 5 files changed, 275 insertions(+), 267 deletions(-) diff --git a/go.mod b/go.mod index 362d42b51..3605c74d4 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,10 @@ module github.com/beam-cloud/beta9 -go 1.22.0 +go 1.23.0 -toolchain go1.22.4 +toolchain go1.23.5 require ( - buf.build/gen/go/cedana/task/grpc/go v1.5.1-20241203191352-12c25eb032cd.1 - buf.build/gen/go/cedana/task/protocolbuffers/go v1.35.2-20241203191352-12c25eb032cd.1 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Masterminds/squirrel v1.5.4 github.com/alicebob/miniredis/v2 v2.30.5 @@ -21,7 +19,7 @@ require ( github.com/beam-cloud/clip v0.0.0-20250109221532-5d9d7744594d github.com/beam-cloud/go-runc v0.0.0-20231222221338-b89899f33170 github.com/bsm/redislock v0.9.4 - github.com/cedana/cedana v0.9.234 + github.com/cedana/cedana v0.9.237-pre github.com/cenkalti/backoff v2.2.1+incompatible github.com/cloudevents/sdk-go/v2 v2.15.1 github.com/containerd/console v1.0.4 @@ -45,7 +43,7 @@ require ( github.com/mholt/archiver/v3 v3.5.1 github.com/mitchellh/hashstructure/v2 v2.0.2 github.com/mitchellh/mapstructure v1.5.0 - github.com/opencontainers/runc v1.1.14 + github.com/opencontainers/runc v1.2.3 github.com/opencontainers/runtime-spec v1.2.0 github.com/opencontainers/umoci v0.4.7 github.com/openmeterio/openmeter v1.0.0-beta.47 @@ -57,28 +55,28 @@ require ( github.com/redis/go-redis/v9 v9.5.1 github.com/rs/zerolog v1.33.0 github.com/sashabaranov/go-openai v1.35.7 - github.com/shirou/gopsutil/v4 v4.24.6 + github.com/shirou/gopsutil/v4 v4.24.11 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.10.0 github.com/tj/assert v0.0.3 github.com/vishvananda/netlink v1.2.1-beta.2 github.com/vishvananda/netns v0.0.4 - go.opentelemetry.io/otel v1.31.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 + go.opentelemetry.io/otel v1.33.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.31.0 go.opentelemetry.io/otel/log v0.7.0 - go.opentelemetry.io/otel/sdk v1.31.0 + go.opentelemetry.io/otel/sdk v1.33.0 go.opentelemetry.io/otel/sdk/log v0.7.0 go.opentelemetry.io/otel/sdk/metric v1.31.0 - go.opentelemetry.io/otel/trace v1.31.0 + go.opentelemetry.io/otel/trace v1.33.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/net v0.33.0 golang.org/x/sync v0.10.0 golang.org/x/sys v0.28.0 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.2 + google.golang.org/grpc v1.68.1 + google.golang.org/protobuf v1.36.3 gopkg.in/yaml.v2 v2.4.0 gvisor.dev/gvisor v0.0.0-20240722211153-64c016c92987 k8s.io/api v0.30.3 @@ -89,7 +87,11 @@ require ( ) require ( - buf.build/gen/go/cedana/gpu/protocolbuffers/go v1.35.2-20241203191352-2167379de17d.1 // indirect + buf.build/gen/go/cedana/cedana-gpu/grpc/go v1.5.1-00000000000000-6f030530e3d9.2 // indirect + buf.build/gen/go/cedana/cedana-gpu/protocolbuffers/go v1.36.3-00000000000000-6f030530e3d9.1 // indirect + buf.build/gen/go/cedana/cedana/grpc/go v1.5.1-20250123222419-64bf8384f939.2 // indirect + buf.build/gen/go/cedana/cedana/protocolbuffers/go v1.36.3-20250123222419-64bf8384f939.1 // indirect + buf.build/gen/go/cedana/criu/protocolbuffers/go v1.36.3-20250123222419-6ed7871347d0.1 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdamKorcz/go-fuzz-headers v0.0.0-20210312213058-32f4d319f0d2 // indirect github.com/akutz/memconn v0.1.0 // indirect @@ -122,7 +124,7 @@ require ( github.com/cilium/ebpf v0.16.0 // indirect github.com/coder/websocket v1.8.12 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/cyphar/filepath-securejoin v0.3.5 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dblohm7/wingoes v0.0.0-20240119213807-a09d6be7affa // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect @@ -134,6 +136,7 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect github.com/emicklei/go-restful/v3 v3.11.2 // indirect github.com/fatih/color v1.17.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect @@ -162,11 +165,14 @@ require ( github.com/google/nftables v0.2.1-0.20240414091927-5e242ec57806 // indirect github.com/gorilla/csrf v1.7.2 // indirect github.com/gorilla/securecookie v1.1.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/illarion/gonotify v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2 // indirect github.com/invopop/yaml v0.3.1 // indirect + github.com/jedib0t/go-pretty/v6 v6.6.5 // indirect github.com/jellydator/ttlcache/v3 v3.2.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -181,13 +187,17 @@ require ( github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-sqlite3 v1.14.24 // indirect github.com/mdlayher/genetlink v1.3.2 // indirect github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/sdnotify v1.0.0 // indirect github.com/mdlayher/socket v0.5.0 // indirect + github.com/mdlayher/vsock v1.2.1 // indirect github.com/mfridman/interpolate v0.0.2 // indirect github.com/miekg/dns v1.1.58 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -207,20 +217,33 @@ require ( github.com/onsi/gomega v1.34.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/prometheus-community/pro-bing v0.4.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.53.0 // indirect + github.com/rb-go/namegen v1.1.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rootless-containers/proto v0.1.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/safchain/ethtool v0.4.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e // indirect github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 // indirect github.com/tailscale/golang-x-crypto v0.0.0-20240604161659-3fde5e568aa4 // indirect @@ -242,27 +265,31 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vbatts/go-mtree v0.5.0 // indirect github.com/x448/float16 v0.8.4 // indirect + github.com/xeonx/timeago v1.0.0-rc5 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/yuin/gopher-lua v1.1.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect + go.opentelemetry.io/otel/metric v1.33.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect golang.org/x/crypto v0.31.0 // indirect golang.org/x/mod v0.20.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect golang.org/x/term v0.27.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.8.0 // indirect golang.org/x/tools v0.24.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect golang.zx2c4.com/wireguard/windows v0.5.3 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect diff --git a/go.sum b/go.sum index 77a1d361c..af1bfa49c 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,13 @@ +buf.build/gen/go/cedana/cedana-gpu/grpc/go v1.5.1-00000000000000-6f030530e3d9.2 h1:MGpWxWtn2AvjNUTNUcMy28suVQGVE420uPMx+ttFGpU= +buf.build/gen/go/cedana/cedana-gpu/grpc/go v1.5.1-00000000000000-6f030530e3d9.2/go.mod h1:66lazxgMJ/X1yUlQiZJs8xjIh2k8hSVl9lJYzqesAck= +buf.build/gen/go/cedana/cedana-gpu/protocolbuffers/go v1.36.3-00000000000000-6f030530e3d9.1 h1:CuqljsPrTo/yFPuc8cUAbu2tHMWLh8ufNUOTeVKmckQ= +buf.build/gen/go/cedana/cedana-gpu/protocolbuffers/go v1.36.3-00000000000000-6f030530e3d9.1/go.mod h1:RoDVyq9Z0G9myjkZI2oQk90AOR/lBBesb+MoxMBcOiw= +buf.build/gen/go/cedana/cedana/grpc/go v1.5.1-20250123222419-64bf8384f939.2 h1:Zw9aEmuLp3J95SoJRzO14KFK4/iDsAIaeuBl/EwchgI= +buf.build/gen/go/cedana/cedana/grpc/go v1.5.1-20250123222419-64bf8384f939.2/go.mod h1:LRuWA5Ue691K2WNiZxuIkjkMbRleOQiG4xOzd5oXHCU= +buf.build/gen/go/cedana/cedana/protocolbuffers/go v1.36.3-20250123222419-64bf8384f939.1 h1:VQZx7YpA+sGCx6+OXHUDz0k0XaWh+yrTlk8fR2Hl/aU= +buf.build/gen/go/cedana/cedana/protocolbuffers/go v1.36.3-20250123222419-64bf8384f939.1/go.mod h1:8V7MaxrApVmbeo/griPsEpYqZg/oM8YtAk82IIm0HY8= +buf.build/gen/go/cedana/criu/protocolbuffers/go v1.36.3-20250123222419-6ed7871347d0.1 h1:W+aj4R10spaBdKDdWrL39gCf3RdAqtmxthdONBBQRJ4= +buf.build/gen/go/cedana/criu/protocolbuffers/go v1.36.3-20250123222419-6ed7871347d0.1/go.mod h1:SdiN7y9upUiOum1wTo2CQm1HoN88y/WCgjHc6CkOfXc= buf.build/gen/go/cedana/gpu/protocolbuffers/go v1.35.2-20241203191352-2167379de17d.1 h1:AxyPWWT4YGmLs8RduxavZi3acD+WGXXr2r7oJP2EBQQ= buf.build/gen/go/cedana/gpu/protocolbuffers/go v1.35.2-20241203191352-2167379de17d.1/go.mod h1:14P29lBGPpmKBTOhetR/D806Xraxf+f7Zw9nwaWSOmo= buf.build/gen/go/cedana/task/grpc/go v1.5.1-20241203191352-12c25eb032cd.1 h1:qTCCRcSFwS7IIKeBtSSOgaZVSsH3T7V0sSRKFAGrPds= @@ -109,6 +119,8 @@ github.com/bsm/redislock v0.9.4 h1:X/Wse1DPpiQgHbVYRE9zv6m070UcKoOGekgvpNhiSvw= github.com/bsm/redislock v0.9.4/go.mod h1:Epf7AJLiSFwLCiZcfi6pWFO/8eAYrYpQXFxEDPoDeAk= github.com/cedana/cedana v0.9.234 h1:sH9F3unNC9fPl/TOzePFqlb05Pudr/wV0yTQgLGm7lc= github.com/cedana/cedana v0.9.234/go.mod h1:dAynzssinqVeyy1GTw8WYDwEeIVTLOzQx0qA5/D0Tu4= +github.com/cedana/cedana v0.9.237-pre h1:1+/zkYsWfpfR0ZTbb8+l0zP1UuPh+OxMsrwzNx+AJEA= +github.com/cedana/cedana v0.9.237-pre/go.mod h1:jOeO7RVA03ZDXO6kbQev2TmgJI2chomtg7cOW1azftQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -142,6 +154,7 @@ github.com/creack/pty v1.1.23/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfv github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.5/go.mod h1:edhVd3c6OXKjUmSrVa/tGJRS9joFTxlslFCAyaxigkE= 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= @@ -174,6 +187,8 @@ github.com/dsnet/try v0.0.3 h1:ptR59SsrcFUYbT/FhAbKTV6iLkeD6O18qfIWRml2fqI= github.com/dsnet/try v0.0.3/go.mod h1:WBM8tRpUmnXXhY1U6/S8dt6UWdHTQ7y8A5YSkRCkq40= 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/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/emicklei/go-restful/v3 v3.11.2 h1:1onLa9DcsMYO9P+CXaL0dStDqQ2EHHXLiz+BtnqkLAU= github.com/emicklei/go-restful/v3 v3.11.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -285,19 +300,27 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/ github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hanwen/go-fuse/v2 v2.5.1 h1:OQBE8zVemSocRxA4OaFJbjJ5hlpCmIWbGr7r0M4uoQQ= github.com/hanwen/go-fuse/v2 v2.5.1/go.mod h1:xKwi1cF7nXAOBCXujD5ie0ZKsxc8GGSA1rlMJc+8IJs= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +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/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/illarion/gonotify v1.0.1 h1:F1d+0Fgbq/sDWjj/r66ekjDG+IDeecQKUFH4wNwsoio= github.com/illarion/gonotify v1.0.1/go.mod h1:zt5pmDofZpU1f8aqlK0+95eQhoEAn/d4G4B/FjVW4jE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2 h1:9K06NfxkBh25x56yVhWWlKFE8YpicaSfHwoV8SFbueA= github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2/go.mod h1:3A9PQ1cunSDF/1rbTq99Ts4pVnycWg+vlPkfeD2NLFI= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= +github.com/jedib0t/go-pretty/v6 v6.6.5 h1:9PgMJOVBedpgYLI56jQRJYqngxYAAzfEUua+3NgSqAo= +github.com/jedib0t/go-pretty/v6 v6.6.5/go.mod h1:Uq/HrbhuFty5WSVNfjpQQe47x16RwVGXIveNGEyGtHs= github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -377,6 +400,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -393,9 +418,13 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mdlayher/genetlink v1.3.2 h1:KdrNKe+CTu+IbZnm/GVUMXSqBBLqcGpRDa0xkQy56gw= github.com/mdlayher/genetlink v1.3.2/go.mod h1:tcC3pkCrPUGIKKsCsp0B3AdaaKuHtaxoJRz3cc+528o= github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= @@ -404,6 +433,8 @@ github.com/mdlayher/sdnotify v1.0.0 h1:Ma9XeLVN/l0qpyx1tNeMSeTjCPH6NtuD6/N9XdTlQ github.com/mdlayher/sdnotify v1.0.0/go.mod h1:HQUmpM4XgYkhDLtd+Uad8ZFK1T9D5+pNxnXQjCeJlGE= github.com/mdlayher/socket v0.5.0 h1:ilICZmJcQz70vrWVes1MFera4jGiWNocSkykwwoy3XI= github.com/mdlayher/socket v0.5.0/go.mod h1:WkcBFfvyG8QENs5+hfQPl1X6Jpd2yeLIYgrGFmJiJxI= +github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= +github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -463,6 +494,7 @@ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2sz github.com/opencontainers/runc v1.0.0-rc90/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.1.14 h1:rgSuzbmgz5DUJjeSnw337TxDbRuqjs6iqQck/2weR6w= github.com/opencontainers/runc v1.1.14/go.mod h1:E4C2z+7BxR7GHXp0hAY53mek+x49X1LjPNeMTfRGvOA= +github.com/opencontainers/runc v1.2.3/go.mod h1:nSxcWUydXrsBZVYNSkTjoQ/N6rcyTtn+1SD5D4+kRIM= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -473,8 +505,12 @@ github.com/openmeterio/openmeter v1.0.0-beta.47/go.mod h1:rGwmmEiRR4uS4xNkdhFMkZ github.com/oracle/oci-go-sdk v24.3.0+incompatible h1:x4mcfb4agelf1O4/1/auGlZ1lr97jXRSSN5MxTgG/zU= github.com/oracle/oci-go-sdk v24.3.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= +github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= @@ -502,10 +538,15 @@ github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+a github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rb-go/namegen v1.1.0 h1:AmVdO2kM7ayaTRjpBSqKILAnT1xC4sKD01spJ7qnGbA= +github.com/rb-go/namegen v1.1.0/go.mod h1:whb/fzz/7xbi6EgHw/zOqPS150h2efUptbJh1XFGyhA= github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= @@ -519,6 +560,10 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/safchain/ethtool v0.4.0 h1:vq1i2HCjshJNywOXFZ1BpwIjyeFR/kvNdHiRzqSElDI= github.com/safchain/ethtool v0.4.0/go.mod h1:XLLnZmy4OCRTkksP/UiMjij96YmIsBfmBQcs7H6tA48= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +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/sashabaranov/go-openai v1.35.7 h1:icyrRbkYoKPa4rbO1WSInpJu3qDQrPEnsoJVZ6QymdI= github.com/sashabaranov/go-openai v1.35.7/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -528,6 +573,8 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v4 v4.24.6 h1:9qqCSYF2pgOU+t+NgJtp7Co5+5mHF/HyKBUckySQL64= github.com/shirou/gopsutil/v4 v4.24.6/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= 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/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -540,13 +587,24 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +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.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= 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.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/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.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -555,8 +613,11 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e h1:PtWT87weP5LWHEY//SWsYkSO3RWRZo4OSWagh3YD2vQ= github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e/go.mod h1:XrBNfAFN+pwoWuksbFS9Ccxnopa15zJGgXRFN90l3K4= github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 h1:Gzfnfk2TWrk8Jj4P4c1a3CtQyMaTVCznlkLZI++hok4= @@ -623,6 +684,8 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeonx/timeago v1.0.0-rc5 h1:pwcQGpaH3eLfPtXeyPA4DmHWjoQt0Ea7/++FwpxqLxg= +github.com/xeonx/timeago v1.0.0-rc5/go.mod h1:qDLrYEFynLO7y5Ho7w3GwgtYgpy5UfhcXIIQvMKVDkA= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -631,10 +694,18 @@ github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= +go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= @@ -645,16 +716,24 @@ go.opentelemetry.io/otel/log v0.7.0 h1:d1abJc0b1QQZADKvfe9JqqrfmPYQCz2tUSO+0XZmu go.opentelemetry.io/otel/log v0.7.0/go.mod h1:2jf2z7uVfnzDNknKTO9G+ahcOAyWcp1fJmk/wJjULRo= go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= +go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= +go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= +go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= 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.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -701,6 +780,7 @@ golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -775,13 +855,19 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= +google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= 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= @@ -793,6 +879,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -801,6 +889,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= diff --git a/pkg/common/config.default.yaml b/pkg/common/config.default.yaml index 07f1e197f..be49a54a8 100644 --- a/pkg/common/config.default.yaml +++ b/pkg/common/config.default.yaml @@ -192,13 +192,32 @@ worker: secretKey: test endpointURL: http://localstack:4566 cedana: # defaults - client: - leaveRunning: true - sharedStorage: - dumpStorageDir: /tmp/dump + # Can be unix, tcp, vsock + protocol: unix + address: /run/cedana.sock + log_level: debug + # Connection details to your cedana endpoint connection: - cedanaUrl: - cedanaAuthToken: + url: "" + auth_token: "" + checkpoint: + # Default dir to write/stream checkpoints to + dir: /data/checkpoints + # Can be one of: none, tar, lz4, gzip, zlib + compression: lz4 + # Parallelism for streaming checkpoints + # TODO: usable only in next release + # stream: 4 + db: + # Use remote DB on the cedana endpoint + remote: true + profiling: + # Receive profiling info in the gRPC trailer + enabled: false + precision: auto + criu: + # Keep the job running after checkpoint + leave_running: true providers: ec2: diff --git a/pkg/worker/cedana.go b/pkg/worker/cedana.go index 6f6f8024c..ad856f0e8 100644 --- a/pkg/worker/cedana.go +++ b/pkg/worker/cedana.go @@ -2,262 +2,151 @@ package worker import ( "context" + "encoding/json" "fmt" - "os" + "io" "os/exec" "path/filepath" "strings" - "time" - cedanagrpc "buf.build/gen/go/cedana/task/grpc/go/_gogrpc" - cedanaproto "buf.build/gen/go/cedana/task/protocolbuffers/go" + cedanadaemon "buf.build/gen/go/cedana/cedana/protocolbuffers/go/daemon" + cedanarunc "buf.build/gen/go/cedana/cedana/protocolbuffers/go/plugins/runc" common "github.com/beam-cloud/beta9/pkg/common" "github.com/beam-cloud/go-runc" - types "github.com/cedana/cedana/pkg/types" + cedana "github.com/cedana/cedana/pkg/client" + "github.com/cedana/cedana/pkg/config" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - - "github.com/opencontainers/runtime-spec/specs-go" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) const ( - runcRoot = "/run/runc" - cedanaHost = "0.0.0.0" - cedanaBinPath = "/usr/bin/cedana" - cedanaSharedLibPath = "/usr/local/lib/libcedana-gpu.so" - cedanaLogLevel = "info" - checkpointPathBase = "/tmp/checkpoints" - defaultManageDeadline = 10 * time.Second - defaultCheckpointDeadline = 10 * time.Minute - defaultRestoreDeadline = 5 * time.Minute - defaultHealthCheckDeadline = 30 * time.Second - cedanaUseRemoteDB = true // Do not change, or migrations across workers will fail + fullHealthCheck = true + runcRoot = "/run/runc" ) type CedanaClient struct { - conn *grpc.ClientConn - service cedanagrpc.TaskServiceClient - daemon *exec.Cmd - config types.Config + *cedana.Client } -func NewCedanaClient( +func InitializeCedana( ctx context.Context, - config types.Config, - gpuEnabled bool, -) (*CedanaClient, error) { - var opts []grpc.DialOption - opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) - - port, err := getRandomFreePort() + c config.Config, +) (*cedana.Client, error) { + path, err := exec.LookPath("cedana") if err != nil { - return nil, err + return nil, fmt.Errorf("cedana binary not found: %w", err) } - addr := fmt.Sprintf("%s:%d", cedanaHost, port) - taskConn, err := grpc.NewClient(addr, opts...) + // Apply the config globally + config.Global = c + + // Parse the config for the daemon + configJson, err := json.Marshal(c) if err != nil { - return nil, err + return nil, fmt.Errorf("incompatible config type: %w", err) } - taskClient := cedanagrpc.NewTaskServiceClient(taskConn) - - // Launch the daemon - daemon := exec.CommandContext(ctx, cedanaBinPath, "daemon", "start", - fmt.Sprintf("--port=%d", port), - fmt.Sprintf("--gpu-enabled=%t", gpuEnabled)) - - daemon.Stdout = &common.ZerologIOWriter{LogFn: func() *zerolog.Event { return log.Info().Str("operation", "cedana daemon start") }} - daemon.Stderr = &common.ZerologIOWriter{LogFn: func() *zerolog.Event { return log.Error().Str("operation", "cedana daemon start") }} + cmd := exec.CommandContext(ctx, path, "daemon", "start", fmt.Sprintf("--config=%s", configJson)) - // XXX: Set config using env until config JSON parsing is fixed - daemon.Env = append(os.Environ(), - fmt.Sprintf("CEDANA_LOG_LEVEL=%s", cedanaLogLevel), - fmt.Sprintf("CEDANA_CLIENT_LEAVE_RUNNING=%t", config.Client.LeaveRunning), - fmt.Sprintf("CEDANA_DUMP_STORAGE_DIR=%s", config.SharedStorage.DumpStorageDir), - fmt.Sprintf("CEDANA_URL=%s", config.Connection.CedanaUrl), - fmt.Sprintf("CEDANA_AUTH_TOKEN=%s", config.Connection.CedanaAuthToken), - fmt.Sprintf("CEDANA_REMOTE=%t", cedanaUseRemoteDB), - ) + cmd.Stdout = &common.ZerologIOWriter{LogFn: func() *zerolog.Event { return log.Info().Str("operation", "cedana daemon start") }} + cmd.Stderr = &common.ZerologIOWriter{LogFn: func() *zerolog.Event { return log.Error().Str("operation", "cedana daemon start") }} - err = daemon.Start() + err = cmd.Start() if err != nil { return nil, fmt.Errorf("failed to start cedana daemon: %v", err) } + client, err := cedana.New(c.Address, c.Protocol) + if err != nil { + return nil, fmt.Errorf("failed to create client: %w", err) + } + // Cleanup the daemon on exit go func() { - daemon.Wait() - taskConn.Close() + cmd.Wait() + client.Close() }() - client := &CedanaClient{ - service: taskClient, - conn: taskConn, - daemon: daemon, - config: config, - } - // Wait for the daemon to be ready, and do health check - details, err := client.DetailedHealthCheckWait(ctx) - if err != nil || len(details.UnhealthyReasons) > 0 { - defer daemon.Process.Kill() - defer taskConn.Close() - - if err != nil { - return nil, fmt.Errorf("cedana health check failed: %v", err) - } - - if len(details.UnhealthyReasons) > 0 { - return nil, fmt.Errorf( - "cedana health failed with reasons: %v", - details.UnhealthyReasons, - ) + resp, err := client.HealthCheck(ctx, &cedanadaemon.HealthCheckReq{Full: fullHealthCheck}, grpc.WaitForReady(true)) + errorsFound := false + for _, result := range resp.Results { + for _, component := range result.Components { + for _, errs := range component.Errors { + log.Error().Str("name", component.Name).Str("data", component.Data).Msgf("cedana health check error: %v", errs) + errorsFound = true + } + for _, warning := range component.Warnings { + log.Warn().Str("name", component.Name).Str("data", component.Data).Msgf("cedana health check warning: %v", warning) + } } } + if errorsFound { + return nil, fmt.Errorf("cedana health check failed") + } return client, nil } -func (c *CedanaClient) Close() { - c.conn.Close() - c.daemon.Process.Kill() -} - -// Updates the runc container spec to make the shared library available -// as well as the shared memory that is used for communication -func (c *CedanaClient) PrepareContainerSpec(spec *specs.Spec, containerId string, containerHostname string, gpuEnabled bool) error { - os.MkdirAll(checkpointSignalDir(containerId), os.ModePerm) // Add a mount point for the checkpoint signal file - - spec.Mounts = append(spec.Mounts, specs.Mount{ - Type: "bind", - Source: checkpointSignalDir(containerId), - Destination: "/cedana", - Options: []string{ - "rbind", - "rprivate", - "nosuid", - "nodev", +// Spawn a runc container using cedana, creating a 'job' in cedana +func (c *CedanaClient) Run(ctx context.Context, containerId string, bundle string, gpuEnabled bool, runcOpts *runc.CreateOpts) (int, error) { + // If config path provided directly, derive bundle from it + if runcOpts.ConfigPath != "" { + bundle = strings.TrimRight(runcOpts.ConfigPath, filepath.Base(runcOpts.ConfigPath)) + } + + args := &cedanadaemon.RunReq{ + Action: cedanadaemon.RunAction_START_NEW, + JID: containerId, // just use containerId for convenience + GPUEnabled: gpuEnabled, + Attachable: true, + Type: "runc", + Details: &cedanadaemon.Details{ + Runc: &cedanarunc.Runc{ + ID: containerId, + Bundle: bundle, + Root: runcRoot, + }, }, - }) - - containerIdPath := filepath.Join(checkpointSignalDir(containerId), checkpointContainerIdFileName) - err := os.WriteFile(containerIdPath, []byte(containerId), 0644) - if err != nil { - return err } - containerHostnamePath := filepath.Join(checkpointSignalDir(containerId), checkpointContainerHostnameFileName) - err = os.WriteFile(containerHostnamePath, []byte(containerHostname), 0644) + resp, profilingData, err := c.Client.Run(ctx, args) if err != nil { - return err - } - - if !gpuEnabled { - return nil // No need to do anything else if GPU is not enabled - } - - // First check if shared library is on worker - if _, err := os.Stat(cedanaSharedLibPath); os.IsNotExist(err) { - return fmt.Errorf( - "%s not found on worker. Was the daemon started with GPU enabled?", - cedanaSharedLibPath, - ) + return -1, fmt.Errorf("failed to run runc container: %w", err) } - // Remove nvidia prestart hook as we don't need actual device mounts - spec.Hooks.Prestart = nil + _ = profilingData - // Add shared memory mount from worker instead, remove existing /dev/shm mount - for i, m := range spec.Mounts { - if m.Destination == "/dev/shm" { - spec.Mounts = append(spec.Mounts[:i], spec.Mounts[i+1:]...) - break - } + _, stdout, stderr, exitCode, errors, err := c.AttachIO(ctx, &cedanadaemon.AttachReq{PID: resp.PID}) + if err != nil { + return -1, fmt.Errorf("failed to attach to runc container: %w", err) } - // Add shared memory mount from worker - spec.Mounts = append(spec.Mounts, specs.Mount{ - Destination: "/dev/shm", - Source: "/dev/shm", - Type: "bind", - Options: []string{ - "rbind", - "rprivate", - "nosuid", - "nodev", - "rw", - }, - }) - - // Add the shared library to the container - spec.Mounts = append(spec.Mounts, specs.Mount{ - Destination: cedanaSharedLibPath, - Source: cedanaSharedLibPath, - Type: "bind", - Options: []string{ - "rbind", - "rprivate", - "nosuid", - "nodev", - "rw", - }, - }) + go io.Copy(runcOpts.OutputWriter, stdout) + go io.Copy(runcOpts.OutputWriter, stderr) - // XXX: Remove /usr/lib/worker/x86_64-linux-gnu from mounts - for i, m := range spec.Mounts { - if m.Destination == "/usr/lib/worker/x86_64-linux-gnu" { - spec.Mounts = append(spec.Mounts[:i], spec.Mounts[i+1:]...) - break - } + if err := <-errors; err != nil { + return -1, err } - spec.Process.Env = append(spec.Process.Env, "CEDANA_JID="+containerId, "LD_PRELOAD="+cedanaSharedLibPath) - return nil -} - -// Start managing a runc container -func (c *CedanaClient) Manage(ctx context.Context, containerId string, gpuEnabled bool) error { - ctx, cancel := context.WithTimeout(ctx, defaultManageDeadline) - defer cancel() - - args := &cedanaproto.RuncManageArgs{ - ContainerID: containerId, - GPU: gpuEnabled, - Root: runcRoot, - } - _, err := c.service.RuncManage(ctx, args) - if err != nil { - return err - } - return nil + return <-exitCode, nil } -// Checkpoint a runc container, returns the path to the checkpoint func (c *CedanaClient) Checkpoint(ctx context.Context, containerId string) (string, error) { - ctx, cancel := context.WithTimeout(ctx, defaultCheckpointDeadline) - defer cancel() - - args := cedanaproto.JobDumpArgs{ - JID: containerId, - CriuOpts: &cedanaproto.CriuOpts{ - TcpClose: true, - TcpEstablished: true, - LeaveRunning: true, - TcpSkipInFlight: true, - }, - Dir: fmt.Sprintf("%s/%s", checkpointPathBase, containerId), + args := &cedanadaemon.DumpReq{ + Name: containerId, + Type: "job", + Details: &cedanadaemon.Details{JID: &containerId}, } - res, err := c.service.JobDump(ctx, &args) + + resp, profilingData, err := c.Client.Dump(ctx, args) if err != nil { - return "", err + return "", fmt.Errorf("failed to dump runc container: %w", err) } + _ = profilingData - log.Info().Str("container_id", containerId).Interface("dump_stats", res.GetDumpStats()).Msg("dump stats") - return res.GetState().GetCheckpointPath(), nil + return resp.Path, nil } type cedanaRestoreOpts struct { @@ -267,17 +156,7 @@ type cedanaRestoreOpts struct { cacheFunc func(string, string) (string, error) } -// Restore a runc container. If a checkpoint path is provided, it will be used as the checkpoint. -// If empty path is provided, the latest checkpoint path from DB will be used. -func (c *CedanaClient) Restore( - ctx context.Context, - restoreOpts cedanaRestoreOpts, - runcOpts *runc.CreateOpts, -) (*cedanaproto.ProcessState, error) { - ctx, cancel := context.WithTimeout(ctx, defaultCheckpointDeadline) - defer cancel() - - // NOTE: Cedana uses bundle path to find the config.json +func (c *CedanaClient) Restore(ctx context.Context, restoreOpts *cedanaRestoreOpts, runcOpts *runc.CreateOpts) (int, error) { bundle := strings.TrimRight(runcOpts.ConfigPath, filepath.Base(runcOpts.ConfigPath)) // If a cache function is provided, attempt to cache the checkpoint nearby @@ -291,46 +170,38 @@ func (c *CedanaClient) Restore( } } - args := &cedanaproto.JobRestoreArgs{ - JID: restoreOpts.jobId, - RuncOpts: &cedanaproto.RuncOpts{ - Root: runcRoot, - Bundle: bundle, - Detach: true, - ConsoleSocket: runcOpts.ConsoleSocket.Path(), - ContainerID: restoreOpts.containerId, + args := &cedanadaemon.RestoreReq{ + Path: restoreOpts.checkpointPath, + Type: "job", + Attachable: true, + Details: &cedanadaemon.Details{ + JID: &restoreOpts.jobId, + Runc: &cedanarunc.Runc{ + ID: restoreOpts.containerId, + Bundle: bundle, + Root: runcRoot, + }, }, - CriuOpts: &cedanaproto.CriuOpts{TcpClose: true, TcpEstablished: true}, - CheckpointPath: restoreOpts.checkpointPath, } - res, err := c.service.JobRestore(ctx, args) + + resp, profilingData, err := c.Client.Restore(ctx, args) if err != nil { - return nil, err + return -1, fmt.Errorf("failed to restore runc container: %w", err) } - log.Info().Str("container_id", restoreOpts.containerId).Interface("restore_stats", res.GetRestoreStats()).Msg("restore stats") + _ = profilingData - if runcOpts.Started != nil { - runcOpts.Started <- int(res.GetState().GetPID()) + _, stdout, stderr, exitCode, errors, err := c.AttachIO(ctx, &cedanadaemon.AttachReq{PID: resp.PID}) + if err != nil { + return -1, fmt.Errorf("failed to attach to runc container: %w", err) } - return res.State, nil -} - -// Perform a detailed health check of cedana C/R capabilities -func (c *CedanaClient) DetailedHealthCheckWait( - ctx context.Context, -) (*cedanaproto.DetailedHealthCheckResponse, error) { - ctx, cancel := context.WithTimeout(ctx, defaultHealthCheckDeadline) - defer cancel() + go io.Copy(runcOpts.OutputWriter, stdout) + go io.Copy(runcOpts.OutputWriter, stderr) - opts := []grpc.CallOption{} - opts = append(opts, grpc.WaitForReady(true)) - - res, err := c.service.DetailedHealthCheck(ctx, &cedanaproto.DetailedHealthCheckRequest{}, opts...) - if err != nil { - return nil, err + if err := <-errors; err != nil { + return -1, err } - return res, nil + return <-exitCode, nil } diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index 6c0f709c7..13ea1684f 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -16,6 +16,7 @@ import ( "github.com/opencontainers/runtime-spec/specs-go" "github.com/rs/zerolog/log" + cedana "github.com/cedana/cedana/pkg/client" common "github.com/beam-cloud/beta9/pkg/common" repo "github.com/beam-cloud/beta9/pkg/repository" "github.com/beam-cloud/beta9/pkg/storage" @@ -41,7 +42,7 @@ type Worker struct { imageMountPath string runcHandle runc.Runc runcServer *RunCServer - cedanaClient *CedanaClient + cedanaClient *cedana.Client fileCacheManager *FileCacheManager containerNetworkManager *ContainerNetworkManager containerCudaManager GPUManager @@ -158,10 +159,10 @@ func NewWorker() (*Worker, error) { return nil, err } - var cedanaClient *CedanaClient = nil + var cedanaClient *cedana.Client = nil var checkpointStorage storage.Storage = nil if pool, ok := config.Worker.Pools[workerPoolName]; ok && pool.CRIUEnabled { - cedanaClient, err = NewCedanaClient(context.Background(), config.Worker.CRIU.Cedana, gpuType != "") + cedanaClient, err = InitializeCedana(context.Background(), config.Worker.CRIU.Cedana) if err != nil { log.Warn().Str("worker_id", workerId).Msgf("C/R unavailable, failed to create cedana client: %v", err) } From f1d72578340e711171cd66ee0c3e0678cff03302 Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Fri, 24 Jan 2025 14:23:30 -0500 Subject: [PATCH 02/10] Fix build errors --- go.mod | 13 +-------- go.sum | 65 ++++------------------------------------- pkg/worker/cedana.go | 18 ++++++------ pkg/worker/cr.go | 21 ++++--------- pkg/worker/lifecycle.go | 18 +++--------- pkg/worker/worker.go | 5 ++-- 6 files changed, 26 insertions(+), 114 deletions(-) diff --git a/go.mod b/go.mod index 3605c74d4..6f50fb6fb 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.23.0 toolchain go1.23.5 require ( + buf.build/gen/go/cedana/cedana/protocolbuffers/go v1.36.3-20250123222419-64bf8384f939.1 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Masterminds/squirrel v1.5.4 github.com/alicebob/miniredis/v2 v2.30.5 @@ -87,10 +88,7 @@ require ( ) require ( - buf.build/gen/go/cedana/cedana-gpu/grpc/go v1.5.1-00000000000000-6f030530e3d9.2 // indirect - buf.build/gen/go/cedana/cedana-gpu/protocolbuffers/go v1.36.3-00000000000000-6f030530e3d9.1 // indirect buf.build/gen/go/cedana/cedana/grpc/go v1.5.1-20250123222419-64bf8384f939.2 // indirect - buf.build/gen/go/cedana/cedana/protocolbuffers/go v1.36.3-20250123222419-64bf8384f939.1 // indirect buf.build/gen/go/cedana/criu/protocolbuffers/go v1.36.3-20250123222419-6ed7871347d0.1 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdamKorcz/go-fuzz-headers v0.0.0-20210312213058-32f4d319f0d2 // indirect @@ -121,7 +119,6 @@ require ( github.com/briandowns/spinner v1.23.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cilium/ebpf v0.16.0 // indirect github.com/coder/websocket v1.8.12 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/cyphar/filepath-securejoin v0.3.5 // indirect @@ -132,7 +129,6 @@ require ( github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/digitalocean/go-smbios v0.0.0-20180907143718-390a4f403a8e // indirect github.com/djherbis/atime v1.1.0 // indirect - github.com/docker/docker v27.2.0+incompatible // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -192,7 +188,6 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/mattn/go-sqlite3 v1.14.24 // indirect github.com/mdlayher/genetlink v1.3.2 // indirect github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/sdnotify v1.0.0 // indirect @@ -226,9 +221,7 @@ require ( github.com/prometheus-community/pro-bing v0.4.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.53.0 // indirect - github.com/rb-go/namegen v1.1.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rootless-containers/proto v0.1.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/safchain/ethtool v0.4.0 // indirect @@ -236,7 +229,6 @@ require ( github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect @@ -253,7 +245,6 @@ require ( github.com/tailscale/peercred v0.0.0-20240214030740-b535050b2aa4 // indirect github.com/tailscale/web-client-prebuilt v0.0.0-20240226180453-5db17b287bf1 // indirect github.com/tailscale/wireguard-go v0.0.0-20240731203015-71393c576b98 // indirect - github.com/tchap/go-patricia v2.3.0+incompatible // indirect github.com/tcnksm/go-httpstat v0.2.0 // indirect github.com/tidwall/btree v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -265,7 +256,6 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vbatts/go-mtree v0.5.0 // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/xeonx/timeago v1.0.0-rc5 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/yuin/gopher-lua v1.1.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect @@ -292,7 +282,6 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/go.sum b/go.sum index af1bfa49c..1d574f5bd 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,9 @@ -buf.build/gen/go/cedana/cedana-gpu/grpc/go v1.5.1-00000000000000-6f030530e3d9.2 h1:MGpWxWtn2AvjNUTNUcMy28suVQGVE420uPMx+ttFGpU= -buf.build/gen/go/cedana/cedana-gpu/grpc/go v1.5.1-00000000000000-6f030530e3d9.2/go.mod h1:66lazxgMJ/X1yUlQiZJs8xjIh2k8hSVl9lJYzqesAck= -buf.build/gen/go/cedana/cedana-gpu/protocolbuffers/go v1.36.3-00000000000000-6f030530e3d9.1 h1:CuqljsPrTo/yFPuc8cUAbu2tHMWLh8ufNUOTeVKmckQ= -buf.build/gen/go/cedana/cedana-gpu/protocolbuffers/go v1.36.3-00000000000000-6f030530e3d9.1/go.mod h1:RoDVyq9Z0G9myjkZI2oQk90AOR/lBBesb+MoxMBcOiw= buf.build/gen/go/cedana/cedana/grpc/go v1.5.1-20250123222419-64bf8384f939.2 h1:Zw9aEmuLp3J95SoJRzO14KFK4/iDsAIaeuBl/EwchgI= buf.build/gen/go/cedana/cedana/grpc/go v1.5.1-20250123222419-64bf8384f939.2/go.mod h1:LRuWA5Ue691K2WNiZxuIkjkMbRleOQiG4xOzd5oXHCU= buf.build/gen/go/cedana/cedana/protocolbuffers/go v1.36.3-20250123222419-64bf8384f939.1 h1:VQZx7YpA+sGCx6+OXHUDz0k0XaWh+yrTlk8fR2Hl/aU= buf.build/gen/go/cedana/cedana/protocolbuffers/go v1.36.3-20250123222419-64bf8384f939.1/go.mod h1:8V7MaxrApVmbeo/griPsEpYqZg/oM8YtAk82IIm0HY8= buf.build/gen/go/cedana/criu/protocolbuffers/go v1.36.3-20250123222419-6ed7871347d0.1 h1:W+aj4R10spaBdKDdWrL39gCf3RdAqtmxthdONBBQRJ4= buf.build/gen/go/cedana/criu/protocolbuffers/go v1.36.3-20250123222419-6ed7871347d0.1/go.mod h1:SdiN7y9upUiOum1wTo2CQm1HoN88y/WCgjHc6CkOfXc= -buf.build/gen/go/cedana/gpu/protocolbuffers/go v1.35.2-20241203191352-2167379de17d.1 h1:AxyPWWT4YGmLs8RduxavZi3acD+WGXXr2r7oJP2EBQQ= -buf.build/gen/go/cedana/gpu/protocolbuffers/go v1.35.2-20241203191352-2167379de17d.1/go.mod h1:14P29lBGPpmKBTOhetR/D806Xraxf+f7Zw9nwaWSOmo= -buf.build/gen/go/cedana/task/grpc/go v1.5.1-20241203191352-12c25eb032cd.1 h1:qTCCRcSFwS7IIKeBtSSOgaZVSsH3T7V0sSRKFAGrPds= -buf.build/gen/go/cedana/task/grpc/go v1.5.1-20241203191352-12c25eb032cd.1/go.mod h1:hvCGPsk+cZoAyajPC1bH9AksIXACSO+VTqKHGZ4AIqE= -buf.build/gen/go/cedana/task/protocolbuffers/go v1.35.2-20241203191352-12c25eb032cd.1 h1:6XRJodc0kzDvlBuZbq6/q1eOypH6NarL86rLD/QZkGA= -buf.build/gen/go/cedana/task/protocolbuffers/go v1.35.2-20241203191352-12c25eb032cd.1/go.mod h1:PrKt+vnu69Ffpw8c3G4gr8CqzL0uBbQ9QjwL4qEusCU= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= @@ -22,9 +12,8 @@ filippo.io/mkcert v1.4.4/go.mod h1:VyvOchVuAye3BoUsPUOOofKygVwLV2KQMVFJNRq+1dA= github.com/AdamKorcz/go-fuzz-headers v0.0.0-20210312213058-32f4d319f0d2 h1:dIxAd7URQa+ovSiQURY3UJu8Q7A2dG7QKTlxOlvDZHI= github.com/AdamKorcz/go-fuzz-headers v0.0.0-20210312213058-32f4d319f0d2/go.mod h1:VPevheIvXETHZT/ddjwarP3POR5p/cnH9Hy5yoFnQjc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= @@ -117,8 +106,6 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/bsm/redislock v0.9.4 h1:X/Wse1DPpiQgHbVYRE9zv6m070UcKoOGekgvpNhiSvw= github.com/bsm/redislock v0.9.4/go.mod h1:Epf7AJLiSFwLCiZcfi6pWFO/8eAYrYpQXFxEDPoDeAk= -github.com/cedana/cedana v0.9.234 h1:sH9F3unNC9fPl/TOzePFqlb05Pudr/wV0yTQgLGm7lc= -github.com/cedana/cedana v0.9.234/go.mod h1:dAynzssinqVeyy1GTw8WYDwEeIVTLOzQx0qA5/D0Tu4= github.com/cedana/cedana v0.9.237-pre h1:1+/zkYsWfpfR0ZTbb8+l0zP1UuPh+OxMsrwzNx+AJEA= github.com/cedana/cedana v0.9.237-pre/go.mod h1:jOeO7RVA03ZDXO6kbQev2TmgJI2chomtg7cOW1azftQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -152,8 +139,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.23 h1:4M6+isWdcStXEf15G/RbrMPOQj1dZ7HPZCGwE4kOeP0= github.com/creack/pty v1.1.23/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.5 h1:L81NHjquoQmcPgXcttUS9qTSR/+bXry6pbSINQGpjj4= github.com/cyphar/filepath-securejoin v0.3.5/go.mod h1:edhVd3c6OXKjUmSrVa/tGJRS9joFTxlslFCAyaxigkE= 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= @@ -175,8 +161,6 @@ github.com/djherbis/atime v1.1.0 h1:rgwVbP/5by8BvvjBNrbh64Qz33idKT3pSnMSJsxhi0g= github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= -github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= -github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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= @@ -298,12 +282,11 @@ github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kX github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hanwen/go-fuse/v2 v2.5.1 h1:OQBE8zVemSocRxA4OaFJbjJ5hlpCmIWbGr7r0M4uoQQ= github.com/hanwen/go-fuse/v2 v2.5.1/go.mod h1:xKwi1cF7nXAOBCXujD5ie0ZKsxc8GGSA1rlMJc+8IJs= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -421,8 +404,6 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mdlayher/genetlink v1.3.2 h1:KdrNKe+CTu+IbZnm/GVUMXSqBBLqcGpRDa0xkQy56gw= @@ -492,8 +473,7 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.0.0-rc90/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.1.14 h1:rgSuzbmgz5DUJjeSnw337TxDbRuqjs6iqQck/2weR6w= -github.com/opencontainers/runc v1.1.14/go.mod h1:E4C2z+7BxR7GHXp0hAY53mek+x49X1LjPNeMTfRGvOA= +github.com/opencontainers/runc v1.2.3 h1:fxE7amCzfZflJO2lHXf4y/y8M1BoAqp+FVmG19oYB80= github.com/opencontainers/runc v1.2.3/go.mod h1:nSxcWUydXrsBZVYNSkTjoQ/N6rcyTtn+1SD5D4+kRIM= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= @@ -538,8 +518,6 @@ github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+a github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rb-go/namegen v1.1.0 h1:AmVdO2kM7ayaTRjpBSqKILAnT1xC4sKD01spJ7qnGbA= -github.com/rb-go/namegen v1.1.0/go.mod h1:whb/fzz/7xbi6EgHw/zOqPS150h2efUptbJh1XFGyhA= github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= @@ -571,14 +549,8 @@ github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08O github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v4 v4.24.6 h1:9qqCSYF2pgOU+t+NgJtp7Co5+5mHF/HyKBUckySQL64= -github.com/shirou/gopsutil/v4 v4.24.6/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= -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/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -642,8 +614,6 @@ github.com/tailscale/xnet v0.0.0-20240729143630-8497ac4dab2e h1:zOGKqN5D5hHhiYUp github.com/tailscale/xnet v0.0.0-20240729143630-8497ac4dab2e/go.mod h1:orPd6JZXXRyuDusYilywte7k094d7dycXXU5YnWsrwg= github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA= github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk= -github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= -github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= @@ -684,8 +654,6 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xeonx/timeago v1.0.0-rc5 h1:pwcQGpaH3eLfPtXeyPA4DmHWjoQt0Ea7/++FwpxqLxg= -github.com/xeonx/timeago v1.0.0-rc5/go.mod h1:qDLrYEFynLO7y5Ho7w3GwgtYgpy5UfhcXIIQvMKVDkA= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -696,12 +664,8 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM= @@ -714,24 +678,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.31.0 h1:HZgBIps9wH0RDr go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.31.0/go.mod h1:RDRhvt6TDG0eIXmonAx5bd9IcwpqCkziwkOClzWKwAQ= go.opentelemetry.io/otel/log v0.7.0 h1:d1abJc0b1QQZADKvfe9JqqrfmPYQCz2tUSO+0XZmuV4= go.opentelemetry.io/otel/log v0.7.0/go.mod h1:2jf2z7uVfnzDNknKTO9G+ahcOAyWcp1fJmk/wJjULRo= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -778,8 +734,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -853,19 +808,13 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY= google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -877,8 +826,6 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 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.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -904,8 +851,6 @@ gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/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= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gvisor.dev/gvisor v0.0.0-20240722211153-64c016c92987 h1:TU8z2Lh3Bbq77w0t1eG8yRlLcNHzZu3x6mhoH2Mk0c8= gvisor.dev/gvisor v0.0.0-20240722211153-64c016c92987/go.mod h1:sxc3Uvk/vHcd3tj7/DHVBoR5wvWT/MmRq2pj7HRJnwU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/worker/cedana.go b/pkg/worker/cedana.go index ad856f0e8..c10f89400 100644 --- a/pkg/worker/cedana.go +++ b/pkg/worker/cedana.go @@ -26,13 +26,13 @@ const ( ) type CedanaClient struct { - *cedana.Client + client *cedana.Client } func InitializeCedana( ctx context.Context, c config.Config, -) (*cedana.Client, error) { +) (*CedanaClient, error) { path, err := exec.LookPath("cedana") if err != nil { return nil, fmt.Errorf("cedana binary not found: %w", err) @@ -86,7 +86,7 @@ func InitializeCedana( return nil, fmt.Errorf("cedana health check failed") } - return client, nil + return &CedanaClient{client: client}, nil } // Spawn a runc container using cedana, creating a 'job' in cedana @@ -111,14 +111,14 @@ func (c *CedanaClient) Run(ctx context.Context, containerId string, bundle strin }, } - resp, profilingData, err := c.Client.Run(ctx, args) + resp, profilingData, err := c.client.Run(ctx, args) if err != nil { return -1, fmt.Errorf("failed to run runc container: %w", err) } _ = profilingData - _, stdout, stderr, exitCode, errors, err := c.AttachIO(ctx, &cedanadaemon.AttachReq{PID: resp.PID}) + _, stdout, stderr, exitCode, errors, err := c.client.AttachIO(ctx, &cedanadaemon.AttachReq{PID: resp.PID}) if err != nil { return -1, fmt.Errorf("failed to attach to runc container: %w", err) } @@ -140,7 +140,7 @@ func (c *CedanaClient) Checkpoint(ctx context.Context, containerId string) (stri Details: &cedanadaemon.Details{JID: &containerId}, } - resp, profilingData, err := c.Client.Dump(ctx, args) + resp, profilingData, err := c.client.Dump(ctx, args) if err != nil { return "", fmt.Errorf("failed to dump runc container: %w", err) } @@ -156,7 +156,7 @@ type cedanaRestoreOpts struct { cacheFunc func(string, string) (string, error) } -func (c *CedanaClient) Restore(ctx context.Context, restoreOpts *cedanaRestoreOpts, runcOpts *runc.CreateOpts) (int, error) { +func (c *CedanaClient) Restore(ctx context.Context, restoreOpts cedanaRestoreOpts, runcOpts *runc.CreateOpts) (int, error) { bundle := strings.TrimRight(runcOpts.ConfigPath, filepath.Base(runcOpts.ConfigPath)) // If a cache function is provided, attempt to cache the checkpoint nearby @@ -184,14 +184,14 @@ func (c *CedanaClient) Restore(ctx context.Context, restoreOpts *cedanaRestoreOp }, } - resp, profilingData, err := c.Client.Restore(ctx, args) + resp, profilingData, err := c.client.Restore(ctx, args) if err != nil { return -1, fmt.Errorf("failed to restore runc container: %w", err) } _ = profilingData - _, stdout, stderr, exitCode, errors, err := c.AttachIO(ctx, &cedanadaemon.AttachReq{PID: resp.PID}) + _, stdout, stderr, exitCode, errors, err := c.client.AttachIO(ctx, &cedanadaemon.AttachReq{PID: resp.PID}) if err != nil { return -1, fmt.Errorf("failed to attach to runc container: %w", err) } diff --git a/pkg/worker/cr.go b/pkg/worker/cr.go index 24722cc47..4a75df06f 100644 --- a/pkg/worker/cr.go +++ b/pkg/worker/cr.go @@ -4,6 +4,7 @@ import ( "context" _ "embed" "fmt" + "io" "log/slog" "os" "path/filepath" @@ -15,7 +16,9 @@ import ( "github.com/rs/zerolog/log" ) -func (s *Worker) attemptCheckpointOrRestore(ctx context.Context, request *types.ContainerRequest, consoleWriter *ConsoleWriter, startedChan chan int, configPath string) (bool, string, error) { +const defaultCheckpointDeadline = 10 * time.Minute + +func (s *Worker) attemptCheckpointOrRestore(ctx context.Context, request *types.ContainerRequest, outputWriter io.Writer, startedChan chan int, configPath string) (bool, string, error) { state, createCheckpoint := s.shouldCreateCheckpoint(request) // If checkpointing is enabled, attempt to create a checkpoint @@ -38,7 +41,7 @@ func (s *Worker) attemptCheckpointOrRestore(ctx context.Context, request *types. cacheFunc: s.cacheCheckpoint, }, &runc.CreateOpts{ Detach: true, - ConsoleSocket: consoleWriter, + OutputWriter: outputWriter, ConfigPath: configPath, Started: startedChan, }) @@ -68,8 +71,6 @@ func (s *Worker) createCheckpoint(ctx context.Context, request *types.ContainerR os.MkdirAll(filepath.Join(s.config.Worker.CRIU.Storage.MountPath, request.Workspace.Name), os.ModePerm) timeout := defaultCheckpointDeadline - managing := false - gpuEnabled := request.RequiresGPU() ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() @@ -89,18 +90,6 @@ waitForReady: continue } - // Start managing the container with Cedana - if !managing { - err := s.cedanaClient.Manage(ctx, instance.Id, gpuEnabled) - if err == nil { - managing = true - } else { - log.Error().Str("container_id", instance.Id).Msgf("cedana manage failed, container may not be started yet: %+v", err) - } - - continue - } - // Check if the container is ready for checkpoint by verifying the existence of a signal file readyFilePath := filepath.Join(checkpointSignalDir(instance.Id), checkpointSignalFileName) if _, err := os.Stat(readyFilePath); err == nil { diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index 4cd325cd3..a3510833f 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -297,7 +297,7 @@ func (s *Worker) specFromRequest(request *types.ContainerRequest, options *Conta spec.Process.Cwd = defaultContainerDirectory spec.Process.Args = request.EntryPoint - spec.Process.Terminal = true // NOTE: This is since we are using a console writer for logging + spec.Process.Terminal = false if s.config.Worker.RunCResourcesEnforced { spec.Linux.Resources.CPU = getLinuxCPU(request) @@ -328,12 +328,6 @@ func (s *Worker) specFromRequest(request *types.ContainerRequest, options *Conta spec.Hooks.Prestart = nil } - // We need to modify the spec to support Cedana C/R if enabled - if s.IsCRIUAvailable() && request.CheckpointEnabled { - containerHostname := fmt.Sprintf("%s:%d", s.podAddr, options.BindPort) - s.cedanaClient.PrepareContainerSpec(spec, request.ContainerId, containerHostname, request.RequiresGPU()) - } - spec.Process.Env = append(spec.Process.Env, env...) spec.Root.Readonly = false @@ -538,11 +532,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } - consoleWriter, err := NewConsoleWriter(containerInstance.OutputWriter) - if err != nil { - log.Error().Str("container_id", containerId).Msgf("failed to create console writer: %v", err) - return - } + outputWriter := containerInstance.OutputWriter // Log metrics go s.workerMetrics.EmitContainerUsage(ctx, request) @@ -553,7 +543,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output // Handle checkpoint creation & restore if applicable if s.IsCRIUAvailable() && request.CheckpointEnabled { - restored, restoredContainerId, err := s.attemptCheckpointOrRestore(ctx, request, consoleWriter, startedChan, configPath) + restored, restoredContainerId, err := s.attemptCheckpointOrRestore(ctx, request, outputWriter, startedChan, configPath) if err != nil { log.Error().Str("container_id", containerId).Msgf("C/R failed: %v", err) } @@ -576,7 +566,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output // Invoke runc process (launch the container) _, err = s.runcHandle.Run(s.ctx, containerId, opts.BundlePath, &runc.CreateOpts{ Detach: true, - ConsoleSocket: consoleWriter, + OutputWriter: outputWriter, ConfigPath: configPath, Started: startedChan, }) diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index 13ea1684f..3fad83f3e 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -16,7 +16,6 @@ import ( "github.com/opencontainers/runtime-spec/specs-go" "github.com/rs/zerolog/log" - cedana "github.com/cedana/cedana/pkg/client" common "github.com/beam-cloud/beta9/pkg/common" repo "github.com/beam-cloud/beta9/pkg/repository" "github.com/beam-cloud/beta9/pkg/storage" @@ -42,7 +41,7 @@ type Worker struct { imageMountPath string runcHandle runc.Runc runcServer *RunCServer - cedanaClient *cedana.Client + cedanaClient *CedanaClient fileCacheManager *FileCacheManager containerNetworkManager *ContainerNetworkManager containerCudaManager GPUManager @@ -159,7 +158,7 @@ func NewWorker() (*Worker, error) { return nil, err } - var cedanaClient *cedana.Client = nil + var cedanaClient *CedanaClient = nil var checkpointStorage storage.Storage = nil if pool, ok := config.Worker.Pools[workerPoolName]; ok && pool.CRIUEnabled { cedanaClient, err = InitializeCedana(context.Background(), config.Worker.CRIU.Cedana) From ef18cf91079b5184741ffa763d78dab24e34d12e Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Fri, 24 Jan 2025 14:27:28 -0500 Subject: [PATCH 03/10] Fix config comment --- pkg/common/config.default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/config.default.yaml b/pkg/common/config.default.yaml index be49a54a8..363b86249 100644 --- a/pkg/common/config.default.yaml +++ b/pkg/common/config.default.yaml @@ -205,7 +205,7 @@ worker: dir: /data/checkpoints # Can be one of: none, tar, lz4, gzip, zlib compression: lz4 - # Parallelism for streaming checkpoints + # Number of parallel streams for streaming checkpoints # TODO: usable only in next release # stream: 4 db: From 30cabde46565a86ffd56596339b5f0c9fbd7c8ea Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Fri, 24 Jan 2025 14:27:28 -0500 Subject: [PATCH 04/10] Fix build --- docker/Dockerfile.gateway | 2 +- docker/Dockerfile.worker | 2 +- pkg/types/config.go | 2 +- pkg/worker/runc_console.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/Dockerfile.gateway b/docker/Dockerfile.gateway index 515fe8389..43efc7df5 100644 --- a/docker/Dockerfile.gateway +++ b/docker/Dockerfile.gateway @@ -1,4 +1,4 @@ -FROM golang:1.22.10-bullseye AS base +FROM golang:1.23.5-bullseye AS base RUN apt-get update && \ apt-get install -y --no-install-recommends fuse3 diff --git a/docker/Dockerfile.worker b/docker/Dockerfile.worker index e15c76f9d..fc1fd287b 100644 --- a/docker/Dockerfile.worker +++ b/docker/Dockerfile.worker @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1.7-labs ARG BASE_STAGE=dev -FROM golang:1.22.10-bookworm AS golang +FROM golang:1.23.5-bookworm AS golang RUN apt-get update && apt-get install -y curl git diff --git a/pkg/types/config.go b/pkg/types/config.go index 1dd4b10ac..17074c95e 100644 --- a/pkg/types/config.go +++ b/pkg/types/config.go @@ -5,7 +5,7 @@ import ( "time" blobcache "github.com/beam-cloud/blobcache-v2/pkg" - cedana "github.com/cedana/cedana/pkg/types" + cedana "github.com/cedana/cedana/pkg/config" corev1 "k8s.io/api/core/v1" ) diff --git a/pkg/worker/runc_console.go b/pkg/worker/runc_console.go index 91ffbaa19..eb7e64c51 100644 --- a/pkg/worker/runc_console.go +++ b/pkg/worker/runc_console.go @@ -51,7 +51,7 @@ func NewConsoleWriter(writer io.Writer) (*ConsoleWriter, error) { defer socket.Close() // Get the master file descriptor from runC. - master, err := utils.RecvFd(socket) + master, err := utils.RecvFile(socket) if err != nil { return } From 60ee073993b3d3d56aac394d3c3ab55d3470f99a Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Fri, 24 Jan 2025 15:40:02 -0500 Subject: [PATCH 05/10] Clean up cedana & CRIU download in dockerfile --- docker/Dockerfile.worker | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/docker/Dockerfile.worker b/docker/Dockerfile.worker index fc1fd287b..567683ee3 100644 --- a/docker/Dockerfile.worker +++ b/docker/Dockerfile.worker @@ -120,38 +120,21 @@ RUN mkdir -p /etc/containers/registries.conf.d RUN curl -L https://raw.githubusercontent.com/containers/shortnames/refs/heads/main/shortnames.conf \ -o /etc/containers/registries.conf.d/shortnames.conf -# XXX: Remove once cedana starts shipping with a compatible binary +ARG CEDANA_VERSION=0.9.237-pre +ARG CEDANA_TOKEN +ARG CEDANA_BASE_URL RUN < Date: Fri, 24 Jan 2025 16:39:24 -0500 Subject: [PATCH 06/10] Revert gateway dockerfile --- docker/Dockerfile.gateway | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.gateway b/docker/Dockerfile.gateway index 43efc7df5..515fe8389 100644 --- a/docker/Dockerfile.gateway +++ b/docker/Dockerfile.gateway @@ -1,4 +1,4 @@ -FROM golang:1.23.5-bullseye AS base +FROM golang:1.22.10-bullseye AS base RUN apt-get update && \ apt-get install -y --no-install-recommends fuse3 From d438b7752c49741df57256a5aa17250580ab57fc Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Sat, 25 Jan 2025 18:54:27 -0500 Subject: [PATCH 07/10] Update golang version in gateway dockerfile --- docker/Dockerfile.gateway | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.gateway b/docker/Dockerfile.gateway index 515fe8389..43efc7df5 100644 --- a/docker/Dockerfile.gateway +++ b/docker/Dockerfile.gateway @@ -1,4 +1,4 @@ -FROM golang:1.22.10-bullseye AS base +FROM golang:1.23.5-bullseye AS base RUN apt-get update && \ apt-get install -y --no-install-recommends fuse3 From 134f3bb5d822daa3bed444f7d5cc1b3f46e3bdaf Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Tue, 28 Jan 2025 18:02:23 -0500 Subject: [PATCH 08/10] Fix C/R --- Makefile | 2 +- docker/Dockerfile.worker | 2 +- go.mod | 3 +- go.sum | 10 +++- pkg/common/config.default.yaml | 2 +- pkg/worker/cedana.go | 65 ++++++++++++++--------- pkg/worker/cr.go | 10 ++-- pkg/worker/lifecycle.go | 95 +++++++++++++++++++++++----------- 8 files changed, 124 insertions(+), 65 deletions(-) diff --git a/Makefile b/Makefile index 24bbb3a23..c39c704c6 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ gateway: docker push localhost:5001/beta9-gateway:$(tag) worker: - docker build . --target final --build-arg BASE_STAGE=dev -f ./docker/Dockerfile.worker -t localhost:5001/beta9-worker:$(workerTag) + docker build . --target final --build-arg BASE_STAGE=dev -f ./docker/Dockerfile.worker -t localhost:5001/beta9-worker:$(workerTag) --build-arg CEDANA_BASE_URL=$(CEDANA_URL) --build-arg CEDANA_TOKEN=$(CEDANA_AUTH_TOKEN) docker push localhost:5001/beta9-worker:$(workerTag) bin/delete_workers.sh diff --git a/docker/Dockerfile.worker b/docker/Dockerfile.worker index 567683ee3..907fa8700 100644 --- a/docker/Dockerfile.worker +++ b/docker/Dockerfile.worker @@ -120,7 +120,7 @@ RUN mkdir -p /etc/containers/registries.conf.d RUN curl -L https://raw.githubusercontent.com/containers/shortnames/refs/heads/main/shortnames.conf \ -o /etc/containers/registries.conf.d/shortnames.conf -ARG CEDANA_VERSION=0.9.237-pre +ARG CEDANA_VERSION=0.9.238-pre ARG CEDANA_TOKEN ARG CEDANA_BASE_URL RUN < Date: Tue, 28 Jan 2025 18:17:54 -0500 Subject: [PATCH 09/10] Update comment --- pkg/common/config.default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/config.default.yaml b/pkg/common/config.default.yaml index eca0f1c42..fd8fe5e6e 100644 --- a/pkg/common/config.default.yaml +++ b/pkg/common/config.default.yaml @@ -205,7 +205,7 @@ worker: dir: /data/checkpoints # Can be one of: none, tar, lz4, gzip, zlib compression: lz4 - # Number of parallel streams for streaming checkpoints + # Number of parallel streams for streaming checkpoints (0 = off) # TODO: usable only in next release # stream: 4 db: From 0f90204710876b7da4a658a662179d7fcbdf2d47 Mon Sep 17 00:00:00 2001 From: Yash Anand Date: Fri, 31 Jan 2025 16:09:05 -0500 Subject: [PATCH 10/10] Add back exception for mount --- pkg/worker/lifecycle.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index dd9e50c61..dfce3a8e4 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -347,6 +347,15 @@ func (s *Worker) specFromRequest(request *types.ContainerRequest, options *Conta }, }) + // XXX: Remove /usr/lib/worker/x86_64-linux-gnu from mounts + // as CRIU is unable to find its root mount + for i, m := range spec.Mounts { + if m.Destination == "/usr/lib/worker/x86_64-linux-gnu" { + spec.Mounts = append(spec.Mounts[:i], spec.Mounts[i+1:]...) + break + } + } + containerIdPath := filepath.Join(checkpointSignalDir(request.ContainerId), checkpointContainerIdFileName) err := os.WriteFile(containerIdPath, []byte(request.ContainerId), 0644) if err != nil {