From ea094ed0b61891fe49bc43b80d7e270a1cd746dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 04:24:27 +0000 Subject: [PATCH 01/31] chore(deps): bump github.com/spf13/viper from 1.17.0 to 1.18.1 (#2524) Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.17.0 to 1.18.1. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.17.0...v1.18.1) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> --- go.mod | 12 +-- go.sum | 333 +++------------------------------------------------------ 2 files changed, 22 insertions(+), 323 deletions(-) diff --git a/go.mod b/go.mod index ea0a47ec16..3998822016 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/redis/go-redis/v9 v9.3.0 github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.17.0 + github.com/spf13/viper v1.18.1 github.com/stretchr/testify v1.8.4 github.com/testcontainers/testcontainers-go v0.26.0 github.com/uber/jaeger-client-go v2.30.0+incompatible @@ -124,7 +124,7 @@ require ( github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-jose/go-jose/v3 v3.0.1 // indirect github.com/go-logr/logr v1.3.0 // indirect @@ -176,7 +176,7 @@ require ( github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sagikazarmark/locafero v0.3.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/segmentio/backo-go v1.0.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect @@ -185,8 +185,8 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect @@ -211,7 +211,7 @@ require ( golang.org/x/tools v0.15.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect nhooyr.io/websocket v1.8.7 // indirect diff --git a/go.sum b/go.sum index 76c17b2e54..76e7f5dcaa 100644 --- a/go.sum +++ b/go.sum @@ -1,50 +1,14 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cuelang.org/go v0.6.0 h1:dJhgKCog+FEZt7OwAYV1R+o/RZPmE8aqFoptmxSWyr8= cuelang.org/go v0.6.0/go.mod h1:9CxOX8aawrr3BgSdqPj7V0RYoXo7XIb+yDFC6uESrOQ= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= @@ -52,7 +16,6 @@ github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1r github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/HdrHistogram/hdrhistogram-go v0.9.0 h1:dpujRju0R4M/QZzcnR1LH1qm+TVG3UzkWdp5tH1WMcg= github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= @@ -142,8 +105,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= @@ -200,8 +161,6 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= @@ -209,12 +168,12 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= @@ -234,9 +193,6 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.10.0 h1:F0x3xXrAWmhwtzoCokU4IMPcBdncG+HAAqi9FcOOjbQ= github.com/go-git/go-git/v5 v5.10.0/go.mod h1:1FOZ/pQnqw24ghP2n7cunVl0ON55BsjPYvhWHvZGhoo= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v3 v3.0.1 h1:pWmKFVtt+Jl0vBZTIpz/eAKwsm6LkIxDVVbFHKkchhA= github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -283,45 +239,28 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-migrate/migrate/v4 v4.16.2 h1:8coYbMKUyInrFk1lfGfRovTLAW7PhWp8qQDT2iKfuoA= github.com/golang-migrate/migrate/v4 v4.16.2/go.mod h1:pfcJX4nPHaVdc5nmdCikFBWtm+UBpiZjRNNsyBbp0/o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -338,27 +277,11 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/csrf v1.7.2 h1:oTUjx0vyf2T+wkrx09Trsev1TE+/EbDAeHtSTbtC2eI= github.com/gorilla/csrf v1.7.2/go.mod h1:F1Fj3KG23WYHE6gozCmBAezKookxbIvUJT+121wTuLk= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= @@ -391,14 +314,11 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -451,8 +371,6 @@ github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXL github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= @@ -465,7 +383,6 @@ github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJw github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -597,7 +514,6 @@ github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFz github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -628,8 +544,8 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= -github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= +github.com/sagikazarmark/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/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= @@ -660,16 +576,16 @@ github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJC github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/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.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= -github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= +github.com/spf13/viper v1.18.1 h1:rmuU42rScKWlhhJDyXZRKJQHXFX02chSVW1IvkPGiVM= +github.com/spf13/viper v1.18.1/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= 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.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -729,21 +645,13 @@ github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEAB github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yquansah/libsql-client-go v0.0.0-20231017144447-34b2f2f84292 h1:LzG7bJfKeUfQWZZ5OjDVCR5q1Pq4iuPtsMPMF3OeyYs= github.com/yquansah/libsql-client-go v0.0.0-20231017144447-34b2f2f84292/go.mod h1:T+1lRvREkstNW7bmF1PTiDhV6hji0mrlfZkZuk/UPhw= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= @@ -793,57 +701,29 @@ go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= @@ -858,31 +738,12 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= @@ -900,26 +761,15 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -930,53 +780,28 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -993,7 +818,6 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1015,12 +839,9 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -1032,66 +853,24 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= @@ -1105,95 +884,26 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1201,11 +911,7 @@ google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -1247,16 +953,9 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= oras.land/oras-go/v2 v2.3.1 h1:lUC6q8RkeRReANEERLfH86iwGn55lbSWP20egdFHVec= oras.land/oras-go/v2 v2.3.1/go.mod h1:5AQXVEu1X/FKp1F9DMOb5ZItZBOa0y5dha0yCm4NR9c= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From b1ff2b856f53de8450f24fec4f23b1eb75653111 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 04:38:04 +0000 Subject: [PATCH 02/31] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 (#2525) Bumps [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) from 1.47.0 to 1.47.5. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.47.0...service/s3/v1.47.5) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/s3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 22 +++++++++++----------- go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 3998822016..cbcc19598b 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/Masterminds/squirrel v1.5.4 github.com/XSAM/otelsql v0.26.0 github.com/aws/aws-sdk-go-v2/config v1.25.11 - github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0 + github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 github.com/blang/semver/v4 v4.0.0 github.com/cenkalti/backoff/v4 v4.2.1 github.com/coreos/go-oidc/v3 v3.7.0 @@ -90,22 +90,22 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect - github.com/aws/aws-sdk-go-v2 v1.23.5 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.24.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.16.9 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.18.2 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.26.2 // indirect - github.com/aws/smithy-go v1.18.1 // indirect + github.com/aws/smithy-go v1.19.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 76e7f5dcaa..1fd585f5ee 100644 --- a/go.sum +++ b/go.sum @@ -42,42 +42,42 @@ github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go-v2 v1.23.5 h1:xK6C4udTyDMd82RFvNkDQxtAd00xlzFUtX4fF2nMZyg= -github.com/aws/aws-sdk-go-v2 v1.23.5/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2 h1:1oGZAnpWWnJgPPWC07RrXt2Ah0qbfbzP466aruiX8pk= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2/go.mod h1:XBiFjNGW7x9HG45+j5YGxEcN83ORvTNbzE54kNDJuYo= +github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk= +github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= github.com/aws/aws-sdk-go-v2/config v1.25.11 h1:RWzp7jhPRliIcACefGkKp03L0Yofmd2p8M25kbiyvno= github.com/aws/aws-sdk-go-v2/config v1.25.11/go.mod h1:BVUs0chMdygHsQtvaMyEOpW2GIW+ubrxJLgIz/JU29s= github.com/aws/aws-sdk-go-v2/credentials v1.16.9 h1:LQo3MUIOzod9JdUK+wxmSdgzLVYUbII3jXn3S/HJZU0= github.com/aws/aws-sdk-go-v2/credentials v1.16.9/go.mod h1:R7mDuIJoCjH6TxGUc/cylE7Lp/o0bhKVoxdBThsjqCM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 h1:FZVFahMyZle6WcogZCOxo6D/lkDA2lqKIn4/ueUmVXw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9/go.mod h1:kjq7REMIkxdtcEC9/4BVXjOsNY5isz6jQbEgk6osRTU= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 h1:8GVZIR0y6JRIUNSYI1xAMF4HDfV8H/bOsZ/8AD/uY5Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8/go.mod h1:rwBfu0SoUkBUZndVgPZKAD9Y2JigaZtRP68unRiYToQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 h1:ZE2ds/qeBkhk3yqYvS3CDCFNvd9ir5hMjlVStLZWrvM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8/go.mod h1:/lAPPymDYL023+TS6DJmjuL42nxix2AvEvfjqOBRODk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 h1:v+HbZaCGmOwnTTVS86Fleq0vPzOd7tnJGbFhP0stNLs= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9/go.mod h1:Xjqy+Nyj7VDLBtCMkQYOw1QYfAEZCVLrfI0ezve8wd4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrwK1SKFIJrA9pOJ5yu2eSHnmls= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6 h1:PwAdPhlij28U62OUi+WmxQ+9bO1efg6coxpE+sk00dg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6/go.mod h1:KRa2wmoEt38uXpnNKtORDswczZGl1hQNDrkfE6+LhnM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6 h1:eU9m+2vE8ILkr71WK5RJ2pysYngcKoN1Kv5kThuV6J4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6/go.mod h1:W8gOSyIsMgmaFnm+CkRHLz0skCyz9cS5SZlBalHkzII= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 h1:EamsKe+ZjkOQjDdHd86/JCEucjFKQ9T0atWKO4s2Lgs= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8/go.mod h1:Q0vV3/csTpbkfKLI5Sb56cJQTCTtJ0ixdb7P+Wedqiw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6 h1:GCW9ULjE7qIwzGPcoOnv4h4htx/XxWDy+WJevY30QcI= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6/go.mod h1:YqS77Hii1ITov+Tpf0CGkQdBJCm5L9Wo2C7fhask92M= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0 h1:7KZW8jwPTB/94/ghX8j+kw03zl2ftxDv7PGwA0l+6uw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0/go.mod h1:bL8ey+ugMUesj7F1tF8GJkq14i7qhIsSaCJshRWC3Og= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 h1:ugD6qzjYtB7zM5PN/ZIeaAIyefPaD82G8+SJopgvUpw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9/go.mod h1:YD0aYBWCrPENpHolhKw2XDlTIWae2GKXT1T4o6N6hiM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 h1:/90OR2XbSYfXucBMJ4U14wrjlfleq/0SB6dZDPncgmo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9/go.mod h1:dN/Of9/fNZet7UrQQ6kTDo/VSwKPIq94vjlU16bRARc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9/go.mod h1:idky4TER38YIjr2cADF1/ugFMKvZV7p//pVeV5LZbF0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 h1:iEAeF6YC3l4FzlJPP9H3Ko1TXpdjdqWffxXjp8SY6uk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9/go.mod h1:kjsXoK23q9Z/tLBrckZLLyvjhZoS+AGrzqzUfEClvMM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 h1:Keso8lIOS+IzI2MkPZyK6G0LYcK3My2LQ+T5bxghEAY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5/go.mod h1:vADO6Jn+Rq4nDtfwNjhgR84qkZwiC6FqCaXdw/kYwjA= github.com/aws/aws-sdk-go-v2/service/sso v1.18.2 h1:xJPydhNm0Hiqct5TVKEuHG7weC0+sOs4MUnd7A5n5F4= github.com/aws/aws-sdk-go-v2/service/sso v1.18.2/go.mod h1:zxk6y1X2KXThESWMS5CrKRvISD8mbIMab6nZrCGxDG0= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2 h1:8dU9zqA77C5egbU6yd4hFLaiIdPv3rU+6cp7sz5FjCU= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2/go.mod h1:7Lt5mjQ8x5rVdKqg+sKKDeuwoszDJIIPmkd8BVsEdS0= github.com/aws/aws-sdk-go-v2/service/sts v1.26.2 h1:fFrLsy08wEbAisqW3KDl/cPHrF43GmV79zXB9EwJiZw= github.com/aws/aws-sdk-go-v2/service/sts v1.26.2/go.mod h1:7Ld9eTqocTvJqqJ5K/orbSDwmGcpRdlDiLjz2DO+SL8= -github.com/aws/smithy-go v1.18.1 h1:pOdBTUfXNazOlxLrgeYalVnuTpKreACHtc62xLwIB3c= -github.com/aws/smithy-go v1.18.1/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= +github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= From cfe4d96faaa518973cdd1f0dec4dd445a9415fc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 13:17:41 +0000 Subject: [PATCH 03/31] chore(deps-dev): bump eslint from 8.51.0 to 8.55.0 in /ui (#2516) Bumps [eslint](https://github.com/eslint/eslint) from 8.51.0 to 8.55.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.51.0...v8.55.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> --- ui/package-lock.json | 116 ++++++++++++++++++++++++------------------- ui/package.json | 2 +- 2 files changed, 66 insertions(+), 52 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index b63887d230..ed1b8bc639 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -57,7 +57,7 @@ "@typescript-eslint/parser": "^5.62.0", "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.16", - "eslint": "^8.51.0", + "eslint": "^8.55.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", @@ -2489,9 +2489,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2512,9 +2512,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2539,9 +2539,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2625,12 +2625,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -2652,9 +2652,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -4589,6 +4589,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vitejs/plugin-react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", @@ -6235,18 +6241,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -11179,9 +11186,9 @@ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -14741,9 +14748,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -14758,9 +14765,9 @@ }, "dependencies": { "globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -14775,9 +14782,9 @@ } }, "@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true }, "@fortawesome/fontawesome-common-types": { @@ -14833,12 +14840,12 @@ "requires": {} }, "@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" } @@ -14850,9 +14857,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -16274,6 +16281,12 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "@vitejs/plugin-react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", @@ -17475,18 +17488,19 @@ "dev": true }, "eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -20950,9 +20964,9 @@ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "pure-rand": { diff --git a/ui/package.json b/ui/package.json index f069c81b88..e746724148 100644 --- a/ui/package.json +++ b/ui/package.json @@ -61,7 +61,7 @@ "@typescript-eslint/parser": "^5.62.0", "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.16", - "eslint": "^8.51.0", + "eslint": "^8.55.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", From 490affb0112cdd9a696bd6dc84fc1619f7ce61cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 13:32:40 +0000 Subject: [PATCH 04/31] chore(deps-dev): bump prettier-plugin-organize-imports in /ui (#2517) Bumps [prettier-plugin-organize-imports](https://github.com/simonhaenisch/prettier-plugin-organize-imports) from 3.2.3 to 3.2.4. - [Release notes](https://github.com/simonhaenisch/prettier-plugin-organize-imports/releases) - [Commits](https://github.com/simonhaenisch/prettier-plugin-organize-imports/compare/v3.2.3...v3.2.4) --- updated-dependencies: - dependency-name: prettier-plugin-organize-imports dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 14 +++++++------- ui/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index ed1b8bc639..50c4b480a4 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -79,7 +79,7 @@ "playwright": "^1.40.1", "postcss": "^8.4.31", "prettier": "^2.8.8", - "prettier-plugin-organize-imports": "^3.2.3", + "prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-tailwindcss": "^0.4.1", "tailwindcss": "^3.3.5", "tailwindcss-bg-patterns": "^0.2.0", @@ -11023,9 +11023,9 @@ } }, "node_modules/prettier-plugin-organize-imports": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.3.tgz", - "integrity": "sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz", + "integrity": "sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==", "dev": true, "peerDependencies": { "@volar/vue-language-plugin-pug": "^1.0.4", @@ -20894,9 +20894,9 @@ } }, "prettier-plugin-organize-imports": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.3.tgz", - "integrity": "sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz", + "integrity": "sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==", "dev": true, "requires": {} }, diff --git a/ui/package.json b/ui/package.json index e746724148..c590cb6fac 100644 --- a/ui/package.json +++ b/ui/package.json @@ -83,7 +83,7 @@ "playwright": "^1.40.1", "postcss": "^8.4.31", "prettier": "^2.8.8", - "prettier-plugin-organize-imports": "^3.2.3", + "prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-tailwindcss": "^0.4.1", "tailwindcss": "^3.3.5", "tailwindcss-bg-patterns": "^0.2.0", From 0df471e36516e66bdd1131e173097d0669cfb8c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 13:46:01 +0000 Subject: [PATCH 05/31] chore(deps-dev): bump @types/node from 18.18.7 to 18.19.3 in /ui (#2518) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.18.7 to 18.19.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 14 +++++++------- ui/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 50c4b480a4..d636273827 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -47,7 +47,7 @@ "@types/jest": "^29.5.10", "@types/loadable__component": "^5.13.7", "@types/lodash": "^4.14.202", - "@types/node": "^18.18.7", + "@types/node": "^18.19.3", "@types/react": "^18.2.41", "@types/react-dom": "^18.2.17", "@types/react-helmet": "^6.1.8", @@ -3821,9 +3821,9 @@ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" }, "node_modules/@types/node": { - "version": "18.18.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.7.tgz", - "integrity": "sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ==", + "version": "18.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", + "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", "devOptional": true, "dependencies": { "undici-types": "~5.26.4" @@ -15766,9 +15766,9 @@ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" }, "@types/node": { - "version": "18.18.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.7.tgz", - "integrity": "sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ==", + "version": "18.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", + "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", "devOptional": true, "requires": { "undici-types": "~5.26.4" diff --git a/ui/package.json b/ui/package.json index c590cb6fac..29c8ede664 100644 --- a/ui/package.json +++ b/ui/package.json @@ -51,7 +51,7 @@ "@types/jest": "^29.5.10", "@types/loadable__component": "^5.13.7", "@types/lodash": "^4.14.202", - "@types/node": "^18.18.7", + "@types/node": "^18.19.3", "@types/react": "^18.2.41", "@types/react-dom": "^18.2.17", "@types/react-helmet": "^6.1.8", From 5f855d237c601455833ac158ce4705561e510631 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 13:59:09 +0000 Subject: [PATCH 06/31] chore(deps-dev): bump @types/react-helmet from 6.1.8 to 6.1.11 in /ui (#2515) Bumps [@types/react-helmet](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-helmet) from 6.1.8 to 6.1.11. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-helmet) --- updated-dependencies: - dependency-name: "@types/react-helmet" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 14 +++++++------- ui/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index d636273827..c54755e772 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -50,7 +50,7 @@ "@types/node": "^18.19.3", "@types/react": "^18.2.41", "@types/react-dom": "^18.2.17", - "@types/react-helmet": "^6.1.8", + "@types/react-helmet": "^6.1.11", "@types/react-router-dom": "^5.3.3", "@types/uuid": "^9.0.7", "@typescript-eslint/eslint-plugin": "^5.62.0", @@ -3860,9 +3860,9 @@ } }, "node_modules/@types/react-helmet": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.8.tgz", - "integrity": "sha512-UyJFvbGWO8xKvfCPFTt/DG/vsgkMqyXbUQAa1pSPco1Whw85Z3ypMEqoHtCDfoW4Qu8XgJp63jyXEhOa4te5Kw==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", + "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", "dev": true, "dependencies": { "@types/react": "*" @@ -15805,9 +15805,9 @@ } }, "@types/react-helmet": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.8.tgz", - "integrity": "sha512-UyJFvbGWO8xKvfCPFTt/DG/vsgkMqyXbUQAa1pSPco1Whw85Z3ypMEqoHtCDfoW4Qu8XgJp63jyXEhOa4te5Kw==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", + "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", "dev": true, "requires": { "@types/react": "*" diff --git a/ui/package.json b/ui/package.json index 29c8ede664..2dfc7f2919 100644 --- a/ui/package.json +++ b/ui/package.json @@ -54,7 +54,7 @@ "@types/node": "^18.19.3", "@types/react": "^18.2.41", "@types/react-dom": "^18.2.17", - "@types/react-helmet": "^6.1.8", + "@types/react-helmet": "^6.1.11", "@types/react-router-dom": "^5.3.3", "@types/uuid": "^9.0.7", "@typescript-eslint/eslint-plugin": "^5.62.0", From be05a9324b0e6aeec0919a220b8d5f66bbfba10d Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Mon, 11 Dec 2023 16:57:59 +0200 Subject: [PATCH 07/31] fix(ui): remove h-screen from default for Loading component (#2527) --- ui/src/components/Loading.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/components/Loading.tsx b/ui/src/components/Loading.tsx index 61077af242..3e163f64a9 100644 --- a/ui/src/components/Loading.tsx +++ b/ui/src/components/Loading.tsx @@ -10,7 +10,7 @@ export default function Loading(props: LoadingProps) { return (
From 8ca1cc948cfbca1dbf86f5ec83f5d774b8ebf134 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Mon, 11 Dec 2023 10:33:26 -0500 Subject: [PATCH 08/31] feat(cli): silence usage on errors (#2512) --- cmd/flipt/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/flipt/main.go b/cmd/flipt/main.go index c37502a895..5417d9cf79 100644 --- a/cmd/flipt/main.go +++ b/cmd/flipt/main.go @@ -109,6 +109,7 @@ func exec() error { CompletionOptions: cobra.CompletionOptions{ DisableDefaultCmd: true, }, + SilenceUsage: true, } t = template.Must(template.New("banner").Parse(bannerTmpl)) From b7a7b86aaddf63f2122f864f8341b47b57b63020 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Mon, 11 Dec 2023 11:05:36 -0500 Subject: [PATCH 09/31] chore: prep for v1.33 release (#2528) * chore: prep for v1.33 release * chore: update Changelog --- CHANGELOG.md | 24 ++++++++++++++++ go.work.sum | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 723f901e90..b978dbdf66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,30 @@ This format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v1.33.0](https://github.com/flipt-io/flipt/releases/tag/v1.33.0) - 2023-12-11 + +### Added + +- `auth/github`: add organization membership check to GitHub (#2508) +- `ui`: allow setting page size for tables (#2503) +- use default config even on linux if no config found (#2496) +- `ui/console`: add copy as curl button (#2474) + +### Changed + +- `cli`: silence usage on error (#2512) +- `ui`: cleanup header; show user name and opt login in user dropdown (#2480) +- `ui`: replace classNames with clsx library (#2482) +- `ui`: use rtk for flags (#2478) +- `ui`: move namespaces to use redux rtk (#2472) +- rework tests for TLS options for git sources with self-signed certificates + +### Fixed + +- `ui`: remove h-screen from default for Loading component (#2527) +- `ui`: page api call could finish earlier that Layout api calls (#2506) +- dont show name/login section if only email (#2495) + ## [v1.32.0](https://github.com/flipt-io/flipt/releases/tag/v1.32.0) - 2023-11-29 ### Added diff --git a/go.work.sum b/go.work.sum index 0e3208d292..f22b027d7e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -120,6 +120,7 @@ cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfj cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= @@ -168,6 +169,7 @@ cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8B cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= @@ -197,6 +199,7 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v0.6.0/go.mod h1:BDJ5qMFKx9DugEg3+uQSDCdbYPr5s9vBTrL9P8TpqOU= github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/IBM/sarama v1.40.1/go.mod h1:+5OFwA5Du9I6QrznhaMHsuwWdWZNMjaBSIxEWEgKOYE= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= @@ -208,27 +211,40 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.34.0 h1:brux2dRrlwCF5JhTL7MUT3WUwo9zfDHZZp3+g3Mvlmo= github.com/aws/aws-sdk-go v1.34.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v1.23.2/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= github.com/aws/aws-sdk-go-v2 v1.23.3/go.mod h1:6wqGJPusLvL1YYcoxj4vPtACABVl0ydN1sxzBetRcsw= +github.com/aws/aws-sdk-go-v2 v1.23.5/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33/go.mod h1:84XgODVR8uRhmOnUkKGUZKqIMxmjmLOR8Uyp7G/TPwc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5/go.mod h1:pRvFacV2qbRKy34ZFptHZW4wpauJA445bqFbvA6ikSo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6/go.mod h1:d8JTl9EfMC8x7cWRUTOBNHTk/GJ9UsqdANQqAAMKo4s= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8/go.mod h1:rwBfu0SoUkBUZndVgPZKAD9Y2JigaZtRP68unRiYToQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5/go.mod h1:dO8Js7ym4Jzg/wcjTgCRVln/jFn3nI82XNhsG2lWbDI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.6/go.mod h1:9hhwbyCoH/tgJqXTVj/Ef0nGYJVr7+R/pfOx4OZ99KU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8/go.mod h1:/lAPPymDYL023+TS6DJmjuL42nxix2AvEvfjqOBRODk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.2/go.mod h1:IfJeNmXVQIpeR7LviG93t479TtAkBqF92cSnyy5yG1o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.5/go.mod h1:NlZuvlkyu6l/F3+qIBsGGtYLL2Z71tCf5NFoNAaG1NY= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.6/go.mod h1:ssHSTCS9CeO6QDbT5+2e6shPpZhzLNSwI5KvgH9rKdM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8/go.mod h1:Q0vV3/csTpbkfKLI5Sb56cJQTCTtJ0ixdb7P+Wedqiw= github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/aws/smithy-go v1.18.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.18.1/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= @@ -278,6 +294,8 @@ github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= @@ -285,7 +303,6 @@ github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrt github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= @@ -311,6 +328,7 @@ github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5 github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -318,11 +336,24 @@ github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NM github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= @@ -359,17 +390,24 @@ github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxA github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microsoft/go-mssqldb v1.0.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= @@ -383,18 +421,27 @@ github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7 github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= github.com/nats-io/nats.go v1.30.2/go.mod h1:dcfhUgmQNN4GJEfIb2f9R7Fow+gzBF4emzDHrVBd5qM= +github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= github.com/nats-io/nkeys v0.4.5/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= +github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/open-policy-agent/opa v0.42.2/go.mod h1:MrmoTi/BsKWT58kXlVayBb+rYVeaMwuBm3nYAN3923s= github.com/opencontainers/runtime-spec v1.1.0-rc.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170/go.mod h1:uQd4a7Rh3ZsVg5j0lNyAfyxIeGde9yrlhjF78GzeW0c= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/rabbitmq/amqp091-go v1.8.1/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= @@ -405,7 +452,10 @@ github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.15.0/go.mod h1:5rwNNax6Mlk9sZ40AcyVtiEw24Z4J04cfSioF2COKmc= +github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= @@ -420,6 +470,7 @@ github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7/go.mod github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho= github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -443,9 +494,13 @@ github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaD gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.29.0/go.mod h1:vHItvsnJtp7ES++nFLLFBzUWny7fJQSvTlxFcqQGUr4= @@ -453,12 +508,21 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1: go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= @@ -467,14 +531,23 @@ golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= @@ -482,6 +555,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go. google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f/go.mod h1:iIgEblxoG4klcXsG0d9cpoxJ4xndv6+1FkDROCHhPRI= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= From 6c4bb95ae16f6fefd36f5af8f0cc76111ef6a608 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 20:18:42 +0000 Subject: [PATCH 10/31] chore(deps): bump @fortawesome/free-brands-svg-icons from 6.4.2 to 6.5.1 in /ui (#2514) * chore(deps): bump @fortawesome/free-brands-svg-icons in /ui Bumps [@fortawesome/free-brands-svg-icons](https://github.com/FortAwesome/Font-Awesome) from 6.4.2 to 6.5.1. - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.4.2...6.5.1) --- updated-dependencies: - dependency-name: "@fortawesome/free-brands-svg-icons" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore(deps): bump @fortawesome/free-brands-svg-core to ^6.5.1 (#2530) --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> Co-authored-by: Roman Dmytrenko --- ui/package-lock.json | 48 ++++++++++++++++++++++---------------------- ui/package.json | 4 ++-- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index c54755e772..42750f550c 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -10,8 +10,8 @@ "dependencies": { "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^7.0.2", - "@fortawesome/fontawesome-svg-core": "^6.4.0", - "@fortawesome/free-brands-svg-icons": "^6.4.0", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.1", "@fortawesome/react-fontawesome": "^0.2.0", "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", @@ -2548,33 +2548,33 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", - "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz", - "integrity": "sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", + "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" @@ -14788,24 +14788,24 @@ "dev": true }, "@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==" }, "@fortawesome/fontawesome-svg-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", - "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", "requires": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.1" } }, "@fortawesome/free-brands-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz", - "integrity": "sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", + "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", "requires": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.1" } }, "@fortawesome/react-fontawesome": { diff --git a/ui/package.json b/ui/package.json index 2dfc7f2919..3562a4b64b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -14,8 +14,8 @@ "dependencies": { "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^7.0.2", - "@fortawesome/fontawesome-svg-core": "^6.4.0", - "@fortawesome/free-brands-svg-icons": "^6.4.0", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.1", "@fortawesome/react-fontawesome": "^0.2.0", "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", From 120ec2b7711f5c3600d8a30b41d515f802bbb033 Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Tue, 12 Dec 2023 03:34:55 +0200 Subject: [PATCH 11/31] refactor(ui): move listAuthMethods to Redux RTK (#2529) --- ui/src/app/auth/Login.tsx | 224 ++++++++++++++++----------------- ui/src/app/auth/authApi.ts | 21 ++++ ui/src/app/console/Console.tsx | 33 ++--- ui/src/app/tokens/Tokens.tsx | 35 ++---- ui/src/data/api.ts | 3 - ui/src/store.ts | 7 +- 6 files changed, 158 insertions(+), 165 deletions(-) create mode 100644 ui/src/app/auth/authApi.ts diff --git a/ui/src/app/auth/Login.tsx b/ui/src/app/auth/Login.tsx index a5b2548dd8..c3f72979b1 100644 --- a/ui/src/app/auth/Login.tsx +++ b/ui/src/app/auth/Login.tsx @@ -2,25 +2,32 @@ import { faGithub, faGitlab, faGoogle, - faOpenid + faOpenid, + IconDefinition } from '@fortawesome/free-brands-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { toLower, upperFirst } from 'lodash'; -import { useEffect, useState } from 'react'; +import { useMemo } from 'react'; import { Navigate } from 'react-router-dom'; +import { useListAuthProvidersQuery } from '~/app/auth/authApi'; import logoFlag from '~/assets/logo-flag.png'; +import Loading from '~/components/Loading'; import { NotificationProvider } from '~/components/NotificationProvider'; import ErrorNotification from '~/components/notifications/ErrorNotification'; -import { listAuthMethods } from '~/data/api'; import { useError } from '~/data/hooks/error'; import { useSession } from '~/data/hooks/session'; import { IAuthMethod } from '~/types/Auth'; -import { IAuthMethodGithub } from '~/types/auth/Github'; -import { IAuthMethodOIDC } from '~/types/auth/OIDC'; interface ILoginProvider { displayName: string; - icon?: any; + icon: IconDefinition; +} + +interface IAuthDisplay { + name: string; + authorize_url: string; + callback_url: string; + icon: IconDefinition; } const knownProviders: Record = { @@ -33,7 +40,8 @@ const knownProviders: Record = { icon: faGitlab }, auth0: { - displayName: 'Auth0' + displayName: 'Auth0', + icon: faOpenid }, github: { displayName: 'Github', @@ -41,18 +49,7 @@ const knownProviders: Record = { } }; -function InnerLogin() { - const { session } = useSession(); - - const [providers, setProviders] = useState< - { - name: string; - authorize_url: string; - callback_url: string; - icon: any; - }[] - >([]); - +function InnerLoginButtons() { const { setError, clearError } = useError(); const authorize = async (uri: string) => { @@ -73,31 +70,38 @@ function InnerLogin() { const body = await res.json(); window.location.href = body.authorizeUrl; }; + const { + data: listAuthProviders, + isLoading, + error + } = useListAuthProvidersQuery(); + if (error) { + setError(error); + } - useEffect(() => { - const loadProviders = async () => { - try { - const resp = await listAuthMethods(); - // TODO: support alternative auth methods - const authOIDC = resp.methods.find( - (m: IAuthMethod) => m.method === 'METHOD_OIDC' && m.enabled - ) as IAuthMethodOIDC; - - const authGithub = resp.methods.find( - (m: IAuthMethod) => m.method === 'METHOD_GITHUB' && m.enabled - ) as IAuthMethodGithub; - - if (!authOIDC && !authGithub) { - return; + const providers = useMemo(() => { + return (listAuthProviders?.methods || []) + .filter( + (m: IAuthMethod) => + (m.method === 'METHOD_OIDC' || m.method === 'METHOD_GITHUB') && + m.enabled + ) + .flatMap((m: IAuthMethod) => { + if (m.method === 'METHOD_GITHUB') { + return { + name: 'Github', + authorize_url: m.metadata.authorize_url, + callback_url: m.metadata.callback_url, + icon: faGithub + }; } - - let loginProviders: any[] = []; - - if (authOIDC) { - const oidcLoginProviders = Object.entries( - authOIDC.metadata.providers - ).map(([k, v]) => { + if (m.method === 'METHOD_OIDC') { + return Object.entries(m.metadata.providers).map(([k, value]) => { k = toLower(k); + const v = value as { + authorize_url: string; + callback_url: string; + }; return { name: knownProviders[k]?.displayName || upperFirst(k), // if we dont know the provider, just capitalize the first letter authorize_url: v.authorize_url, @@ -105,31 +109,72 @@ function InnerLogin() { icon: knownProviders[k]?.icon || faOpenid // if we dont know the provider icon, use the openid icon }; }); - - loginProviders = loginProviders.concat(oidcLoginProviders); } + }); + }, [listAuthProviders]); - if (authGithub) { - const githubLogin = [ - { - name: 'GitHub', - authorize_url: authGithub.metadata.authorize_url, - callback_url: authGithub.metadata.callback_url, - icon: faGithub - } - ]; - - loginProviders = loginProviders.concat(githubLogin); - } + if (isLoading) { + return ; + } - setProviders([...loginProviders]); - } catch (err) { - setError(err); - } - }; + return ( + <> + {providers.length > 0 && ( + + )} + {providers.length === 0 && ( +
+
+

+ No Providers +

+
+

+ Authentication is set to{' '} + required, however, there + are no login providers configured. Please see the documentation + for more information. +

+
+ +
+
+ )} + + ); +} - loadProviders(); - }, [setProviders, setError]); +function InnerLogin() { + const { session } = useSession(); if (session && (!session.required || session.authenticated)) { return ; @@ -146,7 +191,7 @@ function InnerLogin() { alt="logo" width={512} height={512} - className="m-auto h-20 w-auto" + className="m-auto h-20 w-20" />

Login to Flipt @@ -154,58 +199,7 @@ function InnerLogin() {

- {providers && providers.length > 0 && ( - - )} - {(!providers || providers.length === 0) && ( -
-
-

- No Providers -

-
-

- Authentication is set to{' '} - required, - however, there are no login providers configured. - Please see the documentation for more information. -

-
- -
-
- )} +
diff --git a/ui/src/app/auth/authApi.ts b/ui/src/app/auth/authApi.ts new file mode 100644 index 0000000000..a5f2e2d5f9 --- /dev/null +++ b/ui/src/app/auth/authApi.ts @@ -0,0 +1,21 @@ +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; +import { IAuthMethodList } from '~/types/Auth'; + +export const authProvidersApi = createApi({ + reducerPath: 'providers', + baseQuery: fetchBaseQuery({ + baseUrl: '/auth/v1' + }), + tagTypes: ['Provider'], + endpoints: (builder) => ({ + // get list of tokens + listAuthProviders: builder.query({ + query: () => { + return { url: '/method' }; + }, + providesTags: (_result, _error, _args) => [{ type: 'Provider' }] + }) + }) +}); + +export const { useListAuthProvidersQuery } = authProvidersApi; diff --git a/ui/src/app/console/Console.tsx b/ui/src/app/console/Console.tsx index 0d5b13c8f6..3d5b0a9559 100644 --- a/ui/src/app/console/Console.tsx +++ b/ui/src/app/console/Console.tsx @@ -3,11 +3,12 @@ import { Form, Formik, useFormikContext } from 'formik'; import hljs from 'highlight.js'; import javascript from 'highlight.js/lib/languages/json'; import 'highlight.js/styles/tomorrow-night-bright.css'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; import { useNavigate } from 'react-router-dom'; import { v4 as uuidv4 } from 'uuid'; import * as Yup from 'yup'; +import { useListAuthProvidersQuery } from '~/app/auth/authApi'; import { useListFlagsQuery } from '~/app/flags/flagsApi'; import { selectCurrentNamespace } from '~/app/namespaces/namespacesSlice'; import { ContextEditor } from '~/components/console/ContextEditor'; @@ -15,7 +16,7 @@ import EmptyState from '~/components/EmptyState'; import Button from '~/components/forms/buttons/Button'; import Combobox from '~/components/forms/Combobox'; import Input from '~/components/forms/Input'; -import { evaluateURL, evaluateV2, listAuthMethods } from '~/data/api'; +import { evaluateURL, evaluateV2 } from '~/data/api'; import { useError } from '~/data/hooks/error'; import { useSuccess } from '~/data/hooks/success'; import { @@ -23,7 +24,7 @@ import { keyValidation, requiredValidation } from '~/data/validations'; -import { IAuthMethod, IAuthMethodList } from '~/types/Auth'; +import { IAuthMethod } from '~/types/Auth'; import { FilterableFlag, FlagType, flagTypeToLabel, IFlag } from '~/types/Flag'; import { INamespace } from '~/types/Namespace'; import { @@ -54,7 +55,6 @@ export default function Console() { const [selectedFlag, setSelectedFlag] = useState(null); const [response, setResponse] = useState(null); const [hasEvaluationError, setHasEvaluationError] = useState(false); - const [isAuthRequired, setIsAuthRequired] = useState(false); const { setError, clearError } = useError(); const navigate = useNavigate(); @@ -88,19 +88,14 @@ export default function Console() { }); }, [data]); - const checkIsAuthRequired = useCallback(() => { - listAuthMethods() - .then((resp: IAuthMethodList) => { - const enabledAuthMethods = resp.methods.filter( - (m: IAuthMethod) => m.enabled - ); - setIsAuthRequired(enabledAuthMethods.length != 0); - clearError(); - }) - .catch((err) => { - setError(err); - }); - }, [setError, clearError]); + const { data: listAuthProviders } = useListAuthProvidersQuery(); + + const isAuthRequired = useMemo(() => { + return ( + (listAuthProviders?.methods || []).filter((m: IAuthMethod) => m.enabled) + .length > 0 + ); + }, [listAuthProviders]); const handleSubmit = (flag: IFlag | null, values: ConsoleFormValues) => { const { entityId, context } = values; @@ -182,10 +177,6 @@ export default function Console() { hljs.highlightAll(); }, [response, codeRef]); - useEffect(() => { - checkIsAuthRequired(); - }, [checkIsAuthRequired]); - const initialvalues: ConsoleFormValues = { flagKey: selectedFlag?.key || '', entityId: uuidv4(), diff --git a/ui/src/app/tokens/Tokens.tsx b/ui/src/app/tokens/Tokens.tsx index 9141747a17..a2fa7a8424 100644 --- a/ui/src/app/tokens/Tokens.tsx +++ b/ui/src/app/tokens/Tokens.tsx @@ -1,5 +1,6 @@ import { PlusIcon } from '@heroicons/react/24/outline'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useMemo, useRef, useState } from 'react'; +import { useListAuthProvidersQuery } from '~/app/auth/authApi'; import { useDeleteTokensMutation, useListTokensQuery @@ -14,9 +15,8 @@ import ShowTokenPanel from '~/components/tokens/ShowTokenPanel'; import TokenForm from '~/components/tokens/TokenForm'; import TokenTable from '~/components/tokens/TokenTable'; import Well from '~/components/Well'; -import { listAuthMethods } from '~/data/api'; import { useError } from '~/data/hooks/error'; -import { IAuthMethod, IAuthMethodList } from '~/types/Auth'; +import { IAuthMethod } from '~/types/Auth'; import { IAuthToken, IAuthTokenInternal, @@ -24,9 +24,7 @@ import { } from '~/types/auth/Token'; export default function Tokens() { - const [tokenAuthEnabled, setTokenAuthEnabled] = useState(false); - - const { setError, clearError } = useError(); + const { setError } = useError(); const [createdToken, setCreatedToken] = useState( null @@ -45,24 +43,13 @@ export default function Tokens() { const tokenFormRef = useRef(null); - const checkTokenAuthEnabled = useCallback(() => { - listAuthMethods() - .then((resp: IAuthMethodList) => { - const authToken = resp.methods.find( - (m: IAuthMethod) => m.method === 'METHOD_TOKEN' && m.enabled - ); - - setTokenAuthEnabled(!!authToken); - clearError(); - }) - .catch((err) => { - setError(err); - }); - }, [clearError, setError]); - - useEffect(() => { - checkTokenAuthEnabled(); - }, [checkTokenAuthEnabled]); + const { data: listAuthProviders } = useListAuthProvidersQuery(); + + const tokenAuthEnabled = useMemo(() => { + return listAuthProviders?.methods.find( + (m: IAuthMethod) => m.method === 'METHOD_TOKEN' && m.enabled + ); + }, [listAuthProviders]); const tokensQuery = useListTokensQuery(); diff --git a/ui/src/data/api.ts b/ui/src/data/api.ts index 806594b21e..b82cbb7463 100644 --- a/ui/src/data/api.ts +++ b/ui/src/data/api.ts @@ -87,9 +87,6 @@ async function put(uri: string, values: T, base = apiURL) { // // auth -export async function listAuthMethods() { - return get('/method', authURL); -} export async function getAuthSelf() { return get('/self', authURL); diff --git a/ui/src/store.ts b/ui/src/store.ts index 9eb043a010..61c0684877 100644 --- a/ui/src/store.ts +++ b/ui/src/store.ts @@ -4,6 +4,7 @@ import { isAnyOf } from '@reduxjs/toolkit'; +import { authProvidersApi } from '~/app/auth/authApi'; import { namespaceApi, namespacesSlice @@ -87,7 +88,8 @@ export const store = configureStore({ [segmentsApi.reducerPath]: segmentsApi.reducer, [rulesApi.reducerPath]: rulesApi.reducer, [rolloutsApi.reducerPath]: rolloutsApi.reducer, - [tokensApi.reducerPath]: tokensApi.reducer + [tokensApi.reducerPath]: tokensApi.reducer, + [authProvidersApi.reducerPath]: authProvidersApi.reducer }, middleware: (getDefaultMiddleware) => getDefaultMiddleware() @@ -98,7 +100,8 @@ export const store = configureStore({ segmentsApi.middleware, rulesApi.middleware, rolloutsApi.middleware, - tokensApi.middleware + tokensApi.middleware, + authProvidersApi.middleware ) }); From e05d6357bd18d0d49581755e7b983ebb43d20463 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 12 Dec 2023 19:32:24 -0500 Subject: [PATCH 12/31] chore: update README --- README.md | 76 +++++++++++++++++++++++++++++------------------------ go.work.sum | 3 +++ 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 95bd319fa0..12e17ee267 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Flipt

-

An open source, self-hosted, enterprise-ready, feature management solution

+

An enterprise-ready, GRPC powered, GitOps enabled, feature management solution


@@ -52,11 +52,11 @@ -[Flipt](https://www.flipt.io) is an open-source, self-hosted feature flag application that allows you to run experiments across services in **your** environment. +[Flipt](https://www.flipt.io) enables you to follow DevOps best practices and seperate releases from deployments. Built with high performance engineering organizations in mind. Flipt can be deployed within your existing infrastructure so that you don't have to worry about your information being sent to a third party or the latency required to communicate across the internet. -With our [GitOps friendly functionality](https://www.flipt.io/docs/guides/get-going-with-gitops), you can easily integrate Flipt into your Platform Engineering, DevOps, and CI/CD workflows to enable continuous configuration and deployment. +With our [GitOps friendly functionality](https://www.flipt.io/docs/guides/get-going-with-gitops), you can easily integrate Flipt into your CI/CD workflows to enable continuous configuration and deployment with confidence.
@@ -86,20 +86,26 @@ Flipt supports use cases such as:
+## Values + +- :lock: **Security** - No [SSO Tax](https://sso.tax/). HTTPS, OIDC, OAuth, Service and API Token authentication methods supported out of the box. +- :ice: **Transparency** - No data leaves your servers and you don't have to open your systems to the outside world to communicate with Flipt. It all runs within your existing infrastructure. +- :rocket: **Speed** - Since Flipt is co-located with your existing services, you do not have to communicate across the internet which can add excessive latency and slow down your applications. +- :white_check_mark: **Simplicity** - Flipt is a single binary with no external dependencies by default. +- :thumbsup: **Compatibility** - GRPC, REST, MySQL, Postgres, CockroachDB, SQLite, LibSQL, Redis... Flipt supports it all. + +
+ ## Features -- Fast. Written in Go. Optimized for performance - Stand alone, single binary that's easy to run and [configure](https://www.flipt.io/docs/configuration/overview) - Ability to create advanced distribution rules to target segments of users -- Native [GRPC](https://grpc.io/) client [SDKs](#grpc-client-libraries) to integrate with your existing GRPC architecture -- Powerful REST API with native [SDKs](#rest-client-libraries) for easy integration +- Native [GRPC](#grpc-client-libraries) and [REST](#rest-client-libraries) server-side SDKs to integrate with your existing applications - Modern, mobile-friendly 📱 UI and debug console with dark mode 🌙 -- Supports multiple databases: Postgres, MySQL, SQLite, [libSQL](https://turso.tech/libsql), and [CockroachDB](https://github.com/cockroachdb/cockroach) - Import and export to allow storing your data as code -- Cloud-ready. Runs anywhere: bare metal, PaaS, K8s, with Docker or without - Works with [Prometheus](https://prometheus.io/) and [OpenTelemetry](https://opentelemetry.io/) out of the box 🔋 - [Filesystem, Object, Git, and OCI declarative storage backends](https://www.flipt.io/docs/configuration/storage#declarative) to support **GitOps** workflows and more. -- Audit logging with webhooks support to track changes to your data +- Audit logging with Webhook support to track changes to your data Are we missing a feature that you'd like to see? [Let us know!](https://features.flipt.io) @@ -115,13 +121,21 @@ Check out our [public roadmap](https://volta.net/embed/eyJzdGF0dXNlcyI6WyJ0cmlhZ Not sure how to get started? You can: -- [Book a free, non-pressure pairing session/code walkthrough](https://calendly.com/flipt-mark/30) with one of our teammates! +- [Book a pairing session/code walkthrough](https://calendly.com/flipt-mark/30) with one of our teammates! - Join our [Discord](https://www.flipt.io/discord), and ask any questions there + - Dive into any of the open issues, here are some examples: - [Good First Issues](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - [Backend](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Ago) - [Frontend](https://github.com/flipt-io/flipt/issues?q=is%3Aopen+is%3Aissue+label%3Aui) +- Looking for issues by effort? We've got you covered: + - [XS](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Axs) + - [Small](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Asm) + - [Medium](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Amd) + - [Large](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Alg) + - [XL](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Axl) + Review the [Architecture](ARCHITECTURE.md) and [Development](DEVELOPMENT.md) documentation for more information on how Flipt works.
@@ -132,16 +146,6 @@ For help and discussion around Flipt, feature flag best practices, and more, joi
-## Values - -- :lock: **Security** - HTTPS support. [OIDC](https://www.flipt.io/docs/authentication/methods#openid-connect) and [Static Token](https://www.flipt.io/docs/authentication/methods#static-token) authentication. [Auditing](https://www.flipt.io/docs/configuration/auditing). No data leaves your servers and you don't have to open your systems to the outside world to communicate with Flipt. It all runs within your existing infrastructure. -- :rocket: **Speed** - Since Flipt is co-located with your existing services, you do not have to communicate across the internet which can add excessive latency and slow down your applications. -- :white_check_mark: **Simplicity** - Flipt is a single binary with no external dependencies by default. -- :thumbsup: **Compatibility** - REST, GRPC, MySQL, Postgres, CockroachDB, SQLite, LibSQL, Redis... Flipt supports it all. -- :eyes: **Observability** - Flipt integrates with [Prometheus](https://prometheus.io/) and [OpenTelemetry](https://opentelemetry.io/) to provide metrics and tracing. We support sending trace data to [Jaeger](https://www.jaegertracing.io/), [Zipkin](https://zipkin.io/), and [OpenTelemetry Protocol (OTLP)](https://opentelemetry.io/docs/reference/specification/protocol/) backends. - -
- ## Try It Try the latest version of Flipt for yourself. @@ -216,7 +220,23 @@ docker run --rm -p 8080:8080 -p 9000:9000 -t docker.flipt.io/flipt/flipt:nightly ## Integration -Check out the [integration documentation](https://flipt.io/docs/integration/) for more info on how to integrate Flipt into your existing applications. +Check out our [integration documentation](https://flipt.io/docs/integration/) for more info on how to integrate Flipt into your existing applications. + +### GRPC Client Libraries + +| Language | Version | Status | +| -------- | ------- | ------ | +| [Go](./sdk/go) | ![go](https://img.shields.io/github/v/tag/flipt-io/flipt?filter=sdk%2Fgo%2Fv*&label=go&link=https%3A%2F%2Fpkg.go.dev%2Fgo.flipt.io%2Fflipt%2Fsdk%2Fgo) | ![stable](https://img.shields.io/badge/status-stable-green) | +| [Ruby](https://github.com/flipt-io/flipt-grpc-ruby) | ![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/flipt-io/flipt-grpc-ruby?color=red&label=gem&sort=semver) | ![stable](https://img.shields.io/badge/status-stable-green) | +| [.NET](https://github.com/flipt-io/flipt-grpc-dotnet) | ![Nuget](https://img.shields.io/nuget/v/flipt.grpc) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | + +### Generate Your Own + +If a client in your language is not available for download, you can easily generate one yourself using the existing [protobuf definition](https://github.com/flipt-io/flipt/blob/main/rpc/flipt/flipt.proto). + +Our [integration documentation](https://www.flipt.io/docs/integration) has more information on how to generate your own Flipt clients in your language of choice. + +
### REST API @@ -235,20 +255,6 @@ The [Flipt REST API](https://www.flipt.io/docs/reference/overview) can also be u | [Rust](https://github.com/flipt-io/flipt-rust) | [![crates.io](https://img.shields.io/crates/v/flipt.svg)](https://crates.io/crates/flipt) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | | [PHP](https://github.com/flipt-io/flipt-php) | [![Packagist](https://img.shields.io/packagist/v/flipt-io/flipt)](https://packagist.org/packages/flipt-io/flipt) | ![beta](https://img.shields.io/badge/status-beta-yellow) | -### GRPC Client Libraries - -| Language | Version | Status | -| -------- | ------- | ------ | -| [Go](./sdk/go) | ![go](https://img.shields.io/github/v/tag/flipt-io/flipt?filter=sdk%2Fgo%2Fv*&label=go&link=https%3A%2F%2Fpkg.go.dev%2Fgo.flipt.io%2Fflipt%2Fsdk%2Fgo) | ![stable](https://img.shields.io/badge/status-stable-green) | -| [Ruby](https://github.com/flipt-io/flipt-grpc-ruby) | ![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/flipt-io/flipt-grpc-ruby?color=red&label=gem&sort=semver) | ![stable](https://img.shields.io/badge/status-stable-green) | -| [.NET](https://github.com/flipt-io/flipt-grpc-dotnet) | ![Nuget](https://img.shields.io/nuget/v/flipt.grpc) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | - -### Generate Your Own - -If a client in your language is not available for download, you can easily generate one yourself using the existing [protobuf definition](https://github.com/flipt-io/flipt/blob/main/rpc/flipt/flipt.proto). - -Our [integration documentation](https://www.flipt.io/docs/integration) has more information on how to generate your own Flipt clients in your language of choice. -
## Release Cadence diff --git a/go.work.sum b/go.work.sum index f22b027d7e..25d52c9d17 100644 --- a/go.work.sum +++ b/go.work.sum @@ -285,6 +285,7 @@ github.com/docker/cli v23.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvM github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= @@ -315,6 +316,7 @@ github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/ github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= @@ -346,6 +348,7 @@ github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= From 253d460fcfb5e7788a35fc857798ee09c65583c0 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 12 Dec 2023 19:54:04 -0500 Subject: [PATCH 13/31] chore: update readme --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 12e17ee267..5a74ecf6f8 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,11 @@ Flipt supports use cases such as: ## Values -- :lock: **Security** - No [SSO Tax](https://sso.tax/). HTTPS, OIDC, OAuth, Service and API Token authentication methods supported out of the box. -- :ice: **Transparency** - No data leaves your servers and you don't have to open your systems to the outside world to communicate with Flipt. It all runs within your existing infrastructure. -- :rocket: **Speed** - Since Flipt is co-located with your existing services, you do not have to communicate across the internet which can add excessive latency and slow down your applications. -- :white_check_mark: **Simplicity** - Flipt is a single binary with no external dependencies by default. -- :thumbsup: **Compatibility** - GRPC, REST, MySQL, Postgres, CockroachDB, SQLite, LibSQL, Redis... Flipt supports it all. +- 🔒 **Security** - No [SSO Tax](https://sso.tax/). HTTPS, OIDC, OAuth, Service and API Token authentication methods supported out of the box. +- 🎛️ **Control** - No data leaves your servers and you don't have to open your systems to the outside world to communicate with Flipt. It all runs within your existing infrastructure. +- 🚀 **Speed** - Since Flipt is co-located with your existing services, you do not have to communicate across the internet which can add excessive latency and slow down your applications. +- ✅ **Simplicity** - Flipt is a single binary with no external dependencies by default. +- 👍 **Compatibility** - GRPC, REST, MySQL, Postgres, CockroachDB, SQLite, LibSQL, Redis... Flipt supports it all.
@@ -104,7 +104,7 @@ Flipt supports use cases such as: - Modern, mobile-friendly 📱 UI and debug console with dark mode 🌙 - Import and export to allow storing your data as code - Works with [Prometheus](https://prometheus.io/) and [OpenTelemetry](https://opentelemetry.io/) out of the box 🔋 -- [Filesystem, Object, Git, and OCI declarative storage backends](https://www.flipt.io/docs/configuration/storage#declarative) to support **GitOps** workflows and more. +- [Filesystem, Object, Git, and OCI declarative storage backends](https://www.flipt.io/docs/configuration/storage#declarative) to support GitOps workflows and more. - Audit logging with Webhook support to track changes to your data Are we missing a feature that you'd like to see? [Let us know!](https://features.flipt.io) From afe7632b7a609de5e68176aa7c0f1ff256d9380c Mon Sep 17 00:00:00 2001 From: George Date: Wed, 13 Dec 2023 13:59:51 +0000 Subject: [PATCH 14/31] chore(deps): update xo/dburl to v0.20.0 (#2533) * chore(deps): update xo/dburl to v0.20.0 * fix(storage/sql): set dburl resolve schema type to false * fix(storage/sql): override dburls Stat for our usecase * fix(storage/sql): return non-nil fileinfo --- go.mod | 2 +- go.sum | 4 +- go.work.sum | 491 +++++++++++++++++++++++++++++++++++ internal/storage/sql/db.go | 20 ++ internal/storage/sql/file.go | 32 +++ 5 files changed, 546 insertions(+), 3 deletions(-) create mode 100644 internal/storage/sql/file.go diff --git a/go.mod b/go.mod index cbcc19598b..6f3fe5b484 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/testcontainers/testcontainers-go v0.26.0 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/xeipuuv/gojsonschema v1.2.0 - github.com/xo/dburl v0.16.3 + github.com/xo/dburl v0.20.0 go.flipt.io/flipt/errors v1.19.3 go.flipt.io/flipt/rpc/flipt v1.31.0 go.flipt.io/flipt/sdk/go v0.6.1 diff --git a/go.sum b/go.sum index 1fd585f5ee..c9fb756c78 100644 --- a/go.sum +++ b/go.sum @@ -639,8 +639,8 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xo/dburl v0.16.3 h1:ikRz71tJW3S16fUO+eaxu9hZv660VNdS7ZOyEFjShKQ= -github.com/xo/dburl v0.16.3/go.mod h1:B7/G9FGungw6ighV8xJNwWYQPMfn3gsi2sn5SE8Bzco= +github.com/xo/dburl v0.20.0 h1:v601OhM9J4Zh56R270ncM9HRgoxp39tf9+nt5ft9UD0= +github.com/xo/dburl v0.20.0/go.mod h1:B7/G9FGungw6ighV8xJNwWYQPMfn3gsi2sn5SE8Bzco= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yquansah/libsql-client-go v0.0.0-20231017144447-34b2f2f84292 h1:LzG7bJfKeUfQWZZ5OjDVCR5q1Pq4iuPtsMPMF3OeyYs= diff --git a/go.work.sum b/go.work.sum index 25d52c9d17..87053ed984 100644 --- a/go.work.sum +++ b/go.work.sum @@ -11,75 +11,99 @@ cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYN cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= +cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= +cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= +cloud.google.com/go/aiplatform v1.52.0 h1:TbbUvAujxXlSlbG5+XBtJEEEUyGjtyJxZ/VIlvz9Dps= cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= +cloud.google.com/go/analytics v0.21.6 h1:fnV7B8lqyEYxCU0LKk+vUL7mTlqRAq4uFlIthIdr/iA= cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= +cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= +cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= +cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= +cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= +cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= +cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= +cloud.google.com/go/asset v1.15.3 h1:uI8Bdm81s0esVWbWrTHcjFDFKNOa9aB7rI1vud1hO84= cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= +cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= +cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= +cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= +cloud.google.com/go/batch v1.6.3 h1:mPiIH20a5NU02rucbAmLeO4sLPO9hrTK0BLjdHyW8xw= cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= +cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= +cloud.google.com/go/bigquery v1.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA= cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= +cloud.google.com/go/billing v1.17.4 h1:77/4kCqzH6Ou5CCDzNmqmboE+WvbwFBJmw1QZQz19AI= cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= +cloud.google.com/go/binaryauthorization v1.7.3 h1:3R6WYn1JKIaVicBmo18jXubu7xh4mMkmbIgsTXk0cBA= cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= +cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= +cloud.google.com/go/channel v1.17.3 h1:Rd4+fBrjiN6tZ4TR8R/38elkyEkz6oogGDr7jDyjmMY= cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= +cloud.google.com/go/cloudbuild v1.14.3 h1:hP6LDes9iqeppgGbmCkB3C3MvS12gJe5i4ZGtnnIO5c= cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= +cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= +cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= @@ -87,141 +111,270 @@ cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdi cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go/contactcenterinsights v1.11.3 h1:Ui14kRKgQ3mVrMRkiBNzjdJIfFAN2qqiu9993ec9+jw= cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/container v1.27.1 h1:ZfLRiFM9ddFE92SlA28rknI6YJMz5Z5huAQK+FKWxIQ= cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= +cloud.google.com/go/datacatalog v1.18.3 h1:zmdxP6nOjN5Qb1rtu9h4kbEVwerQ6Oshf+t747QJUew= cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= +cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= +cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= +cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= +cloud.google.com/go/dataplex v1.11.1 h1:+malGTMnHubsSi0D6dbr3aqp86dKs0t4yAdmxKZGUm4= cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.2.3 h1:snv4EQfh1BfQ/HZS2MGbOqCgwEzYE/j6f30XFOTsgXg= cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= +cloud.google.com/go/deploy v1.14.2 h1:OWVwtGy+QeQGPT3yc8bJu6yANoPFpXniCgl7bJu5u88= cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/dialogflow v1.44.3 h1:cK/f88KX+YVR4tLH4clMQlvrLWD2qmKJQziusjGPjmc= cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= +cloud.google.com/go/documentai v1.23.5 h1:KAlzT+q8qvRxAmhsJUvLtfFHH0PNvz3M79H6CgVBKL8= cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= +cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= +cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= +cloud.google.com/go/filestore v1.7.4 h1:twtI5/89kf9QW7MqDic9fsUbH5ZLIDV1MVsRmu9iu2E= cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= +cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= +cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= +cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= +cloud.google.com/go/gkemulticloud v1.0.3 h1:NmJsNX9uQ2CT78957xnjXZb26TDIMvv+d5W2vVUt0Pg= cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/grafeas v0.3.0 h1:oyTL/KjiUeBs9eYLw/40cpSZglUC+0F7X4iu/8t7NWs= cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= +cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= +cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= +cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= +cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= +cloud.google.com/go/logging v1.8.1 h1:26skQWPeYhvIasWKm48+Eq7oUqdcdbwsCVwz5Ys0FvU= cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/maps v1.6.1 h1:2+eMp/1MvMPp5qrSOd3vtnLKa/pylt+krVRqET3jWsM= cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= +cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= +cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/monitoring v1.16.3 h1:mf2SN9qSoBtIgiMA4R/y4VADPWZA7VCNJA079qLaZQ8= cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= +cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= +cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= +cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= +cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= +cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= +cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= +cloud.google.com/go/orgpolicy v1.11.4 h1:RWuXQDr9GDYhjmrredQJC7aY7cbyqP9ZuLbq5GJGves= cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= +cloud.google.com/go/oslogin v1.12.2 h1:NP/KgsD9+0r9hmHC5wKye0vJXVwdciv219DtYKYjgqE= cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= +cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= +cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= +cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= +cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.3 h1:UaV9C58snc5IsRQ6NN65jmRGnTdPT7mYZzK4Vbun+ik= cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= +cloud.google.com/go/recommender v1.11.3 h1:VndmgyS/J3+izR8V8BHa7HV/uun8//ivQ3k5eVKKyyM= cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= +cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= +cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= +cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= +cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= +cloud.google.com/go/scheduler v1.10.4 h1:LXm6L6IYW3Fy8lxU7kvT7r6JiW/noxn2gItJmsvwzV4= cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= +cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= +cloud.google.com/go/securitycenter v1.24.2 h1:qCEyXoJoxNKKA1bDywBjjqCB7ODXazzHnVWnG5Uqd1M= cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= +cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= +cloud.google.com/go/spanner v1.51.0 h1:l3exhhsVMKsx1E7Xd1QajYSvHmI1KZoWPW5tRxIIdvQ= cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= +cloud.google.com/go/speech v1.20.1 h1:OpJ666ao7XxXewGSAkDUJnW188tJ5hNPoM7pZB+Q730= cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= +cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= +cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= +cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= +cloud.google.com/go/translate v1.9.3 h1:t5WXTqlrk8VVJu/i3WrYQACjzYJiff5szARHiyqqPzI= cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= +cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= +cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= +cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= +cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= +cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= +cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= +code.gitea.io/gitea-vet v0.2.1 h1:b30by7+3SkmiftK0RjuXqFvZg2q4p68uoPGuxhzBN0s= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 h1:rTnT/Jrcm+figWlYz4Ixzt0SJVR2cMC8lvZcimipiEY= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 h1:QkAcEIAKbNL4KoFr4SathZPhDhF4mVwpBMFlYjyAqy8= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.16 h1:P8An8Z9rH1ldbOLdFpxYorgOt2sywL9V24dAwWHPuGc= github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.6.0 h1:XMEdVDFxgulDDl0lQmAZS6j8gRQ/0pJ+ZpXH2FHVtDc= github.com/AzureAD/microsoft-authentication-library-for-go v0.6.0/go.mod h1:BDJ5qMFKx9DugEg3+uQSDCdbYPr5s9vBTrL9P8TpqOU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/ClickHouse/clickhouse-go v1.4.3 h1:iAFMa2UrQdR5bHJ2/yaSLffZkxpcOYQMCUuKeNXGdqc= github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/IBM/sarama v1.40.1 h1:lL01NNg/iBeigUbT+wpPysuTYW6roHo6kc1QrffRf0k= github.com/IBM/sarama v1.40.1/go.mod h1:+5OFwA5Du9I6QrznhaMHsuwWdWZNMjaBSIxEWEgKOYE= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= +github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc= github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2 h1:7Ip0wMmLHLRJdrloDxZfhMm0xrLXZS8+COSu2bXmEQs= github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.34.0 h1:brux2dRrlwCF5JhTL7MUT3WUwo9zfDHZZp3+g3Mvlmo= github.com/aws/aws-sdk-go v1.34.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v1.23.2/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= github.com/aws/aws-sdk-go-v2 v1.23.3/go.mod h1:6wqGJPusLvL1YYcoxj4vPtACABVl0ydN1sxzBetRcsw= github.com/aws/aws-sdk-go-v2 v1.23.5/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33 h1:fAoVmNGhir6BR+RU0/EI+6+D7abM+MCwWf8v4ip5jNI= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33/go.mod h1:84XgODVR8uRhmOnUkKGUZKqIMxmjmLOR8Uyp7G/TPwc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5/go.mod h1:pRvFacV2qbRKy34ZFptHZW4wpauJA445bqFbvA6ikSo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6/go.mod h1:d8JTl9EfMC8x7cWRUTOBNHTk/GJ9UsqdANQqAAMKo4s= @@ -238,277 +391,566 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8/go.mod h1:Q0 github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/aws/smithy-go v1.18.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/aws/smithy-go v1.18.1/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj0JTv4mTs= github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= +github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/container-orchestrated-devices/container-device-interface v0.5.4 h1:PqQGqJqQttMP5oJ/qNGEg8JttlHqGY3xDbbcKb5T9E8= github.com/container-orchestrated-devices/container-device-interface v0.5.4/go.mod h1:DjE95rfPiiSmG7uVXtg0z6MnPm/Lx4wxKCIts0ZE0vg= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs/v2 v2.0.0 h1:FN4wsx7KQrYoLXN7uLP0vBV4oVWHOIKDRQ1G2Z0oL5M= github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2 h1:Xy9Tkx0tk/SsMfLDFc69wzqSrxQHYEFELHBO/Z8XO3M= github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= +github.com/containerd/go-cni v1.1.9 h1:ORi7P1dYzCwVM6XPN4n3CbkuOx/NZ2DOqy+SHRdo9rU= github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.1.7 h1:WSf9o9EQ0KGHiUx2ESFZ+PKf4nxK9BcvV/nJDX8RkB4= github.com/containerd/imgcrypt v1.1.7/go.mod h1:FD8gqIcX5aTotCtOmjeCsi3A1dHmTZpnMISGKSczt4k= +github.com/containerd/nri v0.4.0 h1:PjgIBm0RtUiFyEO6JqPBQZRQicbsIz41Fz/5VSC0zgw= github.com/containerd/nri v0.4.0/go.mod h1:Zw9q2lP16sdg0zYybemZ9yTDy8g7fPCIB3KXOGlggXI= +github.com/containerd/nydus-snapshotter v0.3.1 h1:b8WahTrPkt3XsabjG2o/leN4fw3HWZYr+qxo/Z8Mfzk= github.com/containerd/nydus-snapshotter v0.3.1/go.mod h1:+8R7NX7vrjlxAgtidnsstwIhpzyTlriYPssTxH++uiM= +github.com/containerd/stargz-snapshotter v0.13.0 h1:3zr1/IkW1aEo6cMYTQeZ4L2jSuCN+F4kgGfjnuowe4U= github.com/containerd/stargz-snapshotter v0.13.0/go.mod h1:01uOvoNzN1T4kV+8HeVt9p29esO5/61x8+VP/KU4fvQ= +github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/containerd/zfs v1.1.0 h1:n7OZ7jZumLIqNJqXrEc/paBM840mORnmGdJDmAmJZHM= github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= +github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v1.2.0 h1:SWgg3dQG1yzUo4d9iD8cwSVh1VqI+bP7mkPDoSfP9VU= github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= +github.com/containers/ocicrypt v1.1.6 h1:uoG52u2e91RE4UqmBICZY8dNshgfvkdl3BW6jnxiFaI= github.com/containers/ocicrypt v1.1.6/go.mod h1:WgjxPWdTJMqYMjf3M6cuIFFA1/MpyyhIM99YInA+Rvc= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cristalhq/acmd v0.8.1 h1:mtFp/cbeJNY5jokF9zPz5mRllGHropRrOkOVxeGS6FI= github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 h1:XNT/Zf5l++1Pyg08/HV04ppB0gKxAqtZQBRYiYrUuYk= github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d h1:1iy2qD6JEhHKKhUOA9IWs7mjco7lnw2qx8FsRI2wirE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= +github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= +github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/docker/cli v23.0.3+incompatible h1:Zcse1DuDqBdgI7OQDV8Go7b83xLgfhW1eza4HfEdxpY= github.com/docker/cli v23.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 h1:aaQcKT9WumO6JEJcRyTqFVq4XUZiUcKR2/GI31TOcz8= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8= github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fsouza/fake-gcs-server v1.17.0 h1:OeH75kBZcZa3ZE+zz/mFdJ2btt9FgqfjI7gIh9+5fvk= github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= +github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556 h1:N/MD/sr6o61X+iZBAT2qEUF023s4KbA8RWfKzl0L6MQ= github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-containerregistry v0.14.0 h1:z58vMqHxuwvAsVwvKEkmVBz2TlgBgH5k6koEXBtlYkw= github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= +github.com/google/go-github/v39 v39.2.0 h1:rNNM311XtPOz5rDdsJXAp2o8F67X9FnROXTvto3aSnQ= github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9 h1:OF1IPgv+F4NmqmJ98KTjdN97Vs1JxDPB3vbmYzV2dpk= github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.5.2 h1:uLnfXcaFjlrDnQDT+NCBcfhrXqYTx/rcCa6xn01Y8yI= github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= +github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d h1:ibbzF2InxMOS+lLCphY9PHNKPURDUBNKaG6ErSq8gJQ= github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= +github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/intel/goresctrl v0.3.0 h1:K2D3GOzihV7xSBedGxONSlaw/un1LZgWsc9IfqipN4c= github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/pgconn v1.14.0 h1:vrbA9Ud87g6JdFWkHTJXppVce58qPIdP7N8y0Ml/A7Q= github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa h1:s+4MhCQ6YrzisK6hFJUX53drDT4UsSW3DEhKn0ifuHw= github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.18.1 h1:YP7G1KABtKpB5IHrO9vYwSrCOhs7p3uqhvhhQBptya0= github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= +github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE/Tq8= github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/k0kubun/pp v2.3.0+incompatible h1:EKhKbi34VQDWJtq+zpsKSEhkHHs9w2P8Izbq8IhLVSo= github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/kevinmbeaulieu/eq-go v1.0.0 h1:AQgYHURDOmnVJ62jnEk0W/7yFKEn+Lv8RHN6t7mB0Zo= github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/ktrysmt/go-bitbucket v0.6.4 h1:C8dUGp0qkwncKtAnozHCbbqhptefzEd1I0sfnuy9rYQ= github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora/v3 v3.0.0 h1:R6zcoZZbvVcGMvDCKo45A9U/lzYyzl5NfYIvznmDfE4= github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= +github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/markbates/pkger v0.15.1 h1:3MPelV53RnGSW07izx5xGxl4e/sdRD6zqseIk0rMASY= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/matryer/moq v0.2.7 h1:RtpiPUM8L7ZSCbSwK+QcZH/E9tgqAkFjKQxsRs25b4w= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/microsoft/go-mssqldb v1.0.0 h1:k2p2uuG8T5T/7Hp7/e3vMGTnnR0sU4h8d1CcC71iLHU= github.com/microsoft/go-mssqldb v1.0.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= +github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mmcloughlin/avo v0.5.0 h1:nAco9/aI9Lg2kiuROBY6BhCI/z0t5jEvJfjWbL8qXLU= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/mutecomm/go-sqlcipher/v4 v4.4.0 h1:sV1tWCWGAVlPhNGT95Q+z/txFxuhAYWwHD1afF5bMZg= github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 h1:P48LjvUQpTReR3TQRbxSeSBsMXzfK0uol7eRcr7VBYQ= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= +github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4= github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= github.com/nats-io/nats.go v1.30.2/go.mod h1:dcfhUgmQNN4GJEfIb2f9R7Fow+gzBF4emzDHrVBd5qM= +github.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E= github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= github.com/nats-io/nkeys v0.4.5/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= +github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba h1:fhFP5RliM2HW/8XdcO5QngSfFli9GcRIpMXvypTQt6E= github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/open-policy-agent/opa v0.42.2 h1:qocVAKyjrqMjCqsU02S/gHyLr4AQQ9xMtuV1kKnnyhM= github.com/open-policy-agent/opa v0.42.2/go.mod h1:MrmoTi/BsKWT58kXlVayBb+rYVeaMwuBm3nYAN3923s= +github.com/opencontainers/runtime-spec v1.1.0-rc.1 h1:wHa9jroFfKGQqFHj0I1fMRKLl0pfj+ynAqBxo3v6u9w= github.com/opencontainers/runtime-spec v1.1.0-rc.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 h1:DmNGcqH3WDbV5k8OJ+esPWbqUOX5rMLR2PMvziDMJi0= github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= +github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= +github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170 h1:DiLBVp4DAcZlBVBEtJpNWZpZVq0AEeCY7Hqk8URVs4o= github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170/go.mod h1:uQd4a7Rh3ZsVg5j0lNyAfyxIeGde9yrlhjF78GzeW0c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 h1:CNooiryw5aisadVfzneSZPswRWvnVW8hF1bS/vo8ReI= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/rabbitmq/amqp091-go v1.8.1 h1:RejT1SBUim5doqcL6s7iN6SBmsQqyTgXb1xMlH0h1hA= github.com/rabbitmq/amqp091-go v1.8.1/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5 h1:CvqZS4QYHBRvx7AeFdimd16HCbLlYsvQMcKDACpJW/c= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96 h1:J8J/cgLDRuqXJnwIrRDBvtl+LLsdg7De74znW/BRRq4= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e h1:eTWZyPUnHcuGRDiryS/l2I7FfKjbU3IBx3IjqHPxuKU= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= +github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.15.0/go.mod h1:5rwNNax6Mlk9sZ40AcyVtiEw24Z4J04cfSioF2COKmc= +github.com/sagikazarmark/crypt v0.17.0 h1:ZA/7pXyjkHoK4bW4mIdnCLvL8hd+Nrbiw7Dqk7D4qUk= github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= +github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ= github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/snowflakedb/gosnowflake v1.6.19 h1:KSHXrQ5o7uso25hNIzi/RObXtnSGkFgie91X82KcvMY= github.com/snowflakedb/gosnowflake v1.6.19/go.mod h1:FM1+PWUdwB9udFDsXdfD58NONC0m+MlOSmQRvimobSM= +github.com/spdx/tools-golang v0.3.1-0.20230104082527-d6f58551be3f h1:9B623Cfs+mclYK6dsae7gLSwuIBHvlgmEup87qpqsAQ= github.com/spdx/tools-golang v0.3.1-0.20230104082527-d6f58551be3f/go.mod h1:VHzvNsKAfAGqs4ZvwRL+7a0dNsL20s7lGui4K9C0xQM= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/tetratelabs/wazero v1.0.2 h1:lpwL5zczFHk2mxKur98035Gig+Z3vd9JURk6lUdZxXY= github.com/tetratelabs/wazero v1.0.2/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/tonistiigi/fsutil v0.0.0-20230105215944-fb433841cbfa h1:XOFp/3aBXlqmOFAg3r6e0qQjPnK5I970LilqX+Is1W8= github.com/tonistiigi/fsutil v0.0.0-20230105215944-fb433841cbfa/go.mod h1:AvLEd1LEIl64G2Jpgwo7aVV5lGH0ePcKl0ygGIHNYl8= +github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7 h1:8eY6m1mjgyB8XySUR7WvebTM8D/Vs86jLJzD/Tw7zkc= github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7/go.mod h1:qqvyZqkfwkoJuPU/bw61bItaoO0SJ8YSW0vSVRRvsRg= +github.com/tonistiigi/go-archvariant v1.0.0 h1:5LC1eDWiBNflnTF1prCiX09yfNHIxDC/aukdhCdTyb0= github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f h1:DLpt6B5oaaS8jyXHa9VA4rrZloBVPVXeCtrOsrFauxc= github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/urfave/cli/v2 v2.25.5 h1:d0NIAyhh5shGscroL7ek/Ya9QYQE0KNabJgiUinIQkc= github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/veraison/go-cose v1.0.0-rc.1 h1:4qA7dbFJGvt7gcqv5MCIyCQvN+NpHFPkW7do3EeDLb8= github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= +github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +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/xanzy/go-gitlab v0.15.0 h1:rWtwKTgEnXyNUGrOArN7yyc3THRkpYcKXIXia9abywQ= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg= github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= +github.com/yhat/scrape v0.0.0-20161128144610-24b7890b0945 h1:6Ju8pZBYFTN9FaV/JvNBiIHcsgEmP4z4laciqjfjY8E= github.com/yhat/scrape v0.0.0-20161128144610-24b7890b0945/go.mod h1:4vRFPPNYllgCacoj+0FoKOjTW68rUhEfqPLiEJaK2w8= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= +gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= +go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2QE4= go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.mongodb.org/mongo-driver v1.7.5 h1:ny3p0reEpgsR2cfA5cjgwFZg3Cv/ofFh/8jbhGtz9VI= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.29.0 h1:Wjp9vsVSIEyvdiaECfqxY9xBqQ7JaSCGtvHgR4doXZk= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.29.0/go.mod h1:vHItvsnJtp7ES++nFLLFBzUWny7fJQSvTlxFcqQGUr4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0 h1:SLme4Porm+UwX0DdHMxlwRt7FzPSE0sys81bet2o0pU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1:tLYsuf2v8fZreBVwp9gVMhefZlLFZaUiNVSq8QxXRII= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= +go.opentelemetry.io/otel/internal/metric v0.27.0 h1:9dAVGAfFiiEq5NVB9FUJ5et+btbDQAUIJehJ+ikyryk= go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -516,13 +958,17 @@ go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= @@ -544,12 +990,15 @@ golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6 h1:4WsZyVtkthqrHTbDCJfiTs8IWNYE4uvsSDgaV6xpp+o= google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4= google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= @@ -558,6 +1007,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go. google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f h1:hL+1ptbhFoeL1HcROQ8OGXaqH0jYRRibgWQWco0/Ugc= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f/go.mod h1:iIgEblxoG4klcXsG0d9cpoxJ4xndv6+1FkDROCHhPRI= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= @@ -567,35 +1017,76 @@ google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gorm.io/driver/postgres v1.0.8 h1:PAgM+PaHOSAeroTjHkCHCBIHHoBIf9RgPWGo8dF2DA8= +gorm.io/gorm v1.21.4 h1:J0xfPJMRfHgpVcYLrEAIqY/apdvTIkrltPQNHQLq9Qc= +k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apiserver v0.26.2 h1:Pk8lmX4G14hYqJd1poHGC08G03nIHVqdJMR0SD3IH3o= k8s.io/apiserver v0.26.2/go.mod h1:GHcozwXgXsPuOJ28EnQ/jXEM9QeG6HT22YxSNmpYNh8= +k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/cri-api v0.27.1 h1:KWO+U8MfI9drXB/P4oU9VchaWYOlwDglJZVHWMpTT3Q= k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/b v1.0.0 h1:vpvqeyp17ddcQWF29Czawql4lDdABCDRbXRAS4+aF2o= modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= +modernc.org/cc/v3 v3.36.3 h1:uISP3F66UlixxWEcKuIWERa4TwrZENHSL8tWxZz8bHg= modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.16.9 h1:AXquSwg7GuMk11pIdw7fmO1Y/ybgazVkMhsZWCV0mHM= modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/db v1.0.0 h1:2c6NdCfaLnshSvY7OU09cyAY0gYXUZj4lmg5ItHyucg= modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8= +modernc.org/file v1.0.0 h1:9/PdvjVxd5+LcWUQIfapAWRGOkDLK90rloa8s/au06A= modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw= +modernc.org/fileutil v1.0.0 h1:Z1AFLZwl6BO8A5NldQg/xTSjGLetp+1Ubvl4alfGx8w= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= +modernc.org/golex v1.0.0 h1:wWpDlbK8ejRfSyi0frMyhilD3JBvtcx2AdGDnU+JtsE= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/internal v1.0.0 h1:XMDsFDcBDsibbBnHB2xzljZ+B1yrOVLEFkKL2u15Glw= modernc.org/internal v1.0.0/go.mod h1:VUD/+JAkhCpvkUitlEOnhpVxCgsBI90oTzSCRcqQVSM= +modernc.org/libc v1.17.1 h1:Q8/Cpi36V/QBfuQaFVeisEBs3WqoGAJprZzmf7TfEYI= modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/lldb v1.0.0 h1:6vjDJxQEfhlOLwl4bhpwIz00uyFK4EmSYcbwqwbynsc= modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.2.1 h1:dkRh86wgmq/bJu2cAS2oqBCz/KsMZU7TUM4CibQ7eBs= modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/ql v1.0.0 h1:bIQ/trWNVjQPlinI6jdOQsi195SIturGo3mp5hsDqVU= modernc.org/ql v1.0.0/go.mod h1:xGVyrLIatPcO2C1JvI/Co8c0sr6y91HKFNy4pt9JXEY= +modernc.org/sortutil v1.1.0 h1:oP3U4uM+NT/qBQcbg/K2iqAX0Nx7B1b6YZtq3Gk/PjM= modernc.org/sortutil v1.1.0/go.mod h1:ZyL98OQHJgH9IEfN71VsamvJgrtRX9Dj2gX+vH86L1k= +modernc.org/sqlite v1.18.1 h1:ko32eKt3jf7eqIkCgPAeHMBXw3riNSLhl2f3loEF7o8= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/zappy v1.0.0 h1:dPVaP+3ueIUv4guk8PuZ2wiUGcJ1WUVvIheeSSTD0yk= modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= diff --git a/internal/storage/sql/db.go b/internal/storage/sql/db.go index 75b4e0691e..016357bae3 100644 --- a/internal/storage/sql/db.go +++ b/internal/storage/sql/db.go @@ -3,7 +3,9 @@ package sql import ( "database/sql" "database/sql/driver" + "errors" "fmt" + "io/fs" "net/url" sq "github.com/Masterminds/squirrel" @@ -19,6 +21,24 @@ import ( ) func init() { + // we do a bit of surgery in dburl to stop it from walking + // up the provided file:/path to see if any parent directories + // exist, else dburl assumes the postgres protocol. + // see: https://github.com/xo/dburl/issues/35 + stat := dburl.Stat + dburl.Stat = func(name string) (fs.FileInfo, error) { + fi, err := stat(name) + if err == nil { + return fi, nil + } + + if errors.Is(err, fs.ErrNotExist) { + return fileInfo(name), nil + } + + return nil, err + } + // register libsql driver with dburl dburl.Register(dburl.Scheme{ Driver: "libsql", diff --git a/internal/storage/sql/file.go b/internal/storage/sql/file.go new file mode 100644 index 0000000000..432b0685d8 --- /dev/null +++ b/internal/storage/sql/file.go @@ -0,0 +1,32 @@ +package sql + +import ( + "io/fs" + "time" +) + +type fileInfo string + +func (f fileInfo) Name() string { + return string(f) +} + +func (f fileInfo) Size() int64 { + return 0 +} + +func (f fileInfo) Mode() fs.FileMode { + return fs.ModePerm +} + +func (f fileInfo) ModTime() time.Time { + return time.Now() +} + +func (f fileInfo) IsDir() bool { + return false +} + +func (f fileInfo) Sys() any { + return nil +} From fb9280216a86c35fce6b9642d75fbfc52725dc87 Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Wed, 13 Dec 2023 14:17:35 +0000 Subject: [PATCH 15/31] test: move database coverage into integration tests --- .github/workflows/integration-test.yml | 6 ++- .github/workflows/test.yml | 7 +-- build/README.md | 3 -- build/magefile.go | 32 ------------ build/testing/integration.go | 70 ++++++++++++++++++++++++-- build/testing/test.go | 55 -------------------- 6 files changed, 72 insertions(+), 101 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 46f7e8afe6..868eb765f0 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -47,7 +47,11 @@ jobs: matrix: test: [ - "api", + "api/sqlite", + "api/libsql", + "api/postgres", + "api/mysql", + "api/cockroach", "api/cache", "fs/git", "fs/local", diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0c646b27e9..8bbba927ee 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,9 +14,6 @@ jobs: test: name: "Tests (Go)" runs-on: ubuntu-latest - strategy: - matrix: - database: ["mysql", "postgres", "cockroachdb", "sqlite", "libsql"] steps: - uses: actions/checkout@v4 @@ -36,8 +33,8 @@ jobs: with: install-only: true - - name: Unit Test ${{ matrix.database }} - run: mage dagger:run "test:database ${{ matrix.database }}" + - name: Unit Test + run: mage dagger:run "test:unit" - name: Upload Coverage uses: codecov/codecov-action@v3.1.4 diff --git a/build/README.md b/build/README.md index fc7bb5d93f..c19e8ef07c 100644 --- a/build/README.md +++ b/build/README.md @@ -45,7 +45,6 @@ The test section of the Mage targets handles running Flipts various unit tests w ```sh test:all runs Flipt's unit test suite against all the databases Flipt supports. test:cli runs a suite of test cases which exercise the `flipt` binary CLI. - test:database runs the unit test suite against the desired database (one of ["sqlite" "postgres" "mysql" "cockroach"]). test:integration runs the entire integration test suite (one of ["*", "list", ""] use "list" to see available cases). test:ui runs the entire integration test suite for the UI. test:unit runs the base suite of tests for all of Flipt. @@ -55,10 +54,8 @@ The test section of the Mage targets handles running Flipts various unit tests w `mage test:all` runs the entire suite for each database concurrently. `mage test:unit` runs the entire test suite with `SQLite` as the backing database. -`mage test:database ` runs the entire test suite with the desired database (`sqlite`, `postgres`, `mysql` and `cockroach` available). These tests run [Flipts Go suite](testing/test.go) of unit tests. -There are a number of ways to invoke them with different backing databases. ### Integration Tests (End to End) diff --git a/build/magefile.go b/build/magefile.go index 0e1f79faf3..4e6dd330f1 100644 --- a/build/magefile.go +++ b/build/magefile.go @@ -19,7 +19,6 @@ import ( "go.flipt.io/flipt/build/release" "go.flipt.io/flipt/build/testing" "golang.org/x/mod/modfile" - "golang.org/x/sync/errgroup" ) // Build is a collection of targets which build Flipt into target Docker images. @@ -67,20 +66,6 @@ func (b Build) Base(ctx context.Context) error { // Test contains all the targets used to test the Flipt base container. type Test mg.Namespace -// All runs Flipt's unit test suite against all the databases Flipt supports. -func (t Test) All(ctx context.Context) error { - var g errgroup.Group - - for db := range testing.All { - db := db - g.Go(func() error { - return t.Database(ctx, db) - }) - } - - return g.Wait() -} - // Unit runs the base suite of tests for all of Flipt. // It uses SQLite as the default database. func (t Test) Unit(ctx context.Context) error { @@ -94,23 +79,6 @@ func (t Test) Unit(ctx context.Context) error { }) } -// Database runs the unit test suite against the desired database (one of ["sqlite" "libsql" "postgres" "mysql" "cockroach"]). -func (t Test) Database(ctx context.Context, db string) error { - return daggerRun(ctx, func(client *dagger.Client, req internal.FliptRequest) error { - base, err := internal.Base(ctx, client, req) - if err != nil { - return err - } - - test, ok := testing.All[db] - if !ok { - return fmt.Errorf("unexpected database name: %q", db) - } - - return testing.Unit(test(ctx, client, base)) - }) -} - // Integration runs the entire integration test suite (one of ["*", "list", ""] use "list" to see available cases). // The suite runs a number of operations via the Go SDK against Flipt // in various configurations using both HTTP and GRPC. diff --git a/build/testing/integration.go b/build/testing/integration.go index 496cd0d387..3514c51039 100644 --- a/build/testing/integration.go +++ b/build/testing/integration.go @@ -5,11 +5,9 @@ import ( "errors" "fmt" "log" - "math/rand" "os" "path" "strings" - "time" "dagger.io/dagger" "github.com/containerd/containerd/platforms" @@ -27,7 +25,11 @@ var ( // AllCases are the top-level filterable integration test cases. AllCases = map[string]testCaseFn{ - "api": api, + "api/sqlite": withSQLite(api), + "api/libsql": withLibSQL(api), + "api/postgres": withPostgres(api), + "api/mysql": withMySQL(api), + "api/cockroach": withCockroach(api), "api/cache": cache, "fs/git": git, "fs/local": local, @@ -118,8 +120,6 @@ func Integration(ctx context.Context, client *dagger.Client, base, flipt *dagger } } - rand.Seed(time.Now().Unix()) - var g errgroup.Group for caseName, fn := range cases { @@ -178,6 +178,66 @@ func api(ctx context.Context, _ *dagger.Client, base, flipt *dagger.Container, c flipt.WithEnvVariable("UNIQUE", uuid.New().String()).WithExec(nil), conf) } +func withSQLite(fn testCaseFn) testCaseFn { + return fn +} + +func withLibSQL(fn testCaseFn) testCaseFn { + return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { + return fn(ctx, client, base, flipt.WithEnvVariable("FLIPT_TEST_DATABASE_PROTOCOL", "libsql"), conf) + } +} + +func withPostgres(fn testCaseFn) testCaseFn { + return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { + return fn(ctx, client, base, flipt. + WithEnvVariable("FLIPT_TEST_DB_URL", "postgres://postgres:password@postgres:5432?sslmode=disable"). + WithServiceBinding("postgres", client.Container(). + From("postgres"). + WithEnvVariable("POSTGRES_PASSWORD", "password"). + WithExposedPort(5432). + WithExec(nil)), + conf, + ) + } +} + +func withMySQL(fn testCaseFn) testCaseFn { + return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { + return fn(ctx, client, base, flipt. + WithEnvVariable( + "FLIPT_TEST_DB_URL", + "mysql://flipt:password@mysql:3306/flipt_test?multiStatements=true", + ). + WithServiceBinding("mysql", client.Container(). + From("mysql:8"). + WithEnvVariable("MYSQL_USER", "flipt"). + WithEnvVariable("MYSQL_PASSWORD", "password"). + WithEnvVariable("MYSQL_DATABASE", "flipt_test"). + WithEnvVariable("MYSQL_ALLOW_EMPTY_PASSWORD", "true"). + WithExposedPort(3306). + WithExec(nil)), + conf, + ) + } +} + +func withCockroach(fn testCaseFn) testCaseFn { + return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { + return fn(ctx, client, base, flipt. + WithEnvVariable("FLIPT_TEST_DB_URL", "cockroachdb://root@cockroach:26257/defaultdb?sslmode=disable"). + WithServiceBinding("cockroach", client.Container(). + From("cockroachdb/cockroach:latest-v21.2"). + WithEnvVariable("COCKROACH_USER", "root"). + WithEnvVariable("COCKROACH_DATABASE", "defaultdb"). + WithExposedPort(26257). + WithExec([]string{"start-single-node", "--insecure"})), + conf, + ) + + } +} + func cache(ctx context.Context, _ *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { flipt = flipt. WithEnvVariable("FLIPT_LOG_LEVEL", "DEBUG"). diff --git a/build/testing/test.go b/build/testing/test.go index 40bff5d565..60467cd5c3 100644 --- a/build/testing/test.go +++ b/build/testing/test.go @@ -63,58 +63,3 @@ func Unit(ctx context.Context, client *dagger.Client, flipt *dagger.Container) e return nil } - -var All = map[string]Wrapper{ - "sqlite": WithSQLite, - "libsql": WithLibSQL, - "postgres": WithPostgres, - "mysql": WithMySQL, - "cockroachdb": WithCockroach, -} - -type Wrapper func(context.Context, *dagger.Client, *dagger.Container) (context.Context, *dagger.Client, *dagger.Container) - -func WithSQLite(ctx context.Context, client *dagger.Client, container *dagger.Container) (context.Context, *dagger.Client, *dagger.Container) { - return ctx, client, container -} - -func WithLibSQL(ctx context.Context, client *dagger.Client, flipt *dagger.Container) (context.Context, *dagger.Client, *dagger.Container) { - return ctx, client, flipt.WithEnvVariable("FLIPT_TEST_DATABASE_PROTOCOL", "libsql") -} - -func WithPostgres(ctx context.Context, client *dagger.Client, flipt *dagger.Container) (context.Context, *dagger.Client, *dagger.Container) { - return ctx, client, flipt. - WithEnvVariable("FLIPT_TEST_DB_URL", "postgres://postgres:password@postgres:5432?sslmode=disable"). - WithServiceBinding("postgres", client.Container(). - From("postgres"). - WithEnvVariable("POSTGRES_PASSWORD", "password"). - WithExposedPort(5432). - WithExec(nil)) -} - -func WithMySQL(ctx context.Context, client *dagger.Client, flipt *dagger.Container) (context.Context, *dagger.Client, *dagger.Container) { - return ctx, client, flipt. - WithEnvVariable( - "FLIPT_TEST_DB_URL", - "mysql://flipt:password@mysql:3306/flipt_test?multiStatements=true", - ). - WithServiceBinding("mysql", client.Container(). - From("mysql:8"). - WithEnvVariable("MYSQL_USER", "flipt"). - WithEnvVariable("MYSQL_PASSWORD", "password"). - WithEnvVariable("MYSQL_DATABASE", "flipt_test"). - WithEnvVariable("MYSQL_ALLOW_EMPTY_PASSWORD", "true"). - WithExposedPort(3306). - WithExec(nil)) -} - -func WithCockroach(ctx context.Context, client *dagger.Client, flipt *dagger.Container) (context.Context, *dagger.Client, *dagger.Container) { - return ctx, client, flipt. - WithEnvVariable("FLIPT_TEST_DB_URL", "cockroachdb://root@cockroach:26257/defaultdb?sslmode=disable"). - WithServiceBinding("cockroach", client.Container(). - From("cockroachdb/cockroach:latest-v21.2"). - WithEnvVariable("COCKROACH_USER", "root"). - WithEnvVariable("COCKROACH_DATABASE", "defaultdb"). - WithExposedPort(26257). - WithExec([]string{"start-single-node", "--insecure"})) -} From 9822c0ed4269567a4e44c7331ec2d7c1f1fca128 Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Wed, 13 Dec 2023 14:38:30 +0000 Subject: [PATCH 16/31] fix(build/testing): use correct db url environment variable --- build/testing/integration.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/testing/integration.go b/build/testing/integration.go index 3514c51039..95306cde1c 100644 --- a/build/testing/integration.go +++ b/build/testing/integration.go @@ -184,14 +184,14 @@ func withSQLite(fn testCaseFn) testCaseFn { func withLibSQL(fn testCaseFn) testCaseFn { return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { - return fn(ctx, client, base, flipt.WithEnvVariable("FLIPT_TEST_DATABASE_PROTOCOL", "libsql"), conf) + return fn(ctx, client, base, flipt.WithEnvVariable("FLIPT_DB_URL", "libsql://file:/etc/flipt/flipt.db"), conf) } } func withPostgres(fn testCaseFn) testCaseFn { return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { return fn(ctx, client, base, flipt. - WithEnvVariable("FLIPT_TEST_DB_URL", "postgres://postgres:password@postgres:5432?sslmode=disable"). + WithEnvVariable("FLIPT_DB_URL", "postgres://postgres:password@postgres:5432?sslmode=disable"). WithServiceBinding("postgres", client.Container(). From("postgres"). WithEnvVariable("POSTGRES_PASSWORD", "password"). @@ -206,7 +206,7 @@ func withMySQL(fn testCaseFn) testCaseFn { return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { return fn(ctx, client, base, flipt. WithEnvVariable( - "FLIPT_TEST_DB_URL", + "FLIPT_DB_URL", "mysql://flipt:password@mysql:3306/flipt_test?multiStatements=true", ). WithServiceBinding("mysql", client.Container(). @@ -225,7 +225,7 @@ func withMySQL(fn testCaseFn) testCaseFn { func withCockroach(fn testCaseFn) testCaseFn { return func(ctx context.Context, client *dagger.Client, base, flipt *dagger.Container, conf testConfig) func() error { return fn(ctx, client, base, flipt. - WithEnvVariable("FLIPT_TEST_DB_URL", "cockroachdb://root@cockroach:26257/defaultdb?sslmode=disable"). + WithEnvVariable("FLIPT_DB_URL", "cockroachdb://root@cockroach:26257/defaultdb?sslmode=disable"). WithServiceBinding("cockroach", client.Container(). From("cockroachdb/cockroach:latest-v21.2"). WithEnvVariable("COCKROACH_USER", "root"). From 8f77bc3a077b069d5ee2962f3ef5fb89ae3ac8c7 Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Wed, 13 Dec 2023 14:42:56 +0000 Subject: [PATCH 17/31] chore(build): update dagger to v0.9.4 --- build/generate/screenshots.go | 2 +- build/testing/cli.go | 6 ++++-- build/testing/integration.go | 27 +++++++++++++++------------ build/testing/loadtest.go | 8 +++++--- build/testing/migration.go | 4 ++-- build/testing/test.go | 6 +++--- build/testing/ui.go | 3 ++- go.mod | 13 ++++++++++--- go.sum | 21 +++++++++++++++++++++ go.work.sum | 15 +++++++++++++++ 10 files changed, 78 insertions(+), 27 deletions(-) diff --git a/build/generate/screenshots.go b/build/generate/screenshots.go index 2cd72e2a58..338a9f2e41 100644 --- a/build/generate/screenshots.go +++ b/build/generate/screenshots.go @@ -141,6 +141,6 @@ func buildUI(ctx context.Context, ui, flipt *dagger.Container, theme string) (_ } return ui. - WithServiceBinding("flipt", flipt.WithExec(nil)).WithFile("/usr/bin/flipt", flipt.File("/flipt")). + WithServiceBinding("flipt", flipt.WithExec(nil).AsService()).WithFile("/usr/bin/flipt", flipt.File("/flipt")). WithEnvVariable("FLIPT_ADDRESS", "http://flipt:8080"), nil } diff --git a/build/testing/cli.go b/build/testing/cli.go index 996dfa8f42..ef2bfe3efa 100644 --- a/build/testing/cli.go +++ b/build/testing/cli.go @@ -361,7 +361,8 @@ exit $?`, container.WithServiceBinding("zot", client.Container(). From(image). - WithExposedPort(5000)), + WithExposedPort(5000). + AsService()), flipt("bundle", "push", "mybundle:latest", "http://zot:5000/myremotebundle:latest"), stdout(matches(`sha256:[a-f0-9]{64}`)), ) @@ -374,7 +375,8 @@ exit $?`, container.WithServiceBinding("zot", client.Container(). From(image). - WithExposedPort(5000)), + WithExposedPort(5000). + AsService()), flipt("bundle", "pull", "http://zot:5000/myremotebundle:latest"), stdout(matches(`sha256:[a-f0-9]{64}`)), ) diff --git a/build/testing/integration.go b/build/testing/integration.go index 95306cde1c..1c72b6dc71 100644 --- a/build/testing/integration.go +++ b/build/testing/integration.go @@ -196,7 +196,8 @@ func withPostgres(fn testCaseFn) testCaseFn { From("postgres"). WithEnvVariable("POSTGRES_PASSWORD", "password"). WithExposedPort(5432). - WithExec(nil)), + WithExec(nil). + AsService()), conf, ) } @@ -216,7 +217,8 @@ func withMySQL(fn testCaseFn) testCaseFn { WithEnvVariable("MYSQL_DATABASE", "flipt_test"). WithEnvVariable("MYSQL_ALLOW_EMPTY_PASSWORD", "true"). WithExposedPort(3306). - WithExec(nil)), + WithExec(nil). + AsService()), conf, ) } @@ -231,7 +233,8 @@ func withCockroach(fn testCaseFn) testCaseFn { WithEnvVariable("COCKROACH_USER", "root"). WithEnvVariable("COCKROACH_DATABASE", "defaultdb"). WithExposedPort(26257). - WithExec([]string{"start-single-node", "--insecure"})), + WithExec([]string{"start-single-node", "--insecure"}). + AsService()), conf, ) @@ -269,7 +272,7 @@ func git(ctx context.Context, client *dagger.Client, base, flipt *dagger.Contain WithExec(nil) _, err := base. - WithServiceBinding("gitea", gitea). + WithServiceBinding("gitea", gitea.AsService()). WithExec([]string{"go", "run", "./build/internal/cmd/gitea/...", "-gitea-url", "http://gitea:3000", "-testdata-dir", testdataDir}). Sync(ctx) if err != nil { @@ -277,7 +280,7 @@ func git(ctx context.Context, client *dagger.Client, base, flipt *dagger.Contain } flipt = flipt. - WithServiceBinding("gitea", gitea). + WithServiceBinding("gitea", gitea.AsService()). WithEnvVariable("FLIPT_LOG_LEVEL", "DEBUG"). WithEnvVariable("FLIPT_STORAGE_TYPE", "git"). WithEnvVariable("FLIPT_STORAGE_GIT_REPOSITORY", "http://gitea:3000/root/features.git"). @@ -295,7 +298,7 @@ func s3(ctx context.Context, client *dagger.Client, base, flipt *dagger.Containe WithExec([]string{"server", "/data", "--address", ":9009"}) _, err := base. - WithServiceBinding("minio", minio). + WithServiceBinding("minio", minio.AsService()). WithEnvVariable("AWS_ACCESS_KEY_ID", "user"). WithEnvVariable("AWS_SECRET_ACCESS_KEY", "password"). WithExec([]string{"go", "run", "./build/internal/cmd/minio/...", "-minio-url", "http://minio:9009", "-testdata-dir", testdataDir}). @@ -305,7 +308,7 @@ func s3(ctx context.Context, client *dagger.Client, base, flipt *dagger.Containe } flipt = flipt. - WithServiceBinding("minio", minio). + WithServiceBinding("minio", minio.AsService()). WithEnvVariable("FLIPT_LOG_LEVEL", "DEBUG"). WithEnvVariable("AWS_ACCESS_KEY_ID", "user"). WithEnvVariable("AWS_SECRET_ACCESS_KEY", "password"). @@ -357,7 +360,7 @@ func oci(ctx context.Context, client *dagger.Client, base, flipt *dagger.Contain if _, err := flipt. WithDirectory("/tmp/testdata", base.Directory(testdataDir)). WithWorkdir("/tmp/testdata"). - WithServiceBinding("zot", zot). + WithServiceBinding("zot", zot.AsService()). WithEnvVariable("FLIPT_STORAGE_OCI_AUTHENTICATION_USERNAME", "username"). WithEnvVariable("FLIPT_STORAGE_OCI_AUTHENTICATION_PASSWORD", "password"). WithExec([]string{"/flipt", "bundle", "build", "readonly:latest"}). @@ -369,7 +372,7 @@ func oci(ctx context.Context, client *dagger.Client, base, flipt *dagger.Contain } flipt = flipt. - WithServiceBinding("zot", zot). + WithServiceBinding("zot", zot.AsService()). WithEnvVariable("FLIPT_LOG_LEVEL", "DEBUG"). WithEnvVariable("FLIPT_STORAGE_TYPE", "oci"). WithEnvVariable("FLIPT_STORAGE_OCI_REPOSITORY", "http://zot:5000/readonly:latest"). @@ -408,7 +411,7 @@ func importExport(ctx context.Context, _ *dagger.Client, base, flipt *dagger.Con WithEnvVariable("UNIQUE", uuid.New().String()). // copy testdata import yaml from base WithFile("import.yaml", seed). - WithServiceBinding("flipt", fliptToTest). + WithServiceBinding("flipt", fliptToTest.AsService()). // it appears it takes a little while for Flipt to come online // For the go tests they have to compile and that seems to be enough // time for the target Flipt to come up. @@ -443,7 +446,7 @@ func importExport(ctx context.Context, _ *dagger.Client, base, flipt *dagger.Con // use target flipt binary to invoke import generated, err := flipt. WithEnvVariable("UNIQUE", uuid.New().String()). - WithServiceBinding("flipt", fliptToTest). + WithServiceBinding("flipt", fliptToTest.AsService()). WithExec(append([]string{"/flipt", "export", "-o", "/tmp/output.yaml"}, flags...)). File("/tmp/output.yaml"). Contents(ctx) @@ -482,7 +485,7 @@ func suite(ctx context.Context, dir string, base, flipt *dagger.Container, conf _, err = base. WithWorkdir(path.Join("build/testing/integration", dir)). WithEnvVariable("UNIQUE", uuid.New().String()). - WithServiceBinding("flipt", flipt). + WithServiceBinding("flipt", flipt.AsService()). WithExec([]string{"sh", "-c", fmt.Sprintf("go test -v -timeout=1m -race %s .", strings.Join(flags, " "))}). Sync(ctx) diff --git a/build/testing/loadtest.go b/build/testing/loadtest.go index 0edea682ea..e0e96313c4 100644 --- a/build/testing/loadtest.go +++ b/build/testing/loadtest.go @@ -21,7 +21,8 @@ func LoadTest(ctx context.Context, client *dagger.Client, base, flipt *dagger.Co From("postgres"). WithEnvVariable("POSTGRES_PASSWORD", "password"). WithExposedPort(5432). - WithExec(nil)) + WithExec(nil). + AsService()) // import some test data flipt, err := flipt.WithEnvVariable("UNIQUE", uuid.New().String()). @@ -53,7 +54,8 @@ func LoadTest(ctx context.Context, client *dagger.Client, base, flipt *dagger.Co WithServiceBinding("redis", client.Container(). From("redis"). WithExposedPort(6379). - WithExec(nil)) + WithExec(nil). + AsService()) } flipt = flipt.WithExec(nil) @@ -77,7 +79,7 @@ func LoadTest(ctx context.Context, client *dagger.Client, base, flipt *dagger.Co _, err = client.Container(). From("pyroscope/pyroscope:latest"). WithFile("loadtest", loadtest). - WithServiceBinding("flipt", flipt). + WithServiceBinding("flipt", flipt.AsService()). WithExec(append([]string{"adhoc", "--log-level", "info", "--url", "flipt:8080"}, cmd...)). Directory("/home/pyroscope/.local/share/pyroscope"). Export(ctx, "build/internal/out/profiles") diff --git a/build/testing/migration.go b/build/testing/migration.go index 7d3958582a..246ebf7883 100644 --- a/build/testing/migration.go +++ b/build/testing/migration.go @@ -48,7 +48,7 @@ func Migration(ctx context.Context, client *dagger.Client, base, flipt *dagger.C // import testdata into latest Flipt instance (using latest image for import) _, err = latest. WithFile("import.yaml", base.File("build/testing/integration/readonly/testdata/default.yaml")). - WithServiceBinding("flipt", latest.WithExec(nil)). + WithServiceBinding("flipt", latest.WithExec(nil).AsService()). WithExec([]string{"sh", "-c", "sleep 5 && /flipt import --address grpc://flipt:9000 import.yaml"}). Sync(ctx) if err != nil { @@ -71,7 +71,7 @@ func Migration(ctx context.Context, client *dagger.Client, base, flipt *dagger.C // ensure new edge Flipt build continues to work as expected _, err = base. - WithServiceBinding("flipt", flipt.WithExec(nil)). + WithServiceBinding("flipt", flipt.WithExec(nil).AsService()). WithWorkdir("build/testing/integration/readonly"). WithEnvVariable("UNIQUE", uuid.New().String()). WithExec([]string{"go", "test", "-v", "-race", "--flipt-addr", "grpc://flipt:9000", "."}). diff --git a/build/testing/test.go b/build/testing/test.go index 60467cd5c3..367907bb4b 100644 --- a/build/testing/test.go +++ b/build/testing/test.go @@ -20,7 +20,7 @@ func Unit(ctx context.Context, client *dagger.Client, flipt *dagger.Container) e WithExec(nil) flipt = flipt. - WithServiceBinding("gitea", gitea). + WithServiceBinding("gitea", gitea.AsService()). WithExec([]string{"go", "run", "./build/internal/cmd/gitea/...", "-gitea-url", "http://gitea:3000", "-testdata-dir", "./internal/storage/fs/git/testdata"}) out, err := flipt.Stdout(ctx) @@ -41,13 +41,13 @@ func Unit(ctx context.Context, client *dagger.Client, flipt *dagger.Container) e WithExec([]string{"server", "/data", "--address", ":9009"}) flipt = flipt. - WithServiceBinding("minio", minio). + WithServiceBinding("minio", minio.AsService()). WithEnvVariable("AWS_ACCESS_KEY_ID", "user"). WithEnvVariable("AWS_SECRET_ACCESS_KEY", "password"). WithExec([]string{"go", "run", "./build/internal/cmd/minio/...", "-minio-url", "http://minio:9009", "-testdata-dir", "./internal/storage/fs/s3/testdata"}) flipt, err = flipt. - WithServiceBinding("redis", redisSrv). + WithServiceBinding("redis", redisSrv.AsService()). WithEnvVariable("REDIS_HOST", "redis:6379"). WithEnvVariable("TEST_GIT_REPO_URL", "http://gitea:3000/root/features.git"). WithEnvVariable("TEST_GIT_REPO_HEAD", push["HEAD"]). diff --git a/build/testing/ui.go b/build/testing/ui.go index 86bbf3c7c4..ba88905767 100644 --- a/build/testing/ui.go +++ b/build/testing/ui.go @@ -44,7 +44,8 @@ func buildUI(ctx context.Context, ui, flipt *dagger.Container) (_ *dagger.Contai WithEnvVariable("CI", os.Getenv("CI")). WithEnvVariable("FLIPT_AUTHENTICATION_METHODS_TOKEN_ENABLED", "true"). WithEnvVariable("UNIQUE", time.Now().String()). - WithExec(nil)). + WithExec(nil). + AsService()). WithFile("/usr/bin/flipt", flipt.File("/flipt")). WithEnvVariable("FLIPT_ADDRESS", "http://flipt:8080"), nil } diff --git a/go.mod b/go.mod index 6f3fe5b484..7bd8d65d31 100644 --- a/go.mod +++ b/go.mod @@ -68,7 +68,7 @@ require ( go.opentelemetry.io/otel/trace v1.21.0 go.uber.org/zap v1.26.0 golang.org/x/crypto v0.16.0 - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 + golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb golang.org/x/net v0.19.0 golang.org/x/oauth2 v0.15.0 golang.org/x/sync v0.5.0 @@ -83,12 +83,16 @@ require ( ) require ( + dagger.io/dagger v0.9.4 // indirect dario.cat/mergo v1.0.0 // indirect + github.com/99designs/gqlgen v0.17.41 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Khan/genqlient v0.6.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/hcsshim v0.11.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect + github.com/adrg/xdg v0.4.0 // indirect github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/aws/aws-sdk-go-v2 v1.24.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect @@ -134,7 +138,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.5.0 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect @@ -159,6 +163,7 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/term v0.5.0 // indirect @@ -184,6 +189,7 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.0 // indirect + github.com/sosodev/duration v1.2.0 // 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 @@ -193,6 +199,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/uber/jaeger-lib v2.2.0+incompatible // indirect + github.com/vektah/gqlparser/v2 v2.5.10 // indirect github.com/vmihailenco/go-tinylfu v0.2.2 // indirect github.com/vmihailenco/msgpack/v5 v5.3.4 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -208,7 +215,7 @@ require ( golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect + golang.org/x/tools v0.16.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect diff --git a/go.sum b/go.sum index c9fb756c78..838135dd51 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,12 @@ cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGB cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cuelang.org/go v0.6.0 h1:dJhgKCog+FEZt7OwAYV1R+o/RZPmE8aqFoptmxSWyr8= cuelang.org/go v0.6.0/go.mod h1:9CxOX8aawrr3BgSdqPj7V0RYoXo7XIb+yDFC6uESrOQ= +dagger.io/dagger v0.9.4 h1:0GNTLq1RlTOcwq6u3qMg/hLFBf2t+OlPeq9OYstLE1E= +dagger.io/dagger v0.9.4/go.mod h1:ic2UD6gS5iBp2e6VWPxyb7h6VpAyhFN6U7/TDlriox8= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/99designs/gqlgen v0.17.41 h1:C1/zYMhGVP5TWNCNpmZ9Mb6CqT1Vr5SHEWoTOEJ3v3I= +github.com/99designs/gqlgen v0.17.41/go.mod h1:GQ6SyMhwFbgHR0a8r2Wn8fYgEwPxxmndLFPhU63+cJE= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= @@ -18,6 +22,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg6 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/HdrHistogram/hdrhistogram-go v0.9.0 h1:dpujRju0R4M/QZzcnR1LH1qm+TVG3UzkWdp5tH1WMcg= github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= +github.com/Khan/genqlient v0.6.0 h1:Bwb1170ekuNIVIwTJEqvO8y7RxBxXu639VJOkKSrwAk= +github.com/Khan/genqlient v0.6.0/go.mod h1:rvChwWVTqXhiapdhLDV4bp9tz/Xvtewwkon4DpWWCRM= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= @@ -35,6 +41,10 @@ github.com/XSAM/otelsql v0.26.0 h1:UhAGVBD34Ctbh2aYcm/JAdL+6T6ybrP+YMWYkHqCdmo= github.com/XSAM/otelsql v0.26.0/go.mod h1:5ciw61eMSh+RtTPN8spvPEPLJpAErZw8mFFPNfYiaxA= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -282,6 +292,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/csrf v1.7.2 h1:oTUjx0vyf2T+wkrx09Trsev1TE+/EbDAeHtSTbtC2eI= github.com/gorilla/csrf v1.7.2/go.mod h1:F1Fj3KG23WYHE6gozCmBAezKookxbIvUJT+121wTuLk= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= @@ -441,6 +453,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -574,6 +588,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= +github.com/sosodev/duration v1.2.0 h1:pqK/FLSjsAADWY74SyWDCjOcd5l7H8GSnnOGEB9A1Us= +github.com/sosodev/duration v1.2.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= 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= @@ -622,6 +638,8 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vektah/gqlparser/v2 v2.5.10 h1:6zSM4azXC9u4Nxy5YmdmGu4uKamfwsdKTwp5zsEealU= +github.com/vektah/gqlparser/v2 v2.5.10/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/go-tinylfu v0.2.2 h1:H1eiG6HM36iniK6+21n9LLpzx1G9R3DJa2UjUjbynsI= @@ -717,6 +735,8 @@ golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -878,6 +898,7 @@ golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.work.sum b/go.work.sum index 87053ed984..0182360072 100644 --- a/go.work.sum +++ b/go.work.sum @@ -306,6 +306,7 @@ code.gitea.io/gitea-vet v0.2.1 h1:b30by7+3SkmiftK0RjuXqFvZg2q4p68uoPGuxhzBN0s= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/gqlgen v0.17.31/go.mod h1:i4rEatMrzzu6RXaHydq1nmEPZkb3bKQsnxNRHS4DQB4= github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= @@ -339,6 +340,7 @@ github.com/IBM/sarama v1.40.1 h1:lL01NNg/iBeigUbT+wpPysuTYW6roHo6kc1QrffRf0k= github.com/IBM/sarama v1.40.1/go.mod h1:+5OFwA5Du9I6QrznhaMHsuwWdWZNMjaBSIxEWEgKOYE= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= @@ -352,6 +354,7 @@ github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= @@ -470,6 +473,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cristalhq/acmd v0.8.1 h1:mtFp/cbeJNY5jokF9zPz5mRllGHropRrOkOVxeGS6FI= github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 h1:XNT/Zf5l++1Pyg08/HV04ppB0gKxAqtZQBRYiYrUuYk= @@ -571,6 +575,7 @@ github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= @@ -859,12 +864,15 @@ github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/snowflakedb/gosnowflake v1.6.19 h1:KSHXrQ5o7uso25hNIzi/RObXtnSGkFgie91X82KcvMY= github.com/snowflakedb/gosnowflake v1.6.19/go.mod h1:FM1+PWUdwB9udFDsXdfD58NONC0m+MlOSmQRvimobSM= +github.com/sosodev/duration v1.1.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/spdx/tools-golang v0.3.1-0.20230104082527-d6f58551be3f h1:9B623Cfs+mclYK6dsae7gLSwuIBHvlgmEup87qpqsAQ= github.com/spdx/tools-golang v0.3.1-0.20230104082527-d6f58551be3f/go.mod h1:VHzvNsKAfAGqs4ZvwRL+7a0dNsL20s7lGui4K9C0xQM= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= @@ -892,6 +900,7 @@ github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTc github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vektah/gqlparser/v2 v2.5.6/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME= github.com/veraison/go-cose v1.0.0-rc.1 h1:4qA7dbFJGvt7gcqv5MCIyCQvN+NpHFPkW7do3EeDLb8= github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= @@ -965,13 +974,17 @@ golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= @@ -989,6 +1002,7 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= @@ -1017,6 +1031,7 @@ google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= From 084dab0d4823ac2b8fbe0b25808f72e5020ed23c Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Wed, 13 Dec 2023 14:47:26 +0000 Subject: [PATCH 18/31] chore: cleanup go work sum --- go.work.sum | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go.work.sum b/go.work.sum index 0182360072..da82c3b4c7 100644 --- a/go.work.sum +++ b/go.work.sum @@ -340,6 +340,7 @@ github.com/IBM/sarama v1.40.1 h1:lL01NNg/iBeigUbT+wpPysuTYW6roHo6kc1QrffRf0k= github.com/IBM/sarama v1.40.1/go.mod h1:+5OFwA5Du9I6QrznhaMHsuwWdWZNMjaBSIxEWEgKOYE= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= @@ -354,6 +355,7 @@ github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= From fe161be2586f6228436e978763f070c4cdf83cde Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Wed, 13 Dec 2023 14:51:27 +0000 Subject: [PATCH 19/31] chore(github): update DAGGER_VERSION to 0.9.4 --- .github/workflows/integration-test.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 868eb765f0..9a6b92dd38 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -8,7 +8,7 @@ on: env: GO_VERSION: "1.21" - DAGGER_VERSION: "0.8.3" + DAGGER_VERSION: "0.9.4" jobs: cli: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8bbba927ee..80162eda3f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ on: env: GO_VERSION: "1.21" - DAGGER_VERSION: "0.8.3" + DAGGER_VERSION: "0.9.4" jobs: test: From 68790aa73ab5b5cc02afbceabe687bb56207c0db Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Wed, 13 Dec 2023 14:52:49 +0000 Subject: [PATCH 20/31] fix(mod): update dagger in correct go.mod (build) --- build/go.mod | 19 ++++++++++--------- build/go.sum | 17 +++++++++++++++++ go.mod | 7 ------- go.sum | 23 +---------------------- 4 files changed, 28 insertions(+), 38 deletions(-) diff --git a/build/go.mod b/build/go.mod index 8830e46eb3..1edbbdd1dd 100644 --- a/build/go.mod +++ b/build/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( code.gitea.io/sdk/gitea v0.15.1 - dagger.io/dagger v0.8.3 + dagger.io/dagger v0.9.4 github.com/aws/aws-sdk-go-v2 v1.22.1 github.com/aws/aws-sdk-go-v2/config v1.19.1 github.com/aws/aws-sdk-go-v2/service/s3 v1.42.0 @@ -15,7 +15,7 @@ require ( github.com/gofrs/uuid v4.4.0+incompatible github.com/google/go-cmp v0.6.0 github.com/google/go-github/v53 v53.2.0 - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.5.0 github.com/magefile/mage v1.15.0 github.com/opencontainers/image-spec v1.1.0-rc5 github.com/stretchr/testify v1.8.4 @@ -33,7 +33,7 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect - github.com/99designs/gqlgen v0.17.36 // indirect + github.com/99designs/gqlgen v0.17.41 // indirect github.com/BurntSushi/toml v1.2.1 // indirect github.com/Khan/genqlient v0.6.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect @@ -95,21 +95,22 @@ require ( github.com/sergi/go-diff v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.0 // indirect + github.com/sosodev/duration v1.2.0 // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/streadway/quantile v0.0.0-20220407130108-4246515d968d // indirect - github.com/vektah/gqlparser/v2 v2.5.8 // indirect + github.com/vektah/gqlparser/v2 v2.5.10 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.flipt.io/flipt/errors v1.19.3 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sys v0.14.0 // indirect + golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect + golang.org/x/tools v0.16.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect diff --git a/build/go.sum b/build/go.sum index e6baec5557..29681b5723 100644 --- a/build/go.sum +++ b/build/go.sum @@ -5,10 +5,14 @@ code.gitea.io/sdk/gitea v0.15.1 h1:WJreC7YYuxbn0UDaPuWIe/mtiNKTvLN8MLkaw71yx/M= code.gitea.io/sdk/gitea v0.15.1/go.mod h1:klY2LVI3s3NChzIk/MzMn7G1FHrfU7qd63iSMVoHRBA= dagger.io/dagger v0.8.3 h1:FEUexo5Rx9ns7/YYFtEcceI/g62neasBTHB2d5axK+s= dagger.io/dagger v0.8.3/go.mod h1:Nwl7WI8YETaZhGjPJvkiOZnKLJXBaJOkSarp5m4+FxA= +dagger.io/dagger v0.9.4 h1:0GNTLq1RlTOcwq6u3qMg/hLFBf2t+OlPeq9OYstLE1E= +dagger.io/dagger v0.9.4/go.mod h1:ic2UD6gS5iBp2e6VWPxyb7h6VpAyhFN6U7/TDlriox8= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/99designs/gqlgen v0.17.36 h1:u/o/rv2SZ9s5280dyUOOrkpIIkr/7kITMXYD3rkJ9go= github.com/99designs/gqlgen v0.17.36/go.mod h1:6RdyY8puhCoWAQVr2qzF2OMVfudQzc8ACxzpzluoQm4= +github.com/99designs/gqlgen v0.17.41 h1:C1/zYMhGVP5TWNCNpmZ9Mb6CqT1Vr5SHEWoTOEJ3v3I= +github.com/99designs/gqlgen v0.17.41/go.mod h1:GQ6SyMhwFbgHR0a8r2Wn8fYgEwPxxmndLFPhU63+cJE= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -164,6 +168,8 @@ github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= @@ -242,6 +248,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= +github.com/sosodev/duration v1.2.0 h1:pqK/FLSjsAADWY74SyWDCjOcd5l7H8GSnnOGEB9A1Us= +github.com/sosodev/duration v1.2.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= @@ -259,6 +267,8 @@ github.com/tsenart/vegeta v12.7.0+incompatible h1:sGlrv11EMxQoKOlDuMWR23UdL90LE5 github.com/tsenart/vegeta v12.7.0+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM= github.com/vektah/gqlparser/v2 v2.5.8 h1:pm6WOnGdzFOCfcQo9L3+xzW51mKrlwTEg4Wr7AH1JW4= github.com/vektah/gqlparser/v2 v2.5.8/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME= +github.com/vektah/gqlparser/v2 v2.5.10 h1:6zSM4azXC9u4Nxy5YmdmGu4uKamfwsdKTwp5zsEealU= +github.com/vektah/gqlparser/v2 v2.5.10/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -284,10 +294,13 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -315,6 +328,7 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= @@ -350,6 +364,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -383,6 +399,7 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.mod b/go.mod index 7bd8d65d31..07c85ad777 100644 --- a/go.mod +++ b/go.mod @@ -83,16 +83,12 @@ require ( ) require ( - dagger.io/dagger v0.9.4 // indirect dario.cat/mergo v1.0.0 // indirect - github.com/99designs/gqlgen v0.17.41 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Khan/genqlient v0.6.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/hcsshim v0.11.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect - github.com/adrg/xdg v0.4.0 // indirect github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/aws/aws-sdk-go-v2 v1.24.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect @@ -163,7 +159,6 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/term v0.5.0 // indirect @@ -189,7 +184,6 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.0 // indirect - github.com/sosodev/duration v1.2.0 // 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 @@ -199,7 +193,6 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/uber/jaeger-lib v2.2.0+incompatible // indirect - github.com/vektah/gqlparser/v2 v2.5.10 // indirect github.com/vmihailenco/go-tinylfu v0.2.2 // indirect github.com/vmihailenco/msgpack/v5 v5.3.4 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index 838135dd51..1e60454fd0 100644 --- a/go.sum +++ b/go.sum @@ -7,12 +7,8 @@ cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGB cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cuelang.org/go v0.6.0 h1:dJhgKCog+FEZt7OwAYV1R+o/RZPmE8aqFoptmxSWyr8= cuelang.org/go v0.6.0/go.mod h1:9CxOX8aawrr3BgSdqPj7V0RYoXo7XIb+yDFC6uESrOQ= -dagger.io/dagger v0.9.4 h1:0GNTLq1RlTOcwq6u3qMg/hLFBf2t+OlPeq9OYstLE1E= -dagger.io/dagger v0.9.4/go.mod h1:ic2UD6gS5iBp2e6VWPxyb7h6VpAyhFN6U7/TDlriox8= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/99designs/gqlgen v0.17.41 h1:C1/zYMhGVP5TWNCNpmZ9Mb6CqT1Vr5SHEWoTOEJ3v3I= -github.com/99designs/gqlgen v0.17.41/go.mod h1:GQ6SyMhwFbgHR0a8r2Wn8fYgEwPxxmndLFPhU63+cJE= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= @@ -22,8 +18,6 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg6 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/HdrHistogram/hdrhistogram-go v0.9.0 h1:dpujRju0R4M/QZzcnR1LH1qm+TVG3UzkWdp5tH1WMcg= github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= -github.com/Khan/genqlient v0.6.0 h1:Bwb1170ekuNIVIwTJEqvO8y7RxBxXu639VJOkKSrwAk= -github.com/Khan/genqlient v0.6.0/go.mod h1:rvChwWVTqXhiapdhLDV4bp9tz/Xvtewwkon4DpWWCRM= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= @@ -41,10 +35,6 @@ github.com/XSAM/otelsql v0.26.0 h1:UhAGVBD34Ctbh2aYcm/JAdL+6T6ybrP+YMWYkHqCdmo= github.com/XSAM/otelsql v0.26.0/go.mod h1:5ciw61eMSh+RtTPN8spvPEPLJpAErZw8mFFPNfYiaxA= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -290,8 +280,6 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/csrf v1.7.2 h1:oTUjx0vyf2T+wkrx09Trsev1TE+/EbDAeHtSTbtC2eI= @@ -453,8 +441,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -588,8 +574,6 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= -github.com/sosodev/duration v1.2.0 h1:pqK/FLSjsAADWY74SyWDCjOcd5l7H8GSnnOGEB9A1Us= -github.com/sosodev/duration v1.2.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= 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= @@ -638,8 +622,6 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vektah/gqlparser/v2 v2.5.10 h1:6zSM4azXC9u4Nxy5YmdmGu4uKamfwsdKTwp5zsEealU= -github.com/vektah/gqlparser/v2 v2.5.10/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/go-tinylfu v0.2.2 h1:H1eiG6HM36iniK6+21n9LLpzx1G9R3DJa2UjUjbynsI= @@ -733,8 +715,6 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -896,8 +876,7 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From a701632439aa62cfed8e7c1156b7e841b0be67a7 Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Wed, 13 Dec 2023 22:35:10 +0200 Subject: [PATCH 21/31] feat(ui): show time/date format on settings/preferences page (#2537) fixes #2535 --- ui/src/app/preferences/Preferences.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/src/app/preferences/Preferences.tsx b/ui/src/app/preferences/Preferences.tsx index a612c3bb14..d1732392c5 100644 --- a/ui/src/app/preferences/Preferences.tsx +++ b/ui/src/app/preferences/Preferences.tsx @@ -3,6 +3,7 @@ import { Formik } from 'formik'; import { useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import Select from '~/components/forms/Select'; +import { useTimezone } from '~/data/hooks/timezone'; import { Theme, Timezone } from '~/types/Preferences'; import { cls } from '~/utils/helpers'; import { @@ -22,7 +23,7 @@ export default function Preferences() { timezone: timezone, theme: theme }; - + const { inTimezone } = useTimezone(); const isUTC = useMemo(() => timezone === Timezone.UTC, [timezone]); return ( @@ -71,6 +72,9 @@ export default function Preferences() {

Display dates and times in UTC timezone

+

+ {inTimezone(new Date().toUTCString())} +

Date: Wed, 13 Dec 2023 23:49:06 +0200 Subject: [PATCH 22/31] fix(cfg): default config outputs first INFO log regardless of FLIPT_LOG_LEVEL (#2536) I would say that it's more chicken and egg problem. Viper is loading the configuration after the logger says that there is no configuration file. fixes #2531 --- cmd/flipt/main.go | 6 +++++- internal/config/config.go | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cmd/flipt/main.go b/cmd/flipt/main.go index 5417d9cf79..ffe11cf2dd 100644 --- a/cmd/flipt/main.go +++ b/cmd/flipt/main.go @@ -67,8 +67,12 @@ var ( ) func loggerConfig(encoding zapcore.EncoderConfig) zap.Config { + level, err := zap.ParseAtomicLevel(os.Getenv(config.EnvPrefix + "_LOG_LEVEL")) + if err != nil { + level = zap.NewAtomicLevelAt(zap.InfoLevel) + } return zap.Config{ - Level: zap.NewAtomicLevelAt(zap.InfoLevel), + Level: level, Development: false, Encoding: "console", EncoderConfig: encoding, diff --git a/internal/config/config.go b/internal/config/config.go index 0821076590..dfa81ac530 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -17,6 +17,7 @@ import ( ) const Version = "1.0" +const EnvPrefix = "FLIPT" var DecodeHooks = []mapstructure.DecodeHookFunc{ mapstructure.StringToTimeDurationHookFunc(), @@ -75,7 +76,7 @@ func Dir() (string, error) { func Load(path string) (*Result, error) { v := viper.New() - v.SetEnvPrefix("FLIPT") + v.SetEnvPrefix(EnvPrefix) v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) v.AutomaticEnv() From aa91f6a28c5440f91ab70b5a13952870b6b0784d Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Thu, 14 Dec 2023 12:19:57 +0000 Subject: [PATCH 23/31] fix(build): create new db instance per api IT --- build/testing/integration.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/testing/integration.go b/build/testing/integration.go index 1c72b6dc71..8cec3357f7 100644 --- a/build/testing/integration.go +++ b/build/testing/integration.go @@ -196,6 +196,7 @@ func withPostgres(fn testCaseFn) testCaseFn { From("postgres"). WithEnvVariable("POSTGRES_PASSWORD", "password"). WithExposedPort(5432). + WithEnvVariable("UNIQUE", uuid.New().String()). WithExec(nil). AsService()), conf, @@ -216,6 +217,7 @@ func withMySQL(fn testCaseFn) testCaseFn { WithEnvVariable("MYSQL_PASSWORD", "password"). WithEnvVariable("MYSQL_DATABASE", "flipt_test"). WithEnvVariable("MYSQL_ALLOW_EMPTY_PASSWORD", "true"). + WithEnvVariable("UNIQUE", uuid.New().String()). WithExposedPort(3306). WithExec(nil). AsService()), @@ -232,6 +234,7 @@ func withCockroach(fn testCaseFn) testCaseFn { From("cockroachdb/cockroach:latest-v21.2"). WithEnvVariable("COCKROACH_USER", "root"). WithEnvVariable("COCKROACH_DATABASE", "defaultdb"). + WithEnvVariable("UNIQUE", uuid.New().String()). WithExposedPort(26257). WithExec([]string{"start-single-node", "--insecure"}). AsService()), From 5f52089f2c0a4e11a9502c2723a0c5c0fab6dff6 Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Thu, 14 Dec 2023 12:20:42 +0000 Subject: [PATCH 24/31] fix(mysql): increase timestamp precision from seconds to microseconds --- .../mysql/11_change_timestamp_precision.up.sql | 17 +++++++++++++++++ internal/storage/sql/migrator.go | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 config/migrations/mysql/11_change_timestamp_precision.up.sql diff --git a/config/migrations/mysql/11_change_timestamp_precision.up.sql b/config/migrations/mysql/11_change_timestamp_precision.up.sql new file mode 100644 index 0000000000..5bab0d352f --- /dev/null +++ b/config/migrations/mysql/11_change_timestamp_precision.up.sql @@ -0,0 +1,17 @@ +ALTER TABLE flags MODIFY created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; +ALTER TABLE flags MODIFY updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; + +ALTER TABLE segments MODIFY created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; +ALTER TABLE segments MODIFY updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; + +ALTER TABLE variants MODIFY created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; +ALTER TABLE variants MODIFY updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; + +ALTER TABLE constraints MODIFY created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; +ALTER TABLE constraints MODIFY updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; + +ALTER TABLE rules MODIFY created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; +ALTER TABLE rules MODIFY updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; + +ALTER TABLE distributions MODIFY created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; +ALTER TABLE distributions MODIFY updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL; diff --git a/internal/storage/sql/migrator.go b/internal/storage/sql/migrator.go index ef6b2b17ab..e238a76b30 100644 --- a/internal/storage/sql/migrator.go +++ b/internal/storage/sql/migrator.go @@ -21,7 +21,7 @@ var expectedVersions = map[Driver]uint{ SQLite: 11, LibSQL: 11, // libsql driver uses the same migrations as sqlite3 Postgres: 12, - MySQL: 10, + MySQL: 11, CockroachDB: 9, } From 69fb56472ea8cef80745477b699def6dfaf9d954 Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Thu, 14 Dec 2023 12:21:10 +0000 Subject: [PATCH 25/31] feat(rpc/flipt): add Now timestamp with microsecond precision function --- rpc/flipt/timestamp.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 rpc/flipt/timestamp.go diff --git a/rpc/flipt/timestamp.go b/rpc/flipt/timestamp.go new file mode 100644 index 0000000000..da8050d13a --- /dev/null +++ b/rpc/flipt/timestamp.go @@ -0,0 +1,17 @@ +package flipt + +import ( + "time" + + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +// Now returns a timestamppb.Time pointer which is rounded to +// microsecond precision. +// This is enough for Flipts purposes and the lowest common +// denominator for the various backends. +func Now() *timestamppb.Timestamp { + now := timestamppb.Now() + now.Nanos = int32(now.AsTime().Round(time.Microsecond).Nanosecond()) + return now +} From 8fbffbc27e91b91a996f7b412449f0ae1778198e Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Thu, 14 Dec 2023 12:21:51 +0000 Subject: [PATCH 26/31] refactor: use rpc/flipt.Now everywhere instead of timestamppb.Now --- build/testing/integration/api/authenticated.go | 4 ++-- internal/server/auth/server.go | 4 ++-- internal/storage/auth/memory/store.go | 3 ++- internal/storage/fs/snapshot.go | 2 +- internal/storage/sql/common/flag.go | 9 ++++----- internal/storage/sql/common/namespace.go | 5 ++--- internal/storage/sql/common/rollout.go | 7 +++---- internal/storage/sql/common/rule.go | 11 +++++------ internal/storage/sql/common/segment.go | 9 ++++----- 9 files changed, 25 insertions(+), 29 deletions(-) diff --git a/build/testing/integration/api/authenticated.go b/build/testing/integration/api/authenticated.go index c864d1af49..3e30e6709f 100644 --- a/build/testing/integration/api/authenticated.go +++ b/build/testing/integration/api/authenticated.go @@ -7,11 +7,11 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.flipt.io/flipt/build/testing/integration" + "go.flipt.io/flipt/rpc/flipt" "go.flipt.io/flipt/rpc/flipt/auth" sdk "go.flipt.io/flipt/sdk/go" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" ) func Authenticated(t *testing.T, client sdk.SDK, opts integration.TestOpts) { @@ -94,7 +94,7 @@ func Authenticated(t *testing.T, client sdk.SDK, opts integration.TestOpts) { t.Run("Expire Self", func(t *testing.T) { err := client.Auth().AuthenticationService().ExpireAuthenticationSelf(ctx, &auth.ExpireAuthenticationSelfRequest{ - ExpiresAt: timestamppb.Now(), + ExpiresAt: flipt.Now(), }) if opts.AuthConfig == integration.AuthNamespaced { diff --git a/internal/server/auth/server.go b/internal/server/auth/server.go index 6db14ef4e1..fb1d304af0 100644 --- a/internal/server/auth/server.go +++ b/internal/server/auth/server.go @@ -9,12 +9,12 @@ import ( authmiddlewaregrpc "go.flipt.io/flipt/internal/server/auth/middleware/grpc" "go.flipt.io/flipt/internal/storage" storageauth "go.flipt.io/flipt/internal/storage/auth" + "go.flipt.io/flipt/rpc/flipt" "go.flipt.io/flipt/rpc/flipt/auth" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/emptypb" - "google.golang.org/protobuf/types/known/timestamppb" ) const ( @@ -166,7 +166,7 @@ func (s *Server) ExpireAuthenticationSelf(ctx context.Context, req *auth.ExpireA s.logger.Debug("ExpireAuthentication", zap.String("id", auth.Id)) if req.ExpiresAt == nil || !req.ExpiresAt.IsValid() { - req.ExpiresAt = timestamppb.Now() + req.ExpiresAt = flipt.Now() } return &emptypb.Empty{}, s.store.ExpireAuthenticationByID(ctx, auth.Id, req.ExpiresAt) diff --git a/internal/storage/auth/memory/store.go b/internal/storage/auth/memory/store.go index aecb7fdf32..a28d3cdd4f 100644 --- a/internal/storage/auth/memory/store.go +++ b/internal/storage/auth/memory/store.go @@ -11,6 +11,7 @@ import ( "go.flipt.io/flipt/errors" "go.flipt.io/flipt/internal/storage" "go.flipt.io/flipt/internal/storage/auth" + rpcflipt "go.flipt.io/flipt/rpc/flipt" rpcauth "go.flipt.io/flipt/rpc/flipt/auth" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -38,7 +39,7 @@ func NewStore(opts ...Option) *Store { store := &Store{ byID: map[string]*rpcauth.Authentication{}, byToken: map[string]*rpcauth.Authentication{}, - now: timestamppb.Now, + now: rpcflipt.Now, generateID: func() string { return uuid.Must(uuid.NewV4()).String() }, diff --git a/internal/storage/fs/snapshot.go b/internal/storage/fs/snapshot.go index bfb8de5976..37f3c2febb 100644 --- a/internal/storage/fs/snapshot.go +++ b/internal/storage/fs/snapshot.go @@ -110,7 +110,7 @@ func SnapshotFromPaths(logger *zap.Logger, ffs fs.FS, paths ...string) (*StoreSn // SnapshotFromFiles constructs a StoreSnapshot from the provided slice // of fs.File implementations. func SnapshotFromFiles(logger *zap.Logger, files ...fs.File) (*StoreSnapshot, error) { - now := timestamppb.Now() + now := flipt.Now() s := StoreSnapshot{ ns: map[string]*namespace{ defaultNs: newNamespace("default", "Default", now), diff --git a/internal/storage/sql/common/flag.go b/internal/storage/sql/common/flag.go index 43db70bcf7..0e6ecfab71 100644 --- a/internal/storage/sql/common/flag.go +++ b/internal/storage/sql/common/flag.go @@ -16,7 +16,6 @@ import ( "go.flipt.io/flipt/internal/storage" fliptsql "go.flipt.io/flipt/internal/storage/sql" flipt "go.flipt.io/flipt/rpc/flipt" - "google.golang.org/protobuf/types/known/timestamppb" ) func compactJSONString(jsonString string) (string, error) { @@ -339,7 +338,7 @@ func (s *Store) CreateFlag(ctx context.Context, r *flipt.CreateFlagRequest) (*fl } var ( - now = timestamppb.Now() + now = flipt.Now() flag = &flipt.Flag{ NamespaceKey: r.NamespaceKey, Key: r.Key, @@ -381,7 +380,7 @@ func (s *Store) UpdateFlag(ctx context.Context, r *flipt.UpdateFlagRequest) (*fl Set("name", r.Name). Set("description", r.Description). Set("enabled", r.Enabled). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(sq.And{sq.Eq{"namespace_key": r.NamespaceKey}, sq.Eq{"\"key\"": r.Key}}) res, err := query.ExecContext(ctx) @@ -421,7 +420,7 @@ func (s *Store) CreateVariant(ctx context.Context, r *flipt.CreateVariantRequest } var ( - now = timestamppb.Now() + now = flipt.Now() v = &flipt.Variant{ Id: uuid.Must(uuid.NewV4()).String(), NamespaceKey: r.NamespaceKey, @@ -477,7 +476,7 @@ func (s *Store) UpdateVariant(ctx context.Context, r *flipt.UpdateVariantRequest Set("name", r.Name). Set("description", r.Description). Set("attachment", emptyAsNil(r.Attachment)). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(whereClause) res, err := query.ExecContext(ctx) diff --git a/internal/storage/sql/common/namespace.go b/internal/storage/sql/common/namespace.go index 10caa2ff9e..8f29f404ba 100644 --- a/internal/storage/sql/common/namespace.go +++ b/internal/storage/sql/common/namespace.go @@ -13,7 +13,6 @@ import ( "go.flipt.io/flipt/internal/storage" fliptsql "go.flipt.io/flipt/internal/storage/sql" flipt "go.flipt.io/flipt/rpc/flipt" - "google.golang.org/protobuf/types/known/timestamppb" ) func (s *Store) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { @@ -164,7 +163,7 @@ func (s *Store) CountNamespaces(ctx context.Context) (uint64, error) { func (s *Store) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { var ( - now = timestamppb.Now() + now = flipt.Now() namespace = &flipt.Namespace{ Key: r.Key, Name: r.Name, @@ -194,7 +193,7 @@ func (s *Store) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceReq query := s.builder.Update("namespaces"). Set("name", r.Name). Set("description", r.Description). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(sq.Eq{"\"key\"": r.Key}) res, err := query.ExecContext(ctx) diff --git a/internal/storage/sql/common/rollout.go b/internal/storage/sql/common/rollout.go index e4a2bc08c3..20fd19943b 100644 --- a/internal/storage/sql/common/rollout.go +++ b/internal/storage/sql/common/rollout.go @@ -14,7 +14,6 @@ import ( "go.flipt.io/flipt/internal/storage" fliptsql "go.flipt.io/flipt/internal/storage/sql" "go.flipt.io/flipt/rpc/flipt" - "google.golang.org/protobuf/types/known/timestamppb" ) const ( @@ -416,7 +415,7 @@ func (s *Store) CreateRollout(ctx context.Context, r *flipt.CreateRolloutRequest } var ( - now = timestamppb.Now() + now = flipt.Now() rollout = &flipt.Rollout{ Id: uuid.Must(uuid.NewV4()).String(), NamespaceKey: r.NamespaceKey, @@ -560,7 +559,7 @@ func (s *Store) UpdateRollout(ctx context.Context, r *flipt.UpdateRolloutRequest query := s.builder.Update(tableRollouts). RunWith(tx). Set("description", r.Description). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(whereClause) res, err := query.ExecContext(ctx) @@ -764,7 +763,7 @@ func (s *Store) OrderRollouts(ctx context.Context, r *flipt.OrderRolloutsRequest } func (s *Store) orderRollouts(ctx context.Context, runner sq.BaseRunner, namespaceKey, flagKey string, rolloutIDs []string) error { - updatedAt := timestamppb.Now() + updatedAt := flipt.Now() for i, id := range rolloutIDs { _, err := s.builder.Update(tableRollouts). diff --git a/internal/storage/sql/common/rule.go b/internal/storage/sql/common/rule.go index bb755c274f..916ca7d881 100644 --- a/internal/storage/sql/common/rule.go +++ b/internal/storage/sql/common/rule.go @@ -10,7 +10,6 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/gofrs/uuid" - "google.golang.org/protobuf/types/known/timestamppb" errs "go.flipt.io/flipt/errors" "go.flipt.io/flipt/internal/storage" @@ -372,7 +371,7 @@ func (s *Store) CreateRule(ctx context.Context, r *flipt.CreateRuleRequest) (_ * } var ( - now = timestamppb.Now() + now = flipt.Now() rule = &flipt.Rule{ Id: uuid.Must(uuid.NewV4()).String(), NamespaceKey: r.NamespaceKey, @@ -469,7 +468,7 @@ func (s *Store) UpdateRule(ctx context.Context, r *flipt.UpdateRuleRequest) (_ * _, err = s.builder.Update("rules"). RunWith(tx). Set("segment_operator", segmentOperator). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(sq.Eq{"id": r.Id, "namespace_key": r.NamespaceKey, "flag_key": r.FlagKey}). ExecContext(ctx) if err != nil { @@ -592,7 +591,7 @@ func (s *Store) OrderRules(ctx context.Context, r *flipt.OrderRulesRequest) erro } func (s *Store) orderRules(ctx context.Context, runner sq.BaseRunner, namespaceKey, flagKey string, ruleIDs []string) error { - updatedAt := timestamppb.Now() + updatedAt := flipt.Now() for i, id := range ruleIDs { _, err := s.builder.Update("rules"). @@ -645,7 +644,7 @@ func (s *Store) CreateDistribution(ctx context.Context, r *flipt.CreateDistribut } var ( - now = timestamppb.Now() + now = flipt.Now() d = &flipt.Distribution{ Id: uuid.Must(uuid.NewV4()).String(), RuleId: r.RuleId, @@ -699,7 +698,7 @@ func (s *Store) UpdateDistribution(ctx context.Context, r *flipt.UpdateDistribut query := s.builder.Update("distributions"). Set("rollout", r.Rollout). Set("variant_id", r.VariantId). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(sq.Eq{"id": r.Id, "rule_id": r.RuleId}) res, err := query.ExecContext(ctx) diff --git a/internal/storage/sql/common/segment.go b/internal/storage/sql/common/segment.go index 59c110c6f0..dbc13fe3b0 100644 --- a/internal/storage/sql/common/segment.go +++ b/internal/storage/sql/common/segment.go @@ -16,7 +16,6 @@ import ( "go.flipt.io/flipt/internal/storage" fliptsql "go.flipt.io/flipt/internal/storage/sql" flipt "go.flipt.io/flipt/rpc/flipt" - "google.golang.org/protobuf/types/known/timestamppb" ) // GetSegment gets a segment @@ -319,7 +318,7 @@ func (s *Store) CreateSegment(ctx context.Context, r *flipt.CreateSegmentRequest } var ( - now = timestamppb.Now() + now = flipt.Now() segment = &flipt.Segment{ NamespaceKey: r.NamespaceKey, Key: r.Key, @@ -358,7 +357,7 @@ func (s *Store) UpdateSegment(ctx context.Context, r *flipt.UpdateSegmentRequest Set("name", r.Name). Set("description", r.Description). Set("match_type", r.MatchType). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(sq.And{sq.Eq{"namespace_key": r.NamespaceKey}, sq.Eq{"\"key\"": r.Key}}) res, err := query.ExecContext(ctx) @@ -399,7 +398,7 @@ func (s *Store) CreateConstraint(ctx context.Context, r *flipt.CreateConstraintR var ( operator = strings.ToLower(r.Operator) - now = timestamppb.Now() + now = flipt.Now() c = &flipt.Constraint{ Id: uuid.Must(uuid.NewV4()).String(), NamespaceKey: r.NamespaceKey, @@ -461,7 +460,7 @@ func (s *Store) UpdateConstraint(ctx context.Context, r *flipt.UpdateConstraintR Set("operator", operator). Set("value", r.Value). Set("description", r.Description). - Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Set("updated_at", &fliptsql.Timestamp{Timestamp: flipt.Now()}). Where(whereClause). ExecContext(ctx) if err != nil { From 57e7b541845b2135376b797f4ae89c5517c04078 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 16:13:08 +0000 Subject: [PATCH 27/31] chore(deps): bump cuelang.org/go from 0.6.0 to 0.7.0 (#2523) Bumps cuelang.org/go from 0.6.0 to 0.7.0. --- updated-dependencies: - dependency-name: cuelang.org/go dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 07c85ad777..37c03ba0e6 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module go.flipt.io/flipt go 1.21 require ( - cuelang.org/go v0.6.0 + cuelang.org/go v0.7.0 github.com/AlecAivazis/survey/v2 v2.3.7 github.com/MakeNowJust/heredoc v1.0.0 github.com/Masterminds/squirrel v1.5.4 @@ -110,7 +110,7 @@ require ( github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.3.3 // indirect - github.com/cockroachdb/apd/v3 v3.2.0 // indirect + github.com/cockroachdb/apd/v3 v3.2.1 // indirect github.com/cockroachdb/cockroach-go/v2 v2.1.1 // indirect github.com/codahale/hdrhistogram v0.0.0-00010101000000-000000000000 // indirect github.com/containerd/containerd v1.7.7 // indirect diff --git a/go.sum b/go.sum index 1e60454fd0..b6fedabbe2 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,10 @@ cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiV cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cuelang.org/go v0.6.0 h1:dJhgKCog+FEZt7OwAYV1R+o/RZPmE8aqFoptmxSWyr8= -cuelang.org/go v0.6.0/go.mod h1:9CxOX8aawrr3BgSdqPj7V0RYoXo7XIb+yDFC6uESrOQ= +cuelabs.dev/go/oci/ociregistry v0.0.0-20231103182354-93e78c079a13 h1:zkiIe8AxZ/kDjqQN+mDKc5BxoVJOqioSdqApjc+eB1I= +cuelabs.dev/go/oci/ociregistry v0.0.0-20231103182354-93e78c079a13/go.mod h1:XGKYSMtsJWfqQYPwq51ZygxAPqpEUj/9bdg16iDPTAA= +cuelang.org/go v0.7.0 h1:gMztinxuKfJwMIxtboFsNc6s8AxwJGgsJV+3CuLffHI= +cuelang.org/go v0.7.0/go.mod h1:ix+3dM/bSpdG9xg6qpCgnJnpeLtciZu+O/rDbywoMII= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= @@ -108,8 +110,8 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/apd/v3 v3.2.0 h1:79kHCn4tO0VGu3W0WujYrMjBDk8a2H4KEUYcXf7whcg= -github.com/cockroachdb/apd/v3 v3.2.0/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= +github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= github.com/cockroachdb/cockroach-go/v2 v2.1.1 h1:3XzfSMuUT0wBe1a3o5C0eOTcArhmmFAg2Jzh/7hhKqo= github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= @@ -212,8 +214,8 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-quicktest/qt v1.100.0 h1:I7iSLgIwNp0E0UnSvKJzs7ig0jg/Iq83zsZjtQNW7jY= -github.com/go-quicktest/qt v1.100.0/go.mod h1:leyLsQ4jksGmF1KaQEyabnqGIiJTbOU5S46QegToEj4= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-redis/cache/v9 v9.0.0 h1:0thdtFo0xJi0/WXbRVu8B066z8OvVymXTJGaXrVWnN0= github.com/go-redis/cache/v9 v9.0.0/go.mod h1:cMwi1N8ASBOufbIvk7cdXe2PbPjK/WMRL95FFHWsSgI= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -536,8 +538,8 @@ github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.11.1-0.20231026093722-fa6a31e0812c h1:fPpdjePK1atuOg28PXfNSqgwf9I/qD1Hlo39JFwKBXk= +github.com/rogpeppe/go-internal v1.11.1-0.20231026093722-fa6a31e0812c/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= From 0466c1fd4e7428c45314ed7115aea523059c78f7 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:15:34 -0500 Subject: [PATCH 28/31] chore(readme): update readme with client-side eval info (#2539) --- README.md | 54 +++++++++++++++++++++++++++++++----- logos/users/asphaltlogo.png | Bin 9975 -> 0 bytes logos/users/ocrolus.svg | 1 - logos/users/paradigm.png | Bin 7048 -> 0 bytes logos/users/prose.png | Bin 9455 -> 0 bytes logos/users/rokt.svg | 15 ---------- logos/users/uk-moj.png | Bin 12690 -> 0 bytes 7 files changed, 47 insertions(+), 23 deletions(-) delete mode 100644 logos/users/asphaltlogo.png delete mode 100644 logos/users/ocrolus.svg delete mode 100644 logos/users/paradigm.png delete mode 100644 logos/users/prose.png delete mode 100644 logos/users/rokt.svg delete mode 100644 logos/users/uk-moj.png diff --git a/README.md b/README.md index 5a74ecf6f8..9b92da7b06 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,6 @@ Flipt supports use cases such as: - Stand alone, single binary that's easy to run and [configure](https://www.flipt.io/docs/configuration/overview) - Ability to create advanced distribution rules to target segments of users -- Native [GRPC](#grpc-client-libraries) and [REST](#rest-client-libraries) server-side SDKs to integrate with your existing applications - Modern, mobile-friendly 📱 UI and debug console with dark mode 🌙 - Import and export to allow storing your data as code - Works with [Prometheus](https://prometheus.io/) and [OpenTelemetry](https://opentelemetry.io/) out of the box 🔋 @@ -222,7 +221,25 @@ docker run --rm -p 8080:8080 -p 9000:9000 -t docker.flipt.io/flipt/flipt:nightly Check out our [integration documentation](https://flipt.io/docs/integration/) for more info on how to integrate Flipt into your existing applications. -### GRPC Client Libraries +There are two ways to evaluate feature flags with Flipt: + +- [Server Side](#server-side-evaluation) +- [Client Side](#client-side-evaluation) + +### Server Side Evaluation + +Server-side evaluation is the most common way to evaluate feature flags. This is where your application makes a request to Flipt to evaluate a feature flag and Flipt responds with the result of the evaluation. + +Flipt exposes two different APIs for performing server-side evaluation: + +- [GRPC](#grpc) +- [REST](#rest) + +#### GRPC + +Flipt is equipped with a fully functional GRPC API. GRPC is a high performance, low latency, binary protocol that is used by many large scale companies such as Google, Netflix, and more. + +#### GRPC SDKs | Language | Version | Status | | -------- | ------- | ------ | @@ -230,21 +247,22 @@ Check out our [integration documentation](https://flipt.io/docs/integration/) fo | [Ruby](https://github.com/flipt-io/flipt-grpc-ruby) | ![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/flipt-io/flipt-grpc-ruby?color=red&label=gem&sort=semver) | ![stable](https://img.shields.io/badge/status-stable-green) | | [.NET](https://github.com/flipt-io/flipt-grpc-dotnet) | ![Nuget](https://img.shields.io/nuget/v/flipt.grpc) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | -### Generate Your Own +#### Generate Your Own If a client in your language is not available for download, you can easily generate one yourself using the existing [protobuf definition](https://github.com/flipt-io/flipt/blob/main/rpc/flipt/flipt.proto). Our [integration documentation](https://www.flipt.io/docs/integration) has more information on how to generate your own Flipt clients in your language of choice. -
- -### REST API +#### REST Flipt is equipped with a fully functional REST API. In fact, the Flipt UI is completely backed by this same API. This means that anything that can be done in the Flipt UI can also be done via the REST API. The [Flipt REST API](https://www.flipt.io/docs/reference/overview) can also be used with any language that can make HTTP requests. -### REST Client Libraries +#### REST SDKs + +> [!NOTE] +> We will be revamping our current REST SDKs in the coming weeks in order to simplify the API and make them easier to use. If you have any feedback on the current REST SDKs, please open an issue in the respective repository. | Language | Version | Status | | -------- | ------- | ------ | @@ -255,6 +273,28 @@ The [Flipt REST API](https://www.flipt.io/docs/reference/overview) can also be u | [Rust](https://github.com/flipt-io/flipt-rust) | [![crates.io](https://img.shields.io/crates/v/flipt.svg)](https://crates.io/crates/flipt) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | | [PHP](https://github.com/flipt-io/flipt-php) | [![Packagist](https://img.shields.io/packagist/v/flipt-io/flipt)](https://packagist.org/packages/flipt-io/flipt) | ![beta](https://img.shields.io/badge/status-beta-yellow) | +### Client Side Evaluation + +Client-side evaluation is a great way to reduce the number of requests that your application needs to make to Flipt. This is done by retrieving all of the feature flags that your application needs to evaluate and then evaluating them locally. + +For more information on client-side evaluation, check out our [client-side evaluation documentation](https://www.flipt.io/docs/integration/client). + +#### Client Side SDKs + +> [!WARNING] +> Our client-side SDKs are currently experimental. We are looking for feedback on the design and implementation. Please open an issue if you have any feedback or questions. + +Our client-side SDKs are available in the [flipt-client-sdks](https://github.com/flipt-io/flipt-client-sdks/) repository. + +We currently support the following languages: + +- [Go](https://github.com/flipt-io/flipt-client-sdks/tree/main/flipt-client-go) +- [Node/TypeScript](https://github.com/flipt-io/flipt-client-sdks/tree/main/flipt-client-node) +- [Python](https://github.com/flipt-io/flipt-client-sdks/tree/main/flipt-client-python) +- [Ruby](https://github.com/flipt-io/flipt-client-sdks/tree/main/flipt-client-ruby) + +We will be adding more languages in the future. If you'd like to see a specific language supported, please open an issue in the [flipt-client-sdks](https://github.com/flipt-io/flipt-client-sdks/issues/new) repository. +
## Release Cadence diff --git a/logos/users/asphaltlogo.png b/logos/users/asphaltlogo.png deleted file mode 100644 index da8663c82da5e7d48af50856d1164fa840ab24ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9975 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 BEENC% diff --git a/logos/users/ocrolus.svg b/logos/users/ocrolus.svg deleted file mode 100644 index e18698cafa..0000000000 --- a/logos/users/ocrolus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/logos/users/paradigm.png b/logos/users/paradigm.png deleted file mode 100644 index 983aa1026f18f02883741a82a71b03a7526dbde6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7048 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 aiC33cF8?&`WBK*}C3R(OrOG=tq5lJ2Xoma% diff --git a/logos/users/prose.png b/logos/users/prose.png deleted file mode 100644 index 0e67bdbf8e63408b1caceb5aca680f5f81d80634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9455 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 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/logos/users/uk-moj.png b/logos/users/uk-moj.png deleted file mode 100644 index 03a26ff0d0828768ee409c013fa12ba0e0a8e26c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12690 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 Date: Fri, 15 Dec 2023 14:36:32 +0000 Subject: [PATCH 29/31] refactor(storage/fs): adjust the declarative storage abstractions (#2540) * refactor(storage): introduce readonly only storage interface refactor(storage/fs): export SyncedStore ability to set snapshot refactor(storage/fs/local): embed synced store directly refactor(storage/fs/s3): embed synced store directly refactor(storage/fs/git): embed synced store directly refactor(storage/fs/oci): embed synced store directly refactor(cmd/grpc): update calls to declarative backend stores refactor(storage/fs): rename files from source to store refactor(storage/fs/git): simplify condition where reference is a revision refactor(storage/fs): remove store abstraction fix(storage/fs/oci): remove errant error check from store test refactor(storage/fs): rename SyncedStore to Store refactor(storage/fs): add SnapshotStore functional transaction interface * chore(storage/fs): thread context on update * fix(storage/fs/git): call get instead of update when initializing --- internal/cmd/grpc.go | 155 +------- internal/storage/fs/git/source.go | 188 --------- internal/storage/fs/git/store.go | 201 ++++++++++ .../fs/git/{source_test.go => store_test.go} | 111 +++--- internal/storage/fs/local/source.go | 75 ---- internal/storage/fs/local/source_test.go | 67 ---- internal/storage/fs/local/store.go | 83 ++++ internal/storage/fs/local/store_test.go | 64 +++ internal/storage/fs/oci/source.go | 105 ----- internal/storage/fs/oci/store.go | 98 +++++ .../fs/oci/{source_test.go => store_test.go} | 77 ++-- internal/storage/fs/poll.go | 68 ++++ internal/storage/fs/s3/source.go | 124 ------ internal/storage/fs/s3/source_test.go | 124 ------ internal/storage/fs/s3/store.go | 135 +++++++ internal/storage/fs/s3/store_test.go | 122 ++++++ internal/storage/fs/snapshot.go | 163 ++------ internal/storage/fs/snapshot_test.go | 4 +- internal/storage/fs/store.go | 368 ++++++++++++++---- internal/storage/fs/store/store.go | 164 ++++++++ internal/storage/fs/store_test.go | 237 ++++++++--- internal/storage/fs/sync.go | 221 ----------- internal/storage/fs/sync_test.go | 228 ----------- internal/storage/storage.go | 57 ++- 24 files changed, 1576 insertions(+), 1663 deletions(-) delete mode 100644 internal/storage/fs/git/source.go create mode 100644 internal/storage/fs/git/store.go rename internal/storage/fs/git/{source_test.go => store_test.go} (65%) delete mode 100644 internal/storage/fs/local/source.go delete mode 100644 internal/storage/fs/local/source_test.go create mode 100644 internal/storage/fs/local/store.go create mode 100644 internal/storage/fs/local/store_test.go delete mode 100644 internal/storage/fs/oci/source.go create mode 100644 internal/storage/fs/oci/store.go rename internal/storage/fs/oci/{source_test.go => store_test.go} (70%) create mode 100644 internal/storage/fs/poll.go delete mode 100644 internal/storage/fs/s3/source.go delete mode 100644 internal/storage/fs/s3/source_test.go create mode 100644 internal/storage/fs/s3/store.go create mode 100644 internal/storage/fs/s3/store_test.go create mode 100644 internal/storage/fs/store/store.go delete mode 100644 internal/storage/fs/sync.go delete mode 100644 internal/storage/fs/sync_test.go diff --git a/internal/cmd/grpc.go b/internal/cmd/grpc.go index 2eece34831..265404c722 100644 --- a/internal/cmd/grpc.go +++ b/internal/cmd/grpc.go @@ -8,7 +8,6 @@ import ( "fmt" "net" "net/url" - "os" "strconv" "sync" "time" @@ -20,7 +19,6 @@ import ( "go.flipt.io/flipt/internal/config" "go.flipt.io/flipt/internal/containers" "go.flipt.io/flipt/internal/info" - "go.flipt.io/flipt/internal/oci" fliptserver "go.flipt.io/flipt/internal/server" "go.flipt.io/flipt/internal/server/audit" "go.flipt.io/flipt/internal/server/audit/logfile" @@ -33,8 +31,7 @@ import ( middlewaregrpc "go.flipt.io/flipt/internal/server/middleware/grpc" "go.flipt.io/flipt/internal/storage" storagecache "go.flipt.io/flipt/internal/storage/cache" - "go.flipt.io/flipt/internal/storage/fs" - storageoci "go.flipt.io/flipt/internal/storage/fs/oci" + fsstore "go.flipt.io/flipt/internal/storage/fs/store" fliptsql "go.flipt.io/flipt/internal/storage/sql" "go.flipt.io/flipt/internal/storage/sql/mysql" "go.flipt.io/flipt/internal/storage/sql/postgres" @@ -52,7 +49,6 @@ import ( semconv "go.opentelemetry.io/otel/semconv/v1.4.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "golang.org/x/crypto/ssh" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" @@ -60,12 +56,6 @@ import ( "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" - "github.com/go-git/go-git/v5/plumbing/transport/http" - gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh" - "go.flipt.io/flipt/internal/storage/fs/git" - "go.flipt.io/flipt/internal/storage/fs/local" - "go.flipt.io/flipt/internal/storage/fs/s3" - grpc_zap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags" @@ -154,119 +144,12 @@ func NewGRPCServer( } logger.Debug("database driver configured", zap.Stringer("driver", driver)) - case config.GitStorageType: - opts := []containers.Option[git.Source]{ - git.WithRef(cfg.Storage.Git.Ref), - git.WithPollInterval(cfg.Storage.Git.PollInterval), - git.WithInsecureTLS(cfg.Storage.Git.InsecureSkipTLS), - } - - if cfg.Storage.Git.CaCertBytes != "" { - opts = append(opts, git.WithCABundle([]byte(cfg.Storage.Git.CaCertBytes))) - } else if cfg.Storage.Git.CaCertPath != "" { - if bytes, err := os.ReadFile(cfg.Storage.Git.CaCertPath); err == nil { - opts = append(opts, git.WithCABundle(bytes)) - } else { - return nil, err - } - } - - auth := cfg.Storage.Git.Authentication - switch { - case auth.BasicAuth != nil: - opts = append(opts, git.WithAuth(&http.BasicAuth{ - Username: auth.BasicAuth.Username, - Password: auth.BasicAuth.Password, - })) - case auth.TokenAuth != nil: - opts = append(opts, git.WithAuth(&http.TokenAuth{ - Token: auth.TokenAuth.AccessToken, - })) - case auth.SSHAuth != nil: - var method *gitssh.PublicKeys - if auth.SSHAuth.PrivateKeyBytes != "" { - method, err = gitssh.NewPublicKeys( - auth.SSHAuth.User, - []byte(auth.SSHAuth.PrivateKeyBytes), - auth.SSHAuth.Password, - ) - } else { - method, err = gitssh.NewPublicKeysFromFile( - auth.SSHAuth.User, - auth.SSHAuth.PrivateKeyPath, - auth.SSHAuth.Password, - ) - } - if err != nil { - return nil, err - } - - // we're protecting against this explicitly so we can disable - // the gosec linting rule - if auth.SSHAuth.InsecureIgnoreHostKey { - // nolint:gosec - method.HostKeyCallback = ssh.InsecureIgnoreHostKey() - } - - opts = append(opts, git.WithAuth(method)) - } - - source, err := git.NewSource(logger, cfg.Storage.Git.Repository, opts...) - if err != nil { - return nil, err - } - - store, err = fs.NewStore(logger, source) - if err != nil { - return nil, err - } - case config.LocalStorageType: - source, err := local.NewSource(logger, cfg.Storage.Local.Path) - if err != nil { - return nil, err - } - - store, err = fs.NewStore(logger, source) - if err != nil { - return nil, err - } - case config.ObjectStorageType: - store, err = NewObjectStore(cfg, logger) - if err != nil { - return nil, err - } - case config.OCIStorageType: - var opts []containers.Option[oci.StoreOptions] - if auth := cfg.Storage.OCI.Authentication; auth != nil { - opts = append(opts, oci.WithCredentials( - auth.Username, - auth.Password, - )) - } - - ocistore, err := oci.NewStore(logger, cfg.Storage.OCI.BundlesDirectory, opts...) - if err != nil { - return nil, err - } - - ref, err := oci.ParseReference(cfg.Storage.OCI.Repository) - if err != nil { - return nil, err - } - - source, err := storageoci.NewSource(logger, ocistore, ref, - storageoci.WithPollInterval(cfg.Storage.OCI.PollInterval), - ) - if err != nil { - return nil, err - } - - store, err = fs.NewStore(logger, source) + default: + // otherwise, attempt to configure a declarative backend store + store, err = fsstore.NewStore(ctx, logger, cfg) if err != nil { return nil, err } - default: - return nil, fmt.Errorf("unexpected storage type: %q", cfg.Storage.Type) } logger.Debug("store enabled", zap.Stringer("store", store)) @@ -507,36 +390,6 @@ func NewGRPCServer( return server, nil } -// NewObjectStore create a new storate.Store from the object config -func NewObjectStore(cfg *config.Config, logger *zap.Logger) (storage.Store, error) { - objectCfg := cfg.Storage.Object - var store storage.Store - // keep this as a case statement in anticipation of - // more object types in the future - // nolint:gocritic - switch objectCfg.Type { - case config.S3ObjectSubStorageType: - opts := []containers.Option[s3.Source]{ - s3.WithPollInterval(objectCfg.S3.PollInterval), - } - if objectCfg.S3.Endpoint != "" { - opts = append(opts, s3.WithEndpoint(objectCfg.S3.Endpoint)) - } - if objectCfg.S3.Region != "" { - opts = append(opts, s3.WithRegion(objectCfg.S3.Region)) - } - source, err := s3.NewSource(logger, objectCfg.S3.Bucket, opts...) - if err != nil { - return nil, err - } - store, err = fs.NewStore(logger, source) - if err != nil { - return nil, err - } - } - return store, nil -} - // Run begins serving gRPC requests. // This methods blocks until Shutdown is called. func (s *GRPCServer) Run() error { diff --git a/internal/storage/fs/git/source.go b/internal/storage/fs/git/source.go deleted file mode 100644 index 7fb52ed345..0000000000 --- a/internal/storage/fs/git/source.go +++ /dev/null @@ -1,188 +0,0 @@ -package git - -import ( - "context" - "errors" - "fmt" - "io/fs" - "time" - - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/config" - "github.com/go-git/go-git/v5/plumbing" - "github.com/go-git/go-git/v5/plumbing/transport" - "github.com/go-git/go-git/v5/storage/memory" - "go.flipt.io/flipt/internal/containers" - "go.flipt.io/flipt/internal/gitfs" - storagefs "go.flipt.io/flipt/internal/storage/fs" - "go.uber.org/zap" -) - -// Source is an implementation of storage/fs.FSSource -// This implementation is backed by a Git repository and it tracks an upstream reference. -// When subscribing to this source, the upstream reference is tracked -// by polling the upstream on a configurable interval. -type Source struct { - logger *zap.Logger - repo *git.Repository - - url string - ref string - hash plumbing.Hash - interval time.Duration - auth transport.AuthMethod - caBundle []byte - insecureSkipTLS bool -} - -// WithRef configures the target reference to be used when fetching -// and building fs.FS implementations. -// If it is a valid hash, then the fixed SHA value is used. -// Otherwise, it is treated as a reference in the origin upstream. -func WithRef(ref string) containers.Option[Source] { - return func(s *Source) { - if plumbing.IsHash(ref) { - s.hash = plumbing.NewHash(ref) - return - } - - s.ref = ref - } -} - -// WithPollInterval configures the interval in which origin is polled to -// discover any updates to the target reference. -func WithPollInterval(tick time.Duration) containers.Option[Source] { - return func(s *Source) { - s.interval = tick - } -} - -// WithAuth returns an option which configures the auth method used -// by the provided source. -func WithAuth(auth transport.AuthMethod) containers.Option[Source] { - return func(s *Source) { - s.auth = auth - } -} - -// WithInsecureTLS returns an option which configures the insecure TLS -// setting for the provided source. -func WithInsecureTLS(insecureSkipTLS bool) containers.Option[Source] { - return func(s *Source) { - s.insecureSkipTLS = insecureSkipTLS - } -} - -// WithCABundle returns an option which configures the CA Bundle used for -// validating the TLS connection to the provided source. -func WithCABundle(caCertBytes []byte) containers.Option[Source] { - return func(s *Source) { - if caCertBytes != nil { - s.caBundle = caCertBytes - } - } -} - -// NewSource constructs and configures a Source. -// The source uses the connection and credential details provided to build -// fs.FS implementations around a target git repository. -func NewSource(logger *zap.Logger, url string, opts ...containers.Option[Source]) (_ *Source, err error) { - source := &Source{ - logger: logger.With(zap.String("repository", url)), - url: url, - ref: "main", - interval: 30 * time.Second, - } - containers.ApplyAll(source, opts...) - - field := zap.Stringer("ref", plumbing.NewBranchReferenceName(source.ref)) - if source.hash != plumbing.ZeroHash { - field = zap.Stringer("SHA", source.hash) - } - source.logger = source.logger.With(field) - - source.repo, err = git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ - Auth: source.auth, - URL: source.url, - CABundle: source.caBundle, - InsecureSkipTLS: source.insecureSkipTLS, - }) - if err != nil { - return nil, err - } - - return source, nil -} - -// Get builds a new store snapshot based on the configure Git remote and reference. -func (s *Source) Get(context.Context) (_ *storagefs.StoreSnapshot, err error) { - var fs fs.FS - if s.hash != plumbing.ZeroHash { - fs, err = gitfs.NewFromRepoHash(s.logger, s.repo, s.hash) - } else { - fs, err = gitfs.NewFromRepo(s.logger, s.repo, gitfs.WithReference(plumbing.NewRemoteReferenceName("origin", s.ref))) - } - if err != nil { - return nil, err - } - - return storagefs.SnapshotFromFS(s.logger, fs) -} - -// Subscribe feeds gitfs implementations of fs.FS onto the provided channel. -// It blocks until the provided context is cancelled (it will be called in a goroutine). -// It closes the provided channel before it returns. -func (s *Source) Subscribe(ctx context.Context, ch chan<- *storagefs.StoreSnapshot) { - defer close(ch) - - // NOTE: theres is no point subscribing to updates for a git Hash - // as it is atomic and will never change. - if s.hash != plumbing.ZeroHash { - s.logger.Info("skipping subscribe as static SHA has been configured") - return - } - - ticker := time.NewTicker(s.interval) - for { - select { - case <-ctx.Done(): - return - case <-ticker.C: - s.logger.Debug("fetching from remote") - if err := s.repo.Fetch(&git.FetchOptions{ - Auth: s.auth, - RefSpecs: []config.RefSpec{ - config.RefSpec(fmt.Sprintf( - "+%s:%s", - plumbing.NewBranchReferenceName(s.ref), - plumbing.NewRemoteReferenceName("origin", s.ref), - )), - }, - }); err != nil { - if errors.Is(err, git.NoErrAlreadyUpToDate) { - s.logger.Debug("store already up to date") - continue - } - - s.logger.Error("failed fetching remote", zap.Error(err)) - continue - } - - snap, err := s.Get(ctx) - if err != nil { - s.logger.Error("failed creating snapshot from fs", zap.Error(err)) - continue - } - - ch <- snap - - s.logger.Debug("finished fetching from remote") - } - } -} - -// String returns an identifier string for the store type. -func (*Source) String() string { - return "git" -} diff --git a/internal/storage/fs/git/store.go b/internal/storage/fs/git/store.go new file mode 100644 index 0000000000..cb312cdbd8 --- /dev/null +++ b/internal/storage/fs/git/store.go @@ -0,0 +1,201 @@ +package git + +import ( + "context" + "errors" + "fmt" + "io/fs" + "sync" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/storage/memory" + "go.flipt.io/flipt/internal/containers" + "go.flipt.io/flipt/internal/gitfs" + "go.flipt.io/flipt/internal/storage" + storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.uber.org/zap" +) + +// ensure that the git *Store implements storage.Store +var _ storagefs.SnapshotStore = (*SnapshotStore)(nil) + +// SnapshotStore is an implementation of storage.SnapshotStore +// This implementation is backed by a Git repository and it tracks an upstream reference. +// When subscribing to this source, the upstream reference is tracked +// by polling the upstream on a configurable interval. +type SnapshotStore struct { + logger *zap.Logger + repo *git.Repository + + mu sync.RWMutex + snap storage.ReadOnlyStore + + url string + ref string + hash plumbing.Hash + auth transport.AuthMethod + caBundle []byte + insecureSkipTLS bool + pollOpts []containers.Option[storagefs.Poller] +} + +// WithRef configures the target reference to be used when fetching +// and building fs.FS implementations. +// If it is a valid hash, then the fixed SHA value is used. +// Otherwise, it is treated as a reference in the origin upstream. +func WithRef(ref string) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + if plumbing.IsHash(ref) { + s.hash = plumbing.NewHash(ref) + return + } + + s.ref = ref + } +} + +// WithPollOptions configures the poller used to trigger update procedures +func WithPollOptions(opts ...containers.Option[storagefs.Poller]) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.pollOpts = append(s.pollOpts, opts...) + } +} + +// WithAuth returns an option which configures the auth method used +// by the provided source. +func WithAuth(auth transport.AuthMethod) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.auth = auth + } +} + +// WithInsecureTLS returns an option which configures the insecure TLS +// setting for the provided source. +func WithInsecureTLS(insecureSkipTLS bool) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.insecureSkipTLS = insecureSkipTLS + } +} + +// WithCABundle returns an option which configures the CA Bundle used for +// validating the TLS connection to the provided source. +func WithCABundle(caCertBytes []byte) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + if caCertBytes != nil { + s.caBundle = caCertBytes + } + } +} + +// NewSnapshotStore constructs and configures a Store. +// The store uses the connection and credential details provided to build +// fs.FS implementations around a target git repository. +func NewSnapshotStore(ctx context.Context, logger *zap.Logger, url string, opts ...containers.Option[SnapshotStore]) (_ *SnapshotStore, err error) { + store := &SnapshotStore{ + logger: logger.With(zap.String("repository", url)), + url: url, + ref: "main", + } + containers.ApplyAll(store, opts...) + + field := zap.Stringer("ref", plumbing.NewBranchReferenceName(store.ref)) + if store.hash != plumbing.ZeroHash { + field = zap.Stringer("SHA", store.hash) + } + store.logger = store.logger.With(field) + + store.repo, err = git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ + Auth: store.auth, + URL: store.url, + CABundle: store.caBundle, + InsecureSkipTLS: store.insecureSkipTLS, + }) + if err != nil { + return nil, err + } + + // fetch snapshot at-least once before returning store + // to ensure we have some state to serve + if err := store.get(ctx); err != nil { + return nil, err + } + + // if the reference is a static hash then it is immutable + // if we have already fetched it once, there is not point updating again + if store.hash == plumbing.ZeroHash { + go storagefs. + NewPoller(store.logger, store.pollOpts...). + Poll(ctx, store.update) + } + + return store, nil +} + +// String returns an identifier string for the store type. +func (*SnapshotStore) String() string { + return "git" +} + +// View accepts a function which takes a *StoreSnapshot. +// The SnapshotStore will supply a snapshot which is valid +// for the lifetime of the provided function call. +func (s *SnapshotStore) View(fn func(storage.ReadOnlyStore) error) error { + s.mu.RLock() + defer s.mu.RUnlock() + return fn(s.snap) +} + +// update fetches from the remote and given that a the target reference +// HEAD updates to a new revision, it builds a snapshot and updates it +// on the store. +func (s *SnapshotStore) update(ctx context.Context) (bool, error) { + if err := s.repo.Fetch(&git.FetchOptions{ + Auth: s.auth, + RefSpecs: []config.RefSpec{ + config.RefSpec(fmt.Sprintf( + "+%s:%s", + plumbing.NewBranchReferenceName(s.ref), + plumbing.NewRemoteReferenceName("origin", s.ref), + )), + }, + }); err != nil { + if !errors.Is(err, git.NoErrAlreadyUpToDate) { + return false, err + } + + return false, nil + } + + if err := s.get(ctx); err != nil { + return false, err + } + + return true, nil +} + +// get builds a new store snapshot based on the configure Git remote and reference. +func (s *SnapshotStore) get(context.Context) (err error) { + var fs fs.FS + if s.hash != plumbing.ZeroHash { + fs, err = gitfs.NewFromRepoHash(s.logger, s.repo, s.hash) + } else { + fs, err = gitfs.NewFromRepo(s.logger, s.repo, gitfs.WithReference(plumbing.NewRemoteReferenceName("origin", s.ref))) + } + if err != nil { + return err + } + + snap, err := storagefs.SnapshotFromFS(s.logger, fs) + if err != nil { + return err + } + + s.mu.Lock() + s.snap = snap + s.mu.Unlock() + + return nil +} diff --git a/internal/storage/fs/git/source_test.go b/internal/storage/fs/git/store_test.go similarity index 65% rename from internal/storage/fs/git/source_test.go rename to internal/storage/fs/git/store_test.go index 89f66ded6f..ec3dfd63dd 100644 --- a/internal/storage/fs/git/source_test.go +++ b/internal/storage/fs/git/store_test.go @@ -9,74 +9,55 @@ import ( "testing" "time" - "github.com/go-git/go-git/v5/plumbing/transport" - "github.com/go-git/go-billy/v5/memfs" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/http" "github.com/go-git/go-git/v5/storage/memory" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.flipt.io/flipt/internal/containers" - storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.flipt.io/flipt/internal/storage" + "go.flipt.io/flipt/internal/storage/fs" "go.uber.org/zap/zaptest" ) var gitRepoURL = os.Getenv("TEST_GIT_REPO_URL") -func Test_SourceString(t *testing.T) { - require.Equal(t, "git", (&Source{}).String()) -} - -func Test_SourceGet(t *testing.T) { - source, skip := testSource(t) - if skip { - return - } - - snap, err := source.Get(context.Background()) - require.NoError(t, err) - - _, err = snap.GetNamespace(context.TODO(), "production") - require.NoError(t, err) +func Test_Store_String(t *testing.T) { + require.Equal(t, "git", (&SnapshotStore{}).String()) } -func Test_SourceSubscribe_Hash(t *testing.T) { +func Test_Store_Subscribe_Hash(t *testing.T) { head := os.Getenv("TEST_GIT_REPO_HEAD") if head == "" { t.Skip("Set non-empty TEST_GIT_REPO_HEAD env var to run this test.") return } - source, skip := testSource(t, WithRef(head)) - if skip { - return - } - - ch := make(chan *storagefs.StoreSnapshot) - source.Subscribe(context.Background(), ch) - - _, closed := <-ch - assert.False(t, closed, "expected channel to be closed") + // this helper will fail if there is a problem with this option + // the only difference in behaviour is that the poll loop + // will silently (intentionally) not run + testStore(t, WithRef(head)) } -func Test_SourceSubscribe(t *testing.T) { - source, skip := testSource(t) +func Test_Store_Subscribe(t *testing.T) { + ch := make(chan struct{}) + store, skip := testStore(t, WithPollOptions( + fs.WithInterval(time.Second), + fs.WithNotify(t, func(modified bool) { + if modified { + close(ch) + } + }), + )) if skip { return } ctx, cancel := context.WithCancel(context.Background()) - - // prime source - _, err := source.Get(context.Background()) - require.NoError(t, err) - - // start subscription - ch := make(chan *storagefs.StoreSnapshot) - go source.Subscribe(ctx, ch) + t.Cleanup(cancel) // pull repo workdir := memfs.New() @@ -121,10 +102,10 @@ flags: RemoteName: "origin", })) - // assert matching state - var snap *storagefs.StoreSnapshot + // wait until the snapshot is updated or + // we timeout select { - case snap = <-ch: + case <-ch: case <-time.After(time.Minute): t.Fatal("timed out waiting for snapshot") } @@ -133,31 +114,27 @@ flags: t.Log("received new snapshot") - _, err = snap.GetFlag(ctx, "production", "foo") - require.NoError(t, err) - - // ensure closed - cancel() - - _, open := <-ch - require.False(t, open, "expected channel to be closed after cancel") + require.NoError(t, store.View(func(s storage.ReadOnlyStore) error { + _, err = s.GetFlag(ctx, "production", "foo") + return err + })) } -func Test_SourceSelfSignedSkipTLS(t *testing.T) { +func Test_Store_SelfSignedSkipTLS(t *testing.T) { ts := httptest.NewTLSServer(nil) defer ts.Close() // This is not a valid Git source, but it still proves the point that a // well-known server with a self-signed certificate will be accepted by Flipt // when configuring the TLS options for the source gitRepoURL = ts.URL - _, err := testSourceWithError(t, WithInsecureTLS(false)) + _, err := testStoreWithError(t, WithInsecureTLS(false)) require.ErrorContains(t, err, "tls: failed to verify certificate: x509: certificate signed by unknown authority") - _, err = testSourceWithError(t, WithInsecureTLS(true)) + _, err = testStoreWithError(t, WithInsecureTLS(true)) // This time, we don't expect a tls validation error anymore require.ErrorIs(t, err, transport.ErrRepositoryNotFound) } -func Test_SourceSelfSignedCABytes(t *testing.T) { +func Test_Store_SelfSignedCABytes(t *testing.T) { ts := httptest.NewTLSServer(nil) defer ts.Close() var buf bytes.Buffer @@ -172,14 +149,14 @@ func Test_SourceSelfSignedCABytes(t *testing.T) { // well-known server with a self-signed certificate will be accepted by Flipt // when configuring the TLS options for the source gitRepoURL = ts.URL - _, err = testSourceWithError(t) + _, err = testStoreWithError(t) require.ErrorContains(t, err, "tls: failed to verify certificate: x509: certificate signed by unknown authority") - _, err = testSourceWithError(t, WithCABundle(buf.Bytes())) + _, err = testStoreWithError(t, WithCABundle(buf.Bytes())) // This time, we don't expect a tls validation error anymore require.ErrorIs(t, err, transport.ErrRepositoryNotFound) } -func testSource(t *testing.T, opts ...containers.Option[Source]) (*Source, bool) { +func testStore(t *testing.T, opts ...containers.Option[SnapshotStore]) (*SnapshotStore, bool) { t.Helper() if gitRepoURL == "" { @@ -187,10 +164,12 @@ func testSource(t *testing.T, opts ...containers.Option[Source]) (*Source, bool) return nil, true } - source, err := NewSource(zaptest.NewLogger(t), gitRepoURL, - append([]containers.Option[Source]{ + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + source, err := NewSnapshotStore(ctx, zaptest.NewLogger(t), gitRepoURL, + append([]containers.Option[SnapshotStore]{ WithRef("main"), - WithPollInterval(5 * time.Second), WithAuth(&http.BasicAuth{ Username: "root", Password: "password", @@ -203,13 +182,15 @@ func testSource(t *testing.T, opts ...containers.Option[Source]) (*Source, bool) return source, false } -func testSourceWithError(t *testing.T, opts ...containers.Option[Source]) (*Source, error) { +func testStoreWithError(t *testing.T, opts ...containers.Option[SnapshotStore]) (*SnapshotStore, error) { t.Helper() - source, err := NewSource(zaptest.NewLogger(t), gitRepoURL, - append([]containers.Option[Source]{ + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + source, err := NewSnapshotStore(ctx, zaptest.NewLogger(t), gitRepoURL, + append([]containers.Option[SnapshotStore]{ WithRef("main"), - WithPollInterval(5 * time.Second), WithAuth(&http.BasicAuth{ Username: "root", Password: "password", diff --git a/internal/storage/fs/local/source.go b/internal/storage/fs/local/source.go deleted file mode 100644 index 3e4aac6b78..0000000000 --- a/internal/storage/fs/local/source.go +++ /dev/null @@ -1,75 +0,0 @@ -package local - -import ( - "context" - "os" - "time" - - "go.flipt.io/flipt/internal/containers" - storagefs "go.flipt.io/flipt/internal/storage/fs" - "go.uber.org/zap" -) - -// Source represents an implementation of an fs.FSSource for local -// updates on a FS. -type Source struct { - logger *zap.Logger - - dir string - interval time.Duration -} - -// NewSource constructs a Source. -func NewSource(logger *zap.Logger, dir string, opts ...containers.Option[Source]) (*Source, error) { - s := &Source{ - logger: logger, - dir: dir, - interval: 10 * time.Second, - } - - containers.ApplyAll(s, opts...) - - return s, nil -} - -// WithPollInterval configures the interval in which we will restore -// the local fs. -func WithPollInterval(tick time.Duration) containers.Option[Source] { - return func(s *Source) { - s.interval = tick - } -} - -// Get returns an fs.FS for the local filesystem. -func (s *Source) Get(context.Context) (*storagefs.StoreSnapshot, error) { - return storagefs.SnapshotFromFS(s.logger, os.DirFS(s.dir)) -} - -// Subscribe feeds local fs.FS implementations onto the provided channel. -// It blocks until the provided context is cancelled. -func (s *Source) Subscribe(ctx context.Context, ch chan<- *storagefs.StoreSnapshot) { - defer close(ch) - - ticker := time.NewTicker(s.interval) - for { - select { - case <-ctx.Done(): - return - case <-ticker.C: - snap, err := s.Get(ctx) - if err != nil { - s.logger.Error("error getting file system from directory", zap.Error(err)) - continue - } - - s.logger.Debug("updating local store snapshot") - - ch <- snap - } - } -} - -// String returns an identifier string for the store type. -func (s *Source) String() string { - return "local" -} diff --git a/internal/storage/fs/local/source_test.go b/internal/storage/fs/local/source_test.go deleted file mode 100644 index 417b63b2e5..0000000000 --- a/internal/storage/fs/local/source_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package local - -import ( - "context" - "os" - "path/filepath" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - storagefs "go.flipt.io/flipt/internal/storage/fs" - "go.uber.org/zap" -) - -func Test_SourceString(t *testing.T) { - assert.Equal(t, "local", (&Source{}).String()) -} - -func Test_SourceGet(t *testing.T) { - s, err := NewSource(zap.NewNop(), "testdata", WithPollInterval(5*time.Second)) - assert.NoError(t, err) - - snap, err := s.Get(context.Background()) - assert.NoError(t, err) - - _, err = snap.GetNamespace(context.TODO(), "production") - require.NoError(t, err) -} - -func Test_SourceSubscribe(t *testing.T) { - s, err := NewSource(zap.NewNop(), "testdata", WithPollInterval(5*time.Second)) - assert.NoError(t, err) - - dir, err := os.Getwd() - assert.NoError(t, err) - - ftc := filepath.Join(dir, "testdata", "a.features.yml") - - defer func() { - _, err := os.Stat(ftc) - if err == nil { - err := os.Remove(ftc) - assert.NoError(t, err) - } - }() - - ctx, cancel := context.WithCancel(context.Background()) - - ch := make(chan *storagefs.StoreSnapshot) - go s.Subscribe(ctx, ch) - - // change the filesystem contents - assert.NoError(t, os.WriteFile(ftc, []byte(`{"namespace":"staging"}`), os.ModePerm)) - - select { - case snap := <-ch: - _, err := snap.GetNamespace(ctx, "staging") - assert.NoError(t, err) - cancel() - - _, open := <-ch - assert.False(t, open, "expected channel to be closed after cancel") - case <-time.After(10 * time.Second): - t.Fatal("event not caught") - } -} diff --git a/internal/storage/fs/local/store.go b/internal/storage/fs/local/store.go new file mode 100644 index 0000000000..62efe2b1b4 --- /dev/null +++ b/internal/storage/fs/local/store.go @@ -0,0 +1,83 @@ +package local + +import ( + "context" + "os" + "sync" + + "go.flipt.io/flipt/internal/containers" + "go.flipt.io/flipt/internal/storage" + storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.uber.org/zap" +) + +var _ storagefs.SnapshotStore = (*SnapshotStore)(nil) + +// SnapshotStore implements storagefs.SnapshotStore which +// is backed by the local filesystem through os.DirFS +type SnapshotStore struct { + logger *zap.Logger + dir string + + mu sync.RWMutex + snap storage.ReadOnlyStore + + pollOpts []containers.Option[storagefs.Poller] +} + +// NewSnapshotStore constructs a new SnapshotStore +func NewSnapshotStore(ctx context.Context, logger *zap.Logger, dir string, opts ...containers.Option[SnapshotStore]) (*SnapshotStore, error) { + s := &SnapshotStore{ + logger: logger, + dir: dir, + } + + containers.ApplyAll(s, opts...) + + // seed initial state an ensure we have state + // before returning + if _, err := s.update(ctx); err != nil { + return nil, err + } + + go storagefs. + NewPoller(logger, s.pollOpts...). + Poll(ctx, s.update) + + return s, nil +} + +// WithPollOptions configures poller options on the store. +func WithPollOptions(opts ...containers.Option[storagefs.Poller]) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.pollOpts = append(s.pollOpts, opts...) + } +} + +// View passes the current snapshot to the provided function +// while holding a read lock. +func (s *SnapshotStore) View(fn func(storage.ReadOnlyStore) error) error { + s.mu.RLock() + defer s.mu.RUnlock() + return fn(s.snap) +} + +// update fetches a new snapshot from the local filesystem +// and updates the current served reference via a write lock +func (s *SnapshotStore) update(context.Context) (bool, error) { + snap, err := storagefs.SnapshotFromFS(s.logger, os.DirFS(s.dir)) + if err != nil { + return false, err + } + + s.mu.Lock() + s.snap = snap + s.mu.Unlock() + + return true, nil +} + +// String returns an identifier string for the store type. +func (s *SnapshotStore) String() string { + return "local" +} diff --git a/internal/storage/fs/local/store_test.go b/internal/storage/fs/local/store_test.go new file mode 100644 index 0000000000..c98de6c543 --- /dev/null +++ b/internal/storage/fs/local/store_test.go @@ -0,0 +1,64 @@ +package local + +import ( + "context" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "go.flipt.io/flipt/internal/storage" + storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.uber.org/zap" +) + +func Test_Store_String(t *testing.T) { + assert.Equal(t, "local", (&SnapshotStore{}).String()) +} + +func Test_Store(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + var closed bool + ch := make(chan struct{}) + + s, err := NewSnapshotStore(ctx, zap.NewNop(), "testdata", WithPollOptions( + storagefs.WithInterval(1*time.Second), + storagefs.WithNotify(t, func(modified bool) { + if modified && !closed { + closed = true + close(ch) + } + }), + )) + assert.NoError(t, err) + + dir, err := os.Getwd() + assert.NoError(t, err) + + ftc := filepath.Join(dir, "testdata", "a.features.yml") + + defer func() { + _, err := os.Stat(ftc) + if err == nil { + err := os.Remove(ftc) + assert.NoError(t, err) + } + }() + + // change the filesystem contents + assert.NoError(t, os.WriteFile(ftc, []byte(`{"namespace":"staging"}`), os.ModePerm)) + + select { + case <-ch: + case <-time.After(10 * time.Second): + t.Fatal("event not caught") + } + + assert.NoError(t, s.View(func(s storage.ReadOnlyStore) error { + _, err = s.GetNamespace(ctx, "staging") + return err + })) +} diff --git a/internal/storage/fs/oci/source.go b/internal/storage/fs/oci/source.go deleted file mode 100644 index 0a8d6ee99d..0000000000 --- a/internal/storage/fs/oci/source.go +++ /dev/null @@ -1,105 +0,0 @@ -package oci - -import ( - "context" - "time" - - "github.com/opencontainers/go-digest" - "go.flipt.io/flipt/internal/containers" - "go.flipt.io/flipt/internal/oci" - storagefs "go.flipt.io/flipt/internal/storage/fs" - "go.uber.org/zap" -) - -// Source is an implementation fs.SnapshotSource backed by OCI repositories -// It fetches instances of OCI manifests and uses them to build snapshots from their contents -type Source struct { - logger *zap.Logger - interval time.Duration - - store *oci.Store - ref oci.Reference - - curSnap *storagefs.StoreSnapshot - curDigest digest.Digest -} - -// NewSource constructs and configures a Source. -// The source uses the connection and credential details provided to build -// *storagefs.StoreSnapshot implementations around a target git repository. -func NewSource(logger *zap.Logger, store *oci.Store, ref oci.Reference, opts ...containers.Option[Source]) (_ *Source, err error) { - src := &Source{ - logger: logger, - interval: 30 * time.Second, - store: store, - ref: ref, - } - containers.ApplyAll(src, opts...) - - return src, nil -} - -// WithPollInterval configures the interval in which origin is polled to -// discover any updates to the target reference. -func WithPollInterval(tick time.Duration) containers.Option[Source] { - return func(s *Source) { - s.interval = tick - } -} - -func (s *Source) String() string { - return "oci" -} - -// Get builds a single instance of an *storagefs.StoreSnapshot -func (s *Source) Get(context.Context) (*storagefs.StoreSnapshot, error) { - resp, err := s.store.Fetch(context.Background(), s.ref, oci.IfNoMatch(s.curDigest)) - if err != nil { - return nil, err - } - - if resp.Matched { - return s.curSnap, nil - } - - if s.curSnap, err = storagefs.SnapshotFromFiles(s.logger, resp.Files...); err != nil { - return nil, err - } - - s.curDigest = resp.Digest - - return s.curSnap, nil -} - -// Subscribe feeds implementations of *storagefs.StoreSnapshot onto the provided channel. -// It should block until the provided context is cancelled (it will be called in a goroutine). -// It should close the provided channel before it returns. -func (s *Source) Subscribe(ctx context.Context, ch chan<- *storagefs.StoreSnapshot) { - defer close(ch) - - ticker := time.NewTicker(s.interval) - for { - select { - case <-ctx.Done(): - return - case <-ticker.C: - current := s.curDigest - s.logger.Debug("fetching new snapshot", zap.String("current", current.Hex())) - - snap, err := s.Get(ctx) - if err != nil { - s.logger.Error("failed resolving upstream", zap.Error(err)) - continue - } - - if current == s.curDigest { - s.logger.Debug("snapshot already up to date") - continue - } - - ch <- snap - - s.logger.Debug("fetched new reference from remote") - } - } -} diff --git a/internal/storage/fs/oci/store.go b/internal/storage/fs/oci/store.go new file mode 100644 index 0000000000..e99cce0930 --- /dev/null +++ b/internal/storage/fs/oci/store.go @@ -0,0 +1,98 @@ +package oci + +import ( + "context" + "sync" + + "github.com/opencontainers/go-digest" + "go.flipt.io/flipt/internal/containers" + "go.flipt.io/flipt/internal/oci" + "go.flipt.io/flipt/internal/storage" + storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.uber.org/zap" +) + +var _ storagefs.SnapshotStore = (*SnapshotStore)(nil) + +// SnapshotStore is an implementation storage.SnapshotStore backed by OCI repositories. +// It fetches instances of OCI manifests and uses them to build snapshots from their contents. +type SnapshotStore struct { + logger *zap.Logger + + store *oci.Store + ref oci.Reference + + mu sync.RWMutex + snap storage.ReadOnlyStore + lastDigest digest.Digest + + pollOpts []containers.Option[storagefs.Poller] +} + +// View accepts a function which takes a *StoreSnapshot. +// The SnapshotStore will supply a snapshot which is valid +// for the lifetime of the provided function call. +func (s *SnapshotStore) View(fn func(storage.ReadOnlyStore) error) error { + s.mu.RLock() + defer s.mu.RUnlock() + return fn(s.snap) +} + +// NewSnapshotStore constructs and configures a Store. +// The store uses the connection and credential details provided to build +// *storagefs.StoreSnapshot implementations around a target OCI repository. +func NewSnapshotStore(ctx context.Context, logger *zap.Logger, store *oci.Store, ref oci.Reference, opts ...containers.Option[SnapshotStore]) (_ *SnapshotStore, err error) { + s := &SnapshotStore{ + logger: logger, + store: store, + ref: ref, + } + containers.ApplyAll(s, opts...) + + if _, err := s.update(ctx); err != nil { + return nil, err + } + + go storagefs.NewPoller(logger, s.pollOpts...).Poll(ctx, s.update) + + return s, nil +} + +// WithPollOptions configures the options used periodically invoke the update procedure +func WithPollOptions(opts ...containers.Option[storagefs.Poller]) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.pollOpts = append(s.pollOpts, opts...) + } +} + +func (s *SnapshotStore) String() string { + return "oci" +} + +// update attempts to fetch the latest state for the target OCi repository and tag. +// If the state has not change sinced the last observed image digest it skips +// updating the snapshot and returns false (not modified). +func (s *SnapshotStore) update(ctx context.Context) (bool, error) { + resp, err := s.store.Fetch(ctx, s.ref, oci.IfNoMatch(s.lastDigest)) + if err != nil { + return false, err + } + + // return not modified as the last observed digest matched + // the remote digest + if resp.Matched { + return false, nil + } + + snap, err := storagefs.SnapshotFromFiles(s.logger, resp.Files...) + if err != nil { + return false, err + } + + s.mu.Lock() + s.lastDigest = resp.Digest + s.snap = snap + s.mu.Unlock() + + return true, nil +} diff --git a/internal/storage/fs/oci/source_test.go b/internal/storage/fs/oci/store_test.go similarity index 70% rename from internal/storage/fs/oci/source_test.go rename to internal/storage/fs/oci/store_test.go index ade6770bff..03810a03fe 100644 --- a/internal/storage/fs/oci/source_test.go +++ b/internal/storage/fs/oci/store_test.go @@ -10,41 +10,42 @@ import ( "github.com/opencontainers/go-digest" v1 "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.flipt.io/flipt/internal/containers" fliptoci "go.flipt.io/flipt/internal/oci" - storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.flipt.io/flipt/internal/storage" + "go.flipt.io/flipt/internal/storage/fs" "go.uber.org/zap/zaptest" "oras.land/oras-go/v2" "oras.land/oras-go/v2/content/oci" ) func Test_SourceString(t *testing.T) { - require.Equal(t, "oci", (&Source{}).String()) -} - -func Test_SourceGet(t *testing.T) { - source, _ := testSource(t) - - snap, err := source.Get(context.Background()) - require.NoError(t, err) - - _, err = snap.GetNamespace(context.TODO(), "production") - require.NoError(t, err) + require.Equal(t, "oci", (&SnapshotStore{}).String()) } func Test_SourceSubscribe(t *testing.T) { - source, target := testSource(t) + ch := make(chan struct{}) + store, target := testStore(t, WithPollOptions( + fs.WithInterval(time.Second), + fs.WithNotify(t, func(modified bool) { + if modified { + close(ch) + } + }), + )) - ctx, cancel := context.WithCancel(context.Background()) + ctx := context.Background() - // prime source - _, err := source.Get(context.Background()) - require.NoError(t, err) + require.NoError(t, store.View(func(s storage.ReadOnlyStore) error { + _, err := s.GetNamespace(ctx, "production") + require.NoError(t, err) - // start subscription - ch := make(chan *storagefs.StoreSnapshot) - go source.Subscribe(ctx, ch) + _, err = s.GetFlag(ctx, "production", "foo") + require.Error(t, err, "should error as flag should not exist yet") + + return nil + })) updateRepoContents(t, target, layer( @@ -57,34 +58,22 @@ func Test_SourceSubscribe(t *testing.T) { t.Log("waiting for new snapshot") // assert matching state - var snap *storagefs.StoreSnapshot select { - case snap = <-ch: + case <-ch: case <-time.After(time.Minute): t.Fatal("timed out waiting for snapshot") } - require.NoError(t, err) - t.Log("received new snapshot") - _, err = snap.GetFlag(ctx, "production", "foo") - require.NoError(t, err) - - // ensure closed - cancel() - - _, open := <-ch - require.False(t, open, "expected channel to be closed after cancel") - - // fetch again and expected to get the same snapshot - found, err := source.Get(context.Background()) - require.NoError(t, err) - - assert.Equal(t, snap, found) + require.NoError(t, store.View(func(s storage.ReadOnlyStore) error { + _, err := s.GetFlag(ctx, "production", "foo") + require.NoError(t, err) + return nil + })) } -func testSource(t *testing.T) (*Source, oras.Target) { +func testStore(t *testing.T, opts ...containers.Option[SnapshotStore]) (*SnapshotStore, oras.Target) { t.Helper() target, dir, repo := testRepository(t, @@ -97,10 +86,14 @@ func testSource(t *testing.T) (*Source, oras.Target) { ref, err := fliptoci.ParseReference(fmt.Sprintf("flipt://local/%s:latest", repo)) require.NoError(t, err) - source, err := NewSource(zaptest.NewLogger(t), + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + source, err := NewSnapshotStore(ctx, + zaptest.NewLogger(t), store, ref, - WithPollInterval(time.Second)) + opts...) require.NoError(t, err) return source, target diff --git a/internal/storage/fs/poll.go b/internal/storage/fs/poll.go new file mode 100644 index 0000000000..12c9147df6 --- /dev/null +++ b/internal/storage/fs/poll.go @@ -0,0 +1,68 @@ +package fs + +import ( + "context" + "testing" + "time" + + "go.flipt.io/flipt/internal/containers" + "go.uber.org/zap" +) + +type Poller struct { + logger *zap.Logger + + interval time.Duration + notify func(modified bool) +} + +func WithInterval(interval time.Duration) containers.Option[Poller] { + return func(p *Poller) { + p.interval = interval + } +} + +func WithNotify(t *testing.T, n func(modified bool)) containers.Option[Poller] { + t.Helper() + return func(p *Poller) { + p.notify = n + } +} + +func NewPoller(logger *zap.Logger, opts ...containers.Option[Poller]) *Poller { + p := &Poller{ + logger: logger, + interval: 30 * time.Second, + } + containers.ApplyAll(p, opts...) + return p +} + +// Poll is a utility function for a common polling strategy used by lots of declarative +// store implementations. +func (p *Poller) Poll(ctx context.Context, update func(context.Context) (bool, error)) { + ticker := time.NewTicker(p.interval) + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + modified, err := update(ctx) + if err != nil { + p.logger.Error("error getting file system from directory", zap.Error(err)) + continue + } + + if p.notify != nil { + p.notify(modified) + } + + if !modified { + p.logger.Debug("skipping snapshot update as it has not been modified") + continue + } + + p.logger.Debug("snapshot updated") + } + } +} diff --git a/internal/storage/fs/s3/source.go b/internal/storage/fs/s3/source.go deleted file mode 100644 index d7d7cdb01f..0000000000 --- a/internal/storage/fs/s3/source.go +++ /dev/null @@ -1,124 +0,0 @@ -package s3 - -import ( - "context" - "time" - - "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/service/s3" - - "go.flipt.io/flipt/internal/containers" - "go.flipt.io/flipt/internal/s3fs" - storagefs "go.flipt.io/flipt/internal/storage/fs" - "go.uber.org/zap" -) - -// Source represents an implementation of an fs.SnapshotSource -// This implementation is backed by an S3 bucket -type Source struct { - logger *zap.Logger - s3 *s3.Client - - endpoint string - region string - bucket string - prefix string - interval time.Duration -} - -// NewSource constructs a Source. -func NewSource(logger *zap.Logger, bucket string, opts ...containers.Option[Source]) (*Source, error) { - s := &Source{ - logger: logger, - bucket: bucket, - interval: 60 * time.Second, - } - - containers.ApplyAll(s, opts...) - - cfg, err := config.LoadDefaultConfig(context.Background(), - config.WithRegion(s.region)) - if err != nil { - return nil, err - } - - var s3Opts []func(*s3.Options) - if s.endpoint != "" { - s3Opts = append(s3Opts, func(o *s3.Options) { - o.BaseEndpoint = &s.endpoint - o.UsePathStyle = true - o.Region = s.region - }) - } - s.s3 = s3.NewFromConfig(cfg, s3Opts...) - - return s, nil -} - -// WithPrefix configures the prefix for s3 -func WithPrefix(prefix string) containers.Option[Source] { - return func(s *Source) { - s.prefix = prefix - } -} - -// WithRegion configures the region for s3 -func WithRegion(region string) containers.Option[Source] { - return func(s *Source) { - s.region = region - } -} - -// WithEndpoint configures the region for s3 -func WithEndpoint(endpoint string) containers.Option[Source] { - return func(s *Source) { - s.endpoint = endpoint - } -} - -// WithPollInterval configures the interval in which we will restore -// the s3 fs. -func WithPollInterval(tick time.Duration) containers.Option[Source] { - return func(s *Source) { - s.interval = tick - } -} - -// Get returns a *sourcefs.StoreSnapshot for the local filesystem. -func (s *Source) Get(context.Context) (*storagefs.StoreSnapshot, error) { - fs, err := s3fs.New(s.logger, s.s3, s.bucket, s.prefix) - if err != nil { - return nil, err - } - - return storagefs.SnapshotFromFS(s.logger, fs) -} - -// Subscribe feeds S3 populated *StoreSnapshot instances onto the provided channel. -// It blocks until the provided context is cancelled. -func (s *Source) Subscribe(ctx context.Context, ch chan<- *storagefs.StoreSnapshot) { - defer close(ch) - - ticker := time.NewTicker(s.interval) - for { - select { - case <-ctx.Done(): - return - case <-ticker.C: - snap, err := s.Get(ctx) - if err != nil { - s.logger.Error("error getting file system from directory", zap.Error(err)) - continue - } - - s.logger.Debug("updating local store snapshot") - - ch <- snap - } - } -} - -// String returns an identifier string for the store type. -func (s *Source) String() string { - return "s3" -} diff --git a/internal/storage/fs/s3/source_test.go b/internal/storage/fs/s3/source_test.go deleted file mode 100644 index e383b8c045..0000000000 --- a/internal/storage/fs/s3/source_test.go +++ /dev/null @@ -1,124 +0,0 @@ -package s3 - -import ( - "bytes" - "context" - "os" - "testing" - "time" - - "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/stretchr/testify/require" - "go.flipt.io/flipt/internal/containers" - storagefs "go.flipt.io/flipt/internal/storage/fs" - "go.uber.org/zap/zaptest" -) - -const testBucket = "testdata" - -var minioURL = os.Getenv("TEST_S3_ENDPOINT") - -func Test_SourceString(t *testing.T) { - require.Equal(t, "s3", (&Source{}).String()) -} - -func Test_SourceGet(t *testing.T) { - source, skip := testSource(t) - if skip { - return - } - - snap, err := source.Get(context.Background()) - require.NoError(t, err) - - _, err = snap.GetNamespace(context.TODO(), "production") - require.NoError(t, err) - - _, err = snap.GetNamespace(context.TODO(), "prefix") - require.NoError(t, err) -} - -func Test_SourceGetPrefix(t *testing.T) { - source, skip := testSource(t, WithPrefix("prefix/")) - if skip { - return - } - - snap, err := source.Get(context.Background()) - require.NoError(t, err) - - _, err = snap.GetNamespace(context.TODO(), "production") - require.Error(t, err, "production namespace should have been skipped") - - _, err = snap.GetNamespace(context.TODO(), "prefix") - require.NoError(t, err, "prefix namespace should be present in snapshot") -} - -func Test_SourceSubscribe(t *testing.T) { - source, skip := testSource(t) - if skip { - return - } - - snap, err := source.Get(context.Background()) - require.NoError(t, err) - - _, err = snap.GetNamespace(context.TODO(), "production") - require.NoError(t, err) - - ctx, cancel := context.WithCancel(context.Background()) - - // start subscription - ch := make(chan *storagefs.StoreSnapshot) - go source.Subscribe(ctx, ch) - - updated := []byte(`namespace: production -flags: - - key: foo - name: Foo`) - - buf := bytes.NewReader(updated) - - s3Client := source.s3 - // update features.yml - path := "features.yml" - _, err = s3Client.PutObject(ctx, &s3.PutObjectInput{ - Bucket: &source.bucket, - Key: &path, - Body: buf, - }) - require.NoError(t, err) - - // assert matching state - snap = <-ch - - t.Log("received new snapshot") - - _, err = snap.GetFlag(context.TODO(), "production", "foo") - require.NoError(t, err) - - cancel() - - _, open := <-ch - require.False(t, open, "expected channel to be closed after cancel") -} - -func testSource(t *testing.T, opts ...containers.Option[Source]) (*Source, bool) { - t.Helper() - - if minioURL == "" { - t.Skip("Set non-empty TEST_S3_ENDPOINT env var to run this test.") - return nil, true - } - - source, err := NewSource(zaptest.NewLogger(t), testBucket, - append([]containers.Option[Source]{ - WithEndpoint(minioURL), - WithPollInterval(5 * time.Second), - }, - opts...)..., - ) - require.NoError(t, err) - - return source, false -} diff --git a/internal/storage/fs/s3/store.go b/internal/storage/fs/s3/store.go new file mode 100644 index 0000000000..2003557683 --- /dev/null +++ b/internal/storage/fs/s3/store.go @@ -0,0 +1,135 @@ +package s3 + +import ( + "context" + "sync" + "time" + + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/s3" + + "go.flipt.io/flipt/internal/containers" + "go.flipt.io/flipt/internal/s3fs" + "go.flipt.io/flipt/internal/storage" + storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.uber.org/zap" +) + +var _ storagefs.SnapshotStore = (*SnapshotStore)(nil) + +// SnapshotStore represents an implementation of storage.SnapshotStore +// This implementation is backed by an S3 bucket +type SnapshotStore struct { + logger *zap.Logger + s3 *s3.Client + + mu sync.RWMutex + snap storage.ReadOnlyStore + + endpoint string + region string + bucket string + prefix string + + pollOpts []containers.Option[storagefs.Poller] +} + +// View accepts a function which takes a *StoreSnapshot. +// The SnapshotStore will supply a snapshot which is valid +// for the lifetime of the provided function call. +func (s *SnapshotStore) View(fn func(storage.ReadOnlyStore) error) error { + s.mu.RLock() + defer s.mu.RUnlock() + return fn(s.snap) +} + +// NewSnapshotStore constructs a Store +func NewSnapshotStore(ctx context.Context, logger *zap.Logger, bucket string, opts ...containers.Option[SnapshotStore]) (*SnapshotStore, error) { + s := &SnapshotStore{ + logger: logger, + bucket: bucket, + pollOpts: []containers.Option[storagefs.Poller]{ + storagefs.WithInterval(60 * time.Second), + }, + } + + containers.ApplyAll(s, opts...) + + cfg, err := config.LoadDefaultConfig(context.Background(), + config.WithRegion(s.region)) + if err != nil { + return nil, err + } + + var s3Opts []func(*s3.Options) + if s.endpoint != "" { + s3Opts = append(s3Opts, func(o *s3.Options) { + o.BaseEndpoint = &s.endpoint + o.UsePathStyle = true + o.Region = s.region + }) + } + s.s3 = s3.NewFromConfig(cfg, s3Opts...) + + // fetch snapshot at-least once before returning store + // to ensure we have some state to serve + if _, err := s.update(ctx); err != nil { + return nil, err + } + + go storagefs.NewPoller(s.logger, s.pollOpts...).Poll(ctx, s.update) + + return s, nil +} + +// WithPrefix configures the prefix for s3 +func WithPrefix(prefix string) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.prefix = prefix + } +} + +// WithRegion configures the region for s3 +func WithRegion(region string) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.region = region + } +} + +// WithEndpoint configures the region for s3 +func WithEndpoint(endpoint string) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.endpoint = endpoint + } +} + +// WithPollOptions configures the poller options used when periodically updating snapshot state +func WithPollOptions(opts ...containers.Option[storagefs.Poller]) containers.Option[SnapshotStore] { + return func(s *SnapshotStore) { + s.pollOpts = append(s.pollOpts, opts...) + } +} + +// Update fetches a new snapshot and swaps it out for the current one. +func (s *SnapshotStore) update(context.Context) (bool, error) { + fs, err := s3fs.New(s.logger, s.s3, s.bucket, s.prefix) + if err != nil { + return false, err + } + + snap, err := storagefs.SnapshotFromFS(s.logger, fs) + if err != nil { + return false, err + } + + s.mu.Lock() + s.snap = snap + s.mu.Unlock() + + return true, nil +} + +// String returns an identifier string for the store type. +func (s *SnapshotStore) String() string { + return "s3" +} diff --git a/internal/storage/fs/s3/store_test.go b/internal/storage/fs/s3/store_test.go new file mode 100644 index 0000000000..4c2314b202 --- /dev/null +++ b/internal/storage/fs/s3/store_test.go @@ -0,0 +1,122 @@ +package s3 + +import ( + "bytes" + "context" + "os" + "testing" + "time" + + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/stretchr/testify/require" + "go.flipt.io/flipt/internal/containers" + "go.flipt.io/flipt/internal/storage" + "go.flipt.io/flipt/internal/storage/fs" + "go.uber.org/zap/zaptest" +) + +const testBucket = "testdata" + +var minioURL = os.Getenv("TEST_S3_ENDPOINT") + +func Test_Store_String(t *testing.T) { + require.Equal(t, "s3", (&SnapshotStore{}).String()) +} + +func Test_Store(t *testing.T) { + ch := make(chan struct{}) + store, skip := testStore(t, WithPollOptions( + fs.WithInterval(time.Second), + fs.WithNotify(t, func(modified bool) { + if modified { + close(ch) + } + }), + )) + if skip { + return + } + + // flag shouldn't be present until we update it + require.Error(t, store.View(func(s storage.ReadOnlyStore) error { + _, err := s.GetFlag(context.TODO(), "production", "foo") + return err + }), "flag should not be defined yet") + + updated := []byte(`namespace: production +flags: + - key: foo + name: Foo`) + + buf := bytes.NewReader(updated) + + s3Client := store.s3 + // update features.yml + path := "features.yml" + _, err := s3Client.PutObject(context.TODO(), &s3.PutObjectInput{ + Bucket: &store.bucket, + Key: &path, + Body: buf, + }) + require.NoError(t, err) + + // assert matching state + select { + case <-ch: + case <-time.After(time.Minute): + t.Fatal("timed out waiting for update") + } + + t.Log("received new snapshot") + + require.NoError(t, store.View(func(s storage.ReadOnlyStore) error { + _, err = s.GetNamespace(context.TODO(), "production") + if err != nil { + return err + } + + _, err = s.GetFlag(context.TODO(), "production", "foo") + if err != nil { + return err + } + + _, err = s.GetNamespace(context.TODO(), "prefix") + return err + })) + +} + +func Test_Store_WithPrefix(t *testing.T) { + store, skip := testStore(t, WithPrefix("prefix")) + if skip { + return + } + + // namespace shouldn't exist as it has been filtered out by the prefix + require.Error(t, store.View(func(s storage.ReadOnlyStore) error { + _, err := s.GetNamespace(context.TODO(), "production") + return err + }), "production namespace shouldn't be retrieavable") +} + +func testStore(t *testing.T, opts ...containers.Option[SnapshotStore]) (*SnapshotStore, bool) { + t.Helper() + + if minioURL == "" { + t.Skip("Set non-empty TEST_S3_ENDPOINT env var to run this test.") + return nil, true + } + + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + source, err := NewSnapshotStore(ctx, zaptest.NewLogger(t), testBucket, + append([]containers.Option[SnapshotStore]{ + WithEndpoint(minioURL), + }, + opts...)..., + ) + require.NoError(t, err) + + return source, false +} diff --git a/internal/storage/fs/snapshot.go b/internal/storage/fs/snapshot.go index 37f3c2febb..7f058e0650 100644 --- a/internal/storage/fs/snapshot.go +++ b/internal/storage/fs/snapshot.go @@ -29,10 +29,7 @@ const ( defaultNs = "default" ) -var ( - _ storage.Store = (*StoreSnapshot)(nil) - ErrNotImplemented = errors.New("not implemented") -) +var _ storage.ReadOnlyStore = (*Snapshot)(nil) // FliptIndex represents the structure of a well-known file ".flipt.yml" // at the root of an FS. @@ -42,9 +39,9 @@ type FliptIndex struct { Exclude []string `yaml:"exclude,omitempty"` } -// StoreSnapshot contains the structures necessary for serving +// Snapshot contains the structures necessary for serving // flag state to a client. -type StoreSnapshot struct { +type Snapshot struct { ns map[string]*namespace evalDists map[string][]*storage.EvaluationDistribution now *timestamppb.Timestamp @@ -80,7 +77,7 @@ func newNamespace(key, name string, created *timestamppb.Timestamp) *namespace { // SnapshotFromFS is a convenience function for building a snapshot // directly from an implementation of fs.FS using the list state files // function to source the relevant Flipt configuration files. -func SnapshotFromFS(logger *zap.Logger, fs fs.FS) (*StoreSnapshot, error) { +func SnapshotFromFS(logger *zap.Logger, fs fs.FS) (*Snapshot, error) { files, err := listStateFiles(logger, fs) if err != nil { return nil, err @@ -93,7 +90,7 @@ func SnapshotFromFS(logger *zap.Logger, fs fs.FS) (*StoreSnapshot, error) { // SnapshotFromPaths constructs a StoreSnapshot from the provided // slice of paths resolved against the provided fs.FS. -func SnapshotFromPaths(logger *zap.Logger, ffs fs.FS, paths ...string) (*StoreSnapshot, error) { +func SnapshotFromPaths(logger *zap.Logger, ffs fs.FS, paths ...string) (*Snapshot, error) { var files []fs.File for _, file := range paths { fi, err := ffs.Open(file) @@ -109,9 +106,9 @@ func SnapshotFromPaths(logger *zap.Logger, ffs fs.FS, paths ...string) (*StoreSn // SnapshotFromFiles constructs a StoreSnapshot from the provided slice // of fs.File implementations. -func SnapshotFromFiles(logger *zap.Logger, files ...fs.File) (*StoreSnapshot, error) { +func SnapshotFromFiles(logger *zap.Logger, files ...fs.File) (*Snapshot, error) { now := flipt.Now() - s := StoreSnapshot{ + s := Snapshot{ ns: map[string]*namespace{ defaultNs: newNamespace("default", "Default", now), }, @@ -309,7 +306,7 @@ func listStateFiles(logger *zap.Logger, source fs.FS) ([]string, error) { return filenames, nil } -func (ss *StoreSnapshot) addDoc(doc *ext.Document) error { +func (ss *Snapshot) addDoc(doc *ext.Document) error { ns := ss.ns[doc.Namespace] if ns == nil { ns = newNamespace(doc.Namespace, doc.Namespace, ss.now) @@ -593,11 +590,11 @@ func (ss *StoreSnapshot) addDoc(doc *ext.Document) error { return nil } -func (ss StoreSnapshot) String() string { +func (ss Snapshot) String() string { return "snapshot" } -func (ss *StoreSnapshot) GetRule(ctx context.Context, namespaceKey string, id string) (rule *flipt.Rule, _ error) { +func (ss *Snapshot) GetRule(ctx context.Context, namespaceKey string, id string) (rule *flipt.Rule, _ error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return nil, err @@ -612,7 +609,7 @@ func (ss *StoreSnapshot) GetRule(ctx context.Context, namespaceKey string, id st return rule, nil } -func (ss *StoreSnapshot) ListRules(ctx context.Context, namespaceKey string, flagKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Rule], _ error) { +func (ss *Snapshot) ListRules(ctx context.Context, namespaceKey string, flagKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Rule], _ error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return set, err @@ -630,7 +627,7 @@ func (ss *StoreSnapshot) ListRules(ctx context.Context, namespaceKey string, fla }, rules...) } -func (ss *StoreSnapshot) CountRules(ctx context.Context, namespaceKey, flagKey string) (uint64, error) { +func (ss *Snapshot) CountRules(ctx context.Context, namespaceKey, flagKey string) (uint64, error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return 0, err @@ -646,35 +643,7 @@ func (ss *StoreSnapshot) CountRules(ctx context.Context, namespaceKey, flagKey s return count, nil } -func (ss *StoreSnapshot) CreateRule(ctx context.Context, r *flipt.CreateRuleRequest) (*flipt.Rule, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateRule(ctx context.Context, r *flipt.UpdateRuleRequest) (*flipt.Rule, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteRule(ctx context.Context, r *flipt.DeleteRuleRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) OrderRules(ctx context.Context, r *flipt.OrderRulesRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) CreateDistribution(ctx context.Context, r *flipt.CreateDistributionRequest) (*flipt.Distribution, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateDistribution(ctx context.Context, r *flipt.UpdateDistributionRequest) (*flipt.Distribution, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteDistribution(ctx context.Context, r *flipt.DeleteDistributionRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) GetSegment(ctx context.Context, namespaceKey string, key string) (*flipt.Segment, error) { +func (ss *Snapshot) GetSegment(ctx context.Context, namespaceKey string, key string) (*flipt.Segment, error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return nil, err @@ -688,7 +657,7 @@ func (ss *StoreSnapshot) GetSegment(ctx context.Context, namespaceKey string, ke return segment, nil } -func (ss *StoreSnapshot) ListSegments(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Segment], err error) { +func (ss *Snapshot) ListSegments(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Segment], err error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return set, err @@ -704,7 +673,7 @@ func (ss *StoreSnapshot) ListSegments(ctx context.Context, namespaceKey string, }, segments...) } -func (ss *StoreSnapshot) CountSegments(ctx context.Context, namespaceKey string) (uint64, error) { +func (ss *Snapshot) CountSegments(ctx context.Context, namespaceKey string) (uint64, error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return 0, err @@ -713,31 +682,7 @@ func (ss *StoreSnapshot) CountSegments(ctx context.Context, namespaceKey string) return uint64(len(ns.segments)), nil } -func (ss *StoreSnapshot) CreateSegment(ctx context.Context, r *flipt.CreateSegmentRequest) (*flipt.Segment, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateSegment(ctx context.Context, r *flipt.UpdateSegmentRequest) (*flipt.Segment, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteSegment(ctx context.Context, r *flipt.DeleteSegmentRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) CreateConstraint(ctx context.Context, r *flipt.CreateConstraintRequest) (*flipt.Constraint, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateConstraint(ctx context.Context, r *flipt.UpdateConstraintRequest) (*flipt.Constraint, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteConstraint(ctx context.Context, r *flipt.DeleteConstraintRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { +func (ss *Snapshot) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { ns, err := ss.getNamespace(key) if err != nil { return nil, err @@ -746,7 +691,7 @@ func (ss *StoreSnapshot) GetNamespace(ctx context.Context, key string) (*flipt.N return ns.resource, nil } -func (ss *StoreSnapshot) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Namespace], err error) { +func (ss *Snapshot) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Namespace], err error) { ns := make([]*flipt.Namespace, 0, len(ss.ns)) for _, n := range ss.ns { ns = append(ns, n.resource) @@ -757,23 +702,11 @@ func (ss *StoreSnapshot) ListNamespaces(ctx context.Context, opts ...storage.Que }, ns...) } -func (ss *StoreSnapshot) CountNamespaces(ctx context.Context) (uint64, error) { +func (ss *Snapshot) CountNamespaces(ctx context.Context) (uint64, error) { return uint64(len(ss.ns)), nil } -func (ss *StoreSnapshot) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) GetFlag(ctx context.Context, namespaceKey string, key string) (*flipt.Flag, error) { +func (ss *Snapshot) GetFlag(ctx context.Context, namespaceKey string, key string) (*flipt.Flag, error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return nil, err @@ -787,7 +720,7 @@ func (ss *StoreSnapshot) GetFlag(ctx context.Context, namespaceKey string, key s return flag, nil } -func (ss *StoreSnapshot) ListFlags(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Flag], err error) { +func (ss *Snapshot) ListFlags(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Flag], err error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return set, err @@ -803,7 +736,7 @@ func (ss *StoreSnapshot) ListFlags(ctx context.Context, namespaceKey string, opt }, flags...) } -func (ss *StoreSnapshot) CountFlags(ctx context.Context, namespaceKey string) (uint64, error) { +func (ss *Snapshot) CountFlags(ctx context.Context, namespaceKey string) (uint64, error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return 0, err @@ -812,31 +745,7 @@ func (ss *StoreSnapshot) CountFlags(ctx context.Context, namespaceKey string) (u return uint64(len(ns.flags)), nil } -func (ss *StoreSnapshot) CreateFlag(ctx context.Context, r *flipt.CreateFlagRequest) (*flipt.Flag, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateFlag(ctx context.Context, r *flipt.UpdateFlagRequest) (*flipt.Flag, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteFlag(ctx context.Context, r *flipt.DeleteFlagRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) CreateVariant(ctx context.Context, r *flipt.CreateVariantRequest) (*flipt.Variant, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateVariant(ctx context.Context, r *flipt.UpdateVariantRequest) (*flipt.Variant, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteVariant(ctx context.Context, r *flipt.DeleteVariantRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) GetEvaluationRules(ctx context.Context, namespaceKey string, flagKey string) ([]*storage.EvaluationRule, error) { +func (ss *Snapshot) GetEvaluationRules(ctx context.Context, namespaceKey string, flagKey string) ([]*storage.EvaluationRule, error) { ns, ok := ss.ns[namespaceKey] if !ok { return nil, errs.ErrNotFoundf("namespaced %q", namespaceKey) @@ -850,7 +759,7 @@ func (ss *StoreSnapshot) GetEvaluationRules(ctx context.Context, namespaceKey st return rules, nil } -func (ss *StoreSnapshot) GetEvaluationDistributions(ctx context.Context, ruleID string) ([]*storage.EvaluationDistribution, error) { +func (ss *Snapshot) GetEvaluationDistributions(ctx context.Context, ruleID string) ([]*storage.EvaluationDistribution, error) { dists, ok := ss.evalDists[ruleID] if !ok { return nil, errs.ErrNotFoundf("rule %q", ruleID) @@ -859,7 +768,7 @@ func (ss *StoreSnapshot) GetEvaluationDistributions(ctx context.Context, ruleID return dists, nil } -func (ss *StoreSnapshot) GetEvaluationRollouts(ctx context.Context, namespaceKey, flagKey string) ([]*storage.EvaluationRollout, error) { +func (ss *Snapshot) GetEvaluationRollouts(ctx context.Context, namespaceKey, flagKey string) ([]*storage.EvaluationRollout, error) { ns, ok := ss.ns[namespaceKey] if !ok { return nil, errs.ErrNotFoundf("namespaced %q", namespaceKey) @@ -873,7 +782,7 @@ func (ss *StoreSnapshot) GetEvaluationRollouts(ctx context.Context, namespaceKey return rollouts, nil } -func (ss *StoreSnapshot) GetRollout(ctx context.Context, namespaceKey, id string) (*flipt.Rollout, error) { +func (ss *Snapshot) GetRollout(ctx context.Context, namespaceKey, id string) (*flipt.Rollout, error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return nil, err @@ -887,7 +796,7 @@ func (ss *StoreSnapshot) GetRollout(ctx context.Context, namespaceKey, id string return rollout, nil } -func (ss *StoreSnapshot) ListRollouts(ctx context.Context, namespaceKey, flagKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Rollout], err error) { +func (ss *Snapshot) ListRollouts(ctx context.Context, namespaceKey, flagKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Rollout], err error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return set, err @@ -905,7 +814,7 @@ func (ss *StoreSnapshot) ListRollouts(ctx context.Context, namespaceKey, flagKey }, rollouts...) } -func (ss *StoreSnapshot) CountRollouts(ctx context.Context, namespaceKey, flagKey string) (uint64, error) { +func (ss *Snapshot) CountRollouts(ctx context.Context, namespaceKey, flagKey string) (uint64, error) { ns, err := ss.getNamespace(namespaceKey) if err != nil { return 0, err @@ -921,22 +830,6 @@ func (ss *StoreSnapshot) CountRollouts(ctx context.Context, namespaceKey, flagKe return count, nil } -func (ss *StoreSnapshot) CreateRollout(ctx context.Context, r *flipt.CreateRolloutRequest) (*flipt.Rollout, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) UpdateRollout(ctx context.Context, r *flipt.UpdateRolloutRequest) (*flipt.Rollout, error) { - return nil, ErrNotImplemented -} - -func (ss *StoreSnapshot) DeleteRollout(ctx context.Context, r *flipt.DeleteRolloutRequest) error { - return ErrNotImplemented -} - -func (ss *StoreSnapshot) OrderRollouts(ctx context.Context, r *flipt.OrderRolloutsRequest) error { - return ErrNotImplemented -} - func findByKey[T interface{ GetKey() string }](key string, ts ...T) (t T, _ bool) { return find(func(t T) bool { return t.GetKey() == key }, ts...) } @@ -1003,7 +896,7 @@ func paginate[T any](params storage.QueryParams, less func(i, j int) bool, items return set, nil } -func (ss *StoreSnapshot) getNamespace(key string) (namespace, error) { +func (ss *Snapshot) getNamespace(key string) (namespace, error) { ns, ok := ss.ns[key] if !ok { return namespace{}, errs.ErrNotFoundf("namespace %q", key) diff --git a/internal/storage/fs/snapshot_test.go b/internal/storage/fs/snapshot_test.go index 1a4334d71b..3b0ae2f1fb 100644 --- a/internal/storage/fs/snapshot_test.go +++ b/internal/storage/fs/snapshot_test.go @@ -113,7 +113,7 @@ func TestFSWithIndex(t *testing.T) { type FSIndexSuite struct { suite.Suite - store storage.Store + store storage.ReadOnlyStore } func (fis *FSIndexSuite) TestCountFlag() { @@ -790,7 +790,7 @@ func (fis *FSIndexSuite) TestCountRules() { type FSWithoutIndexSuite struct { suite.Suite - store storage.Store + store storage.ReadOnlyStore } func TestFSWithoutIndex(t *testing.T) { diff --git a/internal/storage/fs/store.go b/internal/storage/fs/store.go index 925bf628dd..21358bae82 100644 --- a/internal/storage/fs/store.go +++ b/internal/storage/fs/store.go @@ -2,108 +2,336 @@ package fs import ( "context" + "errors" "fmt" "path" - "go.uber.org/zap" + "go.flipt.io/flipt/internal/storage" + "go.flipt.io/flipt/rpc/flipt" ) -// SnapshotSource produces instances of the storage snapshot. -// A single snapshot can be produced via Get or a channel -// may be provided to Subscribe in order to received -// new instances when new state becomes available. -type SnapshotSource interface { - fmt.Stringer +var ( + _ storage.Store = (*Store)(nil) - // Get builds a single instance of a *SnapshotSource - Get(context.Context) (*StoreSnapshot, error) + // ErrNotImplemented is returned when a method has intentionally not been implemented + // This is usually reserved for the store write actions when the store is read-only + // but still needs to implement storage.Store + ErrNotImplemented = errors.New("not implemented") +) - // Subscribe feeds instances of *SnapshotSource onto the provided channel. - // It should block until the provided context is cancelled (it will be called in a goroutine). - // It should close the provided channel before it returns. - Subscribe(context.Context, chan<- *StoreSnapshot) +// SnapshotStore is a type which has a single function View. +// View is a functional transaction interface for reading a snapshot +// during the lifetime of a supplied function. +type SnapshotStore interface { + // View accepts a function which takes a *StoreSnapshot. + // The SnapshotStore will supply a snapshot which is valid + // for the lifetime of the provided function call. + View(func(storage.ReadOnlyStore) error) error + fmt.Stringer } -// Store is an implementation of storage.Store backed by an SnapshotSource. -// The store subscribes to the source for instances of *SnapshotSource with new contents. -// When a new fs is received the contents is fetched and built into a snapshot -// of Flipt feature flag state. +// Store embeds a StoreSnapshot and wraps the Store methods with a read-write mutex +// to synchronize reads with atomic replacements of the embedded snapshot. type Store struct { - *syncedStore + viewer SnapshotStore +} + +func NewStore(viewer SnapshotStore) *Store { + return &Store{viewer: viewer} +} + +func (s *Store) String() string { + return path.Join("declarative", s.viewer.String()) +} + +func (s *Store) GetFlag(ctx context.Context, namespaceKey string, key string) (flag *flipt.Flag, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return flag, s.viewer.View(func(ss storage.ReadOnlyStore) error { + flag, err = ss.GetFlag(ctx, namespaceKey, key) + return err + }) +} + +func (s *Store) ListFlags(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Flag], err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return set, s.viewer.View(func(ss storage.ReadOnlyStore) error { + set, err = ss.ListFlags(ctx, namespaceKey, opts...) + return err + }) +} + +func (s *Store) CountFlags(ctx context.Context, namespaceKey string) (count uint64, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return count, s.viewer.View(func(ss storage.ReadOnlyStore) error { + count, err = ss.CountFlags(ctx, namespaceKey) + return err + }) +} + +func (s *Store) GetRule(ctx context.Context, namespaceKey string, id string) (rule *flipt.Rule, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return rule, s.viewer.View(func(ss storage.ReadOnlyStore) error { + rule, err = ss.GetRule(ctx, namespaceKey, id) + return err + }) +} + +func (s *Store) ListRules(ctx context.Context, namespaceKey string, flagKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Rule], err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return set, s.viewer.View(func(ss storage.ReadOnlyStore) error { + set, err = ss.ListRules(ctx, namespaceKey, flagKey, opts...) + return err + }) +} + +func (s *Store) CountRules(ctx context.Context, namespaceKey, flagKey string) (count uint64, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return count, s.viewer.View(func(ss storage.ReadOnlyStore) error { + count, err = ss.CountRules(ctx, namespaceKey, flagKey) + return err + }) +} + +func (s *Store) GetSegment(ctx context.Context, namespaceKey string, key string) (segment *flipt.Segment, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return segment, s.viewer.View(func(ss storage.ReadOnlyStore) error { + segment, err = ss.GetSegment(ctx, namespaceKey, key) + return err + }) +} + +func (s *Store) ListSegments(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Segment], err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return set, s.viewer.View(func(ss storage.ReadOnlyStore) error { + set, err = ss.ListSegments(ctx, namespaceKey, opts...) + return err + }) +} + +func (s *Store) CountSegments(ctx context.Context, namespaceKey string) (count uint64, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return count, s.viewer.View(func(ss storage.ReadOnlyStore) error { + count, err = ss.CountSegments(ctx, namespaceKey) + return err + }) +} + +func (s *Store) GetEvaluationRules(ctx context.Context, namespaceKey string, flagKey string) (rules []*storage.EvaluationRule, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } + + return rules, s.viewer.View(func(ss storage.ReadOnlyStore) error { + rules, err = ss.GetEvaluationRules(ctx, namespaceKey, flagKey) + return err + }) +} + +func (s *Store) GetEvaluationDistributions(ctx context.Context, ruleID string) (dists []*storage.EvaluationDistribution, err error) { + return dists, s.viewer.View(func(ss storage.ReadOnlyStore) error { + dists, err = ss.GetEvaluationDistributions(ctx, ruleID) + return err + }) +} + +func (s *Store) GetEvaluationRollouts(ctx context.Context, namespaceKey, flagKey string) (rollouts []*storage.EvaluationRollout, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace + } - logger *zap.Logger - source SnapshotSource + return rollouts, s.viewer.View(func(ss storage.ReadOnlyStore) error { + rollouts, err = ss.GetEvaluationRollouts(ctx, namespaceKey, flagKey) + return err + }) +} - // notify is used for test purposes - // it is invoked if defined when a snapshot update finishes - notify func() +func (s *Store) GetNamespace(ctx context.Context, key string) (ns *flipt.Namespace, err error) { + if key == "" { + key = flipt.DefaultNamespace + } - cancel context.CancelFunc - done chan struct{} + return ns, s.viewer.View(func(ss storage.ReadOnlyStore) error { + ns, err = ss.GetNamespace(ctx, key) + return err + }) } -func (l *Store) updateSnapshot(storeSnapshot *StoreSnapshot) { - l.mu.Lock() - l.Store = storeSnapshot - l.mu.Unlock() +func (s *Store) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Namespace], err error) { + return set, s.viewer.View(func(ss storage.ReadOnlyStore) error { + set, err = ss.ListNamespaces(ctx, opts...) + return err + }) +} - // NOTE: this is really just a trick for unit tests - // It is used to signal that an update occurred - // so we dont have to e.g. sleep to know when - // to check state. - if l.notify != nil { - l.notify() +func (s *Store) CountNamespaces(ctx context.Context) (count uint64, err error) { + return count, s.viewer.View(func(ss storage.ReadOnlyStore) error { + count, err = ss.CountNamespaces(ctx) + return err + }) +} + +func (s *Store) GetRollout(ctx context.Context, namespaceKey, id string) (rollout *flipt.Rollout, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace } + + return rollout, s.viewer.View(func(ss storage.ReadOnlyStore) error { + rollout, err = ss.GetRollout(ctx, namespaceKey, id) + return err + }) } -// NewStore constructs and configure a Store. -// The store creates a background goroutine which feeds a channel of *SnapshotSource. -func NewStore(logger *zap.Logger, source SnapshotSource) (*Store, error) { - store := &Store{ - syncedStore: &syncedStore{}, - logger: logger, - source: source, - done: make(chan struct{}), +func (s *Store) ListRollouts(ctx context.Context, namespaceKey, flagKey string, opts ...storage.QueryOption) (set storage.ResultSet[*flipt.Rollout], err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace } - // get an initial snapshot from source. - f, err := source.Get(context.Background()) - if err != nil { - return nil, err + return set, s.viewer.View(func(ss storage.ReadOnlyStore) error { + set, err = ss.ListRollouts(ctx, namespaceKey, flagKey, opts...) + return err + }) +} + +func (s *Store) CountRollouts(ctx context.Context, namespaceKey, flagKey string) (count uint64, err error) { + if namespaceKey == "" { + namespaceKey = flipt.DefaultNamespace } - store.updateSnapshot(f) + return count, s.viewer.View(func(ss storage.ReadOnlyStore) error { + count, err = ss.CountRollouts(ctx, namespaceKey, flagKey) + return err + }) +} + +// unimplemented write paths below + +func (s *Store) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + return nil, ErrNotImplemented +} + +func (s *Store) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { + return nil, ErrNotImplemented +} - var ctx context.Context - ctx, store.cancel = context.WithCancel(context.Background()) +func (s *Store) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { + return ErrNotImplemented +} - ch := make(chan *StoreSnapshot) - go source.Subscribe(ctx, ch) +func (s *Store) CreateFlag(ctx context.Context, r *flipt.CreateFlagRequest) (*flipt.Flag, error) { + return nil, ErrNotImplemented +} - go func() { - defer close(store.done) - for snap := range ch { - logger.Debug("received new snapshot") - store.updateSnapshot(snap) - logger.Debug("updated latest snapshot") - } +func (s *Store) UpdateFlag(ctx context.Context, r *flipt.UpdateFlagRequest) (*flipt.Flag, error) { + return nil, ErrNotImplemented +} - logger.Info("source subscription closed") - }() +func (s *Store) DeleteFlag(ctx context.Context, r *flipt.DeleteFlagRequest) error { + return ErrNotImplemented +} - return store, nil +func (s *Store) CreateVariant(ctx context.Context, r *flipt.CreateVariantRequest) (*flipt.Variant, error) { + return nil, ErrNotImplemented } -// Close cancels the polling routine and waits for the routine to return. -func (l *Store) Close() error { - l.cancel() +func (s *Store) UpdateVariant(ctx context.Context, r *flipt.UpdateVariantRequest) (*flipt.Variant, error) { + return nil, ErrNotImplemented +} + +func (s *Store) DeleteVariant(ctx context.Context, r *flipt.DeleteVariantRequest) error { + return ErrNotImplemented +} + +func (s *Store) CreateSegment(ctx context.Context, r *flipt.CreateSegmentRequest) (*flipt.Segment, error) { + return nil, ErrNotImplemented +} + +func (s *Store) UpdateSegment(ctx context.Context, r *flipt.UpdateSegmentRequest) (*flipt.Segment, error) { + return nil, ErrNotImplemented +} - <-l.done +func (s *Store) DeleteSegment(ctx context.Context, r *flipt.DeleteSegmentRequest) error { + return ErrNotImplemented +} + +func (s *Store) CreateConstraint(ctx context.Context, r *flipt.CreateConstraintRequest) (*flipt.Constraint, error) { + return nil, ErrNotImplemented +} + +func (s *Store) UpdateConstraint(ctx context.Context, r *flipt.UpdateConstraintRequest) (*flipt.Constraint, error) { + return nil, ErrNotImplemented +} + +func (s *Store) DeleteConstraint(ctx context.Context, r *flipt.DeleteConstraintRequest) error { + return ErrNotImplemented +} + +func (s *Store) CreateRule(ctx context.Context, r *flipt.CreateRuleRequest) (*flipt.Rule, error) { + return nil, ErrNotImplemented +} + +func (s *Store) UpdateRule(ctx context.Context, r *flipt.UpdateRuleRequest) (*flipt.Rule, error) { + return nil, ErrNotImplemented +} + +func (s *Store) DeleteRule(ctx context.Context, r *flipt.DeleteRuleRequest) error { + return ErrNotImplemented +} + +func (s *Store) OrderRules(ctx context.Context, r *flipt.OrderRulesRequest) error { + return ErrNotImplemented +} + +func (s *Store) CreateDistribution(ctx context.Context, r *flipt.CreateDistributionRequest) (*flipt.Distribution, error) { + return nil, ErrNotImplemented +} + +func (s *Store) UpdateDistribution(ctx context.Context, r *flipt.UpdateDistributionRequest) (*flipt.Distribution, error) { + return nil, ErrNotImplemented +} + +func (s *Store) DeleteDistribution(ctx context.Context, r *flipt.DeleteDistributionRequest) error { + return ErrNotImplemented +} + +func (s *Store) CreateRollout(ctx context.Context, r *flipt.CreateRolloutRequest) (*flipt.Rollout, error) { + return nil, ErrNotImplemented +} + +func (s *Store) UpdateRollout(ctx context.Context, r *flipt.UpdateRolloutRequest) (*flipt.Rollout, error) { + return nil, ErrNotImplemented +} - return nil +func (s *Store) DeleteRollout(ctx context.Context, r *flipt.DeleteRolloutRequest) error { + return ErrNotImplemented } -// String returns an identifier string for the store type. -func (l *Store) String() string { - return path.Join("filesystem", l.source.String()) +func (s *Store) OrderRollouts(ctx context.Context, r *flipt.OrderRolloutsRequest) error { + return ErrNotImplemented } diff --git a/internal/storage/fs/store/store.go b/internal/storage/fs/store/store.go new file mode 100644 index 0000000000..0afece5d99 --- /dev/null +++ b/internal/storage/fs/store/store.go @@ -0,0 +1,164 @@ +package store + +import ( + "context" + "fmt" + "os" + + "github.com/go-git/go-git/v5/plumbing/transport/http" + gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh" + "go.flipt.io/flipt/internal/config" + "go.flipt.io/flipt/internal/containers" + "go.flipt.io/flipt/internal/oci" + "go.flipt.io/flipt/internal/storage" + storagefs "go.flipt.io/flipt/internal/storage/fs" + "go.flipt.io/flipt/internal/storage/fs/git" + "go.flipt.io/flipt/internal/storage/fs/local" + storageoci "go.flipt.io/flipt/internal/storage/fs/oci" + "go.flipt.io/flipt/internal/storage/fs/s3" + "go.uber.org/zap" + "golang.org/x/crypto/ssh" +) + +// NewStore is a constructor that handles all the known declarative backend storage types +// Given the provided storage type is know, the relevant backend is configured and returned +func NewStore(ctx context.Context, logger *zap.Logger, cfg *config.Config) (_ storage.Store, err error) { + switch cfg.Storage.Type { + case config.GitStorageType: + opts := []containers.Option[git.SnapshotStore]{ + git.WithRef(cfg.Storage.Git.Ref), + git.WithPollOptions( + storagefs.WithInterval(cfg.Storage.Git.PollInterval), + ), + git.WithInsecureTLS(cfg.Storage.Git.InsecureSkipTLS), + } + + if cfg.Storage.Git.CaCertBytes != "" { + opts = append(opts, git.WithCABundle([]byte(cfg.Storage.Git.CaCertBytes))) + } else if cfg.Storage.Git.CaCertPath != "" { + if bytes, err := os.ReadFile(cfg.Storage.Git.CaCertPath); err == nil { + opts = append(opts, git.WithCABundle(bytes)) + } else { + return nil, err + } + } + + auth := cfg.Storage.Git.Authentication + switch { + case auth.BasicAuth != nil: + opts = append(opts, git.WithAuth(&http.BasicAuth{ + Username: auth.BasicAuth.Username, + Password: auth.BasicAuth.Password, + })) + case auth.TokenAuth != nil: + opts = append(opts, git.WithAuth(&http.TokenAuth{ + Token: auth.TokenAuth.AccessToken, + })) + case auth.SSHAuth != nil: + var method *gitssh.PublicKeys + if auth.SSHAuth.PrivateKeyBytes != "" { + method, err = gitssh.NewPublicKeys( + auth.SSHAuth.User, + []byte(auth.SSHAuth.PrivateKeyBytes), + auth.SSHAuth.Password, + ) + } else { + method, err = gitssh.NewPublicKeysFromFile( + auth.SSHAuth.User, + auth.SSHAuth.PrivateKeyPath, + auth.SSHAuth.Password, + ) + } + if err != nil { + return nil, err + } + + // we're protecting against this explicitly so we can disable + // the gosec linting rule + if auth.SSHAuth.InsecureIgnoreHostKey { + // nolint:gosec + method.HostKeyCallback = ssh.InsecureIgnoreHostKey() + } + + opts = append(opts, git.WithAuth(method)) + } + + snapStore, err := git.NewSnapshotStore(ctx, logger, cfg.Storage.Git.Repository, opts...) + if err != nil { + return nil, err + } + + return storagefs.NewStore(snapStore), nil + case config.LocalStorageType: + snapStore, err := local.NewSnapshotStore(ctx, logger, cfg.Storage.Local.Path) + if err != nil { + return nil, err + } + + return storagefs.NewStore(snapStore), nil + case config.ObjectStorageType: + return newObjectStore(ctx, cfg, logger) + case config.OCIStorageType: + var opts []containers.Option[oci.StoreOptions] + if auth := cfg.Storage.OCI.Authentication; auth != nil { + opts = append(opts, oci.WithCredentials( + auth.Username, + auth.Password, + )) + } + + ocistore, err := oci.NewStore(logger, cfg.Storage.OCI.BundlesDirectory, opts...) + if err != nil { + return nil, err + } + + ref, err := oci.ParseReference(cfg.Storage.OCI.Repository) + if err != nil { + return nil, err + } + + snapStore, err := storageoci.NewSnapshotStore(ctx, logger, ocistore, ref, + storageoci.WithPollOptions( + storagefs.WithInterval(cfg.Storage.OCI.PollInterval), + ), + ) + if err != nil { + return nil, err + } + + return storagefs.NewStore(snapStore), nil + } + + return nil, fmt.Errorf("unexpected storage type: %q", cfg.Storage.Type) +} + +// newObjectStore create a new storate.Store from the object config +func newObjectStore(ctx context.Context, cfg *config.Config, logger *zap.Logger) (store storage.Store, err error) { + objectCfg := cfg.Storage.Object + // keep this as a case statement in anticipation of + // more object types in the future + // nolint:gocritic + switch objectCfg.Type { + case config.S3ObjectSubStorageType: + opts := []containers.Option[s3.SnapshotStore]{ + s3.WithPollOptions( + storagefs.WithInterval(objectCfg.S3.PollInterval), + ), + } + if objectCfg.S3.Endpoint != "" { + opts = append(opts, s3.WithEndpoint(objectCfg.S3.Endpoint)) + } + if objectCfg.S3.Region != "" { + opts = append(opts, s3.WithRegion(objectCfg.S3.Region)) + } + + snapStore, err := s3.NewSnapshotStore(ctx, logger, objectCfg.S3.Bucket, opts...) + if err != nil { + return nil, err + } + + return storagefs.NewStore(snapStore), nil + } + + return nil, fmt.Errorf("unexpected object storage subtype: %q", objectCfg.Type) +} diff --git a/internal/storage/fs/store_test.go b/internal/storage/fs/store_test.go index 41cae2631b..780ab6059b 100644 --- a/internal/storage/fs/store_test.go +++ b/internal/storage/fs/store_test.go @@ -2,89 +2,212 @@ package fs import ( "context" - "io/fs" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - "go.uber.org/zap/zaptest" + "go.flipt.io/flipt/internal/common" + "go.flipt.io/flipt/internal/storage" + "go.flipt.io/flipt/rpc/flipt" ) -func Test_Store(t *testing.T) { - var ( - logger = zaptest.NewLogger(t) - notify = make(chan struct{}) - source = source{ - get: mustSub(t, testdata, "testdata/valid/explicit_index"), - ch: make(chan *StoreSnapshot), - } - ) +func TestGetFlag(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) - store, err := NewStore(logger, source) + storeMock.On("GetFlag", mock.Anything, flipt.DefaultNamespace, "foo").Return(&flipt.Flag{}, nil) + + _, err := ss.GetFlag(context.TODO(), "", "foo") require.NoError(t, err) +} - // register a function to be called when updates have - // finished - store.notify = func() { - notify <- struct{}{} - } +func TestListFlags(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("ListFlags", mock.Anything, flipt.DefaultNamespace, mock.Anything).Return(storage.ResultSet[*flipt.Flag]{}, nil) + + _, err := ss.ListFlags(context.TODO(), "") + require.NoError(t, err) +} + +func TestCountFlags(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("CountFlags", mock.Anything, flipt.DefaultNamespace).Return(uint64(0), nil) + + _, err := ss.CountFlags(context.TODO(), "") + require.NoError(t, err) +} + +func TestGetRule(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("GetRule", mock.Anything, flipt.DefaultNamespace, "").Return(&flipt.Rule{}, nil) + + _, err := ss.GetRule(context.TODO(), "", "") + require.NoError(t, err) +} + +func TestListRules(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("ListRules", mock.Anything, flipt.DefaultNamespace, "", mock.Anything).Return(storage.ResultSet[*flipt.Rule]{}, nil) - assert.Equal(t, "filesystem/test", store.String()) + _, err := ss.ListRules(context.TODO(), "", "") + require.NoError(t, err) +} + +func TestCountRules(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) - // run FS with index suite against current store - suite.Run(t, &FSIndexSuite{store: store}) + storeMock.On("CountRules", mock.Anything, flipt.DefaultNamespace, "").Return(uint64(0), nil) - // update snapshot by sending fs without index - source.ch <- mustSub(t, testdata, "testdata/valid/implicit_index") + _, err := ss.CountRules(context.TODO(), "", "") + require.NoError(t, err) +} - // wait for update to apply - <-notify +func TestGetSegment(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) - // run FS without index suite against current store - suite.Run(t, &FSWithoutIndexSuite{store: store}) + storeMock.On("GetSegment", mock.Anything, flipt.DefaultNamespace, "").Return(&flipt.Segment{}, nil) - // shutdown store - require.NoError(t, store.Close()) + _, err := ss.GetSegment(context.TODO(), "", "") + require.NoError(t, err) } -type source struct { - get *StoreSnapshot - ch chan *StoreSnapshot +func TestListSegments(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("ListSegments", mock.Anything, flipt.DefaultNamespace, mock.Anything).Return(storage.ResultSet[*flipt.Segment]{}, nil) + + _, err := ss.ListSegments(context.TODO(), "") + require.NoError(t, err) } -func (s source) String() string { - return "test" +func TestCountSegments(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("CountSegments", mock.Anything, flipt.DefaultNamespace).Return(uint64(0), nil) + + _, err := ss.CountSegments(context.TODO(), "") + require.NoError(t, err) } -// Get builds a single instance of an *StoreSnapshot -func (s source) Get(context.Context) (*StoreSnapshot, error) { - return s.get, nil +func TestGetRollout(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("GetRollout", mock.Anything, flipt.DefaultNamespace, "").Return(&flipt.Rollout{}, nil) + + _, err := ss.GetRollout(context.TODO(), "", "") + require.NoError(t, err) } -// Subscribe feeds implementations of *StoreSnapshot onto the provided channel. -// It should block until the provided context is cancelled (it will be called in a goroutine). -// It should close the provided channel before it returns. -func (s source) Subscribe(ctx context.Context, ch chan<- *StoreSnapshot) { - defer close(ch) +func TestListRollouts(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) - for { - select { - case <-ctx.Done(): - return - case snap := <-s.ch: - ch <- snap - } - } + storeMock.On("ListRollouts", mock.Anything, flipt.DefaultNamespace, "", mock.Anything).Return(storage.ResultSet[*flipt.Rollout]{}, nil) + + _, err := ss.ListRollouts(context.TODO(), "", "") + require.NoError(t, err) +} + +func TestCountRollouts(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("CountRollouts", mock.Anything, flipt.DefaultNamespace, "").Return(uint64(0), nil) + + _, err := ss.CountRollouts(context.TODO(), "", "") + require.NoError(t, err) +} + +func TestGetNamespace(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("GetNamespace", mock.Anything, flipt.DefaultNamespace).Return(&flipt.Namespace{}, nil) + + _, err := ss.GetNamespace(context.TODO(), "") + require.NoError(t, err) +} + +func TestListNamespaces(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("ListNamespaces", mock.Anything, mock.Anything).Return(storage.ResultSet[*flipt.Namespace]{}, nil) + + _, err := ss.ListNamespaces(context.TODO()) + require.NoError(t, err) +} + +func TestCountNamespaces(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("CountNamespaces", mock.Anything).Return(uint64(0), nil) + + _, err := ss.CountNamespaces(context.TODO()) + require.NoError(t, err) } -func mustSub(t *testing.T, f fs.FS, dir string) *StoreSnapshot { - t.Helper() - var err error - f, err = fs.Sub(f, dir) +func TestGetEvaluationRules(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("GetEvaluationRules", mock.Anything, flipt.DefaultNamespace, "").Return([]*storage.EvaluationRule{}, nil) + + _, err := ss.GetEvaluationRules(context.TODO(), "", "") + require.NoError(t, err) +} + +func TestGetEvaluationDistributions(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("GetEvaluationDistributions", mock.Anything, "").Return([]*storage.EvaluationDistribution{}, nil) + + _, err := ss.GetEvaluationDistributions(context.TODO(), "") require.NoError(t, err) +} + +func TestGetEvaluationRollouts(t *testing.T) { + storeMock := newSnapshotStoreMock() + ss := NewStore(storeMock) + + storeMock.On("GetEvaluationRollouts", mock.Anything, flipt.DefaultNamespace, "").Return([]*storage.EvaluationRollout{}, nil) - snap, err := SnapshotFromFS(zaptest.NewLogger(t), f) + _, err := ss.GetEvaluationRollouts(context.TODO(), "", "") require.NoError(t, err) - return snap +} + +type snapshotStoreMock struct { + *common.StoreMock +} + +func newSnapshotStoreMock() snapshotStoreMock { + return snapshotStoreMock{ + StoreMock: &common.StoreMock{}, + } +} + +// View accepts a function which takes a *StoreSnapshot. +// The SnapshotStore will supply a snapshot which is valid +// for the lifetime of the provided function call. +func (s snapshotStoreMock) View(fn func(storage.ReadOnlyStore) error) error { + return fn(s.StoreMock) +} + +func (s snapshotStoreMock) String() string { + return "mock" } diff --git a/internal/storage/fs/sync.go b/internal/storage/fs/sync.go deleted file mode 100644 index 459e26466e..0000000000 --- a/internal/storage/fs/sync.go +++ /dev/null @@ -1,221 +0,0 @@ -package fs - -import ( - "context" - "sync" - - "go.flipt.io/flipt/internal/storage" - "go.flipt.io/flipt/rpc/flipt" -) - -var _ storage.Store = (*syncedStore)(nil) - -// syncedStore embeds a storeSnapshot and wraps the Store methods with a read-write mutex -// to synchronize reads with swapping out the storeSnapshot. -type syncedStore struct { - storage.Store - - mu sync.RWMutex -} - -func (s *syncedStore) GetFlag(ctx context.Context, namespaceKey string, key string) (*flipt.Flag, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.GetFlag(ctx, namespaceKey, key) -} - -func (s *syncedStore) ListFlags(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Flag], error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.ListFlags(ctx, namespaceKey, opts...) -} - -func (s *syncedStore) CountFlags(ctx context.Context, namespaceKey string) (uint64, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.CountFlags(ctx, namespaceKey) -} - -func (s *syncedStore) GetRule(ctx context.Context, namespaceKey string, id string) (*flipt.Rule, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.GetRule(ctx, namespaceKey, id) -} - -func (s *syncedStore) ListRules(ctx context.Context, namespaceKey string, flagKey string, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Rule], error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.ListRules(ctx, namespaceKey, flagKey, opts...) -} - -func (s *syncedStore) CountRules(ctx context.Context, namespaceKey, flagKey string) (uint64, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.CountRules(ctx, namespaceKey, flagKey) -} - -func (s *syncedStore) GetSegment(ctx context.Context, namespaceKey string, key string) (*flipt.Segment, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.GetSegment(ctx, namespaceKey, key) -} - -func (s *syncedStore) ListSegments(ctx context.Context, namespaceKey string, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Segment], error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.ListSegments(ctx, namespaceKey, opts...) -} - -func (s *syncedStore) CountSegments(ctx context.Context, namespaceKey string) (uint64, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.CountSegments(ctx, namespaceKey) -} - -func (s *syncedStore) GetEvaluationRules(ctx context.Context, namespaceKey string, flagKey string) ([]*storage.EvaluationRule, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.GetEvaluationRules(ctx, namespaceKey, flagKey) -} - -func (s *syncedStore) GetEvaluationDistributions(ctx context.Context, ruleID string) ([]*storage.EvaluationDistribution, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - return s.Store.GetEvaluationDistributions(ctx, ruleID) -} - -func (s *syncedStore) GetEvaluationRollouts(ctx context.Context, namespaceKey, flagKey string) ([]*storage.EvaluationRollout, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.GetEvaluationRollouts(ctx, namespaceKey, flagKey) -} - -func (s *syncedStore) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if key == "" { - key = flipt.DefaultNamespace - } - - return s.Store.GetNamespace(ctx, key) -} - -func (s *syncedStore) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { - s.mu.RLock() - defer s.mu.RUnlock() - - return s.Store.ListNamespaces(ctx, opts...) -} - -func (s *syncedStore) CountNamespaces(ctx context.Context) (uint64, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - return s.Store.CountNamespaces(ctx) -} - -func (s *syncedStore) GetRollout(ctx context.Context, namespaceKey, id string) (*flipt.Rollout, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.GetRollout(ctx, namespaceKey, id) -} - -func (s *syncedStore) ListRollouts(ctx context.Context, namespaceKey, flagKey string, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Rollout], error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.ListRollouts(ctx, namespaceKey, flagKey, opts...) -} - -func (s *syncedStore) CountRollouts(ctx context.Context, namespaceKey, flagKey string) (uint64, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - if namespaceKey == "" { - namespaceKey = flipt.DefaultNamespace - } - - return s.Store.CountRollouts(ctx, namespaceKey, flagKey) -} - -func (s *syncedStore) CreateRollout(ctx context.Context, r *flipt.CreateRolloutRequest) (*flipt.Rollout, error) { - return nil, ErrNotImplemented -} - -func (s *syncedStore) UpdateRollout(ctx context.Context, r *flipt.UpdateRolloutRequest) (*flipt.Rollout, error) { - return nil, ErrNotImplemented -} - -func (s *syncedStore) DeleteRollout(ctx context.Context, r *flipt.DeleteRolloutRequest) error { - return ErrNotImplemented -} - -func (s *syncedStore) OrderRollouts(ctx context.Context, r *flipt.OrderRolloutsRequest) error { - return ErrNotImplemented -} diff --git a/internal/storage/fs/sync_test.go b/internal/storage/fs/sync_test.go deleted file mode 100644 index 3ee3617975..0000000000 --- a/internal/storage/fs/sync_test.go +++ /dev/null @@ -1,228 +0,0 @@ -package fs - -import ( - "context" - "testing" - - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "go.flipt.io/flipt/internal/common" - "go.flipt.io/flipt/internal/storage" - "go.flipt.io/flipt/rpc/flipt" -) - -func TestGetFlag(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetFlag", mock.Anything, flipt.DefaultNamespace, "foo").Return(&flipt.Flag{}, nil) - - _, err := ss.GetFlag(context.TODO(), "", "foo") - require.NoError(t, err) -} - -func TestListFlags(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("ListFlags", mock.Anything, flipt.DefaultNamespace, mock.Anything).Return(storage.ResultSet[*flipt.Flag]{}, nil) - - _, err := ss.ListFlags(context.TODO(), "") - require.NoError(t, err) -} - -func TestCountFlags(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("CountFlags", mock.Anything, flipt.DefaultNamespace).Return(uint64(0), nil) - - _, err := ss.CountFlags(context.TODO(), "") - require.NoError(t, err) -} - -func TestGetRule(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetRule", mock.Anything, flipt.DefaultNamespace, "").Return(&flipt.Rule{}, nil) - - _, err := ss.GetRule(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestListRules(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("ListRules", mock.Anything, flipt.DefaultNamespace, "", mock.Anything).Return(storage.ResultSet[*flipt.Rule]{}, nil) - - _, err := ss.ListRules(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestCountRules(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("CountRules", mock.Anything, flipt.DefaultNamespace, "").Return(uint64(0), nil) - - _, err := ss.CountRules(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestGetSegment(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetSegment", mock.Anything, flipt.DefaultNamespace, "").Return(&flipt.Segment{}, nil) - - _, err := ss.GetSegment(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestListSegments(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("ListSegments", mock.Anything, flipt.DefaultNamespace, mock.Anything).Return(storage.ResultSet[*flipt.Segment]{}, nil) - - _, err := ss.ListSegments(context.TODO(), "") - require.NoError(t, err) -} - -func TestCountSegments(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("CountSegments", mock.Anything, flipt.DefaultNamespace).Return(uint64(0), nil) - - _, err := ss.CountSegments(context.TODO(), "") - require.NoError(t, err) -} - -func TestGetRollout(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetRollout", mock.Anything, flipt.DefaultNamespace, "").Return(&flipt.Rollout{}, nil) - - _, err := ss.GetRollout(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestListRollouts(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("ListRollouts", mock.Anything, flipt.DefaultNamespace, "", mock.Anything).Return(storage.ResultSet[*flipt.Rollout]{}, nil) - - _, err := ss.ListRollouts(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestCountRollouts(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("CountRollouts", mock.Anything, flipt.DefaultNamespace, "").Return(uint64(0), nil) - - _, err := ss.CountRollouts(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestGetNamespace(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetNamespace", mock.Anything, flipt.DefaultNamespace).Return(&flipt.Namespace{}, nil) - - _, err := ss.GetNamespace(context.TODO(), "") - require.NoError(t, err) -} - -func TestListNamespaces(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("ListNamespaces", mock.Anything, mock.Anything).Return(storage.ResultSet[*flipt.Namespace]{}, nil) - - _, err := ss.ListNamespaces(context.TODO()) - require.NoError(t, err) -} - -func TestCountNamespaces(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("CountNamespaces", mock.Anything).Return(uint64(0), nil) - - _, err := ss.CountNamespaces(context.TODO()) - require.NoError(t, err) -} - -func TestGetEvaluationRules(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetEvaluationRules", mock.Anything, flipt.DefaultNamespace, "").Return([]*storage.EvaluationRule{}, nil) - - _, err := ss.GetEvaluationRules(context.TODO(), "", "") - require.NoError(t, err) -} - -func TestGetEvaluationDistributions(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetEvaluationDistributions", mock.Anything, "").Return([]*storage.EvaluationDistribution{}, nil) - - _, err := ss.GetEvaluationDistributions(context.TODO(), "") - require.NoError(t, err) -} - -func TestGetEvaluationRollouts(t *testing.T) { - storeMock := &common.StoreMock{} - ss := &syncedStore{ - Store: storeMock, - } - - storeMock.On("GetEvaluationRollouts", mock.Anything, flipt.DefaultNamespace, "").Return([]*storage.EvaluationRollout{}, nil) - - _, err := ss.GetEvaluationRollouts(context.TODO(), "", "") - require.NoError(t, err) -} diff --git a/internal/storage/storage.go b/internal/storage/storage.go index 0f7b5441bf..e18d0c7aac 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -151,6 +151,19 @@ func WithOrder(order Order) QueryOption { } } +// ReadOnlyStore is a storage implementation which only supports +// reading the various types of state configuring within Flipt +type ReadOnlyStore interface { + ReadOnlyNamespaceStore + ReadOnlyFlagStore + ReadOnlySegmentStore + ReadOnlyRuleStore + ReadOnlyRolloutStore + EvaluationStore + fmt.Stringer +} + +// Store supports reading and writing all the resources within Flipt type Store interface { NamespaceStore FlagStore @@ -177,21 +190,31 @@ type EvaluationStore interface { GetEvaluationRollouts(ctx context.Context, namespaceKey, flagKey string) ([]*EvaluationRollout, error) } -// NamespaceStore stores and retrieves namespaces -type NamespaceStore interface { +// ReadOnlyNamespaceStore support retrieval of namespaces only +type ReadOnlyNamespaceStore interface { GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) ListNamespaces(ctx context.Context, opts ...QueryOption) (ResultSet[*flipt.Namespace], error) CountNamespaces(ctx context.Context) (uint64, error) +} + +// NamespaceStore stores and retrieves namespaces +type NamespaceStore interface { + ReadOnlyNamespaceStore CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error } -// FlagStore stores and retrieves flags and variants -type FlagStore interface { +// ReadOnlyFlagStore supports retrieval of flags +type ReadOnlyFlagStore interface { GetFlag(ctx context.Context, namespaceKey, key string) (*flipt.Flag, error) ListFlags(ctx context.Context, namespaceKey string, opts ...QueryOption) (ResultSet[*flipt.Flag], error) CountFlags(ctx context.Context, namespaceKey string) (uint64, error) +} + +// FlagStore stores and retrieves flags and variants +type FlagStore interface { + ReadOnlyFlagStore CreateFlag(ctx context.Context, r *flipt.CreateFlagRequest) (*flipt.Flag, error) UpdateFlag(ctx context.Context, r *flipt.UpdateFlagRequest) (*flipt.Flag, error) DeleteFlag(ctx context.Context, r *flipt.DeleteFlagRequest) error @@ -200,11 +223,16 @@ type FlagStore interface { DeleteVariant(ctx context.Context, r *flipt.DeleteVariantRequest) error } -// SegmentStore stores and retrieves segments and constraints -type SegmentStore interface { +// ReadOnlySegmentStore supports retrieval of segments and constraints +type ReadOnlySegmentStore interface { GetSegment(ctx context.Context, namespaceKey, key string) (*flipt.Segment, error) ListSegments(ctx context.Context, namespaceKey string, opts ...QueryOption) (ResultSet[*flipt.Segment], error) CountSegments(ctx context.Context, namespaceKey string) (uint64, error) +} + +// SegmentStore stores and retrieves segments and constraints +type SegmentStore interface { + ReadOnlySegmentStore CreateSegment(ctx context.Context, r *flipt.CreateSegmentRequest) (*flipt.Segment, error) UpdateSegment(ctx context.Context, r *flipt.UpdateSegmentRequest) (*flipt.Segment, error) DeleteSegment(ctx context.Context, r *flipt.DeleteSegmentRequest) error @@ -213,11 +241,16 @@ type SegmentStore interface { DeleteConstraint(ctx context.Context, r *flipt.DeleteConstraintRequest) error } -// RuleStore stores and retrieves rules and distributions -type RuleStore interface { +// ReadOnlyRuleStore supports retrieval of rules and distributions +type ReadOnlyRuleStore interface { GetRule(ctx context.Context, namespaceKey, id string) (*flipt.Rule, error) ListRules(ctx context.Context, namespaceKey, flagKey string, opts ...QueryOption) (ResultSet[*flipt.Rule], error) CountRules(ctx context.Context, namespaceKey, flagKey string) (uint64, error) +} + +// RuleStore stores and retrieves rules and distributions +type RuleStore interface { + ReadOnlyRuleStore CreateRule(ctx context.Context, r *flipt.CreateRuleRequest) (*flipt.Rule, error) UpdateRule(ctx context.Context, r *flipt.UpdateRuleRequest) (*flipt.Rule, error) DeleteRule(ctx context.Context, r *flipt.DeleteRuleRequest) error @@ -227,10 +260,16 @@ type RuleStore interface { DeleteDistribution(ctx context.Context, r *flipt.DeleteDistributionRequest) error } -type RolloutStore interface { +// ReadOnlyRolloutStore supports retrieval of rollouts +type ReadOnlyRolloutStore interface { GetRollout(ctx context.Context, namespaceKey, id string) (*flipt.Rollout, error) ListRollouts(ctx context.Context, namespaceKey, flagKey string, opts ...QueryOption) (ResultSet[*flipt.Rollout], error) CountRollouts(ctx context.Context, namespaceKey, flagKey string) (uint64, error) +} + +// RolloutStore supports storing and retrieving rollouts +type RolloutStore interface { + ReadOnlyRolloutStore CreateRollout(ctx context.Context, r *flipt.CreateRolloutRequest) (*flipt.Rollout, error) UpdateRollout(ctx context.Context, r *flipt.UpdateRolloutRequest) (*flipt.Rollout, error) DeleteRollout(ctx context.Context, r *flipt.DeleteRolloutRequest) error From b7d0b42a166c60d42549ecdcb0bcf931ecbac5e1 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Fri, 15 Dec 2023 13:15:27 -0500 Subject: [PATCH 30/31] chore: Devenv (#2542) * chore: add deploy to railway btn * chore(wip): support devenv * chore: devenv support * chore: update contributing guide/readme * chore: update roadmap link --- .gitignore | 11 ++++ CONTRIBUTING.md | 27 ++++++++- DEVELOPMENT.md | 13 ++++ README.md | 8 ++- devenv.lock | 156 ++++++++++++++++++++++++++++++++++++++++++++++++ devenv.nix | 27 +++++++++ devenv.yaml | 3 + 7 files changed, 240 insertions(+), 5 deletions(-) create mode 100644 devenv.lock create mode 100644 devenv.nix create mode 100644 devenv.yaml diff --git a/.gitignore b/.gitignore index 5d34db7b73..07b7013856 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,14 @@ build/hack/out/ examples/cockroachdb/data playwright-report/ screenshots/ + +# Devenv +.devenv* +devenv.local.nix + +# direnv +.direnv + +# pre-commit +.pre-commit-config.yaml + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b49f5ab086..9e7b74b1eb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,13 +2,34 @@ Checkout our [Development](DEVELOPMENT.md) guide for more information on how to get started developing Flipt. +## What To Work On + +Check out our [public roadmap](https://github.com/orgs/flipt-io/projects/4) to see what we're working on and where you can help. + +Not sure how to get started? You can: + +- [Book a pairing session/code walkthrough](https://calendly.com/flipt-mark/30) with one of our teammates! +- Join our [Discord](https://www.flipt.io/discord), and ask any questions there + +- Dive into any of the open issues, here are some examples: + - [Good First Issues](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) + - [Backend](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Ago) + - [Frontend](https://github.com/flipt-io/flipt/issues?q=is%3Aopen+is%3Aissue+label%3Aui) + +- Looking for issues by effort? We've got you covered: + - [XS](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Axs) + - [Small](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Asm) + - [Medium](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Amd) + - [Large](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Alg) + - [XL](https://github.com/flipt-io/flipt/issues?q=is%3Aissue+is%3Aopen+label%3Axl) + ## Issues Let us know how we can help! -* Include any **stack traces** with your error -* List versions you are using: Flipt, Go, OS, etc. -* List the contents of your Flipt configuration file. (ex: default.yml) +- Include any **stack traces** with your error +- List versions you are using: Flipt, Go, OS, etc. +- List the contents of your Flipt configuration file. (ex: default.yml) ## Code diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 691cebdc78..440513cdd5 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -2,6 +2,9 @@ The following are instructions for setting up your local machine for Flipt development. For info on using VSCode Remote Containers / GitHub Codespaces, see [#cdes](#cdes) below. +> [!TIP] +> Try our new [devenv](#devenv) solution to quickly get setup developing Flipt! + Also check out our [Contributing](CONTRIBUTING.md) guide for more information on how to get changes merged into the project. ## Requirements @@ -129,3 +132,13 @@ For VSCode Remote Containers (devcontainers), make sure you have [Docker](https: If you have access to [GitHub Codespaces](https://github.com/features/codespaces), simply open Flipt in a codespaces from the `Code` tab in the repo on GitHub or click the button below: [![Open in Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=flipt-io/flipt) + +## devenv + +[devenv](devenv.sh) is a solution that creates fast, declarative, reproducible, and composable developer environments using Nix. + +To use it for developing Flipt, you'll first need to install it. See the devenv [getting started](https://devenv.sh/getting-started/) guide for more information. + +Once you have devenv installed, you can run `devenv up` from the root of this repository to start a development environment. + +This will start a Docker container with the Flipt server running on port `8080` and the UI development server running on port `5173`. diff --git a/README.md b/README.md index 9b92da7b06..b88b39a48a 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Discord - + Public Roadmap @@ -48,6 +48,7 @@ WebsiteBlogFeedback • + ContributingDiscord @@ -116,7 +117,7 @@ We would love your help! Before submitting a PR, please read over the [Contribut No contribution is too small, whether it be bug reports/fixes, feature requests, documentation updates, or anything else that can help drive the project forward. -Check out our [public roadmap](https://volta.net/embed/eyJzdGF0dXNlcyI6WyJ0cmlhZ2UiLCJiYWNrbG9nIiwidG9kbyIsImluX3Byb2dyZXNzIiwiaW5fcmV2aWV3IiwiZG9uZSIsInJlbGVhc2VkIiwiY2FuY2VsbGVkIl0sImZpbHRlcnMiOnt9LCJvd25lciI6ImZsaXB0LWlvIiwibmFtZSI6ImZsaXB0In0=) to see what we're working on and where you can help. +Check out our [public roadmap](https://github.com/orgs/flipt-io/projects/4) to see what we're working on and where you can help. Not sure how to get started? You can: @@ -158,6 +159,9 @@ Try the latest version of Flipt for yourself. Deploy to Render + + Deploy to Railway + ### Sandbox diff --git a/devenv.lock b/devenv.lock new file mode 100644 index 0000000000..13d1a46e4e --- /dev/null +++ b/devenv.lock @@ -0,0 +1,156 @@ +{ + "nodes": { + "devenv": { + "locked": { + "dir": "src/modules", + "lastModified": 1702549996, + "narHash": "sha256-mEN+8gjWUXRxBCcixeth+jlDNuzxbpFwZNOEc4K22vw=", + "owner": "cachix", + "repo": "devenv", + "rev": "e681a99ffe2d2882f413a5d771129223c838ddce", + "type": "github" + }, + "original": { + "dir": "src/modules", + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1685518550, + "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1702539185, + "narHash": "sha256-KnIRG5NMdLIpEkZTnN5zovNYc0hhXjAgv6pfd5Z4c7U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "aa9d4729cbc99dabacb50e3994dcefb3ea0f7447", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1685801374, + "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "gitignore": "gitignore", + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1702456155, + "narHash": "sha256-I2XhXGAecdGlqi6hPWYT83AQtMgL+aa3ulA85RAEgOk=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "007a45d064c1c32d04e1b8a0de5ef00984c419bc", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000000..aa142d833c --- /dev/null +++ b/devenv.nix @@ -0,0 +1,27 @@ +{ pkgs, ... }: + +{ + # https://devenv.sh/basics/ + # env.GREET = "devenv"; + + # https://devenv.sh/packages/ + packages = [ pkgs.git pkgs.mage pkgs.gcc pkgs.sqlite pkgs.nodejs ]; + + # https://devenv.sh/scripts/ + scripts.hello.exec = "echo 'hello from Flipt!'"; + + # https://devenv.sh/languages/ + languages.go.enable = true; + languages.typescript.enable = true; + + # https://devenv.sh/pre-commit-hooks/ + # pre-commit.hooks.shellcheck.enable = true; + + # https://devenv.sh/processes/ + processes = { + backend.exec = "mage dev"; + frontend.exec = "mage ui:dev"; + }; + + # See full reference at https://devenv.sh/reference/options/ +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000000..c7cb5cedad --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,3 @@ +inputs: + nixpkgs: + url: github:NixOS/nixpkgs/nixpkgs-unstable From ca1307b3da742dffd16728895738fb75eff8b4cf Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Sun, 17 Dec 2023 14:54:05 +0200 Subject: [PATCH 31/31] fix: resolved issues with go-git 5.11.0 (#2543) --- build/internal/cmd/gitea/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/internal/cmd/gitea/main.go b/build/internal/cmd/gitea/main.go index 3202082b96..e7834fe13f 100644 --- a/build/internal/cmd/gitea/main.go +++ b/build/internal/cmd/gitea/main.go @@ -68,7 +68,7 @@ func main() { fmt.Fprintln(os.Stderr, "Creating Repository from", *testdataDir) repo, err := git.InitWithOptions(memory.NewStorage(), workdir, git.InitOptions{ - DefaultBranch: "main", + DefaultBranch: "refs/heads/main", }) fatalOnError(err) @@ -126,7 +126,7 @@ func main() { repo.Push(&git.PushOptions{ Auth: &githttp.BasicAuth{Username: "root", Password: "password"}, RemoteName: "origin", - RefSpecs: []config.RefSpec{"main:refs/heads/main"}, + RefSpecs: []config.RefSpec{"refs/heads/main:refs/heads/main"}, }) fmt.Fprintln(os.Stderr, "Pushed")