diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index a21044cbe..dd91efa6c 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -54,15 +54,37 @@ jobs: with: test-results: test.json - e2e-test: + e2e-quick-start: strategy: matrix: provider: - Docker + # Uncomment below once we have the ability to run e2e tests on other providers from GHA. + # - AWS + # - Nutanix fail-fast: false uses: ./.github/workflows/e2e.yml with: provider: ${{ matrix.provider }} + focus: Quick start + secrets: inherit + permissions: + contents: read + checks: write + + e2e-self-hosted: + strategy: + matrix: + provider: + - Docker + # Uncomment below once we have the ability to run e2e tests on other providers from GHA. + # - AWS + # - Nutanix + fail-fast: false + uses: ./.github/workflows/e2e.yml + with: + provider: ${{ matrix.provider }} + focus: Self-hosted secrets: inherit permissions: contents: read diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index cf6cb77e0..2eead80da 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -8,6 +8,12 @@ on: description: Infrastructure provider to run e2e tests with type: string required: true + skip: + description: e2e tests to skip + type: string + focus: + description: e2e tests to focus + type: string jobs: e2e-test: @@ -37,7 +43,7 @@ jobs: ${{ runner.os }}-go- - name: Run e2e tests - run: devbox run -- make e2e-test E2E_LABEL='provider:${{ inputs.provider }}' + run: devbox run -- make e2e-test E2E_LABEL='provider:${{ inputs.provider }}' E2E_SKIP='${{ inputs.skip }}' E2E_FOCUS='${{ inputs.focus }}' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/common/pkg/capi/utils/utils.go b/common/pkg/capi/utils/utils.go index fe574152c..255c6bf4f 100644 --- a/common/pkg/capi/utils/utils.go +++ b/common/pkg/capi/utils/utils.go @@ -7,15 +7,16 @@ import ( "context" "fmt" - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" ) // ManagementCluster returns a Cluster object if c is pointing to a management cluster, otherwise returns nil. func ManagementCluster(ctx context.Context, c client.Client) (*clusterv1.Cluster, error) { - allNodes := &v1.NodeList{} + allNodes := &corev1.NodeList{} err := c.List(ctx, allNodes) if err != nil { return nil, fmt.Errorf("error listing Nodes: %w", err) @@ -37,7 +38,7 @@ func ManagementCluster(ctx context.Context, c client.Client) (*clusterv1.Cluster } err = c.Get(ctx, key, cluster) if err != nil { - if k8serrors.IsNotFound(err) { + if k8serrors.IsNotFound(err) || meta.IsNoMatchError(err) { return nil, nil } return nil, fmt.Errorf("error getting Cluster object based on Node annotations: %w", err) diff --git a/devbox.lock b/devbox.lock index 9eab483a7..59ee0c2bb 100644 --- a/devbox.lock +++ b/devbox.lock @@ -2,1618 +2,622 @@ "lockfile_version": "1", "packages": { "actionlint@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#actionlint", + "last_modified": "2024-03-17T01:03:25Z", + "resolved": "github:NixOS/nixpkgs/299d4668ba61600311553920d9fd9c102145b2cb#actionlint", "source": "devbox-search", "version": "1.6.27", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/qygspplxrcnd3jbwlg0k0zzf19478k1y-actionlint-1.6.27", - "default": true - } - ], - "store_path": "/nix/store/qygspplxrcnd3jbwlg0k0zzf19478k1y-actionlint-1.6.27" + "store_path": "/nix/store/nnhjp60w14pdy1hjgxn9dfsg4nbfs93v-actionlint-1.6.27" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ivly2rxzf4hpzz9qw40yhv9m32kimlsx-actionlint-1.6.27", - "default": true - } - ], - "store_path": "/nix/store/ivly2rxzf4hpzz9qw40yhv9m32kimlsx-actionlint-1.6.27" + "store_path": "/nix/store/p8rc44x83sld3wk1m4y27za9n1mjyk48-actionlint-1.6.27" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/zydlj1yk2aydq76nck3swhnydvm7pkin-actionlint-1.6.27", - "default": true - } - ], - "store_path": "/nix/store/zydlj1yk2aydq76nck3swhnydvm7pkin-actionlint-1.6.27" + "store_path": "/nix/store/7v1lh7c3pwlax5fy7pw233czn4hs89hl-actionlint-1.6.27" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/imnkd6dsgzlvbfcd9qiv6yqdrnch80fa-actionlint-1.6.27", - "default": true - } - ], - "store_path": "/nix/store/imnkd6dsgzlvbfcd9qiv6yqdrnch80fa-actionlint-1.6.27" + "store_path": "/nix/store/56xxvs3yijdmhhxbfvps38nz95xdxgyl-actionlint-1.6.27" } } }, "chart-testing@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#chart-testing", + "last_modified": "2024-03-18T12:38:16Z", + "resolved": "github:NixOS/nixpkgs/e367f7a1fb93137af22a3908f00b9a35e2d286a7#chart-testing", "source": "devbox-search", "version": "3.10.1", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ssyavvz0qjc13cj7r2891ldf5kgfikfw-chart-testing-3.10.1", - "default": true - } - ], - "store_path": "/nix/store/ssyavvz0qjc13cj7r2891ldf5kgfikfw-chart-testing-3.10.1" + "store_path": "/nix/store/5lygcps2ly736k0dvk2w4mx6yy8dzz6s-chart-testing-3.10.1" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/lkcgpss5byb8xlm09dx0j984qk4avksx-chart-testing-3.10.1", - "default": true - } - ], - "store_path": "/nix/store/lkcgpss5byb8xlm09dx0j984qk4avksx-chart-testing-3.10.1" + "store_path": "/nix/store/103km469ldwrzs525m57bj409vxjlniw-chart-testing-3.10.1" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/83m0cp0wlik6a1fy86bnzfn40496cnzn-chart-testing-3.10.1", - "default": true - } - ], - "store_path": "/nix/store/83m0cp0wlik6a1fy86bnzfn40496cnzn-chart-testing-3.10.1" + "store_path": "/nix/store/c4qgh783pvhzqpv7skimzfs75pklbz4f-chart-testing-3.10.1" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/i4pk11iyhm4ymj14vqpg6g6ydp5x81md-chart-testing-3.10.1", - "default": true - } - ], - "store_path": "/nix/store/i4pk11iyhm4ymj14vqpg6g6ydp5x81md-chart-testing-3.10.1" + "store_path": "/nix/store/wzscgl31rzxws05y7vxkl0f65fsiydmm-chart-testing-3.10.1" + } + } + }, + "clusterctl@latest": { + "last_modified": "2024-03-15T20:27:35Z", + "resolved": "github:NixOS/nixpkgs/9af9c1c87ed3e3ed271934cb896e0cdd33dae212#clusterctl", + "source": "devbox-search", + "version": "1.6.3", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/6hsi8bj8ddbrv29jff467q1rqcfgs964-clusterctl-1.6.3" + }, + "aarch64-linux": { + "store_path": "/nix/store/jysji089cqrygcwl2ryvbb0sa3cjj8vv-clusterctl-1.6.3" + }, + "x86_64-darwin": { + "store_path": "/nix/store/gbch3dp061am97j79b56pp07121j781k-clusterctl-1.6.3" + }, + "x86_64-linux": { + "store_path": "/nix/store/1xy66gcyxaqjhb5h15slyxzw64d920c6-clusterctl-1.6.3" } } }, "coreutils@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#coreutils", + "last_modified": "2024-03-11T21:09:54Z", + "resolved": "github:NixOS/nixpkgs/bf8462aeba50cc753971480f613fbae0747cffc0#coreutils", "source": "devbox-search", - "version": "9.5", + "version": "9.4", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ssqkq33b9jb441g7baplb87z8vnyp34i-coreutils-9.5", - "default": true - }, - { - "name": "info", - "path": "/nix/store/n417gpwyz6dc7y7fr8cayl6hlm7izqc4-coreutils-9.5-info" - } - ], - "store_path": "/nix/store/ssqkq33b9jb441g7baplb87z8vnyp34i-coreutils-9.5" + "store_path": "/nix/store/vinxz6lkrilb72dkzr3ny02nnvql6z50-coreutils-9.4" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wxkj5fzayx8shn2cl9p6q7l7pynp23zj-coreutils-9.5", - "default": true - }, - { - "name": "info", - "path": "/nix/store/c1pbqrlbl9jivq6jaw6fqs28df4ad7aq-coreutils-9.5-info" - }, - { - "name": "debug", - "path": "/nix/store/9a3qfq2m1gz8ix4x6vzxks42fgv5sa26-coreutils-9.5-debug" - } - ], - "store_path": "/nix/store/wxkj5fzayx8shn2cl9p6q7l7pynp23zj-coreutils-9.5" + "store_path": "/nix/store/77fyfwmz29cz9j5x6yw2wrlm4rvasldv-coreutils-9.4" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/4xiysj68rc0nq0s448csm68a5whyhvfr-coreutils-9.5", - "default": true - }, - { - "name": "info", - "path": "/nix/store/rlhcgllgks6qn00cdc4r3f76v487jcaw-coreutils-9.5-info" - } - ], - "store_path": "/nix/store/4xiysj68rc0nq0s448csm68a5whyhvfr-coreutils-9.5" + "store_path": "/nix/store/spm5vvna0wwkknavwfgxdsbq48r5374a-coreutils-9.4" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/asqa3kfq3maclk7cqqhrjvp7vriw6ahy-coreutils-9.5", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/3vb38vqqkdm1q62rgp24ni7n5j45ksj3-coreutils-9.5-debug" - }, - { - "name": "info", - "path": "/nix/store/k9qai5vqaldxq2fjsapggrbzhw2lyf3l-coreutils-9.5-info" - } - ], - "store_path": "/nix/store/asqa3kfq3maclk7cqqhrjvp7vriw6ahy-coreutils-9.5" + "store_path": "/nix/store/mb488rr560vq1xnl10hinnyfflcrd51n-coreutils-9.4" } } }, "envsubst@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#envsubst", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#envsubst", "source": "devbox-search", "version": "1.4.2", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/k1yh3iayj0bhspnq7c8q686lac9zkhxl-envsubst-1.4.2", - "default": true - } - ], - "store_path": "/nix/store/k1yh3iayj0bhspnq7c8q686lac9zkhxl-envsubst-1.4.2" + "store_path": "/nix/store/7lwyjdf9bhyihfdr9gm7ajhjbliphv34-envsubst-1.4.2" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/jm277id1383qrbpsl9a617amcizv636w-envsubst-1.4.2", - "default": true - } - ], - "store_path": "/nix/store/jm277id1383qrbpsl9a617amcizv636w-envsubst-1.4.2" + "store_path": "/nix/store/qsly6czilaakclr57zlaxl0y574f6lj3-envsubst-1.4.2" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/dlpcwgqp7rckaickj4rgp3adz3hlnbas-envsubst-1.4.2", - "default": true - } - ], - "store_path": "/nix/store/dlpcwgqp7rckaickj4rgp3adz3hlnbas-envsubst-1.4.2" + "store_path": "/nix/store/i5kjf63ns7b1scw1k3jvwlj6m5lpz3mi-envsubst-1.4.2" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/zarprjjn1ms8cdkxymrnpciakh3mpdaq-envsubst-1.4.2", - "default": true - } - ], - "store_path": "/nix/store/zarprjjn1ms8cdkxymrnpciakh3mpdaq-envsubst-1.4.2" + "store_path": "/nix/store/vgglbbxi4wa85g3fzb71jxbddkklhpvg-envsubst-1.4.2" } } }, "findutils@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#findutils", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#findutils", "source": "devbox-search", "version": "4.9.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/f2zkblkcbxvgczjdxa53xn8d0652d4x0-findutils-4.9.0", - "default": true - }, - { - "name": "info", - "path": "/nix/store/crj6g6z8rdkp2qhbvddbss42pwzygdnp-findutils-4.9.0-info" - }, - { - "name": "locate", - "path": "/nix/store/l1s999mk7cm1ndwi2mgg2qdfcypbb70v-findutils-4.9.0-locate" - } - ], - "store_path": "/nix/store/f2zkblkcbxvgczjdxa53xn8d0652d4x0-findutils-4.9.0" + "store_path": "/nix/store/46ilsgv2hj073d3ghqv209bl95djki8q-findutils-4.9.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/48s8dsa5pkk907f95adzgx0f6h2j5kx6-findutils-4.9.0", - "default": true - }, - { - "name": "info", - "path": "/nix/store/gg8hj8l9xral4n0kxk8k2xwi7ccaprz9-findutils-4.9.0-info" - }, - { - "name": "locate", - "path": "/nix/store/zhi1qfhbbl66029yqxjpdzm0ajsyfp4h-findutils-4.9.0-locate" - } - ], - "store_path": "/nix/store/48s8dsa5pkk907f95adzgx0f6h2j5kx6-findutils-4.9.0" + "store_path": "/nix/store/ry6g1kym7g3i8813msq7b0gzqbdj1rfk-findutils-4.9.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/03mm3xdylmym33apqya6p4hrl15na03h-findutils-4.9.0", - "default": true - }, - { - "name": "info", - "path": "/nix/store/nljqq3vj63g7dha3ni04mc1y2ynpwz4a-findutils-4.9.0-info" - }, - { - "name": "locate", - "path": "/nix/store/kblii4jylpkxdfzb2hm85c5qa6f6mqxl-findutils-4.9.0-locate" - } - ], - "store_path": "/nix/store/03mm3xdylmym33apqya6p4hrl15na03h-findutils-4.9.0" + "store_path": "/nix/store/iqka9ifkjwwz0cf5dz8w7fl9p41p142p-findutils-4.9.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vf8cjkgwmgd4sb3vkxh6x9iar71s1w1c-findutils-4.9.0", - "default": true - }, - { - "name": "info", - "path": "/nix/store/r80d9k23pnllj2fygr2qfjccv1q3vnzw-findutils-4.9.0-info" - }, - { - "name": "locate", - "path": "/nix/store/40v3pfgiln10gm274m5z1fhd1sxrx9bf-findutils-4.9.0-locate" - } - ], - "store_path": "/nix/store/vf8cjkgwmgd4sb3vkxh6x9iar71s1w1c-findutils-4.9.0" + "store_path": "/nix/store/rr5pqqck5f6fjkv7agwjyhaljvh27ncn-findutils-4.9.0" } } }, "gh@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#gh", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#gh", "source": "devbox-search", - "version": "2.48.0", + "version": "2.45.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/al0w11wik8xvjv311f9hdcni6lcbd22g-gh-2.48.0", - "default": true - } - ], - "store_path": "/nix/store/al0w11wik8xvjv311f9hdcni6lcbd22g-gh-2.48.0" + "store_path": "/nix/store/ijbvh0hln26a39q5m7iavyvyj83adja9-gh-2.45.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/fa3pwqlw4izfip7kg4c1iv7gdhwjgsf7-gh-2.48.0", - "default": true - } - ], - "store_path": "/nix/store/fa3pwqlw4izfip7kg4c1iv7gdhwjgsf7-gh-2.48.0" + "store_path": "/nix/store/33v7d9a7x91lzvyr8d76mzb5022glay4-gh-2.45.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/m9jcg3yp042alkymg4qy3k4skyfzxpgs-gh-2.48.0", - "default": true - } - ], - "store_path": "/nix/store/m9jcg3yp042alkymg4qy3k4skyfzxpgs-gh-2.48.0" + "store_path": "/nix/store/snd8ridf0apgbk7ngyf4waqdk72mr9pm-gh-2.45.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/yk2hqa1jnc9r26q93cs8m6gi4872s1ga-gh-2.48.0", - "default": true - } - ], - "store_path": "/nix/store/yk2hqa1jnc9r26q93cs8m6gi4872s1ga-gh-2.48.0" + "store_path": "/nix/store/1krwa1i8qyxapbp6n02r4niwiqhhnaln-gh-2.45.0" } } }, "ginkgo@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#ginkgo", + "last_modified": "2024-03-18T21:18:48Z", + "resolved": "github:NixOS/nixpkgs/ca00bc5e9419b97c1a11210f08f9338e6ba7515c#ginkgo", "source": "devbox-search", - "version": "2.17.1", + "version": "2.17.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/94622rky2ffpbz6vpyqdmi86knm3czkw-ginkgo-2.17.1", - "default": true - } - ], - "store_path": "/nix/store/94622rky2ffpbz6vpyqdmi86knm3czkw-ginkgo-2.17.1" + "store_path": "/nix/store/lxq0cx9km60yjwf63pmf1j3rbfr82q7x-ginkgo-2.17.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/d06nha7nl3f8iw5vf06vsfircmvlj852-ginkgo-2.17.1", - "default": true - } - ], - "store_path": "/nix/store/d06nha7nl3f8iw5vf06vsfircmvlj852-ginkgo-2.17.1" + "store_path": "/nix/store/1bf8v0b9k0pmmrs06h6zw13cxl0pmd9q-ginkgo-2.17.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ihm49vvp0z4aifblx362ramg8spinkz5-ginkgo-2.17.1", - "default": true - } - ], - "store_path": "/nix/store/ihm49vvp0z4aifblx362ramg8spinkz5-ginkgo-2.17.1" + "store_path": "/nix/store/7qyd3jfipsx9gj0wbkms245hkidlfb0f-ginkgo-2.17.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/rsq6y6wxhdvh6xr5sk39pp9agxd9vvf5-ginkgo-2.17.1", - "default": true - } - ], - "store_path": "/nix/store/rsq6y6wxhdvh6xr5sk39pp9agxd9vvf5-ginkgo-2.17.1" + "store_path": "/nix/store/bavqnxdhcvlpmkjvd0hcnhj3dlrrysmc-ginkgo-2.17.0" } } }, "git@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#git", + "last_modified": "2024-03-11T12:11:11Z", + "resolved": "github:NixOS/nixpkgs/0fbcc4b2e8571f4af39be41752581ea09dd9ab06#git", "source": "devbox-search", - "version": "2.44.0", + "version": "2.43.2", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/m0xxxwbvmfkpr2xl8xglp6pdcy2b32yr-git-2.44.0", - "default": true - }, - { - "name": "doc", - "path": "/nix/store/ixfyjbvrvcgjd6pvlmwd837n7gpacpsh-git-2.44.0-doc" - } - ], - "store_path": "/nix/store/m0xxxwbvmfkpr2xl8xglp6pdcy2b32yr-git-2.44.0" + "store_path": "/nix/store/4zyn11089z9i567c84d3628bq2k56q8r-git-2.43.2" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/53m8frqp4ibslq73c9rw25aim802cz6d-git-2.44.0", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/wmzbmb8nx1w5i4r9sadfkm5wsnrc626n-git-2.44.0-debug" - }, - { - "name": "doc", - "path": "/nix/store/n43ma18dqvddxslzzbcdg4z1ck0yjlrn-git-2.44.0-doc" - } - ], - "store_path": "/nix/store/53m8frqp4ibslq73c9rw25aim802cz6d-git-2.44.0" + "store_path": "/nix/store/6dmwwsmj6bp9ss0bsw5j042zjzx5p2kw-git-2.43.2" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/31aiia9d9zfmk53wsc2pkixipmhpb2s6-git-2.44.0", - "default": true - }, - { - "name": "doc", - "path": "/nix/store/r10zhb4fvl4mgkwk67nc30mp0z3qs384-git-2.44.0-doc" - } - ], - "store_path": "/nix/store/31aiia9d9zfmk53wsc2pkixipmhpb2s6-git-2.44.0" + "store_path": "/nix/store/ffnl9nk43qffalwvmb0bnhz3j2glkk1h-git-2.43.2" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/apl2ibxqrxbbj6z79nfgv892999z1zyv-git-2.44.0", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/8ibxf7vhwzn2iqzggksgj7wmfph6krr4-git-2.44.0-debug" - }, - { - "name": "doc", - "path": "/nix/store/ylvh2h3hr0m5578rs6ms184923xvsd1j-git-2.44.0-doc" - } - ], - "store_path": "/nix/store/apl2ibxqrxbbj6z79nfgv892999z1zyv-git-2.44.0" + "store_path": "/nix/store/fmx804pc0bs1966xq5bb67kark2mww9r-git-2.43.2" } } }, "gnumake@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#gnumake", + "last_modified": "2024-03-14T00:49:55Z", + "resolved": "github:NixOS/nixpkgs/db001797591bf76f7b8d4c4ed3b49233391e0c97#gnumake", "source": "devbox-search", "version": "4.4.1", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1cjkrg6qi2hqvl2j9arrhda5ik3dw707-gnumake-4.4.1", - "default": true - }, - { - "name": "man", - "path": "/nix/store/ksik878xm0c9bxb75wfhfg2ylm4w0aav-gnumake-4.4.1-man", - "default": true - }, - { - "name": "info", - "path": "/nix/store/j2pa8kq1rba6mkqbbbv7k5r89fqgrgrx-gnumake-4.4.1-info" - } - ], - "store_path": "/nix/store/1cjkrg6qi2hqvl2j9arrhda5ik3dw707-gnumake-4.4.1" + "store_path": "/nix/store/b4jbbx01f3n4r97g49jnxw3clf4p1szv-gnumake-4.4.1" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/779cbnya6zazh6yv8v3axky7wqd1d6xi-gnumake-4.4.1", - "default": true - }, - { - "name": "man", - "path": "/nix/store/8k2f18wc4ngq3y67zwqfvx5ckcbqadl5-gnumake-4.4.1-man", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/lbbdq6cvncqqd2i6yhw1jgivr69hpxav-gnumake-4.4.1-debug" - }, - { - "name": "info", - "path": "/nix/store/af203hd2f4zjfnjd159h9mgdhfbs4iwm-gnumake-4.4.1-info" - } - ], - "store_path": "/nix/store/779cbnya6zazh6yv8v3axky7wqd1d6xi-gnumake-4.4.1" + "store_path": "/nix/store/hfyyfn6h7cw2fvdc0jmpfigwi3rp7d2x-gnumake-4.4.1" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/f990ckg8csfq517rczrn9nnpzcfwzd3d-gnumake-4.4.1", - "default": true - }, - { - "name": "man", - "path": "/nix/store/q857swx734dh6xcjvcmqfgiqrx4cnvn0-gnumake-4.4.1-man", - "default": true - }, - { - "name": "info", - "path": "/nix/store/1iqhxfpxjadf9x3nbrbc9ha0dczrr7jx-gnumake-4.4.1-info" - } - ], - "store_path": "/nix/store/f990ckg8csfq517rczrn9nnpzcfwzd3d-gnumake-4.4.1" + "store_path": "/nix/store/ry772inn49ra4vmns2vg67bjpqv29j0k-gnumake-4.4.1" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/igc1cay5d5nqlj96vrq2icdxkdby1pay-gnumake-4.4.1", - "default": true - }, - { - "name": "man", - "path": "/nix/store/pnffk89cmqpszkhw0jawwfph8sh6gcyp-gnumake-4.4.1-man", - "default": true - }, - { - "name": "debug", - "path": "/nix/store/js0frfqk4xrglycqh2jh87cdb29z4pp3-gnumake-4.4.1-debug" - }, - { - "name": "info", - "path": "/nix/store/4s87rpcgdh4nlsy0xv802xm94x2ky757-gnumake-4.4.1-info" - } - ], - "store_path": "/nix/store/igc1cay5d5nqlj96vrq2icdxkdby1pay-gnumake-4.4.1" + "store_path": "/nix/store/0pkbh7939p7npr02ayama32pa389m5p7-gnumake-4.4.1" } } }, "gnused@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#gnused", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#gnused", "source": "devbox-search", "version": "4.9", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/7bv9z3svwrqc9jlxbk5mamnahfvpm2vp-gnused-4.9", - "default": true - }, - { - "name": "info", - "path": "/nix/store/yx0ndpivlmgmpwy1klb7z66jkw7qrr5f-gnused-4.9-info" - } - ], - "store_path": "/nix/store/7bv9z3svwrqc9jlxbk5mamnahfvpm2vp-gnused-4.9" + "store_path": "/nix/store/zmmrhy50wsyg5k9wrmbpcnjz6swdsk58-gnused-4.9" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/lql8aw5cli8jym5iwhcw81003vhv3swq-gnused-4.9", - "default": true - }, - { - "name": "info", - "path": "/nix/store/wxwxmhh46z2x5sd0r74i5dnzgrkrzc76-gnused-4.9-info" - } - ], - "store_path": "/nix/store/lql8aw5cli8jym5iwhcw81003vhv3swq-gnused-4.9" + "store_path": "/nix/store/jcpl9xd17v9c8aqkdwakhw3mymmagshp-gnused-4.9" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1qwza8ysi153w6v88sfnn6f4y4j8zcag-gnused-4.9", - "default": true - }, - { - "name": "info", - "path": "/nix/store/mybxia2rv2yn0b754cgf006vxx2mkfpx-gnused-4.9-info" - } - ], - "store_path": "/nix/store/1qwza8ysi153w6v88sfnn6f4y4j8zcag-gnused-4.9" + "store_path": "/nix/store/wjlj4v79x8zxnx5ylfgmiqp36vm28ii6-gnused-4.9" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ard747zf4fkkkqa0pwj3fxp9fhnyfm7p-gnused-4.9", - "default": true - }, - { - "name": "info", - "path": "/nix/store/jm2zc3iqm9hc26n3nfhc9k93ag46ipwb-gnused-4.9-info" - } - ], - "store_path": "/nix/store/ard747zf4fkkkqa0pwj3fxp9fhnyfm7p-gnused-4.9" + "store_path": "/nix/store/q7kq0naays5251ihghw0ccsz39id7kk5-gnused-4.9" } } }, "go@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#go", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#go_1_22", "source": "devbox-search", - "version": "1.22.2", + "version": "1.22.1", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/x7gzwywk7mvjamdyc4n45fh62jks7lma-go-1.22.2", - "default": true - } - ], - "store_path": "/nix/store/x7gzwywk7mvjamdyc4n45fh62jks7lma-go-1.22.2" + "store_path": "/nix/store/k9srp8ngvblscg68fdpcyqkydh86429k-go-1.22.1" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ka1iykac1bfvy98p9g2ii3xn2fnl98cn-go-1.22.2", - "default": true - } - ], - "store_path": "/nix/store/ka1iykac1bfvy98p9g2ii3xn2fnl98cn-go-1.22.2" + "store_path": "/nix/store/i604lwmgw1s8w3bdvsiz4332rx7fsb87-go-1.22.1" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/s26vypls3i2rvprj2jq7l1ypb5y12mq9-go-1.22.2", - "default": true - } - ], - "store_path": "/nix/store/s26vypls3i2rvprj2jq7l1ypb5y12mq9-go-1.22.2" + "store_path": "/nix/store/5dyp491ka5hx1g788dvnvadzk9kn92bp-go-1.22.1" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/9kriq85qac7phcxgpdqbqr25vlr61ifw-go-1.22.2", - "default": true - } - ], - "store_path": "/nix/store/9kriq85qac7phcxgpdqbqr25vlr61ifw-go-1.22.2" + "store_path": "/nix/store/wkbckbd30nlhq4dxzg64q6y4vm1xx4fk-go-1.22.1" } } }, "gojq@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#gojq", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#gojq", "source": "devbox-search", - "version": "0.12.15", + "version": "0.12.14", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/zrydwzci0h352b2yiyyyqcdlql8h9c25-gojq-0.12.15", - "default": true - } - ], - "store_path": "/nix/store/zrydwzci0h352b2yiyyyqcdlql8h9c25-gojq-0.12.15" + "store_path": "/nix/store/yzkh6mg18q5c2dxlrsdi750imm41div4-gojq-0.12.14" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/v0xp7kzaaiqkmrqcpjgpap8llaa0pzh5-gojq-0.12.15", - "default": true - } - ], - "store_path": "/nix/store/v0xp7kzaaiqkmrqcpjgpap8llaa0pzh5-gojq-0.12.15" + "store_path": "/nix/store/xb0b2ng2m3xdm5iah0cjbqsaqiz87qza-gojq-0.12.14" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/lahf7ask3i06ycs0mb125rkx176krq0q-gojq-0.12.15", - "default": true - } - ], - "store_path": "/nix/store/lahf7ask3i06ycs0mb125rkx176krq0q-gojq-0.12.15" + "store_path": "/nix/store/1y68nsm5nx450lnvc6gr8as7231sfbhz-gojq-0.12.14" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/a6b7q5hdjzmfgq2ggx7lixc13gy979h7-gojq-0.12.15", - "default": true - } - ], - "store_path": "/nix/store/a6b7q5hdjzmfgq2ggx7lixc13gy979h7-gojq-0.12.15" + "store_path": "/nix/store/1ivsp6qjrkr3d2gzax6w8iai55qagliv-gojq-0.12.14" } } }, "golines@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#golines", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#golines", "source": "devbox-search", "version": "0.12.2", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/cgx4l2m6v0x827m2fyjrlqrv83dmahzq-golines-0.12.2", - "default": true - } - ], - "store_path": "/nix/store/cgx4l2m6v0x827m2fyjrlqrv83dmahzq-golines-0.12.2" + "store_path": "/nix/store/225jl3pgxsgivmvggjbijywn0vfc0nd1-golines-0.12.2" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/aafbk8ismkdyvvcj1zgf55d8k2bb76g7-golines-0.12.2", - "default": true - } - ], - "store_path": "/nix/store/aafbk8ismkdyvvcj1zgf55d8k2bb76g7-golines-0.12.2" + "store_path": "/nix/store/nvfxf1ss0f2kq6cj1apa86yn7sxgxyb2-golines-0.12.2" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/5mfbkv3hhal0awyjqcbpmdhm8f9d4mvr-golines-0.12.2", - "default": true - } - ], - "store_path": "/nix/store/5mfbkv3hhal0awyjqcbpmdhm8f9d4mvr-golines-0.12.2" + "store_path": "/nix/store/jyyd2n5vbwl95a6jkb3xficbj54p8fj4-golines-0.12.2" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/azw2ayvqq2vb98bk65wi9lh6adraric3-golines-0.12.2", - "default": true - } - ], - "store_path": "/nix/store/azw2ayvqq2vb98bk65wi9lh6adraric3-golines-0.12.2" + "store_path": "/nix/store/nach7a7wc17kb36pvfvjcbms2p99kfr5-golines-0.12.2" } } }, "goreleaser@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#goreleaser", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#goreleaser", "source": "devbox-search", - "version": "1.25.1", + "version": "1.24.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ilnb078zcij6ph351ll5fx29b2z2426i-goreleaser-1.25.1", - "default": true - } - ], - "store_path": "/nix/store/ilnb078zcij6ph351ll5fx29b2z2426i-goreleaser-1.25.1" + "store_path": "/nix/store/8dd7j0fgivrb62jq43pyvmmwz5q9qgas-goreleaser-1.24.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/007575nisbps89sgw675kw1f2w3q4jpx-goreleaser-1.25.1", - "default": true - } - ], - "store_path": "/nix/store/007575nisbps89sgw675kw1f2w3q4jpx-goreleaser-1.25.1" + "store_path": "/nix/store/d0z2c8vwijna7cfdp28r5kj6p5f1abzs-goreleaser-1.24.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/c2yy1f6a35vibr366hkszcfh3d9igsx2-goreleaser-1.25.1", - "default": true - } - ], - "store_path": "/nix/store/c2yy1f6a35vibr366hkszcfh3d9igsx2-goreleaser-1.25.1" + "store_path": "/nix/store/4rnps0ylkz2jaw1qdp29m0pyx62mkv93-goreleaser-1.24.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/fqjwqmd5wnxffzcs5r1qbh5a25nifjin-goreleaser-1.25.1", - "default": true - } - ], - "store_path": "/nix/store/fqjwqmd5wnxffzcs5r1qbh5a25nifjin-goreleaser-1.25.1" + "store_path": "/nix/store/ys8s2aigrqa8ylsj58wh3qvj61i0lirb-goreleaser-1.24.0" } } }, "gotestsum@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#gotestsum", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#gotestsum", "source": "devbox-search", "version": "1.10.1", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ig0lkm37qv1dwwcjwr86110wgkr6ifdj-gotestsum-1.10.1", - "default": true - } - ], - "store_path": "/nix/store/ig0lkm37qv1dwwcjwr86110wgkr6ifdj-gotestsum-1.10.1" + "store_path": "/nix/store/0z0jj1xpcnbgmfymdll7qjggffv6x09f-gotestsum-1.10.1" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/zx1qgqrjh64mzghizb5aqrpn5w6m9cwy-gotestsum-1.10.1", - "default": true - } - ], - "store_path": "/nix/store/zx1qgqrjh64mzghizb5aqrpn5w6m9cwy-gotestsum-1.10.1" + "store_path": "/nix/store/ii73x40gwzwgm7wp5svkay6k65w722ab-gotestsum-1.10.1" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/n5gzxnld94v1z2fdqpadav2ncs21fx0a-gotestsum-1.10.1", - "default": true - } - ], - "store_path": "/nix/store/n5gzxnld94v1z2fdqpadav2ncs21fx0a-gotestsum-1.10.1" + "store_path": "/nix/store/glqkgvz7ll2vg7mfm1nlrd49a1dwfpb2-gotestsum-1.10.1" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/nq7a90jrbzykxwsgd57sgyqnhj141xix-gotestsum-1.10.1", - "default": true - } - ], - "store_path": "/nix/store/nq7a90jrbzykxwsgd57sgyqnhj141xix-gotestsum-1.10.1" + "store_path": "/nix/store/bydqdbg757r6g5r24bf6s7yb9zdc1q4d-gotestsum-1.10.1" } } }, "govulncheck@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#govulncheck", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#govulncheck", "source": "devbox-search", - "version": "1.1.0", + "version": "1.0.4", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3drkd0smbpn45r10nsw9pyql4ri627cj-govulncheck-1.1.0", - "default": true - } - ], - "store_path": "/nix/store/3drkd0smbpn45r10nsw9pyql4ri627cj-govulncheck-1.1.0" + "store_path": "/nix/store/kcqx91mgrw03wgqzzx96xprfjzkkss96-govulncheck-1.0.4" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/nhcv6r6m29x502f1sh16v4ybdn2nz940-govulncheck-1.1.0", - "default": true - } - ], - "store_path": "/nix/store/nhcv6r6m29x502f1sh16v4ybdn2nz940-govulncheck-1.1.0" + "store_path": "/nix/store/4m6afbm7qm1rq5ql9a0x4xcyzlj5i627-govulncheck-1.0.4" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/lp9ak63fvb63vjl05fadbaylb1p7k53j-govulncheck-1.1.0", - "default": true - } - ], - "store_path": "/nix/store/lp9ak63fvb63vjl05fadbaylb1p7k53j-govulncheck-1.1.0" + "store_path": "/nix/store/nx4dsdypvbvizasrgjhpv82kw0fjlgm4-govulncheck-1.0.4" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/il628qrar7dkz9cb3c6d7l5sagc56rkz-govulncheck-1.1.0", - "default": true - } - ], - "store_path": "/nix/store/il628qrar7dkz9cb3c6d7l5sagc56rkz-govulncheck-1.1.0" + "store_path": "/nix/store/kp3rjfdaxjx0m021nxp0kng5xx26p2j5-govulncheck-1.0.4" } } }, "helm-docs@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#helm-docs", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#helm-docs", "source": "devbox-search", - "version": "1.13.1", + "version": "1.11.2", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/c2dc5mn43gyvafhaxvw99y1b4r59f1y3-helm-docs-1.13.1", - "default": true - } - ], - "store_path": "/nix/store/c2dc5mn43gyvafhaxvw99y1b4r59f1y3-helm-docs-1.13.1" + "store_path": "/nix/store/dkky99zsrdkwz9hxprsq5zzha94jsrbj-helm-docs-1.11.2" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/sd4zri0m7rim2vm87frh0dl6s1v23vnc-helm-docs-1.13.1", - "default": true - } - ], - "store_path": "/nix/store/sd4zri0m7rim2vm87frh0dl6s1v23vnc-helm-docs-1.13.1" + "store_path": "/nix/store/3wamvq5mnmayksx0yy5ch9zb8mq42hd2-helm-docs-1.11.2" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/cggw7gl27ch6jbah908f8gfxzbn40g66-helm-docs-1.13.1", - "default": true - } - ], - "store_path": "/nix/store/cggw7gl27ch6jbah908f8gfxzbn40g66-helm-docs-1.13.1" + "store_path": "/nix/store/1pfj5vzrss4xd34hi0b119hpm5ymd9hv-helm-docs-1.11.2" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/82vr534g0h22gjzzllwx35dqx9df5fk0-helm-docs-1.13.1", - "default": true - } - ], - "store_path": "/nix/store/82vr534g0h22gjzzllwx35dqx9df5fk0-helm-docs-1.13.1" + "store_path": "/nix/store/zdzdnhdbqfrm2lczw4h38ziipr4ixs1d-helm-docs-1.11.2" } } }, - "hugo@0.124.1": { - "last_modified": "2024-04-01T22:53:36-04:00", - "resolved": "github:NixOS/nixpkgs/080a4a27f206d07724b88da096e27ef63401a504#hugo", + "hugo@latest": { + "last_modified": "2024-03-17T10:00:07Z", + "resolved": "github:NixOS/nixpkgs/6af7e814afb3b62171eee1edc31989ee61528d25#hugo", "source": "devbox-search", - "version": "0.124.1", + "version": "0.124.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/svp323dq8pkvkdpgwm6kacirvj306gk7-hugo-0.124.1", - "default": true - } - ], - "store_path": "/nix/store/svp323dq8pkvkdpgwm6kacirvj306gk7-hugo-0.124.1" + "store_path": "/nix/store/rfkfvwigv0282mw24n3cdym7cyi542jy-hugo-0.124.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/23g4yy8nljj46iahh4h6hr9q5sbwl0sx-hugo-0.124.1", - "default": true - } - ], - "store_path": "/nix/store/23g4yy8nljj46iahh4h6hr9q5sbwl0sx-hugo-0.124.1" + "store_path": "/nix/store/0rnv4sichypqbprm4nqd0jjc27z5286c-hugo-0.124.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/nhfnhk99rwq5ving0adayix38m4kfkpq-hugo-0.124.1", - "default": true - } - ], - "store_path": "/nix/store/nhfnhk99rwq5ving0adayix38m4kfkpq-hugo-0.124.1" + "store_path": "/nix/store/ip5zhc1rf2li8cmjwffjrj42r7nkkj4a-hugo-0.124.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/4rwm1ni7hnhjlpn1v3w6g376hzkks7za-hugo-0.124.1", - "default": true - } - ], - "store_path": "/nix/store/4rwm1ni7hnhjlpn1v3w6g376hzkks7za-hugo-0.124.1" + "store_path": "/nix/store/8syg9xrkp3nbpb1r4b469068kvk8gq2a-hugo-0.124.0" } } }, "kind@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#kind", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#kind", "source": "devbox-search", "version": "0.22.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/7b44andnvna5df49kxck6i4va51y2izm-kind-0.22.0", - "default": true - } - ], - "store_path": "/nix/store/7b44andnvna5df49kxck6i4va51y2izm-kind-0.22.0" + "store_path": "/nix/store/87yk9f9zqzl4q6cawsw78l9c872xk3zb-kind-0.22.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/qjq6mvqrhyr4hwmx5bdnfhjjlvqqcznb-kind-0.22.0", - "default": true - } - ], - "store_path": "/nix/store/qjq6mvqrhyr4hwmx5bdnfhjjlvqqcznb-kind-0.22.0" + "store_path": "/nix/store/hd04jgix5j5dj1grcgh9wwlz636243h6-kind-0.22.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/dslzli66l7dhyqjwfs4r2j9bxdx0m23w-kind-0.22.0", - "default": true - } - ], - "store_path": "/nix/store/dslzli66l7dhyqjwfs4r2j9bxdx0m23w-kind-0.22.0" + "store_path": "/nix/store/114mq99ncln9x8h4mxpcjsflbh9qawxs-kind-0.22.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/nd4i4035fm5055m7y6j8pg5s24139ppf-kind-0.22.0", - "default": true - } - ], - "store_path": "/nix/store/nd4i4035fm5055m7y6j8pg5s24139ppf-kind-0.22.0" + "store_path": "/nix/store/d0wmw2i217vak50q2h94wic5ipi11jir-kind-0.22.0" } } }, "ko@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#ko", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#ko", "source": "devbox-search", "version": "0.15.2", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/fiv4qvv9qh9gyq1jklwv1s8dhbvqznbq-ko-0.15.2", - "default": true - } - ], - "store_path": "/nix/store/fiv4qvv9qh9gyq1jklwv1s8dhbvqznbq-ko-0.15.2" + "store_path": "/nix/store/5d6ri1axxv9cwsac5lg1vz288zk5vf3s-ko-0.15.2" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vk8yhsp9ar2c4vswvgr6kw79sr4prf5y-ko-0.15.2", - "default": true - } - ], - "store_path": "/nix/store/vk8yhsp9ar2c4vswvgr6kw79sr4prf5y-ko-0.15.2" + "store_path": "/nix/store/8d62nfbvadkbrqlp20451cm0pgp6zjxg-ko-0.15.2" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wzj6ljwz4z5vjw4pqd5zql47s5gdwbs0-ko-0.15.2", - "default": true - } - ], - "store_path": "/nix/store/wzj6ljwz4z5vjw4pqd5zql47s5gdwbs0-ko-0.15.2" + "store_path": "/nix/store/mbikn788gr04c9kkzkdic4w05l8nq7z9-ko-0.15.2" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/s8vviasrwpgcl5qafy0s9l3y9rpkznv6-ko-0.15.2", - "default": true - } - ], - "store_path": "/nix/store/s8vviasrwpgcl5qafy0s9l3y9rpkznv6-ko-0.15.2" + "store_path": "/nix/store/11h314lbbbj0989drrwc4bi2xrwvxywv-ko-0.15.2" } } }, "kubebuilder@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#kubebuilder", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#kubebuilder", "source": "devbox-search", - "version": "3.14.1", + "version": "3.14.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/0amj5zw2rka2zjvq076ljfn80pch4dsa-kubebuilder-3.14.1", - "default": true - } - ], - "store_path": "/nix/store/0amj5zw2rka2zjvq076ljfn80pch4dsa-kubebuilder-3.14.1" + "store_path": "/nix/store/yqlqfiab0nglynw6r74inrinbls15620-kubebuilder-3.14.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ckx2xzgy6h4qq1pqr7z8k39yg6s0spin-kubebuilder-3.14.1", - "default": true - } - ], - "store_path": "/nix/store/ckx2xzgy6h4qq1pqr7z8k39yg6s0spin-kubebuilder-3.14.1" + "store_path": "/nix/store/g4nbjgznx6rcrlpg3xn4ynyyr5wvczjp-kubebuilder-3.14.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/4zwb2jklg7wy2whkhp9wg5gnlqldms3a-kubebuilder-3.14.1", - "default": true - } - ], - "store_path": "/nix/store/4zwb2jklg7wy2whkhp9wg5gnlqldms3a-kubebuilder-3.14.1" + "store_path": "/nix/store/xc309p246h3q5xn9gzkh49qcglhfj6ra-kubebuilder-3.14.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/fswxi79rrm0qdqsv6njwmygyc8mzz6sy-kubebuilder-3.14.1", - "default": true - } - ], - "store_path": "/nix/store/fswxi79rrm0qdqsv6njwmygyc8mzz6sy-kubebuilder-3.14.1" + "store_path": "/nix/store/3rzgxlj6msggxpy8zdf6ffk197wnmywr-kubebuilder-3.14.0" } } }, "kubectl@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#kubectl", + "last_modified": "2024-03-18T12:38:16Z", + "resolved": "github:NixOS/nixpkgs/e367f7a1fb93137af22a3908f00b9a35e2d286a7#kubectl", + "source": "devbox-search", + "version": "1.29.3", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/qrfxb19jr53r2kcsvga8wvg25v5dwyjh-kubectl-1.29.3" + }, + "aarch64-linux": { + "store_path": "/nix/store/hmdnw2aivd5ywvg8h2d9sjghpp91jqmm-kubectl-1.29.3" + }, + "x86_64-darwin": { + "store_path": "/nix/store/1xvm25fyz9afncqgjxixjsjxfihvqf9k-kubectl-1.29.3" + }, + "x86_64-linux": { + "store_path": "/nix/store/xha7i9pddiz31bm9cr33njwnmzdpd3rf-kubectl-1.29.3" + } + } + }, + "kubernetes-controller-tools@latest": { + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#kubernetes-controller-tools", "source": "devbox-search", - "version": "1.29.4", + "version": "0.14.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wpjydnaaz6dahlavp8cll4afd9abgi9q-kubectl-1.29.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/7l0z7jvpnwmnj1g9pcflyfykn321xih4-kubectl-1.29.4-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/z5av2wbpms2bwqk5a009lf6lm44v288v-kubectl-1.29.4-convert" - } - ], - "store_path": "/nix/store/wpjydnaaz6dahlavp8cll4afd9abgi9q-kubectl-1.29.4" + "store_path": "/nix/store/jblk86f5bi2dwg2w8g42xl9mpw1yrbi4-controller-tools-0.14.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/hqd784c4j64nrd1rslb9f8c51qyk13vh-kubectl-1.29.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/kjarbx8gwdbjkaaahy4zdqa4g7nm2pv9-kubectl-1.29.4-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/d6qn1817mw5gx6r87v381pcv4myp0zm6-kubectl-1.29.4-convert" - } - ], - "store_path": "/nix/store/hqd784c4j64nrd1rslb9f8c51qyk13vh-kubectl-1.29.4" + "store_path": "/nix/store/sq48wn8yyqkya8as690h61d1dlxwlkbi-controller-tools-0.14.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/c6xmni82xxhwnzz1hsjs6vlf22j46i2q-kubectl-1.29.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/427pw654765qzbhqhnbxa5bfi3w7r2dg-kubectl-1.29.4-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/rzij99nbffblpxwrdwavw4h2iavgxzcz-kubectl-1.29.4-convert" - } - ], - "store_path": "/nix/store/c6xmni82xxhwnzz1hsjs6vlf22j46i2q-kubectl-1.29.4" + "store_path": "/nix/store/nm2vx0f6ajmqpbi2c6z8wani5f1fdqb4-controller-tools-0.14.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wvv8p10f1cz3wbikjhlvamqzhkb3khr4-kubectl-1.29.4", - "default": true - }, - { - "name": "man", - "path": "/nix/store/ydxqa2xl8hh4sg2n56zv59fmkq979zjm-kubectl-1.29.4-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/dp29pz35110sspxlbkn87nvjnannhnkv-kubectl-1.29.4-convert" - } - ], - "store_path": "/nix/store/wvv8p10f1cz3wbikjhlvamqzhkb3khr4-kubectl-1.29.4" + "store_path": "/nix/store/f8h9pj08ksm49v980yb0slzrbpqqc98r-controller-tools-0.14.0" } } }, "kubernetes-helm@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#kubernetes-helm", + "last_modified": "2024-03-14T09:34:31Z", + "resolved": "github:NixOS/nixpkgs/bd5ddf2c6bfafff031edf80221e1ee94e86ca10a#kubernetes-helm", "source": "devbox-search", - "version": "3.14.4", + "version": "3.14.3", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1rlaqgp0b551xzi4mi31wy2zwk3qbs4j-kubernetes-helm-3.14.4", - "default": true - } - ], - "store_path": "/nix/store/1rlaqgp0b551xzi4mi31wy2zwk3qbs4j-kubernetes-helm-3.14.4" + "store_path": "/nix/store/zy9621qww3klbwkffz2pp9kh3p0hdfs3-kubernetes-helm-3.14.3" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/jl1h7r1m77qi845ji1grrchgvcsjb7w6-kubernetes-helm-3.14.4", - "default": true - } - ], - "store_path": "/nix/store/jl1h7r1m77qi845ji1grrchgvcsjb7w6-kubernetes-helm-3.14.4" + "store_path": "/nix/store/ki8zl3ccm68ma3kyjcnzdgfh4wslr2l6-kubernetes-helm-3.14.3" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/hl7n59kix0bv78vgiq4irkscgyndm81h-kubernetes-helm-3.14.4", - "default": true - } - ], - "store_path": "/nix/store/hl7n59kix0bv78vgiq4irkscgyndm81h-kubernetes-helm-3.14.4" + "store_path": "/nix/store/l6d6j4q4af0dhmjha0c7d010f3hj16b6-kubernetes-helm-3.14.3" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/mg1wazgldz91y0k2nfks8w3imlpmf4k7-kubernetes-helm-3.14.4", - "default": true - } - ], - "store_path": "/nix/store/mg1wazgldz91y0k2nfks8w3imlpmf4k7-kubernetes-helm-3.14.4" + "store_path": "/nix/store/dnnm27a9s71pkgb7wjrdiw8gf9f7a003-kubernetes-helm-3.14.3" } } }, "kustomize@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#kustomize", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#kustomize", "source": "devbox-search", "version": "5.3.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wv3jslzlcnycaxp6h6ni5b6yl72is4yk-kustomize-5.3.0", - "default": true - } - ], - "store_path": "/nix/store/wv3jslzlcnycaxp6h6ni5b6yl72is4yk-kustomize-5.3.0" + "store_path": "/nix/store/452i1p4zhmbp0lij399pmlagvvhbz8qa-kustomize-5.3.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/n8ygx4ql0xsxyhmvdfx5l00nr2zy7dgy-kustomize-5.3.0", - "default": true - } - ], - "store_path": "/nix/store/n8ygx4ql0xsxyhmvdfx5l00nr2zy7dgy-kustomize-5.3.0" + "store_path": "/nix/store/db73m9xy7q4al1ypx3i4nbqw9wi25fpc-kustomize-5.3.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/9ywmswh6f6y3fwbmdibj9pgj86fd1vjj-kustomize-5.3.0", - "default": true - } - ], - "store_path": "/nix/store/9ywmswh6f6y3fwbmdibj9pgj86fd1vjj-kustomize-5.3.0" + "store_path": "/nix/store/r4kcp37cwrfskcdlk8r0hmwb5y6gh8lc-kustomize-5.3.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/i4bhj98f4qzn9kyl9k7kcq2r5y3qqm98-kustomize-5.3.0", - "default": true - } - ], - "store_path": "/nix/store/i4bhj98f4qzn9kyl9k7kcq2r5y3qqm98-kustomize-5.3.0" + "store_path": "/nix/store/y6q6p3fv79gahrkp6gz8q9lks4h0zgh8-kustomize-5.3.0" } } }, "pre-commit@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#pre-commit", + "last_modified": "2024-03-17T01:03:25Z", + "resolved": "github:NixOS/nixpkgs/299d4668ba61600311553920d9fd9c102145b2cb#pre-commit", "source": "devbox-search", - "version": "3.7.0", + "version": "3.6.2", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/4q72c7pb6ahlfc34lpn3gh3k0ljh6r1k-pre-commit-3.7.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/2w7785dpszplm9ld1lh0gq3m5hycllvi-pre-commit-3.7.0-dist" - } - ], - "store_path": "/nix/store/4q72c7pb6ahlfc34lpn3gh3k0ljh6r1k-pre-commit-3.7.0" + "store_path": "/nix/store/nwrn3g5v9bsrnd88v84q4q9japllx0jb-pre-commit-3.6.2" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/h0srwkpvqv6cp70pr829fs9admdjgnjy-pre-commit-3.7.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/xayj4a9i1a6lc1ifl6y8d0kl8a1nlkjm-pre-commit-3.7.0-dist" - } - ], - "store_path": "/nix/store/h0srwkpvqv6cp70pr829fs9admdjgnjy-pre-commit-3.7.0" + "store_path": "/nix/store/61bnh53x2c6laq7vd7ssr23wm85zifs6-pre-commit-3.6.2" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/a2xh7vi6q0xvzn3p9hp24jkqfzsx6q1w-pre-commit-3.7.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/pybic67ck38a828ywm3bh0k3c8mk1zq2-pre-commit-3.7.0-dist" - } - ], - "store_path": "/nix/store/a2xh7vi6q0xvzn3p9hp24jkqfzsx6q1w-pre-commit-3.7.0" + "store_path": "/nix/store/dpimv11qs1l3yyzb5nj94p2inpn35yj7-pre-commit-3.6.2" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/k66q5zjp47zkq10vlh8j6g2kyy4363fk-pre-commit-3.7.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/g4gk6fhcsc0hqabbi7cz6yhy4zma4z81-pre-commit-3.7.0-dist" - } - ], - "store_path": "/nix/store/k66q5zjp47zkq10vlh8j6g2kyy4363fk-pre-commit-3.7.0" + "store_path": "/nix/store/1n78gswil3nq9fdrff4rb2li4y45y5w4-pre-commit-3.6.2" } } }, "rsync@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#rsync", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#rsync", "source": "devbox-search", "version": "3.2.7", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/lmn0856fjg2h00dbkgd0yi7dg2i1czrq-rsync-3.2.7", - "default": true - } - ], - "store_path": "/nix/store/lmn0856fjg2h00dbkgd0yi7dg2i1czrq-rsync-3.2.7" + "store_path": "/nix/store/0kmy2vr9hznx2g22bvpavlcyrgjilx4z-rsync-3.2.7" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/plqiay0igxv3q4nf862libyma5sjzwfi-rsync-3.2.7", - "default": true - } - ], - "store_path": "/nix/store/plqiay0igxv3q4nf862libyma5sjzwfi-rsync-3.2.7" + "store_path": "/nix/store/554m9gj7cd3qc7d9yyhvrw6l5gxwsf84-rsync-3.2.7" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3ikzv9bs3hm26s4kahyvlc4l3frydc52-rsync-3.2.7", - "default": true - } - ], - "store_path": "/nix/store/3ikzv9bs3hm26s4kahyvlc4l3frydc52-rsync-3.2.7" + "store_path": "/nix/store/3f6wicmglmb803anbavd1gagbq16gqpb-rsync-3.2.7" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/azidifgdi990qzks68gcg0xj0cpffpbz-rsync-3.2.7", - "default": true - } - ], - "store_path": "/nix/store/azidifgdi990qzks68gcg0xj0cpffpbz-rsync-3.2.7" + "store_path": "/nix/store/dc65w7qlnzqa9wfbyvyq5d8zv42v8zds-rsync-3.2.7" } } }, "shfmt@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#shfmt", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#shfmt", "source": "devbox-search", "version": "3.8.0", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/l8sm1992vmnmr8j99jh7q8byaclf1jv1-shfmt-3.8.0", - "default": true - } - ], - "store_path": "/nix/store/l8sm1992vmnmr8j99jh7q8byaclf1jv1-shfmt-3.8.0" + "store_path": "/nix/store/6sicjz0jhnsazn34g9hlsjb7a80zm9i5-shfmt-3.8.0" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/4g57adzvp11gwiv16n4bkc5ikzir4lml-shfmt-3.8.0", - "default": true - } - ], - "store_path": "/nix/store/4g57adzvp11gwiv16n4bkc5ikzir4lml-shfmt-3.8.0" + "store_path": "/nix/store/l2l4hxcqypaqbp7ia8ig05345yx0sq5m-shfmt-3.8.0" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/9ng247brll7wshkzjg63rip0qsa369h8-shfmt-3.8.0", - "default": true - } - ], - "store_path": "/nix/store/9ng247brll7wshkzjg63rip0qsa369h8-shfmt-3.8.0" + "store_path": "/nix/store/6vh95c1bvnxr08ccy3p3gi02gxam5bns-shfmt-3.8.0" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/w8rmc8xx4cs1kfjfy8cnsdcdipjipylf-shfmt-3.8.0", - "default": true - } - ], - "store_path": "/nix/store/w8rmc8xx4cs1kfjfy8cnsdcdipjipylf-shfmt-3.8.0" + "store_path": "/nix/store/sfdz20anszw4qfgwk71mmmfm0dzp94fv-shfmt-3.8.0" } } }, "yamale@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#yamale", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#yamale", "source": "devbox-search", - "version": "5.1.0", + "version": "4.0.4", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vncl67kx15diiiflpmk823xlxym41f1f-python3.11-yamale-5.1.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/6wrhh6j4n980kk6gakf160njc29qnmg5-python3.11-yamale-5.1.0-dist" - } - ], - "store_path": "/nix/store/vncl67kx15diiiflpmk823xlxym41f1f-python3.11-yamale-5.1.0" + "store_path": "/nix/store/78j6khza1gr5zmbcldssr8zm8xxnzwps-python3.11-yamale-4.0.4" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/8118jblrawm0lmd32s3n8szilw2iqrsk-python3.11-yamale-5.1.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/j3c59wd7g2bl3p0qsk2slv611mvz3i35-python3.11-yamale-5.1.0-dist" - } - ], - "store_path": "/nix/store/8118jblrawm0lmd32s3n8szilw2iqrsk-python3.11-yamale-5.1.0" + "store_path": "/nix/store/9wdk342n50063l5y9idh4pl9gxvwdfyb-python3.11-yamale-4.0.4" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/is5753jsq1j5q1vnin6nbscn6clg064g-python3.11-yamale-5.1.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/faqxai1qf0d84dzvhl8x3likqb3y5i4h-python3.11-yamale-5.1.0-dist" - } - ], - "store_path": "/nix/store/is5753jsq1j5q1vnin6nbscn6clg064g-python3.11-yamale-5.1.0" + "store_path": "/nix/store/zy5pwvyhdyrkvgwwagf950pj0rvcdx68-python3.11-yamale-4.0.4" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1z3h3yqzlv2wgnvn9kdmlznlq0dwg8nl-python3.11-yamale-5.1.0", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/58inrgmiypszq3qi6s8hz3hmackrv37g-python3.11-yamale-5.1.0-dist" - } - ], - "store_path": "/nix/store/1z3h3yqzlv2wgnvn9kdmlznlq0dwg8nl-python3.11-yamale-5.1.0" + "store_path": "/nix/store/9pzsm66srma437qmn3inib0r40jjawkm-python3.11-yamale-4.0.4" } } }, "yamllint@latest": { - "last_modified": "2024-04-19T17:36:04-04:00", - "resolved": "github:NixOS/nixpkgs/92d295f588631b0db2da509f381b4fb1e74173c5#yamllint", + "last_modified": "2024-03-08T13:51:52Z", + "resolved": "github:NixOS/nixpkgs/a343533bccc62400e8a9560423486a3b6c11a23b#yamllint", "source": "devbox-search", "version": "1.35.1", "systems": { "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vd7zfjfphrbp62z5a355km2k1b5pcna2-python3.11-yamllint-1.35.1", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/81v5lk1warbhybasxf50af3p1bckypri-python3.11-yamllint-1.35.1-dist" - } - ], - "store_path": "/nix/store/vd7zfjfphrbp62z5a355km2k1b5pcna2-python3.11-yamllint-1.35.1" + "store_path": "/nix/store/shw3d5hqv1kjsxgs6favbb6icdf5zspz-python3.11-yamllint-1.35.1" }, "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/alway1qh97cggix9vmfpscs22hzflc77-python3.11-yamllint-1.35.1", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/5y3sw452d4anxs88j15vissb7q6qyi5a-python3.11-yamllint-1.35.1-dist" - } - ], - "store_path": "/nix/store/alway1qh97cggix9vmfpscs22hzflc77-python3.11-yamllint-1.35.1" + "store_path": "/nix/store/qhciblsdwcx382ybhv4qy3pv321rprpn-python3.11-yamllint-1.35.1" }, "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/i67vc49gcvlvx1z8is15nb3k5yqvnqjr-python3.11-yamllint-1.35.1", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/zclqzl9lfajahf4pxw88gv1k52gv1cx4-python3.11-yamllint-1.35.1-dist" - } - ], - "store_path": "/nix/store/i67vc49gcvlvx1z8is15nb3k5yqvnqjr-python3.11-yamllint-1.35.1" + "store_path": "/nix/store/0qjkix7ixdmh056zg2w98yqfx31ip722-python3.11-yamllint-1.35.1" }, "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/6bak83f1ib271wfl5ybw4m7vw5qr34kk-python3.11-yamllint-1.35.1", - "default": true - }, - { - "name": "dist", - "path": "/nix/store/hl6l62im8mnxldvqpifi62n8abnwbi93-python3.11-yamllint-1.35.1-dist" - } - ], - "store_path": "/nix/store/6bak83f1ib271wfl5ybw4m7vw5qr34kk-python3.11-yamllint-1.35.1" + "store_path": "/nix/store/04jdxm8pyzbsg9vjgs0y1piglnn6bzny-python3.11-yamllint-1.35.1" } } } diff --git a/test/e2e/addon_helpers.go b/test/e2e/addon_helpers.go index fdca15eae..45c8232ef 100644 --- a/test/e2e/addon_helpers.go +++ b/test/e2e/addon_helpers.go @@ -53,4 +53,17 @@ func WaitForAddonsToBeReadyInWorkloadCluster( ClusterResourceSetIntervals: input.ClusterResourceSetIntervals, }, ) + + WaitForClusterAutoscalerToBeReadyInWorkloadCluster( + ctx, + WaitForClusterAutoscalerToBeReadyInWorkloadClusterInput{ + ClusterAutoscaler: input.AddonsConfig.ClusterAutoscaler, + WorkloadCluster: input.WorkloadCluster, + ClusterProxy: input.ClusterProxy, + DeploymentIntervals: input.DeploymentIntervals, + DaemonSetIntervals: input.DaemonSetIntervals, + HelmReleaseIntervals: input.HelmReleaseIntervals, + ClusterResourceSetIntervals: input.ClusterResourceSetIntervals, + }, + ) } diff --git a/test/e2e/clusterautoscaler_helpers.go b/test/e2e/clusterautoscaler_helpers.go new file mode 100644 index 000000000..7244a62d5 --- /dev/null +++ b/test/e2e/clusterautoscaler_helpers.go @@ -0,0 +1,93 @@ +//go:build e2e + +// Copyright 2024 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package e2e + +import ( + "context" + "fmt" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/test/framework" + + "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1" + "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/common/pkg/capi/utils" +) + +const clusterAutoscalerPrefix = "cluster-autoscaler-" + +type WaitForClusterAutoscalerToBeReadyInWorkloadClusterInput struct { + ClusterAutoscaler *v1alpha1.ClusterAutoscaler + WorkloadCluster *clusterv1.Cluster + ClusterProxy framework.ClusterProxy + DeploymentIntervals []interface{} + DaemonSetIntervals []interface{} + HelmReleaseIntervals []interface{} + ClusterResourceSetIntervals []interface{} +} + +func WaitForClusterAutoscalerToBeReadyInWorkloadCluster( + ctx context.Context, + input WaitForClusterAutoscalerToBeReadyInWorkloadClusterInput, //nolint:gocritic // This hugeParam is OK in tests. +) { + if input.ClusterAutoscaler == nil { + return + } + + workloadClusterClient := input.ClusterProxy.GetWorkloadCluster( + ctx, input.WorkloadCluster.Namespace, input.WorkloadCluster.Name, + ).GetClient() + // Only check for ClusterAutoscaler if the cluster is self-managed. + // managementCluster will be nil if workloadClusterClient is not a self-managed cluster. + managementCluster, err := utils.ManagementCluster(ctx, workloadClusterClient) + Expect(err).NotTo(HaveOccurred()) + if managementCluster == nil { + return + } + + switch input.ClusterAutoscaler.Strategy { + case v1alpha1.AddonStrategyClusterResourceSet: + waitForClusterResourceSetToApplyResourcesInCluster( + ctx, + waitForClusterResourceSetToApplyResourcesInClusterInput{ + name: clusterAutoscalerPrefix + input.WorkloadCluster.Name, + clusterProxy: input.ClusterProxy, + cluster: input.WorkloadCluster, + intervals: input.ClusterResourceSetIntervals, + }, + ) + case v1alpha1.AddonStrategyHelmAddon: + WaitForHelmReleaseProxyReadyForCluster( + ctx, + WaitForHelmReleaseProxyReadyForClusterInput{ + GetLister: input.ClusterProxy.GetClient(), + Cluster: input.WorkloadCluster, + HelmChartProxyName: clusterAutoscalerPrefix + input.WorkloadCluster.Name, + }, + input.HelmReleaseIntervals..., + ) + default: + Fail( + fmt.Sprintf( + "Do not know how to wait for cluster autoscaler using strategy %s to be ready", + input.ClusterAutoscaler.Strategy, + ), + ) + } + + WaitForDeploymentsAvailable(ctx, framework.WaitForDeploymentsAvailableInput{ + Getter: workloadClusterClient, + Deployment: &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterAutoscalerPrefix + input.WorkloadCluster.Name, + Namespace: input.WorkloadCluster.Namespace, + }, + }, + }, input.DeploymentIntervals...) +} diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 59bd79de5..184e2c90f 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -27,7 +27,7 @@ import ( "sigs.k8s.io/cluster-api/test/framework/clusterctl" ctrl "sigs.k8s.io/controller-runtime" - addonsv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/external/sigs.k8s.io/cluster-api-addon-provider-helm/api/v1alpha1" + helmaddonsv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/external/sigs.k8s.io/cluster-api-addon-provider-helm/api/v1alpha1" "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/test/framework/bootstrap" clusterctltemp "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/test/framework/clusterctl" ) @@ -205,7 +205,7 @@ func createClusterctlLocalRepository(config *clusterctl.E2EConfig, repositoryFol func initScheme() *runtime.Scheme { scheme := runtime.NewScheme() framework.TryAddDefaultSchemes(scheme) - Expect(addonsv1.AddToScheme(scheme)).To(Succeed()) + Expect(helmaddonsv1.AddToScheme(scheme)).To(Succeed()) return scheme } diff --git a/test/e2e/framework/self_hosted.go b/test/e2e/framework/self_hosted.go new file mode 100644 index 000000000..43876ea2c --- /dev/null +++ b/test/e2e/framework/self_hosted.go @@ -0,0 +1,482 @@ +//go:build e2e + +// Copyright 2024 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package framework + +import ( + "context" + "fmt" + "os" + "path/filepath" + "slices" + "strings" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/klog/v2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" + capie2e "sigs.k8s.io/cluster-api/test/e2e" + "sigs.k8s.io/cluster-api/test/framework" + "sigs.k8s.io/cluster-api/test/framework/bootstrap" + "sigs.k8s.io/cluster-api/test/framework/clusterctl" + "sigs.k8s.io/cluster-api/util" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// SelfHostedSpecInput is the input for SelfHostedSpec. +type SelfHostedSpecInput struct { + E2EConfig *clusterctl.E2EConfig + ClusterctlConfigPath string + BootstrapClusterProxy framework.ClusterProxy + ArtifactFolder string + SkipCleanup bool + ControlPlaneWaiters clusterctl.ControlPlaneWaiters + Flavor string + + // InfrastructureProviders specifies the infrastructure to use for clusterctl + // operations (Example: get cluster templates). + // Note: In most cases this need not be specified. It only needs to be specified when + // multiple infrastructure providers (ex: CAPD + in-memory) are installed on the cluster as clusterctl will not be + // able to identify the default. + InfrastructureProvider *string + + // SkipUpgrade skip the upgrade of the self-hosted clusters kubernetes version. + // If true, the variable KUBERNETES_VERSION is expected to be set. + // If false, the variables KUBERNETES_VERSION_UPGRADE_FROM, KUBERNETES_VERSION_UPGRADE_TO, + // ETCD_VERSION_UPGRADE_TO and COREDNS_VERSION_UPGRADE_TO are expected to be set. + // There are also (optional) variables CONTROL_PLANE_MACHINE_TEMPLATE_UPGRADE_TO and + // WORKERS_MACHINE_TEMPLATE_UPGRADE_TO to change the infrastructure machine template + // during the upgrade. Note that these templates need to have the clusterctl.cluster.x-k8s.io/move + // label in order to be moved to the self hosted cluster (since they are not part of the owner chain). + SkipUpgrade bool + + // ControlPlaneMachineCount is used in `config cluster` to configure the count of the control plane machines used in + // the test. + // Default is 1. + ControlPlaneMachineCount *int64 + + // WorkerMachineCount is used in `config cluster` to configure the count of the worker machines used in the test. + // NOTE: If the WORKER_MACHINE_COUNT var is used multiple times in the cluster template, the absolute count of + // worker machines is a multiple of WorkerMachineCount. + // Default is 1. + WorkerMachineCount *int64 + + // PostClusterMoved is a function that is called after the cluster is moved to self-hosted. + PostClusterMoved func(proxy framework.ClusterProxy, cluster *clusterv1.Cluster) +} + +// SelfHostedSpec implements a test that verifies Cluster API creating a cluster, pivoting to a self-hosted cluster. +func SelfHostedSpec(ctx context.Context, inputGetter func() SelfHostedSpecInput) { + var ( + specName = "self-hosted" + input SelfHostedSpecInput + namespace *corev1.Namespace + cancelWatches context.CancelFunc + clusterResources *clusterctl.ApplyClusterTemplateAndWaitResult + + selfHostedClusterProxy framework.ClusterProxy + selfHostedNamespace *corev1.Namespace + selfHostedCancelWatches context.CancelFunc + selfHostedCluster *clusterv1.Cluster + + controlPlaneMachineCount int64 + workerMachineCount int64 + + kubernetesVersion string + ) + + BeforeEach(func() { + Expect(ctx).NotTo(BeNil(), "ctx is required for %s spec", specName) + input = inputGetter() + Expect(input.E2EConfig).ToNot( + BeNil(), + "Invalid argument. input.E2EConfig can't be nil when calling %s spec", specName, + ) + Expect(input.ClusterctlConfigPath).To( + BeAnExistingFile(), + "Invalid argument. input.ClusterctlConfigPath must be an existing file when calling %s spec", specName, + ) + Expect(input.BootstrapClusterProxy).ToNot( + BeNil(), + "Invalid argument. input.BootstrapClusterProxy can't be nil when calling %s spec", specName, + ) + Expect(os.MkdirAll(input.ArtifactFolder, 0o750)).To( + Succeed(), + "Invalid argument. input.ArtifactFolder can't be created for %s spec", specName, + ) + + // Use KubernetesVersion if no upgrade step is defined by test input. + Expect(input.E2EConfig.Variables).To(HaveKey(capie2e.KubernetesVersion)) + kubernetesVersion = input.E2EConfig.GetVariable(capie2e.KubernetesVersion) + + // Setup a Namespace where to host objects for this spec and create a watcher for the namespace events. + namespace, cancelWatches = setupSpecNamespace( + ctx, + specName, + input.BootstrapClusterProxy, + input.ArtifactFolder, + ) + clusterResources = new(clusterctl.ApplyClusterTemplateAndWaitResult) + + if input.ControlPlaneMachineCount == nil { + controlPlaneMachineCount = 1 + } else { + controlPlaneMachineCount = *input.ControlPlaneMachineCount + } + + if input.WorkerMachineCount == nil { + workerMachineCount = 1 + } else { + workerMachineCount = *input.WorkerMachineCount + } + }) + + It("Should pivot the bootstrap cluster to a self-hosted cluster", func() { + By("Creating a workload cluster") + + workloadClusterName := fmt.Sprintf("%s-%s", specName, util.RandomString(6)) + clusterctlVariables := map[string]string{} + + // In case the infrastructure-docker provider is installed, ensure to add the preload images variable to load the + // controller images into the nodes. + // NOTE: we are checking the bootstrap cluster and assuming the workload cluster will be on the same infrastructure + // provider. Also, given that we use it to set a variable, then it is up to cluster templates to use it or not. + hasDockerInfrastructureProvider := hasProvider( + ctx, + input.BootstrapClusterProxy.GetClient(), + "infrastructure-docker", + ) + + // In case the infrastructure-docker provider is installed, ensure to add the preload images variable to load the + // controller images into the nodes. + if hasDockerInfrastructureProvider { + images := []string{} + for _, image := range input.E2EConfig.Images { + images = append(images, fmt.Sprintf("%q", image.Name)) + } + clusterctlVariables["DOCKER_PRELOAD_IMAGES"] = `[` + strings.Join(images, ",") + `]` + } + + infrastructureProvider := clusterctl.DefaultInfrastructureProvider + if input.InfrastructureProvider != nil { + infrastructureProvider = *input.InfrastructureProvider + } + clusterctl.ApplyClusterTemplateAndWait(ctx, clusterctl.ApplyClusterTemplateAndWaitInput{ + ClusterProxy: input.BootstrapClusterProxy, + ConfigCluster: clusterctl.ConfigClusterInput{ + LogFolder: filepath.Join( + input.ArtifactFolder, + "clusters", + input.BootstrapClusterProxy.GetName(), + ), + ClusterctlConfigPath: input.ClusterctlConfigPath, + KubeconfigPath: input.BootstrapClusterProxy.GetKubeconfigPath(), + InfrastructureProvider: infrastructureProvider, + Flavor: input.Flavor, + Namespace: namespace.Name, + ClusterName: workloadClusterName, + KubernetesVersion: kubernetesVersion, + ControlPlaneMachineCount: &controlPlaneMachineCount, + WorkerMachineCount: &workerMachineCount, + ClusterctlVariables: clusterctlVariables, + }, + ControlPlaneWaiters: input.ControlPlaneWaiters, + WaitForClusterIntervals: input.E2EConfig.GetIntervals(specName, "wait-cluster"), + WaitForControlPlaneIntervals: input.E2EConfig.GetIntervals( + specName, + "wait-control-plane", + ), + WaitForMachineDeployments: input.E2EConfig.GetIntervals( + specName, + "wait-worker-nodes", + ), + }, clusterResources) + + if infrastructureProvider == "docker" { + By("Loading CAPI runtime extensions image to the workload cluster") + Expect(bootstrap.LoadImagesToKindCluster(ctx, bootstrap.LoadImagesToKindClusterInput{ + Name: workloadClusterName, + Images: input.E2EConfig.Images, + })).To(Succeed()) + } + + By("Turning the workload cluster into a management cluster") + cluster := clusterResources.Cluster + // Get a ClusterBroker so we can interact with the workload cluster + selfHostedClusterProxy = input.BootstrapClusterProxy.GetWorkloadCluster( + ctx, + cluster.Namespace, + cluster.Name, + framework.WithMachineLogCollector(input.BootstrapClusterProxy.GetLogCollector()), + ) + + capie2e.Byf("Creating a namespace for hosting the %s test spec", specName) + selfHostedNamespace, selfHostedCancelWatches = framework.CreateNamespaceAndWatchEvents( + ctx, + framework.CreateNamespaceAndWatchEventsInput{ + Creator: selfHostedClusterProxy.GetClient(), + ClientSet: selfHostedClusterProxy.GetClientSet(), + Name: namespace.Name, + LogFolder: filepath.Join(input.ArtifactFolder, "clusters", "bootstrap"), + IgnoreAlreadyExists: true, + }, + ) + + By("Initializing the workload cluster") + // watchesCtx is used in log streaming to be able to get canceld via cancelWatches after ending the test suite. + watchesCtx, cancelWatches := context.WithCancel(ctx) + defer cancelWatches() + clusterctl.InitManagementClusterAndWatchControllerLogs( + watchesCtx, + clusterctl.InitManagementClusterAndWatchControllerLogsInput{ + ClusterProxy: selfHostedClusterProxy, + ClusterctlConfigPath: input.ClusterctlConfigPath, + InfrastructureProviders: input.E2EConfig.InfrastructureProviders(), + IPAMProviders: input.E2EConfig.IPAMProviders(), + RuntimeExtensionProviders: input.E2EConfig.RuntimeExtensionProviders(), + AddonProviders: input.E2EConfig.AddonProviders(), + LogFolder: filepath.Join( + input.ArtifactFolder, + "clusters", + cluster.Name, + ), + }, + input.E2EConfig.GetIntervals(specName, "wait-controllers")..., + ) + + By("Ensure API servers are stable before doing move") + // Nb. This check was introduced to prevent doing move to self-hosted in an aggressive way and thus avoid flakes. + // More specifically, we were observing the test failing to get objects from the API server during move, so we + // are now testing the API servers are stable before starting move. + Consistently(func() error { + kubeSystem := &corev1.Namespace{} + return input.BootstrapClusterProxy.GetClient(). + Get(ctx, client.ObjectKey{Name: "kube-system"}, kubeSystem) + }, "5s", "100ms").Should(BeNil(), "Failed to assert bootstrap API server stability") + Consistently(func() error { + kubeSystem := &corev1.Namespace{} + return selfHostedClusterProxy.GetClient(). + Get(ctx, client.ObjectKey{Name: "kube-system"}, kubeSystem) + }, "5s", "100ms").Should(BeNil(), "Failed to assert self-hosted API server stability") + + By("Moving the cluster to self hosted") + clusterctl.Move(ctx, clusterctl.MoveInput{ + LogFolder: filepath.Join(input.ArtifactFolder, "clusters", "bootstrap"), + ClusterctlConfigPath: input.ClusterctlConfigPath, + FromKubeconfigPath: input.BootstrapClusterProxy.GetKubeconfigPath(), + ToKubeconfigPath: selfHostedClusterProxy.GetKubeconfigPath(), + Namespace: namespace.Name, + }) + + By("Waiting for the cluster to be reconciled after moving to self hosted") + selfHostedCluster = framework.DiscoveryAndWaitForCluster( + ctx, + framework.DiscoveryAndWaitForClusterInput{ + Getter: selfHostedClusterProxy.GetClient(), + Namespace: selfHostedNamespace.Name, + Name: cluster.Name, + }, + input.E2EConfig.GetIntervals(specName, "wait-cluster")...) + + if input.PostClusterMoved != nil { + By("Running the post-cluster moved function") + input.PostClusterMoved( + selfHostedClusterProxy, + selfHostedCluster, + ) + } + + By("PASSED!") + }) + + AfterEach(func() { + if selfHostedNamespace != nil { + // Dump all Cluster API related resources to artifacts before pivoting back. + dumpAllResources( + ctx, + selfHostedClusterProxy, + input.ArtifactFolder, + namespace, + clusterResources.Cluster, + ) + } + if selfHostedCluster != nil { + By("Ensure API servers are stable before doing move") + // Nb. This check was introduced to prevent doing move back to bootstrap in an aggressive way and thus avoid + // flakes. More specifically, we were observing the test failing to get objects from the API server during move, + // so we are now testing the API servers are stable before starting move. + Consistently(func() error { + kubeSystem := &corev1.Namespace{} + return input.BootstrapClusterProxy.GetClient(). + Get(ctx, client.ObjectKey{Name: "kube-system"}, kubeSystem) + }, "5s", "100ms").Should(BeNil(), "Failed to assert bootstrap API server stability") + Consistently(func() error { + kubeSystem := &corev1.Namespace{} + return selfHostedClusterProxy.GetClient(). + Get(ctx, client.ObjectKey{Name: "kube-system"}, kubeSystem) + }, "5s", "100ms").Should(BeNil(), "Failed to assert self-hosted API server stability") + + By("Moving the cluster back to bootstrap") + clusterctl.Move(ctx, clusterctl.MoveInput{ + LogFolder: filepath.Join( + input.ArtifactFolder, + "clusters", + clusterResources.Cluster.Name, + ), + ClusterctlConfigPath: input.ClusterctlConfigPath, + FromKubeconfigPath: selfHostedClusterProxy.GetKubeconfigPath(), + ToKubeconfigPath: input.BootstrapClusterProxy.GetKubeconfigPath(), + Namespace: selfHostedNamespace.Name, + }) + + By("Waiting for the cluster to be reconciled after moving back to bootstrap") + clusterResources.Cluster = framework.DiscoveryAndWaitForCluster( + ctx, + framework.DiscoveryAndWaitForClusterInput{ + Getter: input.BootstrapClusterProxy.GetClient(), + Namespace: namespace.Name, + Name: clusterResources.Cluster.Name, + }, + input.E2EConfig.GetIntervals(specName, "wait-cluster")...) + } + if selfHostedCancelWatches != nil { + selfHostedCancelWatches() + } + + // Dumps all the resources in the spec namespace, then cleanups the cluster object and the spec namespace itself. + dumpSpecResourcesAndCleanup( + ctx, + specName, + input.BootstrapClusterProxy, + input.ArtifactFolder, + namespace, + cancelWatches, + clusterResources.Cluster, + input.E2EConfig.GetIntervals, + input.SkipCleanup, + ) + }) +} + +func hasProvider(ctx context.Context, c client.Client, providerName string) bool { + providerList := clusterctlv1.ProviderList{} + Eventually(func() error { + return c.List(ctx, &providerList) + }, "1m", "5s").Should(Succeed(), "Failed to list the Providers") + + return slices.ContainsFunc(providerList.Items, func(provider clusterctlv1.Provider) bool { + return provider.GetName() == providerName + }) +} + +func setupSpecNamespace( + ctx context.Context, + specName string, + clusterProxy framework.ClusterProxy, + artifactFolder string, +) (*corev1.Namespace, context.CancelFunc) { + capie2e.Byf("Creating a namespace for hosting the %q test spec", specName) + namespace, cancelWatches := framework.CreateNamespaceAndWatchEvents( + ctx, + framework.CreateNamespaceAndWatchEventsInput{ + Creator: clusterProxy.GetClient(), + ClientSet: clusterProxy.GetClientSet(), + Name: fmt.Sprintf("%s-%s", specName, util.RandomString(6)), + LogFolder: filepath.Join(artifactFolder, "clusters", clusterProxy.GetName()), + }, + ) + + return namespace, cancelWatches +} + +// dumpAllResources dumps all the resources in the spec namespace and the workload cluster. +func dumpAllResources( + ctx context.Context, + clusterProxy framework.ClusterProxy, + artifactFolder string, + namespace *corev1.Namespace, + cluster *clusterv1.Cluster, +) { + capie2e.Byf("Dumping logs from the %q workload cluster", cluster.Name) + + // Dump all the logs from the workload cluster. + clusterProxy.CollectWorkloadClusterLogs( + ctx, + cluster.Namespace, + cluster.Name, + filepath.Join(artifactFolder, "clusters", cluster.Name), + ) + + capie2e.Byf("Dumping all the Cluster API resources in the %q namespace", namespace.Name) + + // Dump all Cluster API related resources to artifacts. + framework.DumpAllResources(ctx, framework.DumpAllResourcesInput{ + Lister: clusterProxy.GetClient(), + Namespace: namespace.Name, + LogPath: filepath.Join(artifactFolder, "clusters", clusterProxy.GetName(), "resources"), + }) + + // If the cluster still exists, dump pods and nodes of the workload cluster. + if err := clusterProxy.GetClient().Get(ctx, client.ObjectKeyFromObject(cluster), &clusterv1.Cluster{}); err == nil { + capie2e.Byf("Dumping Pods and Nodes of Cluster %s", klog.KObj(cluster)) + framework.DumpResourcesForCluster(ctx, framework.DumpResourcesForClusterInput{ + Lister: clusterProxy.GetWorkloadCluster(ctx, cluster.Namespace, cluster.Name). + GetClient(), + Cluster: cluster, + LogPath: filepath.Join(artifactFolder, "clusters", cluster.Name, "resources"), + Resources: []framework.DumpNamespaceAndGVK{ + { + GVK: schema.GroupVersionKind{ + Version: corev1.SchemeGroupVersion.Version, + Kind: "Pod", + }, + }, + { + GVK: schema.GroupVersionKind{ + Version: corev1.SchemeGroupVersion.Version, + Kind: "Node", + }, + }, + }, + }) + } +} + +// dumpSpecResourcesAndCleanup dumps all the resources in the spec namespace and cleans up the spec namespace. +func dumpSpecResourcesAndCleanup( + ctx context.Context, + specName string, + clusterProxy framework.ClusterProxy, + artifactFolder string, + namespace *corev1.Namespace, + cancelWatches context.CancelFunc, + cluster *clusterv1.Cluster, + intervalsGetter func(spec, key string) []interface{}, + skipCleanup bool, +) { + // Dump all the resources in the spec namespace and the workload cluster. + dumpAllResources(ctx, clusterProxy, artifactFolder, namespace, cluster) + + if !skipCleanup { + capie2e.Byf("Deleting cluster %s", klog.KObj(cluster)) + // While https://github.com/kubernetes-sigs/cluster-api/issues/2955 is addressed in future iterations, there is a + // chance that cluster variable is not set even if the cluster exists, so we are calling DeleteAllClustersAndWait + // instead of DeleteClusterAndWait + framework.DeleteAllClustersAndWait(ctx, framework.DeleteAllClustersAndWaitInput{ + Client: clusterProxy.GetClient(), + Namespace: namespace.Name, + }, intervalsGetter(specName, "wait-delete-cluster")...) + + capie2e.Byf("Deleting namespace used for hosting the %q test spec", specName) + framework.DeleteNamespace(ctx, framework.DeleteNamespaceInput{ + Deleter: clusterProxy.GetClient(), + Name: namespace.Name, + }) + } + cancelWatches() +} diff --git a/test/e2e/helmreleaseproxy_helpers.go b/test/e2e/helmreleaseproxy_helpers.go index 1b4769283..4ede2293e 100644 --- a/test/e2e/helmreleaseproxy_helpers.go +++ b/test/e2e/helmreleaseproxy_helpers.go @@ -17,7 +17,7 @@ import ( "sigs.k8s.io/cluster-api/util/conditions" ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" - addonsv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/external/sigs.k8s.io/cluster-api-addon-provider-helm/api/v1alpha1" + helmaddonsv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/external/sigs.k8s.io/cluster-api-addon-provider-helm/api/v1alpha1" ) // WaitForHelmReleaseProxyReadyInput is the input for WaitForHelmReleaseProxyReady. @@ -66,12 +66,12 @@ func getHelmReleaseProxy( clusterName string, clusterNamespace string, helmChartProxyName string, -) (*addonsv1.HelmReleaseProxy, error) { +) (*helmaddonsv1.HelmReleaseProxy, error) { // Get the HelmReleaseProxy using label selectors since we don't know the name of the HelmReleaseProxy. - releaseList := &addonsv1.HelmReleaseProxyList{} + releaseList := &helmaddonsv1.HelmReleaseProxyList{} labels := map[string]string{ - clusterv1.ClusterNameLabel: clusterName, - addonsv1.HelmChartProxyLabelName: helmChartProxyName, + clusterv1.ClusterNameLabel: clusterName, + helmaddonsv1.HelmChartProxyLabelName: helmChartProxyName, } if err := getLister.List( ctx, diff --git a/test/e2e/nfd_helpers.go b/test/e2e/nfd_helpers.go index 8a8306d45..a5600bcb4 100644 --- a/test/e2e/nfd_helpers.go +++ b/test/e2e/nfd_helpers.go @@ -60,7 +60,7 @@ func WaitForNFDToBeReadyInWorkloadCluster( default: Fail( fmt.Sprintf( - "Do not know how to wait for Calico using strategy %s to be ready", + "Do not know how to wait for NFD using strategy %s to be ready", input.NFD.Strategy, ), ) diff --git a/test/e2e/quick_start_test.go b/test/e2e/quick_start_test.go index d2d805fca..4b5763e2c 100644 --- a/test/e2e/quick_start_test.go +++ b/test/e2e/quick_start_test.go @@ -42,9 +42,7 @@ var _ = Describe("Quick start", Serial, func() { ) Context( flavour, - Label( - "provider:"+provider, - ), + Label("provider:"+provider), Label("cni:"+cniProvider), Label("addonStrategy:"+addonStrategy), func() { diff --git a/test/e2e/self_hosted_test.go b/test/e2e/self_hosted_test.go new file mode 100644 index 000000000..229dd1db2 --- /dev/null +++ b/test/e2e/self_hosted_test.go @@ -0,0 +1,111 @@ +//go:build e2e + +// Copyright 2024 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package e2e + +import ( + "fmt" + "strings" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "k8s.io/utils/ptr" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + capiframework "sigs.k8s.io/cluster-api/test/framework" + + "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1" + "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/variables" + "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/clusterconfig" + "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/test/e2e/framework" +) + +var _ = Describe("Self-hosted", Serial, func() { + provider := "Docker" + lowercaseProvider := strings.ToLower(provider) + for _, cniProvider := range []string{"Cilium", "Calico"} { + for _, addonStrategy := range []string{"HelmAddon", "ClusterResourceSet"} { + strategy := "" + switch addonStrategy { + case "HelmAddon": + strategy = "helm-addon" + case "ClusterResourceSet": + strategy = "crs" + default: + Fail("unknown addon strategy: " + addonStrategy) + } + flavour := fmt.Sprintf( + "topology-%s-%s", + strings.ToLower(cniProvider), + strategy, + ) + Context( + flavour, + Label("provider:"+provider), + Label("cni:"+cniProvider), + Label("addonStrategy:"+addonStrategy), + func() { + framework.SelfHostedSpec(ctx, func() framework.SelfHostedSpecInput { + return framework.SelfHostedSpecInput{ + E2EConfig: e2eConfig, + ClusterctlConfigPath: clusterctlConfigPath, + BootstrapClusterProxy: bootstrapClusterProxy, + ArtifactFolder: artifactFolder, + SkipCleanup: skipCleanup, + Flavor: flavour, + InfrastructureProvider: ptr.To(lowercaseProvider), + PostClusterMoved: func(proxy capiframework.ClusterProxy, cluster *clusterv1.Cluster) { + By( + "Waiting for all requested addons to be ready in workload cluster", + ) + workloadCluster := capiframework.GetClusterByName( + ctx, + capiframework.GetClusterByNameInput{ + Namespace: cluster.GetNamespace(), + Name: cluster.GetName(), + Getter: proxy.GetClient(), + }, + ) + Expect(workloadCluster.Spec.Topology).ToNot(BeNil()) + clusterVars := variables.ClusterVariablesToVariablesMap( + workloadCluster.Spec.Topology.Variables, + ) + addonsConfig, err := variables.Get[v1alpha1.Addons]( + clusterVars, + clusterconfig.MetaVariableName, + "addons", + ) + Expect(err).ToNot(HaveOccurred()) + WaitForAddonsToBeReadyInWorkloadCluster( + ctx, + WaitForAddonsToBeReadyInWorkloadClusterInput{ + AddonsConfig: addonsConfig, + ClusterProxy: proxy, + WorkloadCluster: workloadCluster, + DeploymentIntervals: e2eConfig.GetIntervals( + flavour, + "wait-deployment", + ), + DaemonSetIntervals: e2eConfig.GetIntervals( + flavour, + "wait-daemonset", + ), + HelmReleaseIntervals: e2eConfig.GetIntervals( + flavour, + "wait-helmrelease", + ), + ClusterResourceSetIntervals: e2eConfig.GetIntervals( + flavour, + "wait-clusterresourceset", + ), + }, + ) + }, + } + }) + }, + ) + } + } +})