diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ba861dad..6dedfcf9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,13 +12,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - #password: ${{ secrets.GITHUB_TOKEN }} - password: ${{ secrets.GH_CR_TOKEN }} - name: Run plugin run: | wget https://github.com/interTwin-eu/interlink-docker-plugin/releases/download/0.0.22-no-gpu/docker-plugin_Linux_x86_64 -O docker-plugin \ @@ -30,10 +23,11 @@ jobs: id: get_repo_owner run: echo ::set-output name=repo_owner::$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]') - name: Integration Test - uses: dagger/dagger-for-github@v5 + uses: dagger/dagger-for-github@v6 with: workdir: ci verb: call - args: -s build-images --source-folder ../ --virtual-kubelet-ref ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/virtual-kubelet-inttw:$GITHUB_SHA --interlink-ref ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/interlink:$GITHUB_SHA new-interlink --manifests $PWD/manifests --plugin-local-service tcp://localhost:4000 test stdout + args: -s --name my-test build-images --source-folder ../ new-interlink --plugin-endpoint tcp://localhost:4000 --manifests ./manifests test stdout cloud-token: ${{ secrets.DAGGER_CLOUD_TOKEN }} - #dagger-flags: -d + version: "0.11.9" + dagger-flags: -d diff --git a/ci/dagger.json b/ci/dagger.json index 7f6ad735..927f0f5c 100644 --- a/ci/dagger.json +++ b/ci/dagger.json @@ -1,6 +1,12 @@ { "name": "interlink", "sdk": "go", + "dependencies": [ + { + "name": "k3s", + "source": "github.com/marcosnils/daggerverse/k3s@e0bd6b9f5519c49db4b6eb0689927214720976f9" + } + ], "source": ".", "engineVersion": "v0.11.9" } diff --git a/ci/go.mod b/ci/go.mod index d8db8a65..14facf9f 100644 --- a/ci/go.mod +++ b/ci/go.mod @@ -7,10 +7,15 @@ require ( github.com/Khan/genqlient v0.7.0 github.com/vektah/gqlparser/v2 v2.5.11 go.opentelemetry.io/otel v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 + go.opentelemetry.io/otel/log v0.3.0 go.opentelemetry.io/otel/sdk v1.27.0 + go.opentelemetry.io/otel/sdk/log v0.3.0 go.opentelemetry.io/otel/trace v1.27.0 + go.opentelemetry.io/proto/otlp v1.3.1 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa golang.org/x/sync v0.7.0 google.golang.org/grpc v1.64.0 @@ -24,13 +29,8 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/sosodev/duration v1.2.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/log v0.3.0 go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.3.0 - go.opentelemetry.io/proto/otlp v1.3.1 golang.org/x/net v0.25.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.15.0 // indirect diff --git a/ci/k8s.go b/ci/k8s.go deleted file mode 100644 index 9caf4320..00000000 --- a/ci/k8s.go +++ /dev/null @@ -1,291 +0,0 @@ -package main - -import ( - "context" - "fmt" - "strings" - "time" -) - -// entrypoint to setup cgroup nesting since k3s only does it -// when running as PID 1. This doesn't happen in Dagger given that we're using -// our custom shim -const entrypoint = `#!/bin/sh - -set -o errexit -set -o nounset - -######################################################################################################################################### -# DISCLAIMER # -# Copied from https://github.com/moby/moby/blob/ed89041433a031cafc0a0f19cfe573c31688d377/hack/dind#L28-L37 # -# Permission granted by Akihiro Suda (https://github.com/k3d-io/k3d/issues/493#issuecomment-827405962) # -# Moby License Apache 2.0: https://github.com/moby/moby/blob/ed89041433a031cafc0a0f19cfe573c31688d377/LICENSE # -######################################################################################################################################### -if [ -f /sys/fs/cgroup/cgroup.controllers ]; then - echo "[$(date -Iseconds)] [CgroupV2 Fix] Evacuating Root Cgroup ..." - # move the processes from the root group to the /init group, - # otherwise writing subtree_control fails with EBUSY. - mkdir -p /sys/fs/cgroup/init - busybox xargs -rn1 < /sys/fs/cgroup/cgroup.procs > /sys/fs/cgroup/init/cgroup.procs || : - # enable controllers - sed -e 's/ / +/g' -e 's/^/+/' <"/sys/fs/cgroup/cgroup.controllers" >"/sys/fs/cgroup/cgroup.subtree_control" - echo "[$(date -Iseconds)] [CgroupV2 Fix] Done" -fi - -exec "$@" -` - -func NewK8sInstance(ctx context.Context, pluginService *Service) *K8sInstance { - return &K8sInstance{ - KContainer: nil, - PluginService: pluginService, - Registry: nil, - ConfigCache: dag.CacheVolume("k3s_config"), - ContainersCache: dag.CacheVolume("k3s_containers"), - } -} - -type K8sInstance struct { - KContainer *Container - K3s *Container - Registry *Service - PluginService *Service - ConfigCache *CacheVolume - ContainersCache *CacheVolume -} - -func (k *K8sInstance) start( - ctx context.Context, - manifests *Directory, - // +optional - bufferVK string, - // +optional - bufferIL string, - // +optional - kubeconfig *File, - // +optional - localCluster *Service) error { - - if kubeconfig == nil { - // create k3s service container - k.K3s = dag.Pipeline("k3s init").Container(). - From("rancher/k3s"). - WithNewFile("/usr/bin/entrypoint.sh", ContainerWithNewFileOpts{ - Contents: entrypoint, - Permissions: 0o755, - }). - WithServiceBinding("plugin", k.PluginService). - WithEntrypoint([]string{"entrypoint.sh"}). - WithMountedCache("/etc/rancher/k3s", k.ConfigCache). - WithMountedTemp("/etc/lib/cni"). - WithMountedCache("/etc/lib/containers", k.ContainersCache). - WithMountedTemp("/var/lib/kubelet"). - WithMountedTemp("/var/lib/rancher/k3s"). - WithMountedTemp("/var/log"). - WithExec([]string{"sh", "-c", "k3s server --bind-address $(ip route | grep src | awk '{print $NF}') --disable traefik --disable metrics-server --egress-selector-mode=disabled"}, ContainerWithExecOpts{InsecureRootCapabilities: true}). - WithExposedPort(6443) - - k.KContainer = dag.Container(). - From("bitnami/kubectl"). - WithUser("root"). - WithExec([]string{"apt", "update"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"apt", "install", "-y", "curl", "python3", "python3-pip", "python3-venv", "git"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithUser("1001"). - WithMountedCache("/cache/k3s", k.ConfigCache). - WithMountedDirectory("/manifests", manifests). - WithServiceBinding("k3s", k.K3s.AsService()). - WithEnvVariable("CACHE", time.Now().String()). - WithUser("root"). - WithExec([]string{"cp", "/cache/k3s/k3s.yaml", "/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"chown", "1001:0", "/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithUser("1001"). - WithEntrypoint([]string{"sh", "-c"}) - - } else if localCluster != nil { - - // k.KContainer, err = dag.Container().From("ubuntu"). - // WithServiceBinding("localhost", localCluster). - // WithMountedDirectory("/manifests", manifests). - // WithExec([]string{"apt", "update"}, ContainerWithExecOpts{SkipEntrypoint: true}). - // WithExec([]string{"apt", "install", "-y", "curl"}, ContainerWithExecOpts{SkipEntrypoint: true}). - // WithExec([]string{"curl", "-vvv", "localhost:59127"}).Sync(k.Ctx) - // if err != nil { - // return err - // } - - fileName, _ := kubeconfig.Name(ctx) - - k.KContainer = dag.Container(). - From("bitnami/kubectl"). - WithUser("root"). - WithExec([]string{"apt", "update"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"apt", "install", "-y", "curl", "python3", "python3-pip", "python3-venv", "git"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithUser("1001"). - WithDirectory("/manifests", manifests). - WithServiceBinding("minikube", localCluster). - WithEnvVariable("CACHE", time.Now().String()). - WithUser("root"). - WithFile(fmt.Sprintf("/src/%s", fileName), kubeconfig). - WithExec([]string{"cp", fmt.Sprintf("/src/%s", fileName), "/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"chown", "1001:0", "/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithUser("1001"). - WithEntrypoint([]string{"sh", "-c"}) - } else if localCluster == nil { - - fileName, _ := kubeconfig.Name(ctx) - k.KContainer = dag.Container(). - From("bitnami/kubectl"). - WithUser("root"). - WithExec([]string{"apt", "update"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"apt", "install", "-y", "curl", "python3", "python3-pip", "python3-venv", "git"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithUser("1001"). - WithDirectory("/manifests", manifests). - WithEnvVariable("CACHE", time.Now().String()). - WithUser("root"). - WithFile(fmt.Sprintf("/src/%s", fileName), kubeconfig). - WithExec([]string{"cp", fmt.Sprintf("/src/%s", fileName), "/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"chown", "1001:0", "/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithUser("1001"). - WithEntrypoint([]string{"sh", "-c"}) - - } - - if bufferIL != "" { - k.KContainer = k.KContainer. - WithNewFile("/manifests/virtual-kubelet-merge.yaml", ContainerWithNewFileOpts{ - Contents: bufferVK, - Permissions: 0o755, - }) - } - if bufferIL != "" { - k.KContainer = k.KContainer. - WithNewFile("/manifests/interlink-merge.yaml", ContainerWithNewFileOpts{ - Contents: bufferIL, - Permissions: 0o755, - }) - } - return nil -} - -func (k *K8sInstance) kubectl(ctx context.Context, command string) (string, error) { - return k.exec(ctx, "kubectl", fmt.Sprintf("kubectl %v", command)) -} - -func (k *K8sInstance) exec(ctx context.Context, name, command string) (string, error) { - return k.KContainer.Pipeline(name).Pipeline(command). - WithEnvVariable("CACHE", time.Now().String()). - WithExec([]string{command}). - Stdout(ctx) -} - -func (k *K8sInstance) waitForNodes(ctx context.Context) (err error) { - maxRetries := 10 - retryBackoff := 30 * time.Second - for i := 0; i < maxRetries; i++ { - kubectlGetNodes, err := k.kubectl(ctx, "get nodes -o wide") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch nodes: %v", err)) - continue - } - if strings.Contains(kubectlGetNodes, "Ready") { - return nil - } - fmt.Println("waiting for k8s to start:", kubectlGetNodes) - time.Sleep(retryBackoff) - } - return fmt.Errorf("k8s took too long to start") -} - -func (k *K8sInstance) waitForVirtualNodes(ctx context.Context) (err error) { - maxRetries := 10 - retryBackoff := 30 * time.Second - for i := 0; i < maxRetries; i++ { - kubectlGetNodes, err := k.kubectl(ctx, "get nodes -o wide virtual-kubelet") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch nodes: %v", err)) - continue - } - if strings.Contains(kubectlGetNodes, "Ready") { - time.Sleep(60 * time.Second) - return nil - } - fmt.Println("waiting for k8s to start:", kubectlGetNodes) - time.Sleep(retryBackoff) - } - return fmt.Errorf("k8s took too long to start") -} - -func (k *K8sInstance) waitForVirtualKubelet(ctx context.Context) (err error) { - maxRetries := 10 - retryBackoff := 30 * time.Second - for i := 0; i < maxRetries; i++ { - time.Sleep(retryBackoff) - kubectlGetPod, err := k.kubectl(ctx, "get pod -n interlink -l nodeName=virtual-kubelet") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch pod: %v", err)) - continue - } - if strings.Contains(kubectlGetPod, "1/1") || strings.Contains(kubectlGetPod, "2/2") { - return nil - } - fmt.Println("waiting for k8s to start:", kubectlGetPod) - describePod, err := k.kubectl(ctx, "logs -n interlink -l nodeName=virtual-kubelet -c inttw-vk") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch pod description: %v", err)) - continue - } - fmt.Println(describePod) - - } - return fmt.Errorf("k8s took too long to start") -} - -func (k *K8sInstance) waitForInterlink(ctx context.Context) (err error) { - maxRetries := 10 - retryBackoff := 30 * time.Second - for i := 0; i < maxRetries; i++ { - time.Sleep(retryBackoff) - kubectlGetPod, err := k.kubectl(ctx, "get pod -n interlink -l app=interlink") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch pod: %v", err)) - continue - } - if strings.Contains(kubectlGetPod, "1/1") { - return nil - } - fmt.Println("waiting for k8s to start:", kubectlGetPod) - describePod, err := k.kubectl(ctx, "logs -n interlink -l app=interlink") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch pod description: %v", err)) - continue - } - fmt.Println(describePod) - - } - return fmt.Errorf("interlink took too long to start") -} - -func (k *K8sInstance) waitForPlugin(ctx context.Context) (err error) { - maxRetries := 10 - retryBackoff := 30 * time.Second - for i := 0; i < maxRetries; i++ { - time.Sleep(retryBackoff) - kubectlGetPod, err := k.kubectl(ctx, "get pod -n interlink -l app=plugin") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch pod: %v", err)) - continue - } - if strings.Contains(kubectlGetPod, "1/1") { - return nil - } - fmt.Println("waiting for k8s to start:", kubectlGetPod) - describePod, err := k.kubectl(ctx, "logs -n interlink -l app=plugin") - if err != nil { - fmt.Println(fmt.Errorf("could not fetch pod description: %v", err)) - continue - } - fmt.Println(describePod) - - } - return fmt.Errorf("plugin took too long to start") -} diff --git a/ci/main.go b/ci/main.go index 6b63a373..74143371 100644 --- a/ci/main.go +++ b/ci/main.go @@ -1,3 +1,8 @@ +// A module to instantiate and tests interLink components +// +// Visit the interLink documentation for more info: https://intertwin-eu.github.io/interLink/docs/intro/ +// + package main import ( @@ -6,8 +11,7 @@ import ( "fmt" "html/template" "strings" - - "dagger/interlink/internal/dagger" + "time" ) var ( @@ -43,103 +47,101 @@ type patchSchema struct { VirtualKubeletRef string } +// Interlink struct for initialization and internal variables type Interlink struct { - K8s *K8sInstance - Plugin *Container + Name string + Registry *Service + Manifests *Directory VirtualKubeletRef string InterlinkRef string - Manifests *Directory - // TODO: services on NodePort? - //virtualkubelet bool - //interlink bool - //plugin bool - CleanupCluster bool + // +private + Kubectl *Container + // +private + KubeAPIs *Service + // +private + KubeConfig *File + // +private + KubeConfigHost *File } -func (i *Interlink) BuildImages( - ctx context.Context, - // +optional - // +default="ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw" - virtualKubeletRef string, +// New initializes the Dagger module at each call +func New(name string, // +optional - // +default="ghcr.io/intertwin-eu/interlink/interlink" - interlinkRef string, + VirtualKubeletRef string, // +optional - // +default="ghcr.io/intertwin-eu/interlink/plugin-test" - pluginRef string, - sourceFolder *Directory, -) (*Interlink, error) { - - // TODO: get tag - - i.VirtualKubeletRef = virtualKubeletRef - i.InterlinkRef = interlinkRef - - workspace := dag.Container(). - WithDirectory("/src", sourceFolder). - WithWorkdir("/src"). - Directory("/src") + InterlinkRef string, +) *Interlink { - vkVersionSplits := strings.Split(virtualKubeletRef, ":") - - vkVersion := vkVersionSplits[len(vkVersionSplits)-1] - if vkVersion == "" { - return nil, fmt.Errorf("no tag specified on the image for VK") - } - - modulesCache := dag.CacheVolume("go-mod-122") - - _, err := dag.Container(). - WithMountedCache("/go/pkg/mod", modulesCache). - WithMountedCache("/go/build-cache", dag.CacheVolume("go-build-122")). - Build(workspace, dagger.ContainerBuildOpts{ - Dockerfile: "docker/Dockerfile.vk", - BuildArgs: []dagger.BuildArg{ - {"VERSION", vkVersion}, - }, - }). - Publish(ctx, virtualKubeletRef) - if err != nil { - return nil, err + return &Interlink{ + Name: name, + VirtualKubeletRef: VirtualKubeletRef, + InterlinkRef: InterlinkRef, } - - _, err = dag.Container(). - WithMountedCache("/go/pkg/mod", modulesCache). - WithMountedCache("/go/build-cache", dag.CacheVolume("go-build-122")). - Build(workspace, dagger.ContainerBuildOpts{ - Dockerfile: "docker/Dockerfile.interlink", - }). - Publish(ctx, interlinkRef) - if err != nil { - return nil, err - } - - return i, nil } -func (i *Interlink) NewInterlink( +// Setup k8s e interlink components: +// virtual kubelet and interlink API server +func (m *Interlink) NewInterlink( ctx context.Context, manifests *Directory, // +optional kubeconfig *File, // +optional + localRegistry *Service, + // +optional localCluster *Service, // +optional - pluginLocalService *Service, + // +default="dciangot/docker-plugin:v1" + pluginImage string, + // +optional + pluginEndpoint *Service, + // +optional + pluginConfig *File, ) (*Interlink, error) { + if localRegistry != nil { + m.Registry = localRegistry + } + + if pluginEndpoint == nil { + plugin := dag.Container().From(pluginImage). + WithFile("/etc/interlink/InterLinkConfig.yaml", pluginConfig). + WithEnvVariable("INTERLINKCONFIGPATH", "/etc/interlink/InterLinkConfig.yaml"). + WithExec([]string{"bash", "-c", "dockerd --mtu 1450 & /sidecar/docker-sidecar"}, ContainerWithExecOpts{InsecureRootCapabilities: true}). + WithExposedPort(4000) + + pluginEndpoint = plugin.AsService() + } + + //K3s := dag.K3S(m.Name, K3SOpts{Image: "rancher/k3s:v1.28.1-k3s1"}).With(func(k *K3S) *K3S { + K3s := dag.K3S(m.Name).With(func(k *K3S) *K3S { + return k.WithContainer( + k.Container(). + WithEnvVariable("BUST", time.Now().String()). + WithMountedDirectory("/manifests", manifests). + WithExec([]string{"sh", "-c", ` +cat < /etc/rancher/k3s/registries.yaml +mirrors: + "registry:5000": + endpoint: + - "http://registry:5000" +EOF`}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithServiceBinding("registry", m.Registry). + WithServiceBinding("plugin", pluginEndpoint), + ) + }) + + K3s.Server().Start(ctx) + + m.Manifests = manifests + m.KubeAPIs = K3s.Server() + m.KubeConfig = K3s.Config(false) + m.KubeConfigHost = K3s.Config(true) + // create Kustomize patch for images to be used - patch := patchSchema{} - if i.InterlinkRef != "" && i.VirtualKubeletRef != "" { - patch = patchSchema{ - InterLinkRef: i.InterlinkRef, - VirtualKubeletRef: i.VirtualKubeletRef, - } - } else { - patch = patchSchema{ - InterLinkRef: "ghcr.io/intertwin-eu/interlink/interlink", - VirtualKubeletRef: "ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw", - } + patch := patchSchema{ + InterLinkRef: m.InterlinkRef, + VirtualKubeletRef: m.VirtualKubeletRef, } interLinkCompiler, err := template.New("interlink").Parse(interLinkPatch) @@ -166,165 +168,189 @@ func (i *Interlink) NewInterlink( return nil, err } - // use the manifest folder defined in the chain and install components - - if manifests != nil { - i.Manifests = manifests - } - fmt.Println(bufferVK.String()) - if pluginLocalService == nil { - i.K8s = NewK8sInstance(ctx, i.Plugin.AsService()) - if err := i.K8s.start(ctx, i.Manifests, bufferVK.String(), bufferIL.String(), kubeconfig, localCluster); err != nil { - return nil, err - } - } else { - i.K8s = NewK8sInstance(ctx, pluginLocalService) - if err := i.K8s.start(ctx, i.Manifests, bufferVK.String(), bufferIL.String(), kubeconfig, localCluster); err != nil { - return nil, err - } - } + kubectl := dag.Container().From("bitnami/kubectl:1.29.7-debian-12-r3"). + WithUser("root"). + WithExec([]string{"mkdir", "-p", "/opt/user"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithExec([]string{"chown", "-R", "1001:0", "/opt/user"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithExec([]string{"apt", "update"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithExec([]string{"apt", "update"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithExec([]string{"apt", "install", "-y", "curl", "python3", "python3-pip", "python3-venv", "git"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithMountedFile("/.kube/config", m.KubeConfig). + WithExec([]string{"chown", "1001:0", "/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithUser("1001"). + WithDirectory("/manifests", m.Manifests). + WithNewFile("/manifests/virtual-kubelet-merge.yaml", ContainerWithNewFileOpts{ + Contents: bufferVK.String(), + Permissions: 0o755, + }). + WithNewFile("/manifests/interlink-merge.yaml", ContainerWithNewFileOpts{ + Contents: bufferIL.String(), + Permissions: 0o755, + }). + WithEntrypoint([]string{"kubectl"}) - err = i.K8s.waitForNodes(ctx) - if err != nil { - return nil, err - } + m.Kubectl = kubectl - ns, _ := i.K8s.kubectl(ctx, "create ns interlink") + ns, _ := kubectl.WithExec([]string{"create", "ns", "interlink"}).Stdout(ctx) fmt.Println(ns) - sa, err := i.K8s.kubectl(ctx, "apply -f /manifests/service-account.yaml") + sa, err := kubectl.WithExec([]string{"apply", "-f", "/manifests/service-account.yaml"}).Stdout(ctx) if err != nil { return nil, err } fmt.Println(sa) - vkConfig, err := i.K8s.kubectl(ctx, "apply -k /manifests/") + vkConfig, err := kubectl.WithExec([]string{"apply", "-k", "/manifests/"}).Stdout(ctx) if err != nil { return nil, err } fmt.Println(vkConfig) - return i, nil -} - -func (i *Interlink) LoadPlugin(ctx context.Context, config *File) (*Interlink, error) { - - ctr := dag.Container().From("dciangot/docker-plugin:v1"). - WithFile("/etc/interlink/InterLinkConfig.yaml", config). - WithEnvVariable("INTERLINKCONFIGPATH", "/etc/interlink/InterLinkConfig.yaml"). - WithExec([]string{"bash", "-c", "dockerd --mtu 1450 & /sidecar/docker-sidecar"}, ContainerWithExecOpts{InsecureRootCapabilities: true}). - WithExposedPort(4000) - - i.Plugin = ctr - - // pluginConfig, err := i.K8s.kubectl(ctx, "apply -f /manifests/plugin-config.yaml") - // if err != nil { - // return nil, err + return m, nil + //maxRetries := 10 + //retryBackoff := 10 * time.Second + // for i := 0; i < maxRetries; i++ { + // kubectlGetNodes, err := kubectl.WithExec([]string{"get", "nodes", "-o", "wide", "virtual-kubelet"}).Stdout(ctx) + // if err != nil { + // fmt.Println(fmt.Errorf("could not fetch nodes: %v", err)) + // fmt.Println("waiting for k8s to start:", kubectlGetNodes) + // time.Sleep(retryBackoff) + // continue + // } + // if strings.Contains(kubectlGetNodes, " Ready") { + // time.Sleep(30 * time.Second) + // return m, nil + // } + // time.Sleep(retryBackoff) // } - // fmt.Println(pluginConfig) - // - // plugin, err := i.K8s.kubectl(ctx, "apply -f /manifests/plugin.yaml") + // kubectlAll, err := kubectl.WithExec([]string{"logs", "-n", "interlink", "-l", "nodeName=virtual-kubelet"}).Stdout(ctx) // if err != nil { // return nil, err // } - // fmt.Println(plugin) - - return i, nil + // fmt.Println(kubectlAll) + // + // return nil, fmt.Errorf("k8s took too long to start") } -func (i *Interlink) Cleanup(ctx context.Context) error { - - cleanup, err := i.K8s.kubectl(ctx, "delete -f /manifests/") - if err != nil { - return err - } - fmt.Println(cleanup) - - return nil +// Returns the kubeconfig file of the k3s cluster +func (m *Interlink) Config() *File { + return m.KubeConfigHost } -func (i *Interlink) Test( +// Build interLink and virtual kubelet docker images from source +// and publish them in registry service +func (m *Interlink) BuildImages( ctx context.Context, // +optional - manifests *Directory, - // +optional - kubeconfig *File, + // +default="registry:5000/virtual-kubelet-inttw" + virtualKubeletRef string, // +optional - localCluster *Service, + // +default="registry:5000/interlink" + interlinkRef string, // +optional - // +default false - cleanup bool, -) (*Container, error) { + // +default="registry:5000/plugin-test" + pluginRef string, + sourceFolder *Directory, +) (*Interlink, error) { - if manifests != nil { - i.Manifests = manifests - } + // TODO: get tag + m.Registry = dag.Container().From("registry"). + WithExposedPort(5000).AsService() - if err := i.K8s.waitForVirtualKubelet(ctx); err != nil { - return nil, err + m.VirtualKubeletRef = virtualKubeletRef + m.InterlinkRef = interlinkRef + + workspace := dag.Container(). + WithDirectory("/src", sourceFolder). + WithWorkdir("/src"). + Directory("/src") + + vkVersionSplits := strings.Split(virtualKubeletRef, ":") + + vkVersion := vkVersionSplits[len(vkVersionSplits)-1] + if vkVersion == "" { + return nil, fmt.Errorf("no tag specified on the image for VK") } - if err := i.K8s.waitForInterlink(ctx); err != nil { + + _, err := dag.Container().From("quay.io/skopeo/stable"). + WithServiceBinding("registry", m.Registry). + WithMountedFile("image.tar", dag.Container(). + Build(workspace, ContainerBuildOpts{ + Dockerfile: "docker/Dockerfile.vk", + BuildArgs: []BuildArg{ + {"VERSION", vkVersion}, + }, + }).AsTarball()). + WithExec([]string{"copy", "--dest-tls-verify=false", "docker-archive:image.tar", "docker://" + m.VirtualKubeletRef}). + Sync(ctx) + if err != nil { return nil, err } - // if err := i.K8s.waitForPlugin(ctx); err != nil { - // return nil, err - // } - if err := i.K8s.waitForVirtualNodes(ctx); err != nil { + + _, err = dag.Container().From("quay.io/skopeo/stable"). + WithServiceBinding("registry", m.Registry). + WithMountedFile("image.tar", dag.Container(). + Build(workspace, ContainerBuildOpts{ + Dockerfile: "docker/Dockerfile.interlink", + BuildArgs: []BuildArg{ + {"VERSION", vkVersion}, + }, + }).AsTarball()). + WithExec([]string{"copy", "--dest-tls-verify=false", "docker-archive:image.tar", "docker://" + m.InterlinkRef}). + Sync(ctx) + if err != nil { return nil, err } + return m, nil +} - result := i.K8s.KContainer. - WithWorkdir("/opt"). - WithExec([]string{"bash", "-c", "git clone https://github.com/interTwin-eu/vk-test-set.git"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"bash", "-c", "cp /manifests/vktest_config.yaml /opt/vk-test-set/vktest_config.yaml"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithWorkdir("/opt/vk-test-set"). - WithExec([]string{"bash", "-c", "python3 -m venv .venv && source .venv/bin/activate && pip3 install -e ./ "}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"bash", "-c", "source .venv/bin/activate && export KUBECONFIG=/.kube/config && pytest -vk 'not rclone'"}, ContainerWithExecOpts{SkipEntrypoint: true}) - - if i.CleanupCluster { - err := i.Cleanup(ctx) - if err != nil { - return nil, err - } - } +// Wait for virtual node to be ready and expose the k8s endpoint as a service +func (m *Interlink) Kube( + ctx context.Context, +) (*Service, error) { - return result, nil + return dag.K3S(m.Name).Server(), nil } -func (i *Interlink) Run( +// Wait for cluster to be ready, then setup the test container +func (m *Interlink) Run( ctx context.Context, ) (*Container, error) { - if i.CleanupCluster { - err := i.Cleanup(ctx) - if err != nil { - return nil, err - } - } + // result := m.Kubectl. + // WithWorkdir("/opt"). + // WithExec([]string{"bash", "-c", "python3 -m venv .venv && source .venv/bin/activate && pip3 install -e ./ "}, ContainerWithExecOpts{SkipEntrypoint: true}). + // WithExec([]string{"bash", "-c", "source .venv/bin/activate && export KUBECONFIG=/.kube/config"}, ContainerWithExecOpts{SkipEntrypoint: true}) - return i.K8s.KContainer. - WithWorkdir("/opt"). + return m.Kubectl. + WithWorkdir("/opt/user"). WithExec([]string{"bash", "-c", "git clone https://github.com/interTwin-eu/vk-test-set.git"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithExec([]string{"bash", "-c", "cp /manifests/vktest_config.yaml /opt/vk-test-set/vktest_config.yaml"}, ContainerWithExecOpts{SkipEntrypoint: true}). - WithWorkdir("/opt/vk-test-set"). - WithExec([]string{"bash", "-c", "python3 -m venv .venv && source .venv/bin/activate && pip3 install -e ./ "}, ContainerWithExecOpts{SkipEntrypoint: true}), nil + WithExec([]string{"bash", "-c", "cp /manifests/vktest_config.yaml /opt/user/vk-test-set/vktest_config.yaml"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithWorkdir("/opt/user/vk-test-set"), nil } -func (i *Interlink) Cluster( +// Wait for cluster to be ready, setup the test container, run all tests +func (m *Interlink) Test( ctx context.Context, + // +optional + localCluster *Service, + // +optional + // +default false + //cleanup bool, ) (*Container, error) { - if i.CleanupCluster { - err := i.Cleanup(ctx) - if err != nil { - return nil, err - } - } + result := m.Kubectl. + WithWorkdir("/opt/user"). + WithExec([]string{"bash", "-c", "git clone https://github.com/interTwin-eu/vk-test-set.git"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithExec([]string{"bash", "-c", "cp /manifests/vktest_config.yaml /opt/user/vk-test-set/vktest_config.yaml"}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithWorkdir("/opt/user/vk-test-set"). + WithExec([]string{"bash", "-c", "python3 -m venv .venv && source .venv/bin/activate && pip3 install -e ./ "}, ContainerWithExecOpts{SkipEntrypoint: true}). + WithExec([]string{"bash", "-c", "source .venv/bin/activate && export KUBECONFIG=/.kube/config && pytest -vk 'not rclone'"}, ContainerWithExecOpts{SkipEntrypoint: true}) - return i.K8s.K3s, nil + return result, nil } diff --git a/ci/manifests/kustomization.yaml b/ci/manifests/kustomization.yaml index 694260d7..168dc6f7 100644 --- a/ci/manifests/kustomization.yaml +++ b/ci/manifests/kustomization.yaml @@ -3,6 +3,8 @@ resources: - virtual-kubelet.yaml - interlink-config.yaml - interlink.yaml +#- plugin-k8s-config.yaml +#- plugin.yaml patches: - path: virtual-kubelet-merge.yaml target: diff --git a/ci/manifests/plugin-config.yaml b/ci/manifests/plugin-config.yaml index f3e115d4..2163d46a 100644 --- a/ci/manifests/plugin-config.yaml +++ b/ci/manifests/plugin-config.yaml @@ -5,7 +5,10 @@ SidecarPort: "4000" VerboseLogging: true ErrorsOnlyLogging: false ExportPodData: true +# NEEDED PATH FOR GITHUB ACTIONS DataRootFolder: "/home/runner/work/interLink/interLink/.interlink/" +# on your host use something like: +#DataRootFolder: "/home/ubuntu/.interlink/" SbatchPath: "/usr/bin/sbatch" ScancelPath: "/usr/bin/scancel" SqueuePath: "/usr/bin/squeue" diff --git a/ci/manifests/plugin-k8s-config.yaml b/ci/manifests/plugin-k8s-config.yaml new file mode 100644 index 00000000..8db723f4 --- /dev/null +++ b/ci/manifests/plugin-k8s-config.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: "plugin-config" + namespace: interlink +data: + InterLinkConfig.yaml: | + InterlinkURL: "http://localhost" + InterlinkPort: "3000" + SidecarURL: "http://0.0.0.0" + SidecarPort: "4000" + VerboseLogging: true + ErrorsOnlyLogging: false + ExportPodData: true + DataRootFolder: "/home/runner/work/interLink/interLink/.interlink/" + SbatchPath: "/usr/bin/sbatch" + ScancelPath: "/usr/bin/scancel" + SqueuePath: "/usr/bin/squeue" + CommandPrefix: "" + SingularityPrefix: "" + Namespace: "vk" + Tsocks: false + TsocksPath: "$WORK/tsocks-1.8beta5+ds1/libtsocks.so" + TsocksLoginNode: "login01" + BashPath: /bin/bash diff --git a/ci/manifests/vktest_config.yaml b/ci/manifests/vktest_config.yaml index 8a365aec..0263a20e 100644 --- a/ci/manifests/vktest_config.yaml +++ b/ci/manifests/vktest_config.yaml @@ -6,7 +6,7 @@ required_namespaces: - kube-system - interlink -timeout_multiplier: 20. +timeout_multiplier: 10. values: namespace: interlink diff --git a/docker-plugin b/docker-plugin new file mode 100755 index 00000000..ebda63fa Binary files /dev/null and b/docker-plugin differ diff --git a/ci/README.md b/docs/docs/Developers.md similarity index 65% rename from ci/README.md rename to docs/docs/Developers.md index 25ff428a..e322c8a2 100644 --- a/ci/README.md +++ b/docs/docs/Developers.md @@ -1,11 +1,15 @@ -# INTERLINK E2E INTEGRATION TESTS +--- +sidebar_position: 3 +--- + +# E2E integration tests Here you can find how to test a virtual kubelet implementation against the main pod use cases we mean to support. ## Requirements - [Docker engine](https://docs.docker.com/engine/install/) -- [Dagger CLI](https://docs.dagger.io/install/) +- [Dagger CLI v0.11.9](https://docs.dagger.io/install/) ## What's in the Dagger module @@ -29,12 +33,25 @@ That means you can test your code **before** any commit, discovering in advance - `virtual-kubelet.yaml` is the one that you should touch if you are pointing to different interlink endpoints or if you want to change the __virtual kubelet__ image to be tested. - `interlink-config.yaml` is the configuration mounted into the __interlink API__ component to determine its behaviour. - `interlink.yaml` is the one that you should touch if you are pointing to different plugin endpoints or if you want to change the __interlink API__ image to be tested. -- `plugin-config.yaml` is the configuration mounted into the __interLink plugin__ component to determine its behaviour. -- `plugin.yaml` is the one that you should touch if you are pointing to different plugin endpoints or if you want to change the __interlink plugin__ image to be tested. +- `plugin-config.yaml` is the configuration for the __interLink plugin__ component that you MUST TO START MANUALLY on your host. + - we do have solution to make it start inside dagger environment, but is not documented yet. + +#### Start the local docker plugin service + +For a simple demonstration, you can use the plugin that we actually use in are Github Actions: +```bash +wget https://github.com/interTwin-eu/interlink-docker-plugin/releases/download/0.0.22-no-gpu/docker-plugin_Linux_x86_64 -O docker-plugin \ + && chmod +x docker-plugin \ + && docker ps \ + && export INTERLINKCONFIGPATH=$PWD/ci/manifests/plugin-config.yaml \ + && ./docker-plugin +``` #### Run the tests +Then, in another terminal sessions you are ready to execute the e2e tests with Dagger. + First of all, in `ci/manifests/vktest_config.yaml` you will find the pytest configuration file. Please see the [test documentation](https://github.com/interTwin-eu/vk-test-set/tree/main) for understanding how to tweak it. The following instructions are thought for building docker images of the virtual-kubelet and interlink api server components at runtime and published on `virtual-kubelet-ref` and `interlink-ref` repositories (in this example it will be dockerHUB repository of the dciangot user). @@ -43,12 +60,14 @@ It basically consists on a chain of Dagger tasks for building core images (`buil To run the default tests you can move to `ci` folder and execute the Dagger pipeline with: ```bash -export YOUR_DOCKERHUB_USER=dciangot - -dagger call build-images --source-folder ../ --virtual-kubelet-ref ${YOUR_DOCKERHUB_USER}/vk --interlink-ref ${YOUR_DOCKERHUB_USER}/interlink \ - new-interlink --manifests $PWD/manifests \ - load-plugin \ - test stdout +dagger call \ + --name my-tests \ + build-images \ + --source-folder ../ \ + new-interlink \ + --plugin-endpoint tcp://localhost:4000 \ + --manifests ./manifests \ + test stdout ``` :warning: by default the docker plugin is the one tested and to be referred to for any change as first thing. @@ -81,10 +100,15 @@ vktestset/basic_test.py::test_manifest[virtual-kubelet-060-init-container.yaml] In case something went wrong, you have the possibility to spawn a session inside the final step of the pipeline to debug things: ```bash -dagger call build-images --source-folder ../ --virtual-kubelet-ref dciangot/vk --interlink-ref dciangot/interlink \ - new-interlink --manifests $PWD/manifests \ - load-plugin \ - run terminal +dagger call \ + --name my-tests \ + build-images \ + --source-folder ../ \ + new-interlink \ + --manifests ./manifests \ + --plugin-endpoint tcp://localhost:4000 \ + run terminal + ``` with this command (after some minutes) then you should be able to access a bash session doing the following commands: @@ -101,29 +125,47 @@ kubectl get pod -A pytest -vk 'not rclone' ``` +#### Debug from kubectl on your host -### Deploy on existing K8s cluster - -You might want to hijack the test machinery in order to have it instantiating the test environemnt on your own kubernetes cluster (e.g. to debug and develop plugins in a efficient way). We are introducing options for this purpose and it is expected to be extended even more in the future. - -If you have a kubernetes cluster **publically accessible**, you can pass your kubeconfig to the Dagger pipeline and use that instead of the internal one that is "one-shot" for the tests only. +You can get the Kubernetes service running with: ```bash -dagger call build-images --source-folder ../ --virtual-kubelet-ref dciangot/vk --interlink-ref dciangot/interlink \ - new-interlink --manifests $PWD/manifests --kubeconfig $PWD/kubeconfig.yaml \ - load-plugin \ - test stdout +dagger call \ + --name my-tests \ + build-images \ + --source-folder ../ \ + --plugin-endpoint tcp://localhost:4000 \ + --manifests ./manifests \ + new-interlink \ + kube up ``` -If you have a *local* cluster (e.g. via MiniKube), you need to forward the local port of the Kubernetes API server (look inside the kubeconfig file) inside the Dagger runtime with the following: +and then from another session, you can get the kubeconfig with: ```bash -dagger call build-images --source-folder ../ --virtual-kubelet-ref dciangot/vk --interlink-ref dciangot/interlink \ - new-interlink --manifests $PWD/manifests --kubeconfig $PWD/kubeconfig.yaml --local-cluster tcp://localhost:59127 \ - load-plugin \ - test stdout +dagger call \ + --name my-tests \ + config export --path ./kubeconfig.yaml ``` + +### Deploy on existing K8s cluster + +TBD + + + + + + + + + + + + + + ### Develop Virtual Kubelet code :warning: Coming soon @@ -133,3 +175,7 @@ dagger call build-images --source-folder ../ --virtual-kubelet-ref dciangot/vk :warning: Coming soon +### Develop your plugin + +:warning: Coming soon + diff --git a/docs/docs/tutorial-users/02-limitations.md b/docs/docs/Limitations.md similarity index 97% rename from docs/docs/tutorial-users/02-limitations.md rename to docs/docs/Limitations.md index c6111453..ea129510 100644 --- a/docs/docs/tutorial-users/02-limitations.md +++ b/docs/docs/Limitations.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 4 --- # Current limitations diff --git a/docs/docs/tutorial-users/01-quick-start.md b/docs/docs/tutorial-users/01-quick-start.md deleted file mode 100644 index d68c103b..00000000 --- a/docs/docs/tutorial-users/01-quick-start.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -sidebar_position: 1 -toc_min_heading_level: 2 -toc_max_heading_level: 5 ---- - -# Quick-start: local environment - -:::danger - -__N.B.__ in the demo the oauth2 proxy authN/Z is disabled. DO NOT USE THIS IN PRODUCTION unless you know what you are doing. - -::: - -## Requirements - -- [Docker](https://docs.docker.com/engine/install/) -- [Minikube](https://minikube.sigs.k8s.io/docs/start/) (kubernetes-version 1.27.1) -- Clone interlink repo: - -```bash -git clone https://github.com/interTwin-eu/interLink.git -``` - -## Connect a remote machine with Docker - -Move to example location: - -```bash -cd interLink/example/interlink-docker -``` - -### Setup Kubernetes cluster - -```bash -minikube start --kubernetes-version=1.27.1 -``` - -### Deploy Interlink - -#### Configure interLink - -You need to provide the interLink IP address that should be reachable from the kubernetes pods. In case of this demo setup, that address __is the address of your machine__ - -```bash -export INTERLINK_IP_ADDRESS=XXX.XX.X.XXX - -sed -i 's/InterlinkAddress:.*/InterlinkAddress: "http:\/\/'$INTERLINK_IP_ADDRESS'"/g' vk/InterLinkConfig.yaml - -sed -i 's/InterlinkAddres:.*/InterlinkAddress: "http:\/\/'$INTERLINK_IP_ADDRESS'"/g' interlink/InterLinkConfig.yaml | sed -i 's/SidecarURL:.*/SidecarURL: "http:\/\/'$INTERLINK_IP_ADDRESS'"/g' interlink/InterLinkConfig.yaml - -sed -i 's/InterlinkAddress:.*/InterlinkAddress: "http:\/\/'$INTERLINK_IP_ADDRESS'"/g' interlink/sidecarConfig.yaml | sed -i 's/SidecarURL:.*/SidecarURL: "http:\/\/'$INTERLINK_IP_ADDRESS'"/g' interlink/sidecarConfig.yaml -``` - -#### Deploy virtualKubelet - -Create the `vk` namespace: - -```bash -kubectl create ns vk -``` - -Deploy the vk resources on the cluster with: - -```bash -kubectl apply -n vk -k vk/ -``` - -Check that both the pods and the node are in ready status - -```bash -kubectl get pod -n vk - -kubectl get node -``` - -#### Deploy interLink via docker compose - -```bash -cd interlink - -docker compose up -d -``` - -Check logs for both interLink APIs and SLURM sidecar: - -```bash -docker logs interlink-interlink-1 - -docker logs interlink-docker-sidecar-1 -``` - -#### Deploy a sample application - -```bash -kubectl apply -f ../test_pod.yaml -``` - -Then observe the application running and eventually succeeding via: - -```bash -kubectl get pod -n vk --watch -``` - -When finished, interrupt the watch with `Ctrl+C` and retrieve the logs with: - -```bash -kubectl logs -n vk test-pod-cfg-cowsay-dciangot -``` - -Also you can see with `docker ps` the container appearing on the `interlink-docker-sidecar-1` container with: - -```bash -docker exec interlink-docker-sidecar-1 docker ps -``` diff --git a/docs/docs/tutorial-users/_category_.json b/docs/docs/tutorial-users/_category_.json deleted file mode 100644 index b2d0f184..00000000 --- a/docs/docs/tutorial-users/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Usage", - "position": 2, - "link": { - "type": "generated-index", - "description": "5 minutes to learn the most important interLink concepts." - } -} diff --git a/go.mod b/go.mod index 3453b20f..29fcc8b0 100644 --- a/go.mod +++ b/go.mod @@ -7,11 +7,11 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/virtual-kubelet/virtual-kubelet v1.11.0 - go.opentelemetry.io/otel v1.22.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 - go.opentelemetry.io/otel/sdk v1.22.0 - golang.org/x/oauth2 v0.16.0 - google.golang.org/grpc v1.59.0 + go.opentelemetry.io/otel v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 + go.opentelemetry.io/otel/sdk v1.27.0 + golang.org/x/oauth2 v0.20.0 + google.golang.org/grpc v1.64.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.29.1 @@ -20,10 +20,12 @@ require ( k8s.io/klog v1.0.0 ) +require golang.org/x/tools v0.18.0 // indirect + require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect @@ -34,14 +36,14 @@ require ( github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -58,24 +60,21 @@ require ( github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.1 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.9.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.17.0 // indirect - golang.org/x/term v0.16.0 // indirect - golang.org/x/text v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.3.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/apiserver v0.29.1 // indirect k8s.io/component-base v0.29.1 // indirect diff --git a/go.sum b/go.sum index f3935605..38260fda 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,8 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bombsimon/logrusr/v3 v3.1.0 h1:zORbLM943D+hDMGgyjMhSAz/iDz86ZV72qaak/CA0zQ= github.com/bombsimon/logrusr/v3 v3.1.0/go.mod h1:PksPPgSFEL2I52pla2glgCyyd2OqOHAnFF5E+g8Ixco= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -52,8 +52,6 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-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= @@ -67,10 +65,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W 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.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/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -79,7 +75,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/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.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -89,15 +84,15 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -147,8 +142,8 @@ github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdO github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -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.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -170,36 +165,33 @@ github.com/virtual-kubelet/virtual-kubelet v1.11.0 h1:LOMcZQfP083xmYH9mYtyHAR+yb github.com/virtual-kubelet/virtual-kubelet v1.11.0/go.mod h1:WQfPHbIlzfhMNYkh6hFXF1ctGfNM8UJCYLYpLa/trxc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= +go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -209,43 +201,32 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/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-20201020160332-67f06af15bc9/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.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.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.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -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/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -256,33 +237,28 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/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.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-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -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/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -292,10 +268,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 00000000..2e8c4162 --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "linux-x64-127", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +