Showing preview only (1,568K chars total). Download the full file or copy to clipboard to get everything.
Repository: kubernetes-sigs/kind
Branch: main
Commit: 5442e7327f22
Files: 411
Total size: 1.4 MB
Directory structure:
gitextract_mthowuso/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── cleanup.md
│ │ ├── documentation.md
│ │ ├── enhancement.md
│ │ └── question.md
│ ├── actions/
│ │ └── setup-env/
│ │ └── action.yaml
│ ├── dependabot.yml
│ └── workflows/
│ ├── docker.yaml
│ ├── nerdctl.yaml
│ ├── podman.yml
│ └── vm.yaml
├── .gitignore
├── .go-version
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── SECURITY_CONTACTS
├── cmd/
│ └── kind/
│ ├── app/
│ │ ├── main.go
│ │ └── main_test.go
│ └── main.go
├── code-of-conduct.md
├── go.mod
├── go.sum
├── hack/
│ ├── build/
│ │ ├── README.md
│ │ ├── goinstalldir.sh
│ │ ├── gotoolchain.sh
│ │ ├── init-buildx.sh
│ │ └── setup-go.sh
│ ├── ci/
│ │ ├── README.md
│ │ ├── build-all.sh
│ │ ├── cache-wrapper.sh
│ │ ├── e2e-k8s.sh
│ │ ├── e2e.sh
│ │ ├── init-vm.sh
│ │ ├── lima-helper.sh
│ │ └── push-latest-cli/
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ └── push-latest-cli.sh
│ ├── make-rules/
│ │ ├── test.sh
│ │ ├── update/
│ │ │ ├── README.md
│ │ │ ├── all.sh
│ │ │ ├── deps.sh
│ │ │ ├── generated.sh
│ │ │ └── gofmt.sh
│ │ └── verify/
│ │ ├── README.md
│ │ ├── all.sh
│ │ ├── generated.sh
│ │ ├── lint.sh
│ │ └── shellcheck.sh
│ ├── release/
│ │ ├── build/
│ │ │ ├── README.md
│ │ │ ├── cross.sh
│ │ │ └── push-node.sh
│ │ ├── create.sh
│ │ ├── get-contributors.sh
│ │ └── push-node.sh
│ ├── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ └── tools/
│ ├── .golangci.yml
│ ├── README.md
│ ├── boilerplate.go.txt
│ ├── go.mod
│ ├── go.sum
│ └── tools.go
├── images/
│ ├── Makefile.common.in
│ ├── base/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── files/
│ │ │ ├── LICENSES/
│ │ │ │ └── README.txt
│ │ │ ├── etc/
│ │ │ │ ├── containerd/
│ │ │ │ │ └── config.toml
│ │ │ │ ├── crictl.yaml
│ │ │ │ ├── default/
│ │ │ │ │ └── kubelet
│ │ │ │ ├── sysctl.d/
│ │ │ │ │ ├── 10-network-magic.conf
│ │ │ │ │ └── 10-network-security.conf
│ │ │ │ └── systemd/
│ │ │ │ └── system/
│ │ │ │ ├── containerd-fuse-overlayfs.service
│ │ │ │ ├── containerd.service
│ │ │ │ ├── kubelet.service
│ │ │ │ ├── kubelet.service.d/
│ │ │ │ │ ├── 10-kubeadm.conf
│ │ │ │ │ └── 11-kind.conf
│ │ │ │ ├── kubelet.slice
│ │ │ │ └── undo-mount-hacks.service
│ │ │ ├── kind/
│ │ │ │ ├── README.txt
│ │ │ │ └── bin/
│ │ │ │ ├── create-kubelet-cgroup-v2.sh
│ │ │ │ ├── mount-product-files.sh
│ │ │ │ └── undo-mount-hacks.sh
│ │ │ └── usr/
│ │ │ └── local/
│ │ │ └── bin/
│ │ │ ├── clean-install
│ │ │ └── entrypoint
│ │ └── scripts/
│ │ ├── target-cc
│ │ └── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ ├── haproxy/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── haproxy.cfg
│ │ └── stage-binary-and-deps.sh
│ ├── kindnetd/
│ │ ├── Dockerfile
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── cmd/
│ │ │ └── kindnetd/
│ │ │ ├── cni.go
│ │ │ ├── main.go
│ │ │ ├── masq.go
│ │ │ └── routes.go
│ │ ├── files/
│ │ │ └── LICENSES/
│ │ │ └── README.txt
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── scripts/
│ │ └── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ ├── local-path-helper/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ └── stage-binary-and-deps.sh
│ ├── local-path-provisioner/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── files/
│ │ │ └── LICENSES/
│ │ │ └── README.txt
│ │ └── scripts/
│ │ └── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ └── node/
│ └── README.md
├── logo/
│ └── LICENSE
├── main.go
├── netlify.toml
├── pkg/
│ ├── apis/
│ │ └── config/
│ │ ├── defaults/
│ │ │ └── image.go
│ │ └── v1alpha4/
│ │ ├── default.go
│ │ ├── doc.go
│ │ ├── types.go
│ │ ├── yaml.go
│ │ └── zz_generated.deepcopy.go
│ ├── build/
│ │ └── nodeimage/
│ │ ├── build.go
│ │ ├── buildcontext.go
│ │ ├── const.go
│ │ ├── const_cni.go
│ │ ├── const_storage.go
│ │ ├── containerd.go
│ │ ├── defaults.go
│ │ ├── doc.go
│ │ ├── helpers.go
│ │ ├── imageimporter.go
│ │ ├── internal/
│ │ │ ├── container/
│ │ │ │ └── docker/
│ │ │ │ ├── archive.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── exec.go
│ │ │ │ ├── image.go
│ │ │ │ ├── image_test.go
│ │ │ │ ├── pull.go
│ │ │ │ ├── run.go
│ │ │ │ └── save.go
│ │ │ └── kube/
│ │ │ ├── bits.go
│ │ │ ├── builder.go
│ │ │ ├── builder_docker.go
│ │ │ ├── builder_remote.go
│ │ │ ├── builder_tarball.go
│ │ │ ├── doc.go
│ │ │ ├── source.go
│ │ │ └── tar.go
│ │ └── options.go
│ ├── cluster/
│ │ ├── constants/
│ │ │ └── constants.go
│ │ ├── createoption.go
│ │ ├── doc.go
│ │ ├── internal/
│ │ │ ├── create/
│ │ │ │ ├── actions/
│ │ │ │ │ ├── action.go
│ │ │ │ │ ├── config/
│ │ │ │ │ │ └── config.go
│ │ │ │ │ ├── installcni/
│ │ │ │ │ │ └── cni.go
│ │ │ │ │ ├── installstorage/
│ │ │ │ │ │ └── storage.go
│ │ │ │ │ ├── kubeadminit/
│ │ │ │ │ │ └── init.go
│ │ │ │ │ ├── kubeadmjoin/
│ │ │ │ │ │ └── join.go
│ │ │ │ │ ├── loadbalancer/
│ │ │ │ │ │ └── loadbalancer.go
│ │ │ │ │ └── waitforready/
│ │ │ │ │ └── waitforready.go
│ │ │ │ └── create.go
│ │ │ ├── delete/
│ │ │ │ └── delete.go
│ │ │ ├── kubeadm/
│ │ │ │ ├── config.go
│ │ │ │ ├── const.go
│ │ │ │ └── doc.go
│ │ │ ├── kubeconfig/
│ │ │ │ ├── internal/
│ │ │ │ │ └── kubeconfig/
│ │ │ │ │ ├── encode.go
│ │ │ │ │ ├── encode_test.go
│ │ │ │ │ ├── helpers.go
│ │ │ │ │ ├── helpers_test.go
│ │ │ │ │ ├── lock.go
│ │ │ │ │ ├── merge.go
│ │ │ │ │ ├── merge_test.go
│ │ │ │ │ ├── paths.go
│ │ │ │ │ ├── paths_test.go
│ │ │ │ │ ├── read.go
│ │ │ │ │ ├── read_test.go
│ │ │ │ │ ├── remove.go
│ │ │ │ │ ├── remove_test.go
│ │ │ │ │ ├── types.go
│ │ │ │ │ ├── write.go
│ │ │ │ │ └── write_test.go
│ │ │ │ └── kubeconfig.go
│ │ │ ├── loadbalancer/
│ │ │ │ ├── config.go
│ │ │ │ ├── const.go
│ │ │ │ └── doc.go
│ │ │ ├── logs/
│ │ │ │ ├── doc.go
│ │ │ │ └── logs.go
│ │ │ └── providers/
│ │ │ ├── common/
│ │ │ │ ├── cgroups.go
│ │ │ │ ├── constants.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── getport.go
│ │ │ │ ├── getport_test.go
│ │ │ │ ├── images.go
│ │ │ │ ├── images_test.go
│ │ │ │ ├── logs.go
│ │ │ │ ├── namer.go
│ │ │ │ ├── namer_test.go
│ │ │ │ ├── proxy.go
│ │ │ │ └── proxy_test.go
│ │ │ ├── docker/
│ │ │ │ ├── OWNERS
│ │ │ │ ├── constants.go
│ │ │ │ ├── images.go
│ │ │ │ ├── network.go
│ │ │ │ ├── network_integration_test.go
│ │ │ │ ├── network_test.go
│ │ │ │ ├── node.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── provision.go
│ │ │ │ └── util.go
│ │ │ ├── nerdctl/
│ │ │ │ ├── OWNERS
│ │ │ │ ├── constants.go
│ │ │ │ ├── images.go
│ │ │ │ ├── network.go
│ │ │ │ ├── network_test.go
│ │ │ │ ├── node.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── provision.go
│ │ │ │ └── util.go
│ │ │ ├── podman/
│ │ │ │ ├── OWNERS
│ │ │ │ ├── constants.go
│ │ │ │ ├── images.go
│ │ │ │ ├── images_test.go
│ │ │ │ ├── network.go
│ │ │ │ ├── node.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── provision.go
│ │ │ │ └── util.go
│ │ │ └── provider.go
│ │ ├── nodes/
│ │ │ ├── doc.go
│ │ │ └── types.go
│ │ ├── nodeutils/
│ │ │ ├── doc.go
│ │ │ ├── roles.go
│ │ │ ├── util.go
│ │ │ └── util_test.go
│ │ └── provider.go
│ ├── cmd/
│ │ ├── doc.go
│ │ ├── iostreams.go
│ │ ├── kind/
│ │ │ ├── build/
│ │ │ │ ├── build.go
│ │ │ │ └── nodeimage/
│ │ │ │ └── nodeimage.go
│ │ │ ├── completion/
│ │ │ │ ├── bash/
│ │ │ │ │ └── bash.go
│ │ │ │ ├── completion.go
│ │ │ │ ├── fish/
│ │ │ │ │ └── fish.go
│ │ │ │ ├── powershell/
│ │ │ │ │ └── powershell.go
│ │ │ │ └── zsh/
│ │ │ │ └── zsh.go
│ │ │ ├── create/
│ │ │ │ ├── cluster/
│ │ │ │ │ └── createcluster.go
│ │ │ │ └── create.go
│ │ │ ├── delete/
│ │ │ │ ├── cluster/
│ │ │ │ │ └── deletecluster.go
│ │ │ │ ├── clusters/
│ │ │ │ │ └── deleteclusters.go
│ │ │ │ └── delete.go
│ │ │ ├── export/
│ │ │ │ ├── export.go
│ │ │ │ ├── kubeconfig/
│ │ │ │ │ └── kubeconfig.go
│ │ │ │ └── logs/
│ │ │ │ └── logs.go
│ │ │ ├── get/
│ │ │ │ ├── clusters/
│ │ │ │ │ └── clusters.go
│ │ │ │ ├── get.go
│ │ │ │ ├── kubeconfig/
│ │ │ │ │ └── kubeconfig.go
│ │ │ │ └── nodes/
│ │ │ │ └── nodes.go
│ │ │ ├── load/
│ │ │ │ ├── docker-image/
│ │ │ │ │ ├── docker-image.go
│ │ │ │ │ └── docker-image_test.go
│ │ │ │ ├── image-archive/
│ │ │ │ │ └── image-archive.go
│ │ │ │ └── load.go
│ │ │ ├── root.go
│ │ │ └── version/
│ │ │ ├── version.go
│ │ │ └── version_test.go
│ │ └── logger.go
│ ├── errors/
│ │ ├── aggregate.go
│ │ ├── aggregate_forked.go
│ │ ├── aggregate_test.go
│ │ ├── concurrent.go
│ │ ├── concurrent_test.go
│ │ ├── doc.go
│ │ ├── errors.go
│ │ └── errors_test.go
│ ├── exec/
│ │ ├── default.go
│ │ ├── doc.go
│ │ ├── helpers.go
│ │ ├── local.go
│ │ └── types.go
│ ├── fs/
│ │ └── fs.go
│ ├── internal/
│ │ ├── apis/
│ │ │ └── config/
│ │ │ ├── cluster_util.go
│ │ │ ├── cluster_util_test.go
│ │ │ ├── convert_v1alpha4.go
│ │ │ ├── default.go
│ │ │ ├── doc.go
│ │ │ ├── encoding/
│ │ │ │ ├── convert.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── load.go
│ │ │ │ ├── load_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── invalid-apiversion.yaml
│ │ │ │ ├── invalid-kind.yaml
│ │ │ │ ├── invalid-yaml.yaml
│ │ │ │ └── v1alpha4/
│ │ │ │ ├── invalid-bad-indent.yaml
│ │ │ │ ├── invalid-bogus-field.yaml
│ │ │ │ ├── valid-full-ha.yaml
│ │ │ │ ├── valid-kind-patches.yaml
│ │ │ │ ├── valid-kind-workers-patches.yaml
│ │ │ │ ├── valid-many-fields.yaml
│ │ │ │ ├── valid-minimal-two-nodes.yaml
│ │ │ │ ├── valid-minimal.yaml
│ │ │ │ └── valid-port-and-mount.yaml
│ │ │ ├── types.go
│ │ │ ├── validate.go
│ │ │ ├── validate_test.go
│ │ │ └── zz_generated.deepcopy.go
│ │ ├── assert/
│ │ │ ├── assert.go
│ │ │ └── assert_test.go
│ │ ├── cli/
│ │ │ ├── logger.go
│ │ │ ├── override.go
│ │ │ ├── spinner.go
│ │ │ └── status.go
│ │ ├── env/
│ │ │ ├── term.go
│ │ │ └── term_test.go
│ │ ├── integration/
│ │ │ └── integration.go
│ │ ├── patch/
│ │ │ ├── doc.go
│ │ │ ├── json6902patch.go
│ │ │ ├── kubeyaml.go
│ │ │ ├── kubeyaml_test.go
│ │ │ ├── matchinfo.go
│ │ │ ├── mergepatch.go
│ │ │ ├── resource.go
│ │ │ ├── toml.go
│ │ │ └── toml_test.go
│ │ ├── runtime/
│ │ │ └── runtime.go
│ │ ├── sets/
│ │ │ ├── doc.go
│ │ │ ├── empty.go
│ │ │ └── string.go
│ │ └── version/
│ │ ├── doc.go
│ │ ├── version.go
│ │ └── version_test.go
│ └── log/
│ ├── doc.go
│ ├── noop.go
│ └── types.go
└── site/
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── assets/
│ ├── css/
│ │ └── inline.css
│ └── js/
│ └── inline.js
├── config.toml
├── content/
│ ├── _index.md
│ └── docs/
│ ├── contributing/
│ │ ├── 1.0-roadmap.md
│ │ ├── development.md
│ │ ├── getting-started.md
│ │ └── project-scope.md
│ ├── design/
│ │ ├── base-image.md
│ │ ├── initial.md
│ │ ├── node-image.md
│ │ └── principles.md
│ └── user/
│ ├── auditing.md
│ ├── configuration.md
│ ├── ingress.md
│ ├── kind-example-config.yaml
│ ├── known-issues.md
│ ├── loadbalancer.md
│ ├── local-registry.md
│ ├── private-registries.md
│ ├── quick-start.md
│ ├── resources.md
│ ├── rootless.md
│ ├── using-wsl2.md
│ └── working-offline.md
├── data/
│ └── apiVersions.yaml
├── go.mod
├── go.sum
├── layouts/
│ ├── docs/
│ │ ├── index.html
│ │ ├── section.html
│ │ └── single.html
│ ├── index.html
│ ├── index.redirects
│ ├── partials/
│ │ ├── fancymarkdown.html
│ │ ├── footer.html
│ │ ├── header.html
│ │ ├── inlinecss.html
│ │ ├── inlinescript.html
│ │ ├── navbar.html
│ │ └── sidebar.html
│ ├── robots.txt
│ └── shortcodes/
│ ├── absURL.html
│ ├── codeFromFile.html
│ ├── codeFromInline.html
│ ├── minify.html
│ ├── readFile.html
│ ├── securitygoose.html
│ └── stableVersion.html
├── static/
│ ├── browserconfig.xml
│ ├── examples/
│ │ ├── LICENSE
│ │ ├── config-with-mounts.yaml
│ │ ├── config-with-port-mapping.yaml
│ │ ├── ingress/
│ │ │ ├── deploy-ingress-nginx.yaml
│ │ │ └── usage.yaml
│ │ ├── kind-gcr.sh
│ │ ├── kind-with-registry.sh
│ │ └── loadbalancer/
│ │ └── usage.yaml
│ ├── logo/
│ │ └── LICENSE
│ └── site.webmanifest
└── tools.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug Report
about: Report a bug encountered using kind
labels: kind/bug
---
<!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!-->
**What happened**:
<!-- If creating a cluster failed, please run the create cluster command again with the `--retain` flag to prevent cleanup on failure, then run `kind export logs` to dump the cluster logs before cleaning up manually with `kind delete cluster`. Then attach the logs from the path printed by `kind export logs` to this issue as a zip or tarball archive. This will aid us greatly in diagnosing the failure. When `kubeadm init` / `kubeadm join` fail, there are many possible cases and the kubeadm logs typically don't contain enough details vs the full cluster logs. Thanks!-->
**What you expected to happen**:
**How to reproduce it (as _minimally_ and precisely as possible)**:
**Anything else we need to know?**:
**Environment:**
- kind version: (use `kind version`):
- Runtime info: (use `docker info`, `podman info` or `nerdctl info`):
- OS (e.g. from `/etc/os-release`):
- Kubernetes version: (use `kubectl version`):
- Any proxies or other special environment settings?:
================================================
FILE: .github/ISSUE_TEMPLATE/cleanup.md
================================================
---
name: Cleanup
about: Pay down technical debt, reduce friction, etc.
labels: kind/cleanup
---
<!-- Please use this template while filing an issue to highlight technical debt to be paid down, or friction to be reduced -->
**What should be cleaned up or changed**:
**Why is this needed**:
================================================
FILE: .github/ISSUE_TEMPLATE/documentation.md
================================================
---
name: Documentation Request
about: Suggest what should be documented in kind
labels: kind/documentation
---
<!-- Please only use this template for submitting documentation requests -->
**What would you like to be documented**:
**Why is this needed**:
================================================
FILE: .github/ISSUE_TEMPLATE/enhancement.md
================================================
---
name: Enhancement Request
about: Suggest an enhancement to kind
labels: kind/feature
---
<!-- Please only use this template for submitting enhancement requests -->
**What would you like to be added**:
**Why is this needed**:
================================================
FILE: .github/ISSUE_TEMPLATE/question.md
================================================
---
name: Question
about: Ask a question about using kind
labels: kind/support
---
<!-- Consider also checking https://kind.sigs.k8s.io/#community-discussion-contribution-and-support for support, our slack community is especially helpful! -->
================================================
FILE: .github/actions/setup-env/action.yaml
================================================
name: "Setup environment"
description: "Performs common setup operations."
runs:
using: "composite"
steps:
- name: Get go version
id: golangversion
run: |
echo "go_version=$(cat .go-version)" >> "$GITHUB_OUTPUT"
shell: bash
- name: Set up Go
id: go
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
with:
go-version: ${{ steps.golangversion.outputs.go_version }}
check-latest: true
- name: Install kind
run: sudo make install INSTALL_DIR=/usr/local/bin
shell: bash
- name: Install kubectl
run: |
curl -LO https://dl.k8s.io/release/$(curl -sL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
shell: bash
- name: Enable ipv4 and ipv6 forwarding
run: |
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo sysctl -w net.ipv4.ip_forward=1
shell: bash
================================================
FILE: .github/dependabot.yml
================================================
---
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
labels:
- "area/dependency"
- "release-note-none"
- "ok-to-test"
open-pull-requests-limit: 10
groups:
actions:
update-types:
- "minor"
- "patch"
================================================
FILE: .github/workflows/docker.yaml
================================================
name: Docker
on:
workflow_dispatch:
pull_request:
branches:
- main
paths-ignore:
- 'site/**'
permissions:
contents: read
jobs:
docker:
name: Docker
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
ipFamily: [ipv4, ipv6]
deployment: [singleNode, multiNode]
env:
JOB_NAME: "docker-${{ matrix.deployment }}-${{ matrix.ipFamily }}"
IP_FAMILY: ${{ matrix.ipFamily }}
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./.github/actions/setup-env
- name: Create single node cluster
if: ${{ matrix.deployment == 'singleNode' }}
run: |
cat <<EOF | /usr/local/bin/kind create cluster -v7 --wait 1m --retain --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ${IP_FAMILY}
EOF
- name: Create multi node cluster
if: ${{ matrix.deployment == 'multiNode' }}
run: |
cat <<EOF | /usr/local/bin/kind create cluster -v7 --wait 1m --retain --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ${IP_FAMILY}
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
- name: Get Cluster status
run: |
# wait network is ready
kubectl wait --for=condition=ready pods --namespace=kube-system -l k8s-app=kube-dns
kubectl get nodes -o wide
kubectl get pods -A
- name: Load docker image
run: |
docker pull busybox
/usr/local/bin/kind load docker-image busybox
- name: Export logs
if: always()
run: |
mkdir -p /tmp/kind/logs
/usr/local/bin/kind export logs /tmp/kind/logs
sudo chown -R $USER:$USER /tmp/kind/logs
- name: Upload logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: kind-logs-${{ env.JOB_NAME }}-${{ github.run_id }}
path: /tmp/kind/logs
- name: Delete cluster
run: /usr/local/bin/kind delete cluster
================================================
FILE: .github/workflows/nerdctl.yaml
================================================
name: Nerdctl
on:
workflow_dispatch:
pull_request:
branches:
- main
paths-ignore:
- 'site/**'
permissions:
contents: read
jobs:
nerdctl:
name: Nerdctl
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
ipFamily: [ipv4, ipv6]
deployment: [singleNode, multiNode]
exclude:
- ipFamily: ipv6
env:
JOB_NAME: "nerdctl-${{ matrix.deployment }}-${{ matrix.ipFamily }}"
IP_FAMILY: ${{ matrix.ipFamily }}
NERDCTL_VERSION: "2.0.2"
KIND_EXPERIMENTAL_PROVIDER: "nerdctl"
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./.github/actions/setup-env
- name: Install nerdctl
run: |
# Remove Docker and Podman
sudo systemctl is-active --quiet docker.service || systemctl stop docker.service
sudo apt-get remove -y docker-ce docker-ce-cli podman containerd.io
sudo rm -rf /etc/systemd/system/containerd.service # clean up the cotnainerd systemd file
# Install nerdctl full package
sudo curl -sSL https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz | sudo tar -xvz -C /usr/local
# Start Containerd
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
# Show Versions
sudo ctr version
sudo nerdctl version
- name: Create single node cluster
if: ${{ matrix.deployment == 'singleNode' }}
run: |
cat <<EOF | sudo /usr/local/bin/kind create cluster -v7 --wait 1m --retain --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ${IP_FAMILY}
EOF
- name: Create multi node cluster
if: ${{ matrix.deployment == 'multiNode' }}
run: |
cat <<EOF | sudo /usr/local/bin/kind create cluster -v7 --wait 1m --retain --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ${IP_FAMILY}
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
- name: Get Cluster status
run: |
# wait network is ready
sudo kubectl wait --for=condition=ready pods --namespace=kube-system -l k8s-app=kube-dns
sudo kubectl get nodes -o wide
sudo kubectl get pods -A
# TODO: similar to podman, this fails because the imageID() code in KinD is hardcoded to run a docker command
# need to solve this code before this test will work properly
- name: Load nerdctl image
run: |
sudo nerdctl pull busybox
sudo /usr/local/bin/kind load docker-image busybox
continue-on-error: true
- name: Export logs
if: always()
run: |
sudo find /etc/cni/net.d/ -type f -exec sh -c 'echo "{}" && cat "{}"' \;
sudo mkdir -p /tmp/kind/logs
sudo /usr/local/bin/kind export logs /tmp/kind/logs
sudo chown -R $USER:$USER /tmp/kind/logs
- name: Upload logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: kind-logs-${{ env.JOB_NAME }}-${{ github.run_id }}
path: /tmp/kind/logs
- name: Delete cluster
run: sudo /usr/local/bin/kind delete cluster
================================================
FILE: .github/workflows/podman.yml
================================================
name: Podman
on:
workflow_dispatch:
pull_request:
branches:
- main
paths-ignore:
- 'site/**'
permissions:
contents: read
jobs:
podman:
name: Podman
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
ipFamily: [ipv4, ipv6]
deployment: [singleNode, multiNode]
exclude:
- ipFamily: ipv6
env:
JOB_NAME: "podman-${{ matrix.deployment }}-${{ matrix.ipFamily }}"
KIND_EXPERIMENTAL_PROVIDER: "podman"
IP_FAMILY: ${{ matrix.ipFamily }}
PODMAN_VERSION: "stable"
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./.github/actions/setup-env
- name: Setup podman
run: |
podman version
# podman requires dnsmasq for custom networks
# https://github.com/actions/virtual-environments/issues/2708
sudo apt-get update
sudo apt-get -y install dnsmasq
# crun >= 1.9.1 is required on Ubuntu 20.04.6
# https://github.com/kubernetes-sigs/kind/issues/3526
curl -Lo ./crun https://github.com/containers/crun/releases/download/1.14.3/crun-1.14.3-linux-amd64
chmod +x ./crun
sudo mv ./crun /usr/bin/crun
- name: Create single node cluster
if: ${{ matrix.deployment == 'singleNode' }}
run: |
cat <<EOF | sudo KIND_EXPERIMENTAL_PROVIDER=podman kind create cluster -v7 --wait 1m --retain --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ${IP_FAMILY}
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 80
listenAddress: 0.0.0.0
- containerPort: 443
hostPort: 443
listenAddress: 0.0.0.0
EOF
- name: Create multi node cluster
if: ${{ matrix.deployment == 'multiNode' }}
run: |
cat <<EOF | sudo KIND_EXPERIMENTAL_PROVIDER=podman kind create cluster -v7 --wait 1m --retain --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ${IP_FAMILY}
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
- name: Get Cluster status
run: |
# wait network is ready
sudo kubectl wait --for=condition=ready pods --namespace=kube-system -l k8s-app=kube-dns
sudo kubectl get nodes -o wide
sudo kubectl get pods -A
# TODO: https://github.com/kubernetes-sigs/kind/issues/2038
- name: Load docker image
run: |
sudo podman pull busybox
sudo KIND_EXPERIMENTAL_PROVIDER=podman kind load docker-image busybox
continue-on-error: true
- name: Export logs
if: always()
run: |
mkdir -p /tmp/kind/logs
sudo KIND_EXPERIMENTAL_PROVIDER=podman kind export logs /tmp/kind/logs
sudo chown -R $USER:$USER /tmp/kind/logs
- name: Upload logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: kind-logs-${{ env.JOB_NAME }}-${{ github.run_id }}
path: /tmp/kind/logs
- name: Delete cluster
run: sudo KIND_EXPERIMENTAL_PROVIDER=podman kind delete cluster
================================================
FILE: .github/workflows/vm.yaml
================================================
name: VM
on:
workflow_dispatch:
pull_request:
branches:
- main
paths-ignore:
- 'site/**'
permissions:
contents: read
jobs:
vm:
name: "VM"
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
# Fedora is different from Ubuntu in LSM (SELinux), filesystem (btrfs), kernel version, etc.
- template: fedora
provider: docker
rootless: rootful
- template: fedora
provider: docker
rootless: rootless
- template: fedora
provider: podman
rootless: rootful
- template: fedora
provider: podman
rootless: rootless
env:
KIND_EXPERIMENTAL_PROVIDER: "${{ matrix.provider }}"
ROOTLESS: "${{ matrix.rootless }}"
HELPER: "./hack/ci/lima-helper.sh"
JOB_NAME: "vm-${{ matrix.template }}-${{ matrix.provider }}-${{ matrix.rootless }}"
steps:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Get go version
id: golangversion
run: |
echo "go_version=$(cat .go-version)" >> "$GITHUB_OUTPUT"
- name: Set up Go
id: go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: ${{ steps.golangversion.outputs.go_version }}
check-latest: true
- name: "Install Lima"
uses: lima-vm/lima-actions/setup@55627e31b78637bf254a8b2a14da8ea7d12564e5 # v1
id: lima-actions-setup
- name: "Cache ~/.cache/lima"
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ~/.cache/lima
key: lima-${{ steps.lima-actions-setup.outputs.version }}-${{ matrix.template }}
- name: "Start VM"
# --plain is set to disable file sharing, port forwarding, built-in containerd, etc.
run: limactl start --name=default --plain template://${{ matrix.template }}
- name: "Initialize VM"
run: |
set -eux -o pipefail
# Sync the current directory to /tmp/kind in the guest
limactl cp -r . default:/tmp/kind
# Install packages
lima sudo /tmp/kind/hack/ci/init-vm.sh
# Enable systemd lingering for rootless
lima sudo loginctl enable-linger "$USER"
# Install kind
lima sudo git config --global --add safe.directory /tmp/kind
lima sudo make -C /tmp/kind install INSTALL_DIR=/usr/bin
- name: Set up Rootless Docker
if: ${{ matrix.provider == 'docker' && matrix.rootless == 'rootless' }}
run: |
# Disable the rootful daemon
"$HELPER" sudo systemctl disable --now docker
# Install the systemd unit
"$HELPER" dockerd-rootless-setuptool.sh install
# Modify the client config to use the rootless daemon by default
"$HELPER" docker context use rootless
- name: Show provider info
run: |
"$HELPER" "$KIND_EXPERIMENTAL_PROVIDER" info
"$HELPER" "$KIND_EXPERIMENTAL_PROVIDER" version
- name: Create a cluster
run: |
"$HELPER" kind create cluster -v7 --wait 10m --retain
- name: Get Cluster status
run: |
"$HELPER" kubectl wait --for=condition=ready pods --namespace=kube-system -l k8s-app=kube-dns
"$HELPER" kubectl get nodes -o wide
"$HELPER" kubectl get pods -A
- name: Export logs
if: always()
run: |
"$HELPER" kind export logs /tmp/kind/logs
mkdir -p /tmp/kind/logs/lima
cp -a ~/.lima/default/*.log /tmp/kind/logs/lima || true
"$HELPER" tar cC /tmp/kind/logs . | tar xC /tmp/kind/logs
- name: Upload logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: kind-logs-${{ env.JOB_NAME }}-${{ github.run_id }}
path: /tmp/kind/logs
================================================
FILE: .gitignore
================================================
# build and test outputs
/bin/
/_output/
/_artifacts/
# used for the code generators only
/vendor/
# macOS
.DS_Store
# files generated by editors
.idea/
*.iml
.vscode/
*.swp
*.sublime-project
*.sublime-workspace
*~
================================================
FILE: .go-version
================================================
1.25.7
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guidelines
Welcome to Kubernetes. We are excited about the prospect of you joining our [community](https://github.com/kubernetes/community)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt:
_As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._
## Getting Started
We have full documentation on how to get started contributing here: https://kind.sigs.k8s.io/docs/contributing/getting-started/, _please_ read this!
A lot of work went into this guide 🙃
## Mentorship
- [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - Kubernetes has a diverse set of mentorship programs available that are always looking for volunteers!
<!---
Custom Information - if you're copying this template for the first time you can add custom content here, for example:
## Contact Information
- [Slack channel](https://kubernetes.slack.com/messages/kubernetes-users) - Replace `kubernetes-users` with your slack channel string, this will send users directly to your channel.
- [Mailing list](URL)
-->
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Makefile
================================================
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Old-skool build tools.
# Simple makefile to build kind quickly and reproducibly
#
# Common uses:
# - installing kind: `make install INSTALL_DIR=$HOME/go/bin`
# - building: `make build`
# - cleaning up and starting over: `make clean`
#
################################################################################
# ========================== Capture Environment ===============================
# get the repo root and output path
REPO_ROOT:=${CURDIR}
OUT_DIR=$(REPO_ROOT)/bin
# record the source commit in the binary, overridable
COMMIT?=$(shell git rev-parse HEAD 2>/dev/null)
# count the commits since the last release
COMMIT_COUNT?=$(shell git describe --tags | rev | cut -d- -f2 | rev)
################################################################################
# ========================= Setup Go With Gimme ================================
# go version to use for build etc.
# setup correct go version with gimme
GOTOOLCHAIN:=$(shell . hack/build/gotoolchain.sh && echo "$${GOTOOLCHAIN}")
PATH:=$(shell . hack/build/setup-go.sh && echo "$${PATH}")
# go1.9+ can autodetect GOROOT, but if some other tool sets it ...
GOROOT:=
# enable modules
GO111MODULE=on
# disable CGO by default for static binaries
CGO_ENABLED=0
export PATH GOROOT GO111MODULE CGO_ENABLED GOTOOLCHAIN
# work around broken PATH export
SPACE:=$(subst ,, )
SHELL:=env PATH=$(subst $(SPACE),\$(SPACE),$(PATH)) $(SHELL)
################################################################################
# ============================== OPTIONS =======================================
# install tool
INSTALL?=install
# install will place binaries here, by default attempts to mimic go install
INSTALL_DIR?=$(shell hack/build/goinstalldir.sh)
# the output binary name, overridden when cross compiling
KIND_BINARY_NAME?=kind
# build flags for the kind binary
# - reproducible builds: -trimpath and -ldflags=-buildid=
# - smaller binaries: -w (trim debugger data, but not panics)
# - metadata: -X=... to bake in git commit
KIND_VERSION_PKG:=sigs.k8s.io/kind/pkg/cmd/kind/version
KIND_BUILD_LD_FLAGS:=-X=$(KIND_VERSION_PKG).gitCommit=$(COMMIT) -X=$(KIND_VERSION_PKG).gitCommitCount=$(COMMIT_COUNT)
KIND_BUILD_FLAGS?=-trimpath -ldflags="-buildid= -w $(KIND_BUILD_LD_FLAGS)"
################################################################################
# ================================= Building ===================================
# standard "make" target -> builds
all: build
# builds kind in a container, outputs to $(OUT_DIR)
kind:
go build -v -o "$(OUT_DIR)/$(KIND_BINARY_NAME)" $(KIND_BUILD_FLAGS)
# alias for building kind
build: kind
# use: make install INSTALL_DIR=/usr/local/bin
install: build
$(INSTALL) -d $(INSTALL_DIR)
$(INSTALL) "$(OUT_DIR)/$(KIND_BINARY_NAME)" "$(INSTALL_DIR)/$(KIND_BINARY_NAME)"
################################################################################
# ================================= Testing ====================================
# unit tests (hermetic)
unit:
MODE=unit hack/make-rules/test.sh
# integration tests
integration:
MODE=integration hack/make-rules/test.sh
# all tests
test:
hack/make-rules/test.sh
################################################################################
# ================================= Cleanup ====================================
# standard cleanup target
clean:
rm -rf "$(OUT_DIR)/"
################################################################################
# ============================== Auto-Update ===================================
# update generated code, gofmt, etc.
update:
hack/make-rules/update/all.sh
# update generated code
generate:
hack/make-rules/update/generated.sh
# gofmt
gofmt:
hack/make-rules/update/gofmt.sh
################################################################################
# ================================== Linting ===================================
# run linters, ensure generated code, etc.
verify:
hack/make-rules/verify/all.sh
# code linters
lint:
hack/make-rules/verify/lint.sh
# shell linter
shellcheck:
hack/make-rules/verify/shellcheck.sh
#################################################################################
.PHONY: all kind build install unit clean update generate gofmt verify lint shellcheck
================================================
FILE: OWNERS
================================================
# See the OWNERS docs at https://go.k8s.io/owners
reviewers:
- aojea
- BenTheElder
- stmcginnis
approvers:
- aojea
- BenTheElder
- stmcginnis
emeritus_approvers:
- amwat
- munnerz
================================================
FILE: README.md
================================================
<p align="center"><img alt="kind" src="./logo/logo.png" width="300px" /></p>
# Please see [Our Documentation](https://kind.sigs.k8s.io/docs/user/quick-start/) for more in-depth installation etc.
kind is a tool for running local Kubernetes clusters using Docker container "nodes".
kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.
If you have [go] 1.16+ and [docker], [podman] or [nerdctl] installed `go install sigs.k8s.io/kind@v0.31.0 && kind create cluster` is all you need!

kind consists of:
- Go [packages][packages] implementing [cluster creation][cluster package], [image build][build package], etc.
- A command line interface ([`kind`][kind cli]) built on these packages.
- Docker [image(s)][images] written to run systemd, Kubernetes, etc.
- [`kubetest`][kubetest] integration also built on these packages (WIP)
kind bootstraps each "node" with [kubeadm][kubeadm]. For more details see [the design documentation][design doc].
**NOTE**: kind is still a work in progress, see the [1.0 roadmap].
## Installation and usage
For a complete [install guide] see [the documentation here][install guide].
You can install kind with `go install sigs.k8s.io/kind@v0.31.0`.
**NOTE**: please use the latest go to do this. KIND is developed with the latest stable go, see [`.go-version`](./.go-version) for the exact version we're using.
This will put `kind` in `$(go env GOPATH)/bin`. If you encounter the error
`kind: command not found` after installation then you may need to either add that directory to your `$PATH` as
shown [here](https://golang.org/doc/code.html#GOPATH) or do a manual installation by cloning the repo and run
`make build` from the repository.
Without installing go, kind can be built reproducibly with docker using `make build`.
Stable binaries are also available on the [releases] page. Stable releases are
generally recommended for CI usage in particular.
To install, download the binary for your platform from "Assets" and place this
into your `$PATH`:
On Linux:
```console
# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.31.0/kind-$(uname)-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.31.0/kind-$(uname)-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
```
On macOS via Homebrew:
```console
brew install kind
```
On macOS via MacPorts:
```console
sudo port selfupdate && sudo port install kind
```
On macOS via Bash:
```console
# For Intel Macs
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.31.0/kind-darwin-amd64
# For M1 / ARM Macs
[ $(uname -m) = arm64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.31.0/kind-darwin-arm64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind
```
On Windows:
```powershell
curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.31.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe
# OR via Chocolatey (https://chocolatey.org/packages/kind)
choco install kind
```
To use kind, you will need to [install docker].
Once you have docker running you can create a cluster with:
```console
kind create cluster
```
To delete your cluster use:
```console
kind delete cluster
```
<!--TODO(bentheelder): improve this part of the guide-->
To create a cluster from Kubernetes source:
- ensure that Kubernetes is cloned in `$(go env GOPATH)/src/k8s.io/kubernetes`
- build a node image and create a cluster with:
```console
kind build node-image
kind create cluster --image kindest/node:latest
```
Multi-node clusters and other advanced features may be configured with a config
file, for more usage see [the docs][user guide] or run `kind [command] --help`
## Community
Please reach out for bugs, feature requests, and other issues!
The maintainers of this project are reachable via:
- [Kubernetes Slack] in the [#kind] channel
- [filing an issue] against this repo
- The Kubernetes [SIG-Testing Mailing List]
Current maintainers are [@aojea], [@BenTheElder], and [@stmcginnis] - feel free to
reach out if you have any questions!
Pull Requests are very welcome!
If you're planning a new feature, please file an issue to discuss first.
Check the [issue tracker] for `help wanted` issues if you're unsure where to
start, or feel free to reach out to discuss. 🙂
See also: our own [contributor guide] and the Kubernetes [community page].
## Why kind?
- kind supports multi-node (including HA) clusters
- kind supports building Kubernetes release builds from source
- support for make / bash or docker, in addition to pre-published builds
- kind supports Linux, macOS and Windows
- kind is a [CNCF certified conformant Kubernetes installer](https://landscape.cncf.io/?selected=kind)
### Code of conduct
Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct].
<!--links-->
[go]: https://golang.org/
[go-supported]: https://golang.org/doc/devel/release.html#policy
[docker]: https://www.docker.com/
[podman]: https://podman.io/
[nerdctl]: https://github.com/containerd/nerdctl
[community page]: https://kubernetes.io/community/
[Kubernetes Code of Conduct]: code-of-conduct.md
[Go Report Card Badge]: https://goreportcard.com/badge/sigs.k8s.io/kind
[Go Report Card]: https://goreportcard.com/report/sigs.k8s.io/kind
[conformance tests]: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/conformance-tests.md
[packages]: ./pkg
[cluster package]: ./pkg/cluster
[build package]: ./pkg/build
[kind cli]: ./main.go
[images]: ./images
[kubetest]: https://github.com/kubernetes/test-infra/tree/master/kubetest
[kubeadm]: https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
[design doc]: https://kind.sigs.k8s.io/docs/design/initial
[user guide]: https://kind.sigs.k8s.io/docs/user/quick-start
[SIG-Testing Mailing List]: https://groups.google.com/forum/#!forum/kubernetes-sig-testing
[issue tracker]: https://github.com/kubernetes-sigs/kind/issues
[filing an issue]: https://github.com/kubernetes-sigs/kind/issues/new
[Kubernetes Slack]: http://slack.k8s.io/
[#kind]: https://kubernetes.slack.com/messages/CEKK1KTN2/
[1.0 roadmap]: https://kind.sigs.k8s.io/docs/contributing/1.0-roadmap
[install docker]: https://docs.docker.com/install/
[@BenTheElder]: https://github.com/BenTheElder
[@munnerz]: https://github.com/munnerz
[@aojea]: https://github.com/aojea
[@amwat]: https://github.com/amwat
[@stmcginnis]: https://github.com/stmcginnis
[contributor guide]: https://kind.sigs.k8s.io/docs/contributing/getting-started
[releases]: https://github.com/kubernetes-sigs/kind/releases
[install guide]: https://kind.sigs.k8s.io/docs/user/quick-start/#installation
[modules]: https://github.com/golang/go/wiki/Modules
================================================
FILE: SECURITY_CONTACTS
================================================
# Defined below are the security contacts for this repo.
#
# They are the contact point for the Product Security Team to reach out
# to for triaging and handling of incoming issues.
#
# The below names agree to abide by the
# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy)
# and will be removed and replaced if they violate that agreement.
#
# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE
# INSTRUCTIONS AT https://kubernetes.io/security/
BenTheElder
munnerz
================================================
FILE: cmd/kind/app/main.go
================================================
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package app is the implementation of the kind application.
package app
import (
"io"
"os"
"github.com/spf13/pflag"
"sigs.k8s.io/kind/pkg/cmd"
"sigs.k8s.io/kind/pkg/cmd/kind"
"sigs.k8s.io/kind/pkg/errors"
"sigs.k8s.io/kind/pkg/exec"
"sigs.k8s.io/kind/pkg/log"
)
// Main is the kind main(), it will invoke Run(), if an error is returned
// it will then call os.Exit
func Main() {
if err := Run(cmd.NewLogger(), cmd.StandardIOStreams(), os.Args[1:]); err != nil {
os.Exit(1)
}
}
// Run invokes the kind root command, returning the error.
// See: sigs.k8s.io/kind/pkg/cmd/kind
func Run(logger log.Logger, streams cmd.IOStreams, args []string) error {
// NOTE: we handle the quiet flag here so we can fully silence cobra
if checkQuiet(args) {
// if we are in quiet mode, we want to suppress all status output
// only streams.Out should be written to (program output)
logger = log.NoopLogger{}
streams.ErrOut = io.Discard
}
// actually run the command
c := kind.NewCommand(logger, streams)
c.SetArgs(args)
if err := c.Execute(); err != nil {
logError(logger, err)
return err
}
return nil
}
// checkQuiet returns true if -q / --quiet was set in args
func checkQuiet(args []string) bool {
flags := pflag.NewFlagSet("persistent-quiet", pflag.ContinueOnError)
flags.ParseErrorsWhitelist.UnknownFlags = true
quiet := false
flags.BoolVarP(
&quiet,
"quiet",
"q",
false,
"silence all stderr output",
)
// NOTE: pflag will error if -h / --help is specified
// We don't care here. That will be handled downstream
// It will also call flags.Usage so we're making that no-op
flags.Usage = func() {}
_ = flags.Parse(args)
return quiet
}
// logError logs the error and the root stacktrace if there is one
func logError(logger log.Logger, err error) {
colorEnabled := cmd.ColorEnabled(logger)
if colorEnabled {
logger.Errorf("\x1b[31mERROR\x1b[0m: %v", err)
} else {
logger.Errorf("ERROR: %v", err)
}
// Display Output if the error was from running a command ...
if err := exec.RunErrorForError(err); err != nil {
if colorEnabled {
logger.Errorf("\x1b[31mCommand Output\x1b[0m: %s", err.Output)
} else {
logger.Errorf("\nCommand Output: %s", err.Output)
}
}
// TODO: stacktrace should probably be guarded by a higher level ...?
if logger.V(1).Enabled() {
// Then display stack trace if any (there should be one...)
if trace := errors.StackTrace(err); trace != nil {
if colorEnabled {
logger.Errorf("\x1b[31mStack Trace\x1b[0m: %+v", trace)
} else {
logger.Errorf("\nStack Trace: %+v", trace)
}
}
}
}
================================================
FILE: cmd/kind/app/main_test.go
================================================
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package app
import (
"testing"
"sigs.k8s.io/kind/pkg/cmd"
)
func TestCheckQuiet(t *testing.T) {
t.Parallel()
cases := []struct {
Name string
Args []string
ExpectQuiet bool
}{
// normal cases, we expect it to be set
{
Name: "simply q",
Args: []string{"-q"},
ExpectQuiet: true,
},
{
Name: "simply quiet",
Args: []string{"--quiet"},
ExpectQuiet: true,
},
{
Name: "all quiet on the cli",
Args: []string{"all", "quiet", "on", "the", "cli", "--quiet"},
ExpectQuiet: true,
},
// pflag will throw an ErrHelp when -h / --help are in args even though
// we don't register these as flags, checkQuiet should ignore them
{
Name: "with ignored help",
Args: []string{"--quiet", "--help"},
ExpectQuiet: true,
},
{
Name: "with ignored h",
Args: []string{"--quiet", "-h"},
ExpectQuiet: true,
},
// not quiet for these cases ...
{
Name: "no args",
Args: []string{},
ExpectQuiet: false,
},
{
Name: "loud",
Args: []string{"--loud"},
ExpectQuiet: false,
},
}
for _, tc := range cases {
tc := tc
t.Run(tc.Name, func(t *testing.T) {
t.Parallel()
result := checkQuiet(tc.Args)
if result != tc.ExpectQuiet {
t.Fatalf("fooo")
}
})
}
}
func Test_CommandErrReturn(t *testing.T) {
t.Parallel()
cases := []struct {
Name string
Command string
Subcommand string
}{
{
Name: "misspelled subcommand for build",
Command: "build",
Subcommand: "nod-image",
},
{
Name: "misspelled subcommand for completion",
Command: "completion",
Subcommand: "zzsh",
},
{
Name: "misspelled subcommand for create",
Command: "create",
Subcommand: "clunster",
},
{
Name: "misspelled subcommand for delete",
Command: "delete",
Subcommand: "clust",
},
{
Name: "misspelled subcommand for export",
Command: "export",
Subcommand: "kubecfg",
},
{
Name: "misspelled subcommand for get",
Command: "get",
Subcommand: "nods",
},
{
Name: "misspelled subcommand for load",
Command: "load",
Subcommand: "dokker-image",
},
}
for _, tc := range cases {
tc := tc
t.Run(tc.Name, func(t *testing.T) {
t.Parallel()
err := Run(cmd.NewLogger(), cmd.StandardIOStreams(), []string{tc.Command, tc.Subcommand})
if err == nil {
t.Errorf("Subcommand should raise an error if not called with correct params")
}
})
}
}
================================================
FILE: cmd/kind/main.go
================================================
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package main is the main entrypoint for the kind cli.
package main
import (
"sigs.k8s.io/kind/cmd/kind/app"
)
func main() {
app.Main()
}
================================================
FILE: code-of-conduct.md
================================================
# Kubernetes Community Code of Conduct
Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md)
================================================
FILE: go.mod
================================================
module sigs.k8s.io/kind
// NOTE: This is the go language version, NOT the compiler version.
//
// This controls the *minimum* required go version and therefore available Go
// language features.
//
// See ./.go-version for the go compiler version used when building binaries
//
// https://go.dev/doc/modules/gomod-ref#go
go 1.17
require (
al.essio.dev/pkg/shellescape v1.5.1
github.com/BurntSushi/toml v1.4.0
github.com/evanphx/json-patch/v5 v5.6.0
github.com/mattn/go-isatty v0.0.20
github.com/pelletier/go-toml v1.9.5
github.com/pkg/errors v0.9.1
github.com/spf13/cobra v1.8.0
github.com/spf13/pflag v1.0.5
go.yaml.in/yaml/v3 v3.0.4
sigs.k8s.io/yaml v1.4.0
)
// test-only transitive deps, these are used by sigs.k8s.io/yaml's tests
require (
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
)
require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kr/text v0.2.0 // indirect
golang.org/x/sys v0.6.0 // indirect
)
================================================
FILE: go.sum
================================================
al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=
al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
================================================
FILE: hack/build/README.md
================================================
This directory contains tooling used for building
================================================
FILE: hack/build/goinstalldir.sh
================================================
#!/bin/sh
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# this utility prints out the golang install dir, even if go is not installed
# IE it prints the directory where `go install ...` would theoretically place
# binaries
# if we have go, just ask go!
if which go >/dev/null 2>&1; then
DIR=$(go env GOBIN)
if [ -n "${DIR}" ]; then
echo "${DIR}"
exit 0
fi
DIR=$(go env GOPATH)
if [ -n "${DIR}" ]; then
echo "${DIR}/bin"
exit 0
fi
fi
# mimic go behavior
# check if GOBIN is set anyhow
if [ -n "${GOBIN}" ]; then
echo "${GOBIN}"
exit 0
fi
# check if GOPATH is set anyhow
if [ -n "${GOPATH}" ]; then
echo "${GOPATH}/bin"
exit 0
fi
# finally use default for no $GOPATH or $GOBIN
echo "${HOME}/go/bin"
================================================
FILE: hack/build/gotoolchain.sh
================================================
#!/bin/bash
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# script to set GOTOOLCHAIN as needed
# MUST BE RUN FROM THE REPO ROOT DIRECTORY
# read go-version file unless GO_VERSION is set
GO_VERSION="${GO_VERSION:-"$(cat .go-version)"}"
GOTOOLCHAIN="go${GO_VERSION}"
export GOTOOLCHAIN GO_VERSION
================================================
FILE: hack/build/init-buildx.sh
================================================
#!/usr/bin/env bash
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
# TODO: newer buildx releases ship their own qemu copies and don't need any of this
# We can skip setup if the current builder already has multi-arch
# AND if it isn't the docker driver, which doesn't work
current_builder="$(docker buildx inspect)"
# linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
if ! grep -q "^Driver: docker$" <<<"${current_builder}" && \
grep -q "linux/amd64" <<<"${current_builder}" && \
grep -q "linux/arm64" <<<"${current_builder}"; then
exit 0
fi
# Ensure qemu is in binfmt_misc
# Docker desktop already has these in versions recent enough to have buildx
# We only need to do this setup on linux hosts
if [ "$(uname)" == 'Linux' ]; then
# NOTE: this is pinned to a digest for a reason!
docker run --rm --privileged tonistiigi/binfmt:qemu-v7.0.0-28@sha256:66e11bea77a5ea9d6f0fe79b57cd2b189b5d15b93a2bdb925be22949232e4e55 --install all
fi
# Ensure we use a builder that can leverage it (the default on linux will not)
docker buildx rm kind-builder || true
docker buildx create --use --name=kind-builder
================================================
FILE: hack/build/setup-go.sh
================================================
#!/bin/bash
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# script to setup go version with gimme as needed
# MUST BE RUN FROM THE REPO ROOT DIRECTORY
# read go-version file unless GO_VERSION is set
# override GOTOOLCHAIN unless set as well
. ./hack/build/gotoolchain.sh
# we don't actually care where the .env files are
# however, GIMME_SILENT_ENV doesn't trigger re-generating a .env if it
# already exists and isn't "silent" (no `go version` command in it)
# so we fix that by changing where the .env is written, ensuring ours
# is generated from this repo and silent.
export GIMME_ENV_PREFIX=./bin/.gimme/
export GIMME_SILENT_ENV=y
# only setup go if we haven't set FORCE_HOST_GO, or `go version` doesn't match
if [ -n "${FORCE_HOST_GO:-}" ]; then
GOTOOLCHAIN="${GOTOOLCHAIN:-local}"
export GOTOOLCHAIN
else
GOTOOLCHAIN="go${GO_VERSION}"
export GOTOOLCHAIN
# go version output looks like:
# go version go1.14.5 darwin/amd64
if ! (command -v go >/dev/null && [ "$(go version | cut -d' ' -f3)" = "go${GO_VERSION}" ]); then
# eval because the output of this is shell to set PATH etc.
eval "$(hack/third_party/gimme/gimme "${GO_VERSION}")"
fi
fi
# force go modules
export GO111MODULE=on
================================================
FILE: hack/ci/README.md
================================================
This directory contains glue used to test the kind repo in CI.
We don't recommend reusing anything from these scripts, and intend to replace
them at some point.
================================================
FILE: hack/ci/build-all.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# simple CI script to verify kind's own sources
# TODO(bentheelder): rename / refactor. consider building kindnetd
set -o errexit -o nounset -o pipefail
# cd to the repo root
REPO_ROOT=$(git rev-parse --show-toplevel)
cd "${REPO_ROOT}"
# build kind
hack/release/build/cross.sh
================================================
FILE: hack/ci/cache-wrapper.sh
================================================
#!/bin/bash
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# USAGE: cache-wrapper.sh hack/go_container.sh some-go-command
# $@ will be executed with this script wrapping cache upload / download
set -o errexit -o nounset -o pipefail
# options for where the cache is stored
BUCKET="${BUCKET:-bentheelder-kind-ci-builds}"
BRANCH="${BRANCH:-main}"
CACHE_SUFFIX="${CACHE_SUFFIX:-"ci-cache/${BRANCH}/gocache.tar"}"
CACHE_URL="https://storage.googleapis.com/${BUCKET}/${CACHE_SUFFIX}"
CACHE_GS="gs://${BUCKET}/${CACHE_SUFFIX}"
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
cd "${REPO_ROOT}"
# default to downloading cache
if [ "${DOWNLOAD_CACHE:-true}" = "true" ]; then
# NOTE:
# - We clean the modcache because we won't be able to write to it if it exists
# https://github.com/golang/go/issues/31481
# - All of the relevant go system directories are under /go in KIND's build
# - See below for how the cache tarball is created
hack/go_container.sh sh -c "go clean -modcache && curl -sSL ${CACHE_URL} | tar -C /go -zxf - --overwrite"
fi
# run the supplied command and store the exit code for later
set +o errexit
"$@"
res=$?
set -o errexit
# default to not uploading cache
if [ "${UPLOAD_CACHE:-false}" = "true" ]; then
# We want to cache:
# - XDG_CACHE_HOME / the go build cache, this is /go/cache in KIND's build
# - The module cache, ~= $GOPATH/pkg/mod. this /go/pkg/mod in KIND's build
hack/go_container.sh sh -c 'tar -C /go -czf - ./cache ./pkg/mod' | gsutil cp - "${CACHE_GS}"
fi
# preserve the exit code from our real task
exit $res
================================================
FILE: hack/ci/e2e-k8s.sh
================================================
#!/bin/sh
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# hack script for running a kind e2e
# must be run with a kubernetes checkout in $PWD (IE from the checkout)
# Usage: SKIP="ginkgo skip regex" FOCUS="ginkgo focus regex" kind-e2e.sh
set -o errexit -o nounset -o xtrace
# Settings:
# SKIP: ginkgo skip regex
# FOCUS: ginkgo focus regex (defaults to [Conformance] if unset; set to "" to run all tests)
# LABEL_FILTER: ginkgo label query for selecting tests (see "Spec Labels" in https://onsi.github.io/ginkgo/#filtering-specs)
#
# The default is to focus on conformance tests when FOCUS is unset. To run all
# tests (no focus filter), explicitly set FOCUS="". Serial tests get skipped when
# parallel testing is enabled. Using LABEL_FILTER instead of combining SKIP and
# FOCUS is recommended (more expressive, easier to read than regexp).
#
# FEATURE_GATES:
# JSON or YAML encoding of a string/bool map: {"FeatureGateA": true, "FeatureGateB": false}
# Enables or disables feature gates in the entire cluster.
# Cannot be used when GA_ONLY=true.
# RUNTIME_CONFIG:
# JSON or YAML encoding of a string/string (!) map: {"apia.example.com/v1alpha1": "true", "apib.example.com/v1beta1": "false"}
# Enables API groups in the apiserver via --runtime-config.
# Cannot be used when GA_ONLY=true.
# cleanup logic for cleanup on exit
CLEANED_UP=false
cleanup() {
if [ "$CLEANED_UP" = "true" ]; then
return
fi
# KIND_CREATE_ATTEMPTED is true once we: kind create
if [ "${KIND_CREATE_ATTEMPTED:-}" = true ]; then
kind "export" logs "${ARTIFACTS}" || true
kind delete cluster || true
fi
rm -f _output/bin/e2e.test || true
# remove our tempdir, this needs to be last, or it will prevent kind delete
if [ -n "${TMP_DIR:-}" ]; then
rm -rf "${TMP_DIR:?}"
fi
CLEANED_UP=true
}
# setup signal handlers
# shellcheck disable=SC2317 # this is not unreachable code
signal_handler() {
if [ -n "${GINKGO_PID:-}" ]; then
kill -TERM "$GINKGO_PID" || true
fi
cleanup
}
trap signal_handler INT TERM
# build kubernetes / node image, e2e binaries
build() {
# build the node image w/ kubernetes
kind build node-image -v 1
# Ginkgo v1 is used by Kubernetes 1.24 and earlier, fallback if v2 is not available.
GINKGO_SRC_DIR="vendor/github.com/onsi/ginkgo/v2/ginkgo"
if [ ! -d "$GINKGO_SRC_DIR" ]; then
GINKGO_SRC_DIR="vendor/github.com/onsi/ginkgo/ginkgo"
fi
# make sure we have e2e requirements
make all WHAT="cmd/kubectl test/e2e/e2e.test ${GINKGO_SRC_DIR}"
# Ensure the built kubectl is used instead of system
export PATH="${PWD}/_output/bin:$PATH"
}
# up a cluster with kind
create_cluster() {
# Default Log level for all components in test clusters
KIND_CLUSTER_LOG_LEVEL=${KIND_CLUSTER_LOG_LEVEL:-4}
# JSON or YAML map injected into featureGates config
feature_gates="${FEATURE_GATES:-{\}}"
# --runtime-config argument value passed to the API server, again as a map
runtime_config="${RUNTIME_CONFIG:-{\}}"
# create the config file
cat <<EOF > "${ARTIFACTS}/kind-config.yaml"
# config for 1 control plane node and 2 workers (necessary for conformance)
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ${IP_FAMILY:-ipv4}
kubeProxyMode: ${KUBE_PROXY_MODE:-iptables}
# don't pass through host search paths
# TODO: possibly a reasonable default in the future for kind ...
dnsSearch: []
nodes:
- role: control-plane
- role: worker
- role: worker
featureGates: ${feature_gates}
runtimeConfig: ${runtime_config}
kubeadmConfigPatches:
# v1beta4 for the future (v1.35.0+ ?)
# https://github.com/kubernetes-sigs/kind/issues/3847
# TODO: drop v1beta3 when we no longer need versions that use it
- |
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta4
apiServer:
extraArgs:
- name: "v"
value: "${KIND_CLUSTER_LOG_LEVEL}"
controllerManager:
extraArgs:
- name: "v"
value: "${KIND_CLUSTER_LOG_LEVEL}"
scheduler:
extraArgs:
- name: "v"
value: "${KIND_CLUSTER_LOG_LEVEL}"
---
kind: InitConfiguration
apiVersion: kubeadm.k8s.io/v1beta4
nodeRegistration:
kubeletExtraArgs:
- name: "v"
value: "${KIND_CLUSTER_LOG_LEVEL}"
- name: "container-log-max-files"
value: "10"
- name: "container-log-max-size"
value: "100Mi"
---
kind: JoinConfiguration
apiVersion: kubeadm.k8s.io/v1beta4
nodeRegistration:
kubeletExtraArgs:
- name: "v"
value: "${KIND_CLUSTER_LOG_LEVEL}"
# Warning: these flags appear to be load bearing / impact performance
# See: https://github.com/kubernetes-sigs/kind/pull/4046
# Be careful when updating these.
# Most CI jobs should not need them, but some CI jobs might.
- name: "container-log-max-files"
value: "10"
- name: "container-log-max-size"
value: "100Mi"
# v1beta3 for v1.23.0 ... ?
- |
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
apiServer:
extraArgs:
"v": "${KIND_CLUSTER_LOG_LEVEL}"
controllerManager:
extraArgs:
"v": "${KIND_CLUSTER_LOG_LEVEL}"
scheduler:
extraArgs:
"v": "${KIND_CLUSTER_LOG_LEVEL}"
---
kind: InitConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
nodeRegistration:
kubeletExtraArgs:
"v": "${KIND_CLUSTER_LOG_LEVEL}"
"container-log-max-files": "10"
"container-log-max-size": "100Mi"
---
kind: JoinConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
nodeRegistration:
kubeletExtraArgs:
"v": "${KIND_CLUSTER_LOG_LEVEL}"
# Warning: these flags appear to be load bearing / impact performance
# See: https://github.com/kubernetes-sigs/kind/pull/4046
# Be careful when updating these.
# Most CI jobs should not need them, but some CI jobs might.
"container-log-max-files": "10"
"container-log-max-size": "100Mi"
EOF
# NOTE: must match the number of workers above
NUM_NODES=2
# actually create the cluster
# TODO(BenTheElder): settle on verbosity for this script
KIND_CREATE_ATTEMPTED=true
kind create cluster \
--image=kindest/node:latest \
--retain \
--wait=1m \
-v=3 \
"--config=${ARTIFACTS}/kind-config.yaml"
# debug cluster version
kubectl version
# Patch kube-proxy to set the verbosity level
kubectl patch -n kube-system daemonset/kube-proxy \
--type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--v='"${KIND_CLUSTER_LOG_LEVEL}"'" }]'
}
# run e2es with ginkgo-e2e.sh
run_tests() {
# IPv6 clusters need some CoreDNS changes in order to work in k8s CI:
# 1. k8s CI doesn´t offer IPv6 connectivity, so CoreDNS should be configured
# to work in an offline environment:
# https://github.com/coredns/coredns/issues/2494#issuecomment-457215452
# 2. k8s CI adds following domains to resolv.conf search field:
# c.k8s-prow-builds.internal google.internal.
# CoreDNS should handle those domains and answer with NXDOMAIN instead of SERVFAIL
# otherwise pods stops trying to resolve the domain.
if [ "${IP_FAMILY:-ipv4}" = "ipv6" ]; then
# Get the current config
original_coredns=$(kubectl get -oyaml -n=kube-system configmap/coredns)
echo "Original CoreDNS config:"
echo "${original_coredns}"
# Patch it
fixed_coredns=$(
printf '%s' "${original_coredns}" | sed \
-e 's/^.*kubernetes cluster\.local/& internal/' \
-e '/^.*upstream$/d' \
-e '/^.*fallthrough.*$/d' \
-e '/^.*forward . \/etc\/resolv.conf$/d' \
-e '/^.*loop$/d' \
)
echo "Patched CoreDNS config:"
echo "${fixed_coredns}"
printf '%s' "${fixed_coredns}" | kubectl apply -f -
fi
# ginkgo regexes and label filter
SKIP="${SKIP:-}"
LABEL_FILTER="${LABEL_FILTER:-}"
# Only default to Conformance if FOCUS was not explicitly set.
# This allows FOCUS="" to run all tests (no focus filter).
if [ "${FOCUS+set}" != "set" ]; then
if [ -z "${LABEL_FILTER}" ]; then
FOCUS="\\[Conformance\\]"
else
FOCUS=""
fi
fi
# if we set PARALLEL=true, skip serial tests set --ginkgo-parallel
if [ "${PARALLEL:-false}" = "true" ]; then
export GINKGO_PARALLEL=y
if [ -z "${SKIP}" ]; then
SKIP="\\[Serial\\]"
else
SKIP="\\[Serial\\]|${SKIP}"
fi
fi
# setting this env prevents ginkgo e2e from trying to run provider setup
export KUBERNETES_CONFORMANCE_TEST='y'
# setting these is required to make RuntimeClass tests work ... :/
export KUBE_CONTAINER_RUNTIME=remote
export KUBE_CONTAINER_RUNTIME_ENDPOINT=unix:///run/containerd/containerd.sock
export KUBE_CONTAINER_RUNTIME_NAME=containerd
# ginkgo can take forever to exit, so we run it in the background and save the
# PID, bash will not run traps while waiting on a process, but it will while
# running a builtin like `wait`, saving the PID also allows us to forward the
# interrupt
./hack/ginkgo-e2e.sh \
'--provider=skeleton' "--num-nodes=${NUM_NODES}" \
"--ginkgo.focus=${FOCUS}" "--ginkgo.skip=${SKIP}" "--ginkgo.label-filter=${LABEL_FILTER}" \
"--report-dir=${ARTIFACTS}" '--disable-log-dump=true' &
GINKGO_PID=$!
wait "$GINKGO_PID"
}
main() {
# create temp dir and setup cleanup
TMP_DIR=$(mktemp -d)
# ensure artifacts (results) directory exists when not in CI
export ARTIFACTS="${ARTIFACTS:-${PWD}/_artifacts}"
mkdir -p "${ARTIFACTS}"
# export the KUBECONFIG to a unique path for testing
KUBECONFIG="${HOME}/.kube/kind-test-config"
export KUBECONFIG
echo "exported KUBECONFIG=${KUBECONFIG}"
# debug kind version
kind version
# build kubernetes
build
# in CI attempt to release some memory after building
if [ -n "${KUBETEST_IN_DOCKER:-}" ]; then
sync || true
echo 1 > /proc/sys/vm/drop_caches || true
fi
# create the cluster and run tests
res=0
create_cluster || res=$?
run_tests || res=$?
cleanup || res=$?
exit $res
}
main
================================================
FILE: hack/ci/e2e.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# hack script for running a kind e2e
# must be run with a kubernetes checkout in $PWD (IE from the checkout)
# Usage: SKIP="ginkgo skip regex" FOCUS="ginkgo focus regex" kind-e2e.sh
set -o errexit -o nounset -o pipefail -o xtrace
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
# our exit handler (trap)
cleanup() {
# remove our tempdir, this needs to be last, or it will prevent kind delete
[[ -n "${TMP_DIR:-}" ]] && rm -rf "${TMP_DIR:?}"
}
# install kind to a tempdir GOPATH from this script's kind checkout
install_kind() {
mkdir -p "${TMP_DIR}/bin"
make -C "${REPO_ROOT}" install INSTALL_PATH="${TMP_DIR}/bin"
export PATH="${TMP_DIR}/bin:${PATH}"
}
main() {
# create temp dir and setup cleanup
TMP_DIR=$(mktemp -d)
trap cleanup INT TERM EXIT
# install kind
install_kind
# build kubernetes / e2e test
"${REPO_ROOT}/hack/ci/e2e-k8s.sh"
}
main
================================================
FILE: hack/ci/init-vm.sh
================================================
#!/bin/bash
set -eux -o pipefail
# Ensure network-related modules to be loaded
modprobe tap ip_tables iptable_nat ip6_tables ip6table_nat
# The moby-engine package included in Fedora lacks support for rootless,
# So we need to install docker-ce and docker-ce-rootless-extras from the upstream.
DNF_REPO=""
INSTALL_PODMAN="1"
if grep -q centos /etc/os-release; then
# Works with Rocky and Alma too
DNF_REPO="https://download.docker.com/linux/centos/docker-ce.repo"
if grep -q el8 /etc/os-release; then
# podman seems to conflict with docker-ce on EL8
INSTALL_PODMAN=""
fi
elif grep -q fedora /etc/os-release; then
DNF_REPO="https://download.docker.com/linux/fedora/docker-ce.repo"
else
echo >&2 "Unsupported OS"
exit 1
fi
DNF="dnf"
if command -v dnf5 &>/dev/null; then
# DNF 5 (Fedora 41 or later)
DNF="dnf5"
"$DNF" config-manager addrepo --from-repofile="${DNF_REPO}"
else
# DNF 4
"$DNF" config-manager --add-repo="${DNF_REPO}"
fi
"$DNF" install -y git golang make docker-ce docker-ce-rootless-extras
systemctl enable --now docker
if [ -n "${INSTALL_PODMAN}" ]; then
"$DNF" install -y podman
fi
# Install kubectl
GOARCH="$(uname -m | sed -e 's/aarch64/arm64/' -e 's/x86_64/amd64/')"
curl -L -o /usr/bin/kubectl "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/${GOARCH}/kubectl"
chmod +x /usr/bin/kubectl
# Configuration for rootless: https://kind.sigs.k8s.io/docs/user/rootless/
mkdir -p "/etc/systemd/system/user@.service.d"
cat <<EOF >"/etc/systemd/system/user@.service.d/delegate.conf"
[Service]
Delegate=yes
EOF
systemctl daemon-reload
================================================
FILE: hack/ci/lima-helper.sh
================================================
#!/usr/bin/env bash
# Copyright 2021 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
: "${KIND_EXPERIMENTAL_PROVIDER:=docker}"
sudo=sudo
[ "$ROOTLESS" = "rootless" ] && sudo=
exec lima $sudo KIND_EXPERIMENTAL_PROVIDER="$KIND_EXPERIMENTAL_PROVIDER" "${@}"
================================================
FILE: hack/ci/push-latest-cli/README.md
================================================
This tooling is used for our automated builds.
These are meant to be consumed *only* by The Kubernetes Project's CI for
testing Kubernetes.
These builds are currently not supported for other purposes.
See github.com/kubernetes/test-infra for the automation that invokes these.
================================================
FILE: hack/ci/push-latest-cli/cloudbuild.yaml
================================================
# See https://cloud.google.com/cloud-build/docs/build-config
options:
substitution_option: ALLOW_LOOSE
steps:
- name: gcr.io/k8s-staging-test-infra/krte:latest-master
env:
- PULL_BASE_SHA=$_PULL_BASE_SHA
entrypoint: hack/ci/push-latest-cli/push-latest-cli.sh
substitutions:
_GIT_TAG: '12345'
_PULL_BASE_SHA: 'oops'
================================================
FILE: hack/ci/push-latest-cli/push-latest-cli.sh
================================================
#!/usr/bin/env bash
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
set -x;
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
# pass through git details from prow / image builder
if [ -n "${PULL_BASE_SHA:-}" ]; then
export COMMIT="${PULL_BASE_SHA:?}"
else
COMMIT="$(git rev-parse HEAD 2>/dev/null)"
export COMMIT
fi
# short commit is currently 8 characters
SHORT_COMMIT="${COMMIT:0:8}"
# we upload here
BUCKET="${BUCKET:-k8s-staging-kind}"
# under each of these
VERSIONS=(
latest
"${SHORT_COMMIT}"
)
# build for all platforms
hack/release/build/cross.sh
# upload to the bucket
for f in bin/kind-*; do
# make a tarball with this
# TODO: eliminate e2e-k8s.sh
base="$(basename "$f")"
platform="${base#kind-}"
tar \
-czvf "bin/${platform}.tgz" \
--transform 's#.*kind.*#kind#' \
--transform 's#.*e2e-k8s.sh#e2e-k8s.sh#' \
--transform='s#^/#./#' \
--mode='755' \
"${f}" \
"hack/ci/e2e-k8s.sh"
# copy everything up to each version
for version in "${VERSIONS[@]}"; do
gsutil cp -P "bin/${platform}.tgz" "gs://${BUCKET}/${version}/${platform}.tgz"
gsutil cp -P "$f" "gs://${BUCKET}/${version}/${base}"
done
done
# upload the e2e script so kubernetes CI can consume it
for version in "${VERSIONS[@]}"; do
gsutil cp -P hack/ci/e2e-k8s.sh "gs://${BUCKET}/${version}/e2e-k8s.sh"
done
================================================
FILE: hack/make-rules/test.sh
================================================
#!/usr/bin/env bash
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# script to run unit / integration tests, with coverage enabled and junit xml output
set -o errexit -o nounset -o pipefail
# cd to the repo root and setup go
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
cd "${REPO_ROOT}"
source hack/build/setup-go.sh
# set to 'unit' or 'integration' to run a subset
MODE="${MODE:-all}"
# build gotestsum
cd 'hack/tools'
go build -o "${REPO_ROOT}/bin/gotestsum" gotest.tools/gotestsum
cd "${REPO_ROOT}"
go_test_opts=(
"-coverprofile=${REPO_ROOT}/bin/${MODE}.cov"
'-covermode' 'count'
'-coverpkg' 'sigs.k8s.io/kind/...'
)
if [[ "${MODE}" = 'unit' ]]; then
go_test_opts+=('-short' '-tags=nointegration')
elif [[ "${MODE}" = 'integration' ]]; then
go_test_opts+=('-run' '^TestIntegration')
fi
# run unit tests with coverage enabled and junit output
(
set -x;
"${REPO_ROOT}/bin/gotestsum" --junitfile="${REPO_ROOT}/bin/${MODE}-junit.xml" \
-- "${go_test_opts[@]}" './...'
)
# filter out generated files
sed '/zz_generated/d' "${REPO_ROOT}/bin/${MODE}.cov" > "${REPO_ROOT}/bin/${MODE}-filtered.cov"
# generate cover html
go tool cover -html="${REPO_ROOT}/bin/${MODE}-filtered.cov" -o "${REPO_ROOT}/bin/${MODE}-filtered.html"
# if we are in CI, copy to the artifact upload location
if [[ -n "${ARTIFACTS:-}" ]]; then
cp "bin/${MODE}-junit.xml" "${ARTIFACTS:?}/junit.xml"
cp "${REPO_ROOT}/bin/${MODE}-filtered.cov" "${ARTIFACTS:?}/filtered.cov"
cp "${REPO_ROOT}/bin/${MODE}-filtered.html" "${ARTIFACTS:?}/filtered.html"
fi
================================================
FILE: hack/make-rules/update/README.md
================================================
This directory contains tools used to update dependencies, generated files, etc.
================================================
FILE: hack/make-rules/update/all.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# script to run all update scripts (except deps)
set -o errexit -o nounset -o pipefail
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
hack/make-rules/update/deps.sh
hack/make-rules/update/generated.sh
hack/make-rules/update/gofmt.sh
================================================
FILE: hack/make-rules/update/deps.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Runs go mod tidy, go mod vendor, and then prunes vendor
#
# Usage:
# deps.sh
set -o errexit -o nounset -o pipefail
# cd to the repo root and setup go
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
source hack/build/setup-go.sh
# tidy all modules
go mod tidy
cd "${REPO_ROOT}/hack/tools"
go mod tidy
# NOTE: kindnetd is only built for linux and uses linux APIs
cd "${REPO_ROOT}/images/kindnetd"
GOOS=linux go mod tidy
================================================
FILE: hack/make-rules/update/generated.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 'go generate's kind, using tools from vendor (go-bindata)
set -o errexit -o nounset -o pipefail
# cd to the repo root and setup go
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
source hack/build/setup-go.sh
# build the generators using the tools module
cd "${REPO_ROOT}/hack/tools"
go build -o "${REPO_ROOT}/bin/deepcopy-gen" k8s.io/code-generator/cmd/deepcopy-gen
# go back to the root
cd "${REPO_ROOT}"
# turn off module mode before running the generators
# https://github.com/kubernetes/code-generator/issues/69
# we also need to populate vendor
# run the generators
bin/deepcopy-gen --output-file zz_generated.deepcopy.go --go-header-file hack/tools/boilerplate.go.txt ./pkg/internal/apis/config/
bin/deepcopy-gen --output-file zz_generated.deepcopy.go --go-header-file hack/tools/boilerplate.go.txt ./pkg/apis/config/v1alpha4
# set module mode back, return to repo root and gofmt to ensure we format generated code
make gofmt
================================================
FILE: hack/make-rules/update/gofmt.sh
================================================
#!/bin/bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# script to run gofmt over our code (not vendor)
set -o errexit -o nounset -o pipefail
# cd to the repo root and setup go
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
source hack/build/setup-go.sh
find . -name '*.go' -type f -print0 | xargs -0 gofmt -s -w
================================================
FILE: hack/make-rules/verify/README.md
================================================
This directory contains tools to verify the state and quality of the repo.
================================================
FILE: hack/make-rules/verify/all.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
# exit code, if a script fails we'll set this to 1
res=0
# run all verify scripts, optionally skipping any of them
if [[ "${VERIFY_LINT:-true}" == "true" ]]; then
echo "verifying lints ..."
hack/make-rules/verify/lint.sh || res=1
cd "${REPO_ROOT}"
fi
if [[ "${VERIFY_GENERATED:-true}" == "true" ]]; then
echo "verifying generated ..."
hack/make-rules/verify/generated.sh || res=1
cd "${REPO_ROOT}"
fi
if [[ "${VERIFY_SHELLCHECK:-true}" == "true" ]]; then
echo "verifying shellcheck ..."
hack/make-rules/verify/shellcheck.sh || res=1
cd "${REPO_ROOT}"
fi
# exit based on verify scripts
if [[ "${res}" = 0 ]]; then
echo ""
echo "All verify checks passed, congrats!"
else
echo ""
echo "One or more verify checks failed! See output above..."
fi
exit "${res}"
================================================
FILE: hack/make-rules/verify/generated.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
# cd to the repo root and setup go
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
source hack/build/setup-go.sh
# place to stick temp binaries
BINDIR="${REPO_ROOT}/bin"
mkdir -p "${BINDIR}"
# TMP_REPO is used in make_temp_repo_copy
TMP_REPO="$(TMPDIR="${BINDIR}" mktemp -d "${BINDIR}/verify-deps.XXXXX")"
# exit trap cleanup for TMP_REPO
cleanup() {
if [[ -n "${TMP_REPO}" ]]; then
rm -rf "${TMP_REPO}"
fi
}
# copies repo into a temp root saved to TMP_REPO
make_temp_repo_copy() {
# we need to copy everything but bin (and the old _output) (which is .gitignore anyhow)
find . \
-mindepth 1 -maxdepth 1 \
\( \
-type d -path "./.git" -o \
-type d -path "./bin" -o \
-type d -path "./_output" \
\) -prune -o \
-exec bash -c 'cp -r "${0}" "${1}/${0}" >/dev/null 2>&1' {} "${TMP_REPO}" \;
}
main() {
trap cleanup EXIT
# copy repo root into tempdir under ./_output
make_temp_repo_copy
# run generated code update script
cd "${TMP_REPO}"
REPO_ROOT="${TMP_REPO}" make generate
# make sure the temp repo has no changes relative to the real repo
diff=$(diff -Nupr \
-x ".git" \
-x "bin" \
-x "_output" \
-x "vendor" \
"${REPO_ROOT}" "${TMP_REPO}" 2>/dev/null || true)
if [[ -n "${diff}" ]]; then
echo "unexpectedly dirty working directory after hack/update/generated.sh" >&2
echo "" >&2
echo "${diff}" >&2
echo "" >&2
echo "please run make generate" >&2
exit 1
fi
}
main
================================================
FILE: hack/make-rules/verify/lint.sh
================================================
#!/usr/bin/env bash
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# script to run linters
set -o errexit -o nounset -o pipefail
# cd to the repo root and setup go
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
source hack/build/setup-go.sh
# build golangci-lint
cd "${REPO_ROOT}/hack/tools"
go build -o "${REPO_ROOT}"/bin/golangci-lint github.com/golangci/golangci-lint/v2/cmd/golangci-lint
cd "${REPO_ROOT}"
# first for the repo in general
"${REPO_ROOT}"/bin/golangci-lint --config "${REPO_ROOT}/hack/tools/.golangci.yml" run ./...
# then for kindnetd module
cd "${REPO_ROOT}/images/kindnetd"
GOOS=linux "${REPO_ROOT}"/bin/golangci-lint --config "${REPO_ROOT}/hack/tools/.golangci.yml" run ./...
================================================
FILE: hack/make-rules/verify/shellcheck.sh
================================================
#!/usr/bin/env bash
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# CI script to run shellcheck
set -o errexit
set -o nounset
set -o pipefail
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
# required version for this script, if not installed on the host we will
# use the official docker image instead. keep this in sync with SHELLCHECK_IMAGE
SHELLCHECK_VERSION="0.9.0"
# upstream shellcheck latest stable image as of October 23rd, 2019
SHELLCHECK_IMAGE='docker.io/koalaman/shellcheck-alpine:v0.9.0@sha256:e19ed93c22423970d56568e171b4512c9244fc75dd9114045016b4a0073ac4b7'
DOCKER="${DOCKER:-docker}"
# detect if the host machine has the required shellcheck version installed
# if so, we will use that instead.
HAVE_SHELLCHECK=false
if which shellcheck &>/dev/null; then
detected_version="$(shellcheck --version | grep 'version: .*')"
if [[ "${detected_version}" = "version: ${SHELLCHECK_VERSION}" ]]; then
HAVE_SHELLCHECK=true
fi
fi
# Find all shell scripts excluding:
# - Anything git-ignored - No need to lint untracked files.
# - ./.git/* - Ignore anything in the git object store.
# - ./vendor/* - Ignore vendored contents.
# - ./bin/* - No need to lint output directories.
all_shell_scripts=()
while IFS=$'\n' read -r script;
do git check-ignore -q "$script" || all_shell_scripts+=("$script");
done < <(grep -irl '#!.*sh' . | grep -Ev '(^\./\.git/)|(^\./vendor/)|(^\./hack/third_party/)|(^\./images/.*/scripts/third_party/)|(^\./bin/)|(\.go$)')
# common arguments we'll pass to shellcheck
SHELLCHECK_OPTIONS=(
# allow following sourced files that are not specified in the command,
# we need this because we specify one file at a time in order to trivially
# detect which files are failing
'--external-sources'
# disabled lint codes
# 2330 - disabled due to https://github.com/koalaman/shellcheck/issues/1162
'--exclude=2230'
# 2126 - disabled because grep -c exits error when there are zero matches,
# unlike grep | wc -l
'--exclude=2126'
# set colorized output
'--color=auto'
)
# actually shellcheck
# tell the user which we've selected and lint all scripts
# The shellcheck errors are printed to stdout by default, hence they need to be redirected
# to stderr in order to be well parsed for Junit representation by juLog function
res=0
if ${HAVE_SHELLCHECK}; then
>&2 echo "Using host shellcheck ${SHELLCHECK_VERSION} binary."
shellcheck "${SHELLCHECK_OPTIONS[@]}" "${all_shell_scripts[@]}" >&2 || res=$?
else
>&2 echo "Using shellcheck ${SHELLCHECK_VERSION} docker image."
"${DOCKER}" run \
--rm -v "${REPO_ROOT}:${REPO_ROOT}" -w "${REPO_ROOT}" \
"${SHELLCHECK_IMAGE}" \
shellcheck "${SHELLCHECK_OPTIONS[@]}" "${all_shell_scripts[@]}" >&2 || res=$?
fi
exit $res
================================================
FILE: hack/release/build/README.md
================================================
This directory contains temporary tooling used to make releasing kind easier.
================================================
FILE: hack/release/build/cross.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# simple script to build binaries for release
set -o errexit -o nounset -o pipefail
# cd to the repo root and setup go
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
source hack/build/setup-go.sh
# controls the number of concurrent builds
PARALLELISM=${PARALLELISM:-6}
echo "Building in parallel for:"
# What we do here:
# - use xargs to build in parallel (-P) while collecting a combined exit code
# - use cat to supply the individual args to xargs (one line each)
# - use env -S to split the line into environment variables and execute
# - ... the build
# NOTE: the binary name needs to be in single quotes so we delay evaluating
# GOOS / GOARCH
# NOTE: disable SC2016 because we _intend_ for these to evaluate later
# shellcheck disable=SC2016
if xargs -0 -n1 -P "${PARALLELISM}" bash -c 'eval $0; make build KIND_BINARY_NAME=kind-${GOOS}-${GOARCH}'; then
echo "Cross build passed!" 1>&2
else
echo "Cross build failed!" 1>&2
exit 1
fi < <(cat <<EOF | tr '\n' '\0'
export GOOS=windows GOARCH=amd64
export GOOS=darwin GOARCH=amd64
export GOOS=darwin GOARCH=arm64
export GOOS=linux GOARCH=amd64
export GOOS=linux GOARCH=arm64
EOF
)
# add sha256 for binaries
cd "${REPO_ROOT}"/bin
for f in kind-*; do
shasum -a 256 "$f" > "$f".sha256sum;
done
================================================
FILE: hack/release/build/push-node.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
REGISTRY="${REGISTRY:-gcr.io/k8s-staging-kind}"
IMAGE_NAME="${IMAGE_NAME:-node}"
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
# ensure we have up to date kind
make build
# path to kubernetes sources
KUBEROOT="${KUBEROOT:-"$(go env GOPATH)"/src/k8s.io/kubernetes}"
# ensure we have qemu setup so we can run cross-arch images
# TODO: dedupe specifying this image?
docker run --rm --privileged tonistiigi/binfmt:qemu-v7.0.0-28@sha256:66e11bea77a5ea9d6f0fe79b57cd2b189b5d15b93a2bdb925be22949232e4e55 --install all
# NOTE: adding platforms is costly in terms of build time
# we will consider expanding this in the future, for now the aim is to prove
# multi-arch and enable developers working on commonly available hardware
# Other users are free to build their own images on additional platforms using
# their own time and resources. Please see our docs.
ARCHES="${ARCHES:-amd64 arm64}"
IFS=" " read -r -a __arches__ <<< "$ARCHES"
set -x
# ensure clean build
(cd "${KUBEROOT}" && make clean)
# get kubernetes version
version_line="$(cd "${KUBEROOT}"; ./hack/print-workspace-status.sh | grep 'STABLE_DOCKER_TAG')"
kube_version="${version_line#"STABLE_DOCKER_TAG "}"
# kubernetes build option(s)
GOFLAGS="${GOFLAGS:-}"
if [ -z "${GOFLAGS}" ]; then
# TODO: dockerless only applies to < 1.24, the version selection here is brittle
case "${kube_version}" in
v1.1[0-8].*)
GOFLAGS="-tags=providerless"
;;
*)
GOFLAGS="-tags=providerless,dockerless"
;;
esac
fi
export GOFLAGS
# build for each arch
IMAGE="${REGISTRY}/${IMAGE_NAME}:${kube_version}"
images=()
for arch in "${__arches__[@]}"; do
image="${REGISTRY}/${IMAGE_NAME}-${arch}:${kube_version}"
"${REPO_ROOT}/bin/kind" build node-image --image="${image}" --arch="${arch}" "${KUBEROOT}"
images+=("${image}")
done
# combine to manifest list tagged with kubernetes version
# images must be pushed to be referenced by docker manifest
# we push only after all builds have succeeded
for image in "${images[@]}"; do
docker push "${image}"
done
docker manifest rm "${IMAGE}" || true
docker manifest create "${IMAGE}" "${images[@]}"
docker manifest push "${IMAGE}"
================================================
FILE: hack/release/create.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# creates a release and following pre-release commit for `kind`
# builds binaries between the commits
# Use like: create.sh <release-version> <next-prerelease-version>
# EG: create.sh 0.3.0 0.4.0
set -o errexit -o nounset -o pipefail
UPSTREAM='https://github.com/kubernetes-sigs/kind.git'
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
cd "${REPO_ROOT}"
# check for arguments
if [ "$#" -ne 2 ]; then
echo "Usage: create.sh release-version next-prerelease-version"
exit 1
fi
# darwin is great
SED="sed"
if which gsed &>/dev/null; then
SED="gsed"
fi
if ! (${SED} --version 2>&1 | grep -q GNU); then
echo "!!! GNU sed is required. If on OS X, use 'brew install gnu-sed'." >&2
exit 1
fi
VERSION_FILE="./pkg/cmd/kind/version/version.go"
# update core version in go code to $1 and pre-release version to $2
set_version() {
${SED} -i "s/versionCore = .*/versionCore = \"${1}\"/" "${VERSION_FILE}"
${SED} -i "s/versionPreRelease = .*/versionPreRelease = \"${2}\"/" "${VERSION_FILE}"
echo "Updated ${VERSION_FILE} for ${1}"
}
# make a commit denoting the version ($1)
make_commit() {
git add "${VERSION_FILE}"
git commit -m "version ${1}"
echo "Created commit for ${1}"
}
# add a git tag with $1
add_tag() {
git tag "${1}"
echo "Tagged ${1}"
}
# create the first version, tag and build it
set_version "${1}" ""
make_commit "v${1}"
add_tag "v${1}"
echo "Building ..."
make clean && ./hack/release/build/cross.sh
# update to the second version
set_version "${2}" "alpha"
make_commit "v${2}-alpha"
add_tag "v${2}-alpha"
# print follow-up instructions
echo ""
echo "Created commits for v${1} and v${2}, you should now:"
echo " - git push"
echo " - File a PR with these pushed commits"
echo " - Merge the PR"
echo " - git push ${UPSTREAM} v${1}"
echo " - git push ${UPSTREAM} v${2}-alpha"
echo " - Create a GitHub release from the pushed tag v${1}"
================================================
FILE: hack/release/get-contributors.sh
================================================
#!/usr/bin/env bash
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# inputs are:
# - LAST_VERSION_TAG -- This is the version to get commits since
# like: LAST_VERSION_TAG="v0.8.1"
# - GITHUB_OATH_TOKEN -- used to avoid hitting API rate limits
ORG="kubernetes-sigs"
REPO="kind"
# query git for contributors since the tag
contributors=()
while IFS='' read -r line; do contributors+=("$line"); done < <(git log --format="%aN <%aE>" "${LAST_VERSION_TAG:?}.." | sort | uniq)
# query github for usernames and output bulleted list
contributor_logins=()
for contributor in "${contributors[@]}"; do
# get a commit for this author
commit_for_contributor="$(git log --author="${contributor}" --pretty=format:"%H" -1)"
# lookup the commit info to get the login
contributor_logins+=("$(curl \
-sG \
${GITHUB_OAUTH_TOKEN:+-H "Authorization: Bearer ${GITHUB_OAUTH_TOKEN:?}"} \
--data-urlencode "q=${contributor}" \
"https://api.github.com/repos/${ORG}/${REPO}/commits/${commit_for_contributor}" \
| jq -r .author.login
)")
done
echo "Contributors since ${LAST_VERSION_TAG}:"
# echo sorted formatted list
while IFS='' read -r contributor_login; do
echo "- @${contributor_login}"
done < <(for c in "${contributor_logins[@]}"; do echo "$c"; done | LC_COLLATE=C sort --ignore-case | uniq)
================================================
FILE: hack/release/push-node.sh
================================================
#!/usr/bin/env bash
# Copyright 2024 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# this script replaces hack/release/build/push-node.sh for Kubernetes v1.31+
# usage: push-node.sh v1.32.0
set -o errexit -o nounset -o pipefail
REGISTRY="${REGISTRY:-gcr.io/k8s-staging-kind}"
IMAGE_NAME="${IMAGE_NAME:-node}"
# cd to the repo root
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." &> /dev/null && pwd -P)"
cd "${REPO_ROOT}"
VERSION="${1:-}"
if [[ -z "${VERSION}" ]]; then
echo >&2 "version argument not supplied, looking up current stable ..."
VERSION="$(curl -sL https://dl.k8s.io/release/stable.txt)"
fi
echo >&2 "will build node image for Kubernetes ${VERSION} ..."
# ensure we have up to date kind
echo >&2 "building kind ..."
make build
# ensure we have qemu setup so we can run cross-arch images
# TODO: dedupe specifying this image?
echo >&2 "ensuring binfmt_misc ..."
docker run --rm --privileged tonistiigi/binfmt:qemu-v7.0.0-28@sha256:66e11bea77a5ea9d6f0fe79b57cd2b189b5d15b93a2bdb925be22949232e4e55 --install all
# NOTE: adding platforms is costly in terms of build time
# we will consider expanding this in the future, for now the aim is to prove
# multi-arch and enable developers working on commonly available hardware
# Other users are free to build their own images on additional platforms using
# their own time and resources. Please see our docs.
ARCHES="${ARCHES:-amd64 arm64}"
IFS=" " read -r -a __arches__ <<< "$ARCHES"
set -x
# build for each arch
IMAGE="${REGISTRY}/${IMAGE_NAME}:${VERSION}"
images=()
for arch in "${__arches__[@]}"; do
image="${REGISTRY}/${IMAGE_NAME}-${arch}:${VERSION}"
echo >&2 "building ${image} ..."
"${REPO_ROOT}/bin/kind" build node-image --image="${image}" --arch="${arch}" "${VERSION}"
images+=("${image}")
done
# combine to manifest list tagged with kubernetes version
# images must be pushed to be referenced by docker manifest
# we push only after all builds have succeeded
for image in "${images[@]}"; do
docker push "${image}"
done
docker manifest rm "${IMAGE}" || true
docker manifest create "${IMAGE}" "${images[@]}"
docker manifest push "${IMAGE}"
================================================
FILE: hack/third_party/gimme/LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2015-2018 gimme contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: hack/third_party/gimme/README.md
================================================
# gimme
This is an unmodified copy of [gimme], so we don't have to download it
from the internet.
[gimme]: https://github.com/travis-ci/gimme
================================================
FILE: hack/third_party/gimme/gimme
================================================
#!/usr/bin/env bash
# vim:noexpandtab:ts=2:sw=2:
#
#+ Usage: $(basename $0) [flags] [go-version] [version-prefix]
#+ -
#+ Version: ${GIMME_VERSION}
#+ Copyright: ${GIMME_COPYRIGHT}
#+ License URL: ${GIMME_LICENSE_URL}
#+ -
#+ Install go! There are multiple types of installations available, with 'auto' being the default.
#+ If either 'auto' or 'binary' is specified as GIMME_TYPE, gimme will first check for an existing
#+ go installation. This behavior may be disabled by providing '-f/--force/force' as first positional
#+ argument.
#+ -
#+ Option flags:
#+ -h --help help - show this help text and exit
#+ -V --version version - show the version only and exit
#+ -f --force force - remove the existing go installation if present prior to install
#+ -l --list list - list installed go versions and exit
#+ -k --known known - list known go versions and exit
#+ --force-known-update - when used with --known, ignores the cache and updates
#+ -r --resolve resolve - resolve a version specifier to a version, show that and exit
#+ -
#+ Influential env vars:
#+ -
#+ GIMME_GO_VERSION - version to install (*REQUIRED*, may be given as first positional arg)
#+ GIMME_VERSION_PREFIX - prefix for installed versions (default '${GIMME_VERSION_PREFIX}',
#+ may be given as second positional arg)
#+ GIMME_ARCH - arch to install (default '${GIMME_ARCH}')
#+ GIMME_BINARY_OSX - darwin-specific binary suffix (default '${GIMME_BINARY_OSX}')
#+ GIMME_ENV_PREFIX - prefix for env files (default '${GIMME_ENV_PREFIX}')
#+ GIMME_GO_GIT_REMOTE - git remote for git-based install (default '${GIMME_GO_GIT_REMOTE}')
#+ GIMME_OS - os to install (default '${GIMME_OS}')
#+ GIMME_TMP - temp directory (default '${GIMME_TMP}')
#+ GIMME_TYPE - install type to perform ('auto', 'binary', 'source', or 'git')
#+ (default '${GIMME_TYPE}')
#+ GIMME_INSTALL_RACE - install race directory after compile if non-empty.
#+ If the install type is 'binary', this option is ignored.
#+ GIMME_DEBUG - enable tracing if non-empty
#+ GIMME_NO_ENV_ALIAS - disable creation of env 'alias' file when os and arch match host
#+ GIMME_SILENT_ENV - omit the 'go version' line from env file
#+ GIMME_CGO_ENABLED - enable build of cgo support
#+ GIMME_CC_FOR_TARGET - cross compiler for cgo support
#+ GIMME_DOWNLOAD_BASE - override base URL dir for download (default '${GIMME_DOWNLOAD_BASE}')
#+ GIMME_LIST_KNOWN - override base URL for known go versions (default '${GIMME_LIST_KNOWN}')
#+ GIMME_KNOWN_CACHE_MAX - seconds the cache for --known is valid for (default '${GIMME_KNOWN_CACHE_MAX}')
#+ -
#
set -e
shopt -s nullglob
shopt -s dotglob
shopt -s extglob
set -o pipefail
[[ ${GIMME_DEBUG} ]] && set -x
readonly GIMME_VERSION="v1.5.4"
readonly GIMME_COPYRIGHT="Copyright (c) 2015-2020 gimme contributors"
readonly GIMME_LICENSE_URL="https://raw.githubusercontent.com/travis-ci/gimme/${GIMME_VERSION}/LICENSE"
export GIMME_VERSION
export GIMME_COPYRIGHT
export GIMME_LICENSE_URL
program_name="$(basename "$0")"
# shellcheck disable=SC1117
warn() { printf >&2 "%s: %s\n" "${program_name}" "${*}"; }
die() {
warn "$@"
exit 1
}
# We don't want to go around hitting Google's servers with requests for
# files named HEAD@{date}.tar so we only try binary/source downloads if
# it looks like a plausible name to us.
# We don't need to support 0. releases of Go.
# We don't support 5 digit major-versions of Go (limit back-tracking in RE).
# We don't support very long versions
# (both to avoid annoying download server operators with attacks and
# because regexp backtracking can be pathological).
# Per _assert_version_given we do assume 2.0 not 2
ALLOWED_UPSTREAM_VERSION_RE='^[1-9][0-9]{0,3}(\.[0-9][0-9a-zA-Z_-]{0,9})+$'
#
# The main path which allowed these to leak upstream before has been closed
# but a valid git repo tag or branch-name will still reach the point of
# being _tried_ upstream.
# _do_curl "url" "file"
_do_curl() {
mkdir -p "$(dirname "${2}")"
if command -v curl >/dev/null; then
curl -sSLf "${1}" -o "${2}" 2>/dev/null
return
fi
if command -v wget >/dev/null; then
wget -q "${1}" -O "${2}" 2>/dev/null
return
fi
if command -v fetch >/dev/null; then
fetch -q "${1}" -o "${2}" 2>/dev/null
return
fi
echo >&2 'error: no curl, wget, or fetch found'
exit 1
}
# _sha256sum "file"
_sha256sum() {
if command -v sha256sum &>/dev/null; then
sha256sum "$@"
elif command -v gsha256sum &>/dev/null; then
gsha256sum "$@"
else
shasum -a 256 "$@"
fi
}
# sort versions, handling 1.10 after 1.9, not before 1.2
# FreeBSD sort has --version-sort, none of the others do
# Looks like --general-numeric-sort is the safest; checked macOS 10.12.6, FreeBSD 10.3, Ubuntu Trusty
if sort --version-sort </dev/null &>/dev/null; then
_version_sort() { sort --version-sort; }
else
_version_sort() {
# If we go to four-digit minor or patch versions, then extend the padding here
# (but in such a world, perhaps --version-sort will have become standard by then?)
sed -E 's/\.([0-9](\.|$))/.00\1/g; s/\.([0-9][0-9](\.|$))/.0\1/g' |
sort --general-numeric-sort |
sed 's/\.00*/./g'
}
fi
# _do_curls "file" "url" ["url"...]
_do_curls() {
f="${1}"
shift
if _sha256sum -c "${f}.sha256" &>/dev/null; then
return 0
fi
for url in "${@}"; do
if _do_curl "${url}" "${f}"; then
if _do_curl "${url}.sha256" "${f}.sha256"; then
echo "$(cat "${f}.sha256") ${f}" >"${f}.sha256.tmp"
mv "${f}.sha256.tmp" "${f}.sha256"
if ! _sha256sum -c "${f}.sha256" &>/dev/null; then
warn "sha256sum failed for '${f}'"
warn 'continuing to next candidate URL'
continue
fi
fi
return
fi
done
rm -f "${f}"
return 1
}
# _binary "version" "file.tar.gz" "arch"
_binary() {
local version=${1}
local file=${2}
local arch=${3}
urls=(
"${GIMME_DOWNLOAD_BASE}/go${version}.${GIMME_OS}-${arch}.tar.gz"
)
if [[ "${GIMME_OS}" == 'darwin' && "${GIMME_BINARY_OSX}" ]]; then
urls=(
"${GIMME_DOWNLOAD_BASE}/go${version}.${GIMME_OS}-${arch}-${GIMME_BINARY_OSX}.tar.gz"
"${urls[@]}"
)
fi
if [ "${arch}" = 'arm' ]; then
# attempt "armv6l" vs just "arm" first (since that's what's officially published)
urls=(
"${GIMME_DOWNLOAD_BASE}/go${version}.${GIMME_OS}-${arch}v6l.tar.gz" # go1.6beta2 & go1.6rc1
"${GIMME_DOWNLOAD_BASE}/go${version}.${GIMME_OS}-${arch}6.tar.gz" # go1.6beta1
"${urls[@]}"
)
fi
if [ "${GIMME_OS}" = 'windows' ]; then
urls=(
"${GIMME_DOWNLOAD_BASE}/go${version}.${GIMME_OS}-${arch}.zip"
)
fi
_do_curls "${file}" "${urls[@]}"
}
# _source "version" "file.src.tar.gz"
_source() {
urls=(
"${GIMME_DOWNLOAD_BASE}/go${1}.src.tar.gz"
"https://github.com/golang/go/archive/go${1}.tar.gz"
)
_do_curls "${2}" "${urls[@]}"
}
# _fetch "dir"
_fetch() {
mkdir -p "$(dirname "${1}")"
if [[ -d "${1}/.git" ]]; then
(
cd "${1}"
git remote set-url origin "${GIMME_GO_GIT_REMOTE}"
git fetch -q --all && git fetch -q --tags
)
return
fi
git clone -q "${GIMME_GO_GIT_REMOTE}" "${1}"
}
# _checkout "version" "dir"
# NB: might emit a "renamed version" on stdout
_checkout() {
local spec="${1:?}" godir="${2:?}"
# We are called twice, once during validation that a version was given and
# later during build. We don't want to fetch twice, so we are fetching
# during the validation only, in the caller.
if [[ "${spec}" =~ ^[0-9a-f]{6,}$ ]]; then
# We always treat this as a commit sha, whether instead of doing
# branch tests etc. It looks like a commit sha and the Go maintainers
# aren't daft enough to use pure hex for a tag or branch.
git -C "$godir" reset -q --hard "${spec}" || return 1
return 0
fi
# If spec looks like HEAD^{something} or HEAD^^^ then trying
# origin/$spec would succeed but we'd write junk to the filesystem,
# propagating annoying characters out.
local retval probe_named disallow rev
probe_named=1
disallow='[@^~:{}]'
if [[ "${spec}" =~ $disallow ]]; then
probe_named=0
[[ "${spec}" != "@" ]] || spec="HEAD"
fi
try_spec() { git -C "${godir}" reset -q --hard "$@" -- 2>/dev/null; }
retval=1
if ((probe_named)); then
retval=0
try_spec "origin/${spec}" ||
try_spec "origin/go${spec}" ||
{ [[ "${spec}" == "tip" ]] && try_spec origin/master; } ||
try_spec "refs/tags/${spec}" ||
try_spec "refs/tags/go${spec}" ||
retval=1
fi
if ((retval)); then
retval=0
# We're about to reset anyway, if we succeed, so we should reset to a
# known state before parsing what might be relative specs
try_spec origin/master &&
rev="$(git -C "${godir}" rev-parse --verify -q "${spec}^{object}")" &&
try_spec "${rev}" &&
git -C "${godir}" rev-parse --verify -q --short=12 "${rev}" ||
retval=1
# that rev-parse prints to stdout, so we can affect the version seen
fi
unset -f try_spec
return $retval
}
# _extract "file.tar.gz" "dir"
_extract() {
mkdir -p "${2}"
if [[ "${1}" == *.tar.gz ]]; then
tar -xf "${1}" -C "${2}" --strip-components 1
else
unzip -q "${1}" -d "${2}"
mv "${2}"/go/* "${2}"
rmdir "${2}"/go
fi
}
# _setup_bootstrap
_setup_bootstrap() {
local versions=("1.18" "1.17" "1.16" "1.15" "1.14" "1.13" "1.12" "1.11" "1.10" "1.9" "1.8" "1.7" "1.6" "1.5" "1.4")
# try existing
for v in "${versions[@]}"; do
for candidate in "${GIMME_ENV_PREFIX}/go${v}"*".env"; do
if [ -s "${candidate}" ]; then
# shellcheck source=/dev/null
GOROOT_BOOTSTRAP="$(source "${candidate}" 2>/dev/null && go env GOROOT)"
export GOROOT_BOOTSTRAP
return 0
fi
done
done
# try binary
for v in "${versions[@]}"; do
if [ -n "$(_try_binary "${v}" "${GIMME_HOSTARCH}")" ]; then
export GOROOT_BOOTSTRAP="${GIMME_VERSION_PREFIX}/go${v}.${GIMME_OS}.${GIMME_HOSTARCH}"
return 0
fi
done
echo >&2 "Unable to setup go bootstrap from existing or binary"
return 1
}
# _compile "dir"
_compile() {
(
if grep -q GOROOT_BOOTSTRAP "${1}/src/make.bash" &>/dev/null; then
_setup_bootstrap || return 1
fi
cd "${1}"
if [[ -d .git ]]; then
git clean -dfx -q
fi
cd src
export GOOS="${GIMME_OS}" GOARCH="${GIMME_ARCH}"
export CGO_ENABLED="${GIMME_CGO_ENABLED}"
export CC_FOR_TARGET="${GIMME_CC_FOR_TARGET}"
local make_log="${1}/make.${GOOS}.${GOARCH}.log"
if [[ "${GIMME_DEBUG}" -ge "2" ]]; then
./make.bash -v 2>&1 | tee "${make_log}" 1>&2 || return 1
else
./make.bash &>"${make_log}" || return 1
fi
)
}
_try_install_race() {
if [[ ! "${GIMME_INSTALL_RACE}" ]]; then
return 0
fi
"${1}/bin/go" install -race std
}
_can_compile() {
cat >"${GIMME_TMP}/test.go" <<'EOF'
package main
import "os"
func main() {
os.Exit(0)
}
EOF
"${1}/bin/go" run "${GIMME_TMP}/test.go"
}
# _env "dir"
_env() {
[[ -d "${1}/bin" && -x "${1}/bin/go" ]] || return 1
# if we try to run a Darwin binary on Linux, we need to fail so 'auto' can fallback to cross-compiling from source
# automatically
GOROOT="${1}" GOFLAGS="" "${1}/bin/go" version &>/dev/null || return 1
# https://twitter.com/davecheney/status/431581286918934528
# we have to GOROOT sometimes because we use official release binaries in unofficial locations :(
#
# Issue 87 leads to:
# No, we should _always_ set GOROOT when using official release binaries, and sanest to just always set it.
# The "avoid setting it" is _only_ for people using official releases in official locations.
# Tools like `gimme` are the reason that GOROOT-in-env exists.
echo
if [[ "$(GOROOT="${1}" "${1}/bin/go" env GOHOSTOS)" == "${GIMME_OS}" ]]; then
echo 'unset GOOS;'
else
echo 'export GOOS="'"${GIMME_OS}"'";'
fi
if [[ "$(GOROOT="${1}" "${1}/bin/go" env GOHOSTARCH)" == "${GIMME_ARCH}" ]]; then
echo 'unset GOARCH;'
else
echo 'export GOARCH="'"${GIMME_ARCH}"'";'
fi
echo "export GOROOT='${1}';"
# shellcheck disable=SC2016
echo 'export PATH="'"${1}/bin"':${PATH}";'
if [[ -z "${GIMME_SILENT_ENV}" ]]; then
echo 'go version >&2;'
fi
echo
}
# _env_alias "dir" "env-file"
_env_alias() {
if [[ "${GIMME_NO_ENV_ALIAS}" ]]; then
echo "${2}"
return
fi
if [[ "$(GOROOT="${1}" "${1}/bin/go" env GOHOSTOS)" == "${GIMME_OS}" && "$(GOROOT="${1}" "${1}/bin/go" env GOHOSTARCH)" == "${GIMME_ARCH}" ]]; then
# GIMME_GO_VERSION might be a branch, which can contain '/'
local dest="${GIMME_ENV_PREFIX}/go${GIMME_GO_VERSION//\//__}.env"
cp "${2}" "${dest}"
ln -sf "${dest}" "${GIMME_ENV_PREFIX}/latest.env"
echo "${dest}"
else
echo "${2}"
fi
}
_try_existing() {
case "${1}" in
binary)
local existing_ver="${GIMME_VERSION_PREFIX}/go${GIMME_GO_VERSION}.${GIMME_OS}.${GIMME_ARCH}"
local existing_env="${GIMME_ENV_PREFIX}/go${GIMME_GO_VERSION}.${GIMME_OS}.${GIMME_ARCH}.env"
;;
source)
local existing_ver="${GIMME_VERSION_PREFIX}/go${GIMME_GO_VERSION}.src"
local existing_env="${GIMME_ENV_PREFIX}/go${GIMME_GO_VERSION}.src.env"
;;
*)
_try_existing binary || _try_existing source
return $?
;;
esac
if [[ -x "${existing_ver}/bin/go" && -s "${existing_env}" ]]; then
# newer envs have existing semi-colon at end of line, because newer gimme
# puts them there; envs created before that change lack those semi-colons
# and should gain them, to make it easier for people using eval without
# double-quoting the command substition.
sed -e 's/\([^;]\)$/\1;/' <"${existing_env}"
# gimme is the corner-case where GOROOT _should_ be overriden, since if the
# ancilliary tooling's system-internal DefaultGoroot exists, and GOROOT is
# unset, then it will be used and the wrong golang will be picked up.
# Lots of old installs won't have GOROOT; munge it from $PATH
if grep -qs '^unset GOROOT' -- "${existing_env}"; then
sed -n -e 's/^export PATH="\(.*\)\/bin:.*$/export GOROOT='"'"'\1'"'"';/p' <"${existing_env}"
echo
fi
# Export the same variables whether building new or using existing
echo "export GIMME_ENV='${existing_env}';"
return
fi
return 1
}
# _try_binary "version" "arch"
_try_binary() {
local version=${1}
local arch=${2}
local bin_tgz="${GIMME_TMP}/go${version}.${GIMME_OS}.${arch}.tar.gz"
local bin_dir="${GIMME_VERSION_PREFIX}/go${version}.${GIMME_OS}.${arch}"
local bin_env="${GIMME_ENV_PREFIX}/go${version}.${GIMME_OS}.${arch}.env"
[[ "${version}" =~ ${ALLOWED_UPSTREAM_VERSION_RE} ]] || return 1
if [ "${GIMME_OS}" = 'windows' ]; then
bin_tgz=${bin_tgz%.tar.gz}.zip
fi
_binary "${version}" "${bin_tgz}" "${arch}" || return 1
_extract "${bin_tgz}" "${bin_dir}" || return 1
_env "${bin_dir}" | tee "${bin_env}" || return 1
echo "export GIMME_ENV=\"$(_env_alias "${bin_dir}" "${bin_env}")\""
}
_try_source() {
local src_tgz="${GIMME_TMP}/go${GIMME_GO_VERSION}.src.tar.gz"
local src_dir="${GIMME_VERSION_PREFIX}/go${GIMME_GO_VERSION}.src"
local src_env="${GIMME_ENV_PREFIX}/go${GIMME_GO_VERSION}.src.env"
[[ "${GIMME_GO_VERSION}" =~ ${ALLOWED_UPSTREAM_VERSION_RE} ]] || return 1
_source "${GIMME_GO_VERSION}" "${src_tgz}" || return 1
_extract "${src_tgz}" "${src_dir}" || return 1
_compile "${src_dir}" || return 1
_try_install_race "${src_dir}" || return 1
_env "${src_dir}" | tee "${src_env}" || return 1
echo "export GIMME_ENV=\"$(_env_alias "${src_dir}" "${src_env}")\""
}
# We do _not_ try to use any version caching with _try_existing(), but instead
# build afresh each time. We don't want to deal with someone moving the repo
# to other-version, doing an install, then resetting it back to
# last-version-we-saw and thus introducing conflicts.
#
# If you want to re-use a built-at-spec version, then avoid moving the repo
# and source the generated .env manually.
# Note that the env will just refer to the 'go' directory, so it's not safe
# to reuse anyway.
_try_git() {
local git_dir="${GIMME_VERSION_PREFIX}/go"
local git_env="${GIMME_ENV_PREFIX}/go.git.${GIMME_OS}.${GIMME_ARCH}.env"
local resolved_sha
# Any tags should have been resolved when we asserted that we were
# given a version, so no need to handle that here.
_checkout "${GIMME_GO_VERSION}" "${git_dir}" >/dev/null || return 1
_compile "${git_dir}" || return 1
_try_install_race "${git_dir}" || return 1
_env "${git_dir}" | tee "${git_env}" || return 1
echo "export GIMME_ENV=\"$(_env_alias "${git_dir}" "${git_env}")\""
}
_wipe_version() {
local env_file="${GIMME_ENV_PREFIX}/go${1}.${GIMME_OS}.${GIMME_ARCH}.env"
if [[ -s "${env_file}" ]]; then
rm -rf "$(awk -F\" '/GOROOT/ { print $2 }' "${env_file}")"
rm -f "${env_file}"
fi
}
_list_versions() {
if [ ! -d "${GIMME_VERSION_PREFIX}" ]; then
return 0
fi
local current_version
current_version="$(go env GOROOT 2>/dev/null)"
current_version="${current_version##*/go}"
current_version="${current_version%%.${GIMME_OS}.*}"
# 1.1 1.10 1.2 is bad; zsh has `setopt numeric_glob_sort` but bash
# doesn't appear to have anything like that.
for d in "${GIMME_VERSION_PREFIX}/go"*".${GIMME_OS}."*; do
local cleaned="${d##*/go}"
cleaned="${cleaned%%.${GIMME_OS}.*}"
echo "${cleaned}"
done | _version_sort | while read -r cleaned; do
echo -en "${cleaned}"
if [[ "${cleaned}" == "${current_version}" ]]; then
echo -en ' <= current' >&2
fi
echo
done
}
_update_remote_known_list_if_needed() {
# shellcheck disable=SC1117
local exp="go([[:alnum:]\.]*)\.src.*" # :alnum: catches beta versions too
local list="${GIMME_VERSION_PREFIX}/known-versions.txt"
local dlfile="${GIMME_TMP}/known-dl"
if [[ -e "${list}" ]] &&
! ((force_known_update)) &&
! _file_older_than_secs "${list}" "${GIMME_KNOWN_CACHE_MAX}"; then
echo "${list}"
return 0
fi
[[ -d "${GIMME_VERSION_PREFIX:?}" ]] || mkdir -p -- "${GIMME_VERSION_PREFIX}"
_do_curl "${GIMME_LIST_KNOWN}" "${dlfile}"
while read -r line; do
if [[ "${line}" =~ ${exp} ]]; then
echo "${BASH_REMATCH[1]}"
fi
done <"${dlfile}" | _version_sort | uniq >"${list}.new"
rm -f "${list}" &>/dev/null
mv "${list}.new" "${list}"
rm -f "${dlfile}"
echo "${list}"
return 0
}
_list_known() {
local knownfile
knownfile="$(_update_remote_known_list_if_needed)"
(
_list_versions 2>/dev/null
cat -- "${knownfile}"
) | grep . | _version_sort | uniq
}
# For the "invoked on commandline" case, we want to always pass unknown
# strings through, so that we can be a uniqueness filter, but for unknown
# names we want to exit with a value other than 1, so we document that
# we'll exit 2. For use by other functions, 2 is as good as 1.
_resolve_version() {
case "${1}" in
stable)
_get_curr_stable
return 0
;;
oldstable)
_get_old_stable
return 0
;;
tip)
echo "tip"
return 0
;;
*.x)
true
;;
*)
echo "${1}"
local GIMME_GO_VERSION="$1"
local ASSERT_ABORT='return'
if _assert_version_given 2>/dev/null; then
return 0
fi
warn "version specifier '${1}' unknown"
return 2
;;
esac
# We have a .x suffix
local base="${1%.x}"
local ver last='' known
known="$(_update_remote_known_list_if_needed)" # will be version-sorted
if [[ ! "${base}" =~ ^[0-9.]+$ ]]; then
warn "resolve pattern '${base}.x' invalid for .x finding"
return 2
fi
# The `.x` is optional; "1.10" matches "1.10.x"
local search="^${base//./\\.}(\\.[0-9.]+)?\$"
# avoid regexp attacks
while read -r ver; do
[[ "${ver}" =~ $search ]] || continue
last="${ver}"
done <"$known"
if [[ -n "${last}" ]]; then
echo "${last}"
return 0
fi
echo "${1}"
warn "given '${1}' but no release for '${base}' found"
return 2
}
_realpath() {
# shellcheck disable=SC2005
[ -d "$1" ] && echo "$(cd "$1" && pwd)" || echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}
_get_curr_stable() {
local stable="${GIMME_VERSION_PREFIX}/stable"
if _file_older_than_secs "${stable}" 86400; then
_update_stable "${stable}"
fi
cat "${stable}"
}
_get_old_stable() {
local oldstable="${GIMME_VERSION_PREFIX}/oldstable"
if _file_older_than_secs "${oldstable}" 86400; then
_update_oldstable "${oldstable}"
fi
cat "${oldstable}"
}
_update_stable() {
local stable="${1}"
local url="https://golang.org/VERSION?m=text"
_do_curl "${url}" "${stable}"
sed -i.old -e 's/^go\(.*\)/\1/' "${stable}"
rm -f "${stable}.old"
}
_update_oldstable() {
local oldstable="${1}"
local oldstable_x
oldstable_x=$(_get_curr_stable | awk -F. '{
$2--;
print $1 "." $2 "." "x"
}')
_resolve_version "${oldstable_x}" >"${oldstable}"
}
_last_mod_timestamp() {
local filename="${1}"
case "${GIMME_HOSTOS}" in
darwin | *bsd)
stat -f %m "${filename}"
;;
linux)
stat -c %Y "${filename}"
;;
esac
}
_file_older_than_secs() {
local file="${1}"
local age_secs="${2}"
local ts
# if the file does not exist, we return true, as the cache needs updating
ts="$(_last_mod_timestamp "${file}" 2>/dev/null)" || return 0
((($(date +%s) - ts) > age_secs))
}
_assert_version_given() {
# By the time we're called, aliases such as "stable" must have been resolved
# but we could be a reference in git.
#
# Versions can include suffices such as in "1.8beta2", so our assumption is that
# there will always be a minor present; the first public release was "1.0" so
# we assume "2.0" not "2".
if [[ -z "${GIMME_GO_VERSION}" ]]; then
echo >&2 'error: no GIMME_GO_VERSION supplied'
echo >&2 " ex: GIMME_GO_VERSION=1.4.1 ${0} ${*}"
echo >&2 " ex: ${0} 1.4.1 ${*}"
${ASSERT_ABORT:-exit} 1
fi
# Note: _resolve_version calls back to us (_assert_version_given), but
# only for cases where the version does not end with .x, so this should
# be safe.
# This should be untangled. PRs accepted, good starter project.
if [[ "${GIMME_GO_VERSION}" == *.x ]]; then
GIMME_GO_VERSION="$(_resolve_version "${GIMME_GO_VERSION}")" || ${ASSERT_ABORT:-exit} 1
fi
if [[ "${GIMME_GO_VERSION}" == +([[:digit:]]).+([[:digit:]])* ]]; then
return 0
fi
# Here we resolve symbolic references. If we don't, then we get some
# random git tag name being accepted as valid and then we try to
# curl garbage from upstream.
if [[ "${GIMME_TYPE}" == "auto" || "${GIMME_TYPE}" == "git" ]]; then
local git_dir="${GIMME_VERSION_PREFIX}/go"
local resolved_sha
_fetch "${git_dir}"
if resolved_sha="$(_checkout "${GIMME_GO_VERSION}" "${git_dir}")"; then
if [[ -n "${resolved_sha}" ]]; then
# Break our normal silence, this one really needs to be seen on stderr
# always; auditability and knowing what version of Go you got wins.
warn "resolved '${GIMME_GO_VERSION}' to '${resolved_sha}'"
GIMME_GO_VERSION="${resolved_sha}"
fi
return 0
fi
fi
echo >&2 'error: GIMME_GO_VERSION not recognized as valid'
echo >&2 " got: ${GIMME_GO_VERSION}"
${ASSERT_ABORT:-exit} 1
}
_exclude_from_backups() {
# Please avoid anything which requires elevated privileges or is obnoxious
# enough to offend the invoker
case "${GIMME_HOSTOS}" in
darwin)
# Darwin: Time Machine is "standard", we can add others. The default
# mechanism is sticky, as an attribute on the dir, requires no
# privileges, is idempotent (and doesn't support -- to end flags).
tmutil addexclusion "$@"
;;
esac
}
_versint() {
IFS=" " read -r -a args <<<"${1//[^0-9]/ }"
printf '1%03d%03d%03d%03d' "${args[@]}"
}
_to_goarch() {
case "${1}" in
aarch64) echo "arm64" ;;
*) echo "${1}" ;;
esac
}
: "${GIMME_OS:=$(uname -s | tr '[:upper:]' '[:lower:]')}"
: "${GIMME_HOSTOS:=$(uname -s | tr '[:upper:]' '[:lower:]')}"
: "${GIMME_ARCH:=$(_to_goarch "$(uname -m)")}"
: "${GIMME_HOSTARCH:=$(_to_goarch "$(uname -m)")}"
: "${GIMME_ENV_PREFIX:=${HOME}/.gimme/envs}"
: "${GIMME_VERSION_PREFIX:=${HOME}/.gimme/versions}"
: "${GIMME_TMP:=${TMPDIR:-/tmp}/gimme}"
: "${GIMME_GO_GIT_REMOTE:=https://github.com/golang/go.git}"
: "${GIMME_TYPE:=auto}" # 'auto', 'binary', 'source', or 'git'
: "${GIMME_BINARY_OSX:=osx10.8}"
: "${GIMME_DOWNLOAD_BASE:=https://dl.google.com/go}"
: "${GIMME_LIST_KNOWN:=https://golang.org/dl}"
: "${GIMME_KNOWN_CACHE_MAX:=10800}"
# The version prefix must be an absolute path
case "${GIMME_VERSION_PREFIX}" in
/*) true ;;
*)
echo >&2 " Fixing GIMME_VERSION_PREFIX from relative: $GIMME_VERSION_PREFIX"
GIMME_VERSION_PREFIX="$(pwd)/${GIMME_VERSION_PREFIX}"
echo >&2 " to: $GIMME_VERSION_PREFIX"
;;
esac
case "${GIMME_OS}" in mingw* | msys_nt*)
# Minimalist GNU for Windows
GIMME_OS='windows'
if [ "${GIMME_ARCH}" = 'i686' ]; then
GIMME_ARCH="386"
else
GIMME_ARCH="amd64"
fi
;;
esac
force_install=0
force_known_update=0
while [[ $# -gt 0 ]]; do
case "${1}" in
-h | --help | help | wat)
_old_ifs="$IFS"
IFS=';'
awk '/^#\+ / {
sub(/^#\+ /, "", $0) ;
sub(/-$/, "", $0) ;
print $0
}' "$0" | while read -r line; do
eval "echo \"$line\""
done
IFS="$_old_ifs"
exit 0
;;
-V | --version | version)
echo "${GIMME_VERSION}"
exit 0
;;
-r | --resolve | resolve)
# The normal mkdir of versions is below; we don't want to move it up
# to where we create files just if asked our version; thus
# _resolve_version has to mkdir the versions dir itself.
if [[ $# -ge 2 ]]; then
_resolve_version "${2}"
elif [[ -n "${GIMME_GO_VERSION:-}" ]]; then
_resolve_version "${GIMME_GO_VERSION}"
else
die "resolve must be given a version to resolve"
fi
exit $?
;;
-l | --list | list)
_list_versions
exit 0
;;
-k | --known | known)
_list_known
exit 0
;;
-f | --force | force)
force_install=1
;;
--force-known-update | force-known-update)
force_known_update=1
;;
-i | install)
true # ignore a dummy argument
;;
*)
break
;;
esac
shift
done
if [[ -n "${1}" ]]; then
GIMME_GO_VERSION="${1}"
fi
if [[ -n "${2}" ]]; then
GIMME_VERSION_PREFIX="${2}"
fi
case "${GIMME_ARCH}" in
x86_64) GIMME_ARCH=amd64 ;;
x86) GIMME_ARCH=386 ;;
arm64)
if [[ "${GIMME_GO_VERSION}" != master && "$(_versint "${GIMME_GO_VERSION}")" < "$(_versint 1.5)" ]]; then
echo >&2 "error: ${GIMME_ARCH} is not supported by this go version"
echo >&2 "try go1.5 or newer"
exit 1
fi
if [[ "${GIMME_HOSTOS}" == "linux" && "${GIMME_HOSTARCH}" != "${GIMME_ARCH}" ]]; then
: "${GIMME_CC_FOR_TARGET:="aarch64-linux-gnu-gcc"}"
fi
;;
arm*) GIMME_ARCH=arm ;;
esac
case "${GIMME_HOSTARCH}" in
x86_64) GIMME_HOSTARCH=amd64 ;;
x86) GIMME_HOSTARCH=386 ;;
arm64) ;;
arm*) GIMME_HOSTARCH=arm ;;
esac
case "${GIMME_GO_VERSION}" in
stable) GIMME_GO_VERSION=$(_get_curr_stable) ;;
oldstable) GIMME_GO_VERSION=$(_get_old_stable) ;;
esac
_assert_version_given "$@"
((force_install)) && _wipe_version "${GIMME_GO_VERSION}"
unset GOARCH
unset GOBIN
unset GOOS
unset GOPATH
unset GOROOT
unset CGO_ENABLED
unset CC_FOR_TARGET
# GO111MODULE breaks build of Go itself
unset GO111MODULE
mkdir -p "${GIMME_VERSION_PREFIX}" "${GIMME_ENV_PREFIX}"
# The envs dir stays small and provides a record of what had been installed
# whereas the versions dir grows by hundreds of MB per version and is not
# intended to support local modifications (as that subverts the point of gimme)
# _and_ is a cache, so we're unilaterally declaring that the contents of
# the versions dir should be excluded from system backups.
_exclude_from_backups "${GIMME_VERSION_PREFIX}"
GIMME_VERSION_PREFIX="$(_realpath "${GIMME_VERSION_PREFIX}")"
GIMME_ENV_PREFIX="$(_realpath "${GIMME_ENV_PREFIX}")"
if ! case "${GIMME_TYPE}" in
binary) _try_existing binary || _try_binary "${GIMME_GO_VERSION}" "${GIMME_ARCH}" ;;
source) _try_existing source || _try_source || _try_git ;;
git) _try_git ;;
auto) _try_existing || _try_binary "${GIMME_GO_VERSION}" "${GIMME_ARCH}" || _try_source || _try_git ;;
*)
echo >&2 "I don't know how to '${GIMME_TYPE}'."
echo >&2 " Try 'auto', 'binary', 'source', or 'git'."
exit 1
;;
esac; then
echo >&2 "I don't have any idea what to do with '${GIMME_GO_VERSION}'."
echo >&2 " (using download type '${GIMME_TYPE}')"
exit 1
fi
================================================
FILE: hack/tools/.golangci.yml
================================================
version: "2"
run:
timeout: 3m
linters:
default: none
enable:
- errcheck
- govet
- ineffassign
- staticcheck
- gochecknoinits
- revive # replaces golint for now
- misspell
- unparam
settings:
staticcheck:
checks:
- all
revive:
rules:
- name: var-naming
arguments:
- []
- []
- - skip-package-name-checks: true
exclusions:
presets:
- std-error-handling
- common-false-positives
rules:
# this requires renaming all unused parameters, we'd rather leave a preferred
# placeholder name in place when implementing an interface etc.
# we can revisit this later, right now it's generating a lot of new warnings
# after upgrading golangci-lint
- linters:
- revive
text: "^unused-parameter: .*"
# Not all package docstrings add value, so we do not want to enforce it
- linters:
- revive
text: "package-comments: should have a package comment"
- linters:
- staticcheck
text: "ST1000: at least one file in a package should have a package comment"
- linters:
- staticcheck
path: pkg/cmd
text: "ST1005: error strings should not be capitalized"
- linters:
- staticcheck
path: images/kindnetd/cmd
text: "ST1005: error strings should not be capitalized"
formatters:
enable:
- gofmt
================================================
FILE: hack/tools/README.md
================================================
This directory contains a stub go module used to track version of development
tools like the Kubernetes code generators.
================================================
FILE: hack/tools/boilerplate.go.txt
================================================
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
================================================
FILE: hack/tools/go.mod
================================================
module sigs.k8s.io/kind/hack/tools
go 1.25.0
require (
github.com/golangci/golangci-lint/v2 v2.11.3
gotest.tools/gotestsum v1.12.0
k8s.io/code-generator v0.31.0
)
require (
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
4d63.com/gochecknoglobals v0.2.2 // indirect
codeberg.org/chavacava/garif v0.2.0 // indirect
codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect
dev.gaijin.team/go/golib v0.6.0 // indirect
github.com/4meepo/tagalign v1.4.3 // indirect
github.com/Abirdcfly/dupword v0.1.7 // indirect
github.com/AdminBenni/iota-mixing v1.0.0 // indirect
github.com/AlwxSin/noinlineerr v1.0.5 // indirect
github.com/Antonboom/errname v1.1.1 // indirect
github.com/Antonboom/nilnil v1.1.1 // indirect
github.com/Antonboom/testifylint v1.6.4 // indirect
github.com/BurntSushi/toml v1.6.0 // indirect
github.com/Djarvur/go-err113 v0.1.1 // indirect
github.com/Masterminds/semver/v3 v3.4.0 // indirect
github.com/MirrexOne/unqueryvet v1.5.4 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
github.com/alecthomas/chroma/v2 v2.23.1 // indirect
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
github.com/alexkohler/prealloc v1.1.0 // indirect
github.com/alfatraining/structtag v1.0.0 // indirect
github.com/alingse/asasalint v0.0.11 // indirect
github.com/alingse/nilnesserr v0.2.0 // indirect
github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect
github.com/ashanbrown/makezero/v2 v2.1.0 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bitfield/gotestdox v0.2.2 // indirect
github.com/bkielbasa/cyclop v1.2.3 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
github.com/bombsimon/wsl/v5 v5.6.0 // indirect
github.com/breml/bidichk v0.3.3 // indirect
github.com/breml/errchkjson v0.4.1 // indirect
github.com/butuzov/ireturn v0.4.0 // indirect
github.com/butuzov/mirror v1.3.0 // indirect
github.com/catenacyber/perfsprint v0.10.1 // indirect
github.com/ccojocar/zxcvbn-go v1.0.4 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charithe/durationcheck v0.0.11 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/lipgloss v1.1.0 // indirect
github.com/charmbracelet/x/ansi v0.10.1 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/ckaznocha/intrange v0.3.1 // indirect
github.com/curioswitch/go-reassign v0.3.0 // indirect
github.com/daixiang0/gci v0.13.7 // indirect
github.com/dave/dst v0.27.3 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/denis-tingaikin/go-header v0.5.0 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/dnephin/pflag v1.0.7 // indirect
github.com/ettle/strcase v0.2.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/firefart/nonamedreturns v1.0.6 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/ghostiam/protogetter v0.3.20 // indirect
github.com/go-critic/go-critic v0.14.3 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
github.com/go-toolsmith/astcopy v1.1.0 // indirect
github.com/go-toolsmith/astequal v1.2.0 // indirect
github.com/go-toolsmith/astfmt v1.1.0 // indirect
github.com/go-toolsmith/astp v1.1.0 // indirect
github.com/go-toolsmith/strparse v1.1.0 // indirect
github.com/go-toolsmith/typep v1.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/godoc-lint/godoc-lint v0.11.2 // indirect
github.com/gofrs/flock v0.13.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golangci/asciicheck v0.5.0 // indirect
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
github.com/golangci/go-printf-func-name v0.1.1 // indirect
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/golines v0.15.0 // indirect
github.com/golangci/misspell v0.8.0 // indirect
github.com/golangci/plugin-module-register v0.1.2 // indirect
github.com/golangci/revgrep v0.8.0 // indirect
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/gordonklaus/ineffassign v0.2.0 // indirect
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
github.com/gostaticanalysis/comment v1.5.0 // indirect
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
github.com/gostaticanalysis/nilerr v0.1.2 // indirect
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
github.com/hashicorp/go-version v1.8.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jgautheron/goconst v1.8.2 // indirect
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
github.com/jjti/go-spancheck v0.6.5 // indirect
github.com/julz/importas v0.2.0 // indirect
github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect
github.com/kisielk/errcheck v1.10.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
github.com/kulti/thelper v0.7.1 // indirect
github.com/kunwardeep/paralleltest v1.0.15 // indirect
github.com/lasiar/canonicalheader v1.1.2 // indirect
github.com/ldez/exptostd v0.4.5 // indirect
github.com/ldez/gomoddirectives v0.8.0 // indirect
github.com/ldez/grignotin v0.10.1 // indirect
github.com/ldez/structtags v0.6.1 // indirect
github.com/ldez/tagliatelle v0.7.2 // indirect
github.com/ldez/usetesting v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/macabu/inamedparam v0.2.0 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect
github.com/manuelarte/funcorder v0.5.0 // indirect
github.com/maratori/testableexamples v1.0.1 // indirect
github.com/maratori/testpackage v1.1.2 // indirect
github.com/matoous/godox v1.1.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mgechev/revive v1.15.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/moricho/tparallel v0.3.2 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/nakabonne/nestif v0.3.1 // indirect
github.com/nishanths/exhaustive v0.12.0 // indirect
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.23.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.12.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/quasilyte/go-ruleguard v0.4.5 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/raeperd/recvcheck v0.2.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/ryancurrah/gomodguard v1.4.1 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
github.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08 // indirect
github.com/sirupsen/logrus v1.9.4 // indirect
github.com/sivchari/containedctx v1.0.3 // indirect
github.com/sonatard/noctx v0.5.0 // indirect
github.com/sourcegraph/go-diff v0.7.0 // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/cobra v1.10.2 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/spf13/viper v1.12.0 // indirect
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.11.1 // indirect
github.com/subosito/gotenv v1.4.1 // indirect
github.com/tetafro/godot v1.5.4 // indirect
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
github.com/timonwong/loggercheck v0.11.0 // indirect
github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
github.com/ultraware/funlen v0.2.0 // indirect
github.com/ultraware/whitespace v0.2.0 // indirect
github.com/uudashr/gocognit v1.2.1 // indirect
github.com/uudashr/iface v1.4.1 // indirect
github.com/xen0n/gosmopolitan v1.3.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yagipy/maintidx v1.0.0 // indirect
github.com/yeya24/promlinter v0.3.0 // indirect
github.com/ykadowak/zerologlint v0.1.5 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
go-simpler.org/musttag v0.14.0 // indirect
go-simpler.org/sloglint v0.11.1 // indirect
go.augendre.info/arangolint v0.4.0 // indirect
go.augendre.info/fatcontext v0.9.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect
golang.org/x/mod v0.33.0 // indirect
golang.org/x/sync v0.20.0 // indirect
golang.org/x/sys v0.41.0 // indirect
golang.org/x/term v0.39.0 // indirect
golang.org/x/text v0.34.0 // indirect
golang.org/x/tools v0.42.0 // indirect
google.golang.org/protobuf v1.36.8 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.7.0 // indirect
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
mvdan.cc/gofumpt v0.9.2 // indirect
mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect
)
================================================
FILE: hack/tools/go.sum
================================================
4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A=
4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY=
4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU=
4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY=
codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ=
codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI=
codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8=
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y=
dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI=
dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo=
dev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8=
github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c=
github.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ=
github.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4=
github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo=
github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY=
github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY=
github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc=
github.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q=
github.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ=
github.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ=
github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II=
github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ=
github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g=
github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k=
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ=
github.com/MirrexOne/unqueryvet v1.5.4/go.mod h1:fs9Zq6eh1LRIhsDIsxf9PONVUjYdFHdtkHIgZdJnyPU=
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4=
github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.23.1 h1:nv2AVZdTyClGbVQkIzlDm/rnhk1E9bU9nXwmZ/Vk/iY=
github.com/alecthomas/chroma/v2 v2.23.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o=
github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU=
github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E=
github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ=
github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q=
github.com/alexkohler/prealloc v1.1.0 h1:cKGRBqlXw5iyQGLYhrXrDlcHxugXpTq4tQ5c91wkf8M=
github.com/alexkohler/prealloc v1.1.0/go.mod h1:fT39Jge3bQrfA7nPMDngUfvUbQGQeJyGQnR+913SCig=
github.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc=
github.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus=
github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw=
github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I=
github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w=
github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg=
github.com/ashanbrown/forbidigo/v2 v2.3.0 h1:OZZDOchCgsX5gvToVtEBoV2UWbFfI6RKQTir2UZzSxo=
github.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkvY2rRV9nMdWadd6c=
github.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE=
github.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE=
github.com/bitfield/gotestdox v0.2.2/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY=
github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w=
github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo=
github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M=
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ=
github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg=
github.com/bombsimon/wsl/v5 v5.6.0 h1:4z+/sBqC5vUmSp1O0mS+czxwH9+LKXtCWtHH9rZGQL8=
github.com/bombsimon/wsl/v5 v5.6.0/go.mod h1:Uqt2EfrMj2NV8UGoN1f1Y3m0NpUVCsUdrNCdet+8LvU=
github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE=
github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE=
github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg=
github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s=
github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E=
github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70=
github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc=
github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI=
github.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ=
github.com/catenacyber/perfsprint v0.10.1/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc=
github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc=
github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk=
github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ=
github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs=
github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs=
github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88=
github.com/daixiang0/gci v0.13.7 h1:+0bG5eK9vlI08J+J/NWGbWPTNiXPG4WhNLJOkSxWITQ=
github.com/daixiang0/gci v0.13.7/go.mod h1:812WVN6JLFY9S6Tv76twqmNqevN0pa3SX3nih0brVzQ=
github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY=
github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc=
github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo=
github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8=
github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY=
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E=
github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
github.com/ghostiam/protogetter v0.3.20 h1:oW7OPFit2FxZOpmMRPP9FffU4uUpfeE/rEdE1f+MzD0=
github.com/ghostiam/protogetter v0.3.20/go.mod h1:FjIu5Yfs6FT391m+Fjp3fbAYJ6rkL/J6ySpZBfnODuI=
github.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog=
github.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8=
github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU=
github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s=
github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw=
github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4=
github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ=
github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw=
github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY=
github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco=
github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4=
github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA=
github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA=
github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk=
github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus=
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw=
github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ=
github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus=
github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig=
github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=
github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY=
github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/godoc-lint/godoc-lint v0.11.2 h1:Bp0FkJWoSdNsBikdNgIcgtaoo+xz6I/Y9s5WSBQUeeM=
github.com/godoc-lint/godoc-lint v0.11.2/go.mod h1:iVpGdL1JCikNH2gGeAn3Hh+AgN5Gx/I/cxV+91L41jo=
github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw=
github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0=
github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ=
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw=
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E=
github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U=
github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss=
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE=
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY=
github.com/golangci/golangci-lint/v2 v2.11.3 h1:ySX1GtLwlwOEzcLKJifI/aIVesrcHDno+5mrro8rWes=
github.com/golangci/golangci-lint/v2 v2.11.3/go.mod h1:HmDEVZuxz77cNLumPfNNHAFyMX/b7IbA0tpmAbwiVfo=
github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0=
github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10=
github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg=
github.com/golangci/misspell v0.8.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg=
github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg=
github.com/golangci/plugin-module-register v0.1.2/go.mod h1:1+QGTsKBvAIvPvoY/os+G5eoqxWn70HYDm2uvUyGuVw=
github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s=
github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k=
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e h1:ai0EfmVYE2bRA5htgAG9r7s3tHsfjIhN98WshBTJ9jM=
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e/go.mod h1:Vrn4B5oR9qRwM+f54koyeH3yzphlecwERs0el27Fr/s=
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM=
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc=
github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs=
github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw=
github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk=
github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc=
github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM=
github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8=
github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc=
github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk=
github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY=
github.com/gostaticanalysis/nilerr v0.1.2 h1:S6nk8a9N8g062nsx63kUkF6AzbHGw7zzyHMcpu52xQU=
github.com/gostaticanalysis/nilerr v0.1.2/go.mod h1:A19UHhoY3y8ahoL7YKz6sdjDtduwTSI4CsymaC2htPA=
github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=
github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8=
github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs=
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo=
github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4=
github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4=
github.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako=
github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs=
github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c=
github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8=
github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ=
github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY=
github.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0=
github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY=
github.com/kisielk/errcheck v1.10.0 h1:Lvs/YAHP24YKg08LA8oDw2z9fJVme090RAXd90S+rrw=
github.com/kisielk/errcheck v1.10.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE=
github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kulti/thelper v0.7.1 h1:fI8QITAoFVLx+y+vSyuLBP+rcVIB8jKooNSCT2EiI98=
github.com/kulti/thelper v0.7.1/go.mod h1:NsMjfQEy6sd+9Kfw8kCP61W1I0nerGSYSFnGaxQkcbs=
github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJMLyncOb6w=
github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk=
github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4=
github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI=
github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ=
github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM=
github.com/ldez/gomoddirectives v0.8.0 h1:JqIuTtgvFC2RdH1s357vrE23WJF2cpDCPFgA/TWDGpk=
github.com/ldez/gomoddirectives v0.8.0/go.mod h1:jutzamvZR4XYJLr0d5Honycp4Gy6GEg2mS9+2YX3F1Q=
github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o=
github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas=
github.com/ldez/structtags v0.6.1 h1:bUooFLbXx41tW8SvkfwfFkkjPYvFFs59AAMgVg6DUBk=
github.com/ldez/structtags v0.6.1/go.mod h1:YDxVSgDy/MON6ariaxLF2X09bh19qL7MtGBN5MrvbdY=
github.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk=
github.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI=
github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc=
github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ=
github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=
github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE=
github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U=
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww=
github.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM=
github.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8=
github.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA=
github.com/maratori/testableexamples v1.0.1 h1:HfOQXs+XgfeRBJ+Wz0XfH+FHnoY9TVqL6Fcevpzy4q8=
github.com/maratori/testableexamples v1.0.1/go.mod h1:XE2F/nQs7B9N08JgyRmdGjYVGqxWwClLPCGSQhXQSrQ=
github.com/maratori/testpackage v1.1.2 h1:ffDSh+AgqluCLMXhM19f/cpvQAKygKAJXFl9aUjmbqs=
github.com/maratori/testpackage v1.1.2/go.mod h1:8F24GdVDFW5Ew43Et02jamrVMNXLUNaOynhDssITGfc=
github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4=
github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q=
github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09s
gitextract_mthowuso/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── cleanup.md
│ │ ├── documentation.md
│ │ ├── enhancement.md
│ │ └── question.md
│ ├── actions/
│ │ └── setup-env/
│ │ └── action.yaml
│ ├── dependabot.yml
│ └── workflows/
│ ├── docker.yaml
│ ├── nerdctl.yaml
│ ├── podman.yml
│ └── vm.yaml
├── .gitignore
├── .go-version
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── SECURITY_CONTACTS
├── cmd/
│ └── kind/
│ ├── app/
│ │ ├── main.go
│ │ └── main_test.go
│ └── main.go
├── code-of-conduct.md
├── go.mod
├── go.sum
├── hack/
│ ├── build/
│ │ ├── README.md
│ │ ├── goinstalldir.sh
│ │ ├── gotoolchain.sh
│ │ ├── init-buildx.sh
│ │ └── setup-go.sh
│ ├── ci/
│ │ ├── README.md
│ │ ├── build-all.sh
│ │ ├── cache-wrapper.sh
│ │ ├── e2e-k8s.sh
│ │ ├── e2e.sh
│ │ ├── init-vm.sh
│ │ ├── lima-helper.sh
│ │ └── push-latest-cli/
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ └── push-latest-cli.sh
│ ├── make-rules/
│ │ ├── test.sh
│ │ ├── update/
│ │ │ ├── README.md
│ │ │ ├── all.sh
│ │ │ ├── deps.sh
│ │ │ ├── generated.sh
│ │ │ └── gofmt.sh
│ │ └── verify/
│ │ ├── README.md
│ │ ├── all.sh
│ │ ├── generated.sh
│ │ ├── lint.sh
│ │ └── shellcheck.sh
│ ├── release/
│ │ ├── build/
│ │ │ ├── README.md
│ │ │ ├── cross.sh
│ │ │ └── push-node.sh
│ │ ├── create.sh
│ │ ├── get-contributors.sh
│ │ └── push-node.sh
│ ├── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ └── tools/
│ ├── .golangci.yml
│ ├── README.md
│ ├── boilerplate.go.txt
│ ├── go.mod
│ ├── go.sum
│ └── tools.go
├── images/
│ ├── Makefile.common.in
│ ├── base/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── files/
│ │ │ ├── LICENSES/
│ │ │ │ └── README.txt
│ │ │ ├── etc/
│ │ │ │ ├── containerd/
│ │ │ │ │ └── config.toml
│ │ │ │ ├── crictl.yaml
│ │ │ │ ├── default/
│ │ │ │ │ └── kubelet
│ │ │ │ ├── sysctl.d/
│ │ │ │ │ ├── 10-network-magic.conf
│ │ │ │ │ └── 10-network-security.conf
│ │ │ │ └── systemd/
│ │ │ │ └── system/
│ │ │ │ ├── containerd-fuse-overlayfs.service
│ │ │ │ ├── containerd.service
│ │ │ │ ├── kubelet.service
│ │ │ │ ├── kubelet.service.d/
│ │ │ │ │ ├── 10-kubeadm.conf
│ │ │ │ │ └── 11-kind.conf
│ │ │ │ ├── kubelet.slice
│ │ │ │ └── undo-mount-hacks.service
│ │ │ ├── kind/
│ │ │ │ ├── README.txt
│ │ │ │ └── bin/
│ │ │ │ ├── create-kubelet-cgroup-v2.sh
│ │ │ │ ├── mount-product-files.sh
│ │ │ │ └── undo-mount-hacks.sh
│ │ │ └── usr/
│ │ │ └── local/
│ │ │ └── bin/
│ │ │ ├── clean-install
│ │ │ └── entrypoint
│ │ └── scripts/
│ │ ├── target-cc
│ │ └── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ ├── haproxy/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── haproxy.cfg
│ │ └── stage-binary-and-deps.sh
│ ├── kindnetd/
│ │ ├── Dockerfile
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── cmd/
│ │ │ └── kindnetd/
│ │ │ ├── cni.go
│ │ │ ├── main.go
│ │ │ ├── masq.go
│ │ │ └── routes.go
│ │ ├── files/
│ │ │ └── LICENSES/
│ │ │ └── README.txt
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── scripts/
│ │ └── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ ├── local-path-helper/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ └── stage-binary-and-deps.sh
│ ├── local-path-provisioner/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cloudbuild.yaml
│ │ ├── files/
│ │ │ └── LICENSES/
│ │ │ └── README.txt
│ │ └── scripts/
│ │ └── third_party/
│ │ └── gimme/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── gimme
│ └── node/
│ └── README.md
├── logo/
│ └── LICENSE
├── main.go
├── netlify.toml
├── pkg/
│ ├── apis/
│ │ └── config/
│ │ ├── defaults/
│ │ │ └── image.go
│ │ └── v1alpha4/
│ │ ├── default.go
│ │ ├── doc.go
│ │ ├── types.go
│ │ ├── yaml.go
│ │ └── zz_generated.deepcopy.go
│ ├── build/
│ │ └── nodeimage/
│ │ ├── build.go
│ │ ├── buildcontext.go
│ │ ├── const.go
│ │ ├── const_cni.go
│ │ ├── const_storage.go
│ │ ├── containerd.go
│ │ ├── defaults.go
│ │ ├── doc.go
│ │ ├── helpers.go
│ │ ├── imageimporter.go
│ │ ├── internal/
│ │ │ ├── container/
│ │ │ │ └── docker/
│ │ │ │ ├── archive.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── exec.go
│ │ │ │ ├── image.go
│ │ │ │ ├── image_test.go
│ │ │ │ ├── pull.go
│ │ │ │ ├── run.go
│ │ │ │ └── save.go
│ │ │ └── kube/
│ │ │ ├── bits.go
│ │ │ ├── builder.go
│ │ │ ├── builder_docker.go
│ │ │ ├── builder_remote.go
│ │ │ ├── builder_tarball.go
│ │ │ ├── doc.go
│ │ │ ├── source.go
│ │ │ └── tar.go
│ │ └── options.go
│ ├── cluster/
│ │ ├── constants/
│ │ │ └── constants.go
│ │ ├── createoption.go
│ │ ├── doc.go
│ │ ├── internal/
│ │ │ ├── create/
│ │ │ │ ├── actions/
│ │ │ │ │ ├── action.go
│ │ │ │ │ ├── config/
│ │ │ │ │ │ └── config.go
│ │ │ │ │ ├── installcni/
│ │ │ │ │ │ └── cni.go
│ │ │ │ │ ├── installstorage/
│ │ │ │ │ │ └── storage.go
│ │ │ │ │ ├── kubeadminit/
│ │ │ │ │ │ └── init.go
│ │ │ │ │ ├── kubeadmjoin/
│ │ │ │ │ │ └── join.go
│ │ │ │ │ ├── loadbalancer/
│ │ │ │ │ │ └── loadbalancer.go
│ │ │ │ │ └── waitforready/
│ │ │ │ │ └── waitforready.go
│ │ │ │ └── create.go
│ │ │ ├── delete/
│ │ │ │ └── delete.go
│ │ │ ├── kubeadm/
│ │ │ │ ├── config.go
│ │ │ │ ├── const.go
│ │ │ │ └── doc.go
│ │ │ ├── kubeconfig/
│ │ │ │ ├── internal/
│ │ │ │ │ └── kubeconfig/
│ │ │ │ │ ├── encode.go
│ │ │ │ │ ├── encode_test.go
│ │ │ │ │ ├── helpers.go
│ │ │ │ │ ├── helpers_test.go
│ │ │ │ │ ├── lock.go
│ │ │ │ │ ├── merge.go
│ │ │ │ │ ├── merge_test.go
│ │ │ │ │ ├── paths.go
│ │ │ │ │ ├── paths_test.go
│ │ │ │ │ ├── read.go
│ │ │ │ │ ├── read_test.go
│ │ │ │ │ ├── remove.go
│ │ │ │ │ ├── remove_test.go
│ │ │ │ │ ├── types.go
│ │ │ │ │ ├── write.go
│ │ │ │ │ └── write_test.go
│ │ │ │ └── kubeconfig.go
│ │ │ ├── loadbalancer/
│ │ │ │ ├── config.go
│ │ │ │ ├── const.go
│ │ │ │ └── doc.go
│ │ │ ├── logs/
│ │ │ │ ├── doc.go
│ │ │ │ └── logs.go
│ │ │ └── providers/
│ │ │ ├── common/
│ │ │ │ ├── cgroups.go
│ │ │ │ ├── constants.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── getport.go
│ │ │ │ ├── getport_test.go
│ │ │ │ ├── images.go
│ │ │ │ ├── images_test.go
│ │ │ │ ├── logs.go
│ │ │ │ ├── namer.go
│ │ │ │ ├── namer_test.go
│ │ │ │ ├── proxy.go
│ │ │ │ └── proxy_test.go
│ │ │ ├── docker/
│ │ │ │ ├── OWNERS
│ │ │ │ ├── constants.go
│ │ │ │ ├── images.go
│ │ │ │ ├── network.go
│ │ │ │ ├── network_integration_test.go
│ │ │ │ ├── network_test.go
│ │ │ │ ├── node.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── provision.go
│ │ │ │ └── util.go
│ │ │ ├── nerdctl/
│ │ │ │ ├── OWNERS
│ │ │ │ ├── constants.go
│ │ │ │ ├── images.go
│ │ │ │ ├── network.go
│ │ │ │ ├── network_test.go
│ │ │ │ ├── node.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── provision.go
│ │ │ │ └── util.go
│ │ │ ├── podman/
│ │ │ │ ├── OWNERS
│ │ │ │ ├── constants.go
│ │ │ │ ├── images.go
│ │ │ │ ├── images_test.go
│ │ │ │ ├── network.go
│ │ │ │ ├── node.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── provision.go
│ │ │ │ └── util.go
│ │ │ └── provider.go
│ │ ├── nodes/
│ │ │ ├── doc.go
│ │ │ └── types.go
│ │ ├── nodeutils/
│ │ │ ├── doc.go
│ │ │ ├── roles.go
│ │ │ ├── util.go
│ │ │ └── util_test.go
│ │ └── provider.go
│ ├── cmd/
│ │ ├── doc.go
│ │ ├── iostreams.go
│ │ ├── kind/
│ │ │ ├── build/
│ │ │ │ ├── build.go
│ │ │ │ └── nodeimage/
│ │ │ │ └── nodeimage.go
│ │ │ ├── completion/
│ │ │ │ ├── bash/
│ │ │ │ │ └── bash.go
│ │ │ │ ├── completion.go
│ │ │ │ ├── fish/
│ │ │ │ │ └── fish.go
│ │ │ │ ├── powershell/
│ │ │ │ │ └── powershell.go
│ │ │ │ └── zsh/
│ │ │ │ └── zsh.go
│ │ │ ├── create/
│ │ │ │ ├── cluster/
│ │ │ │ │ └── createcluster.go
│ │ │ │ └── create.go
│ │ │ ├── delete/
│ │ │ │ ├── cluster/
│ │ │ │ │ └── deletecluster.go
│ │ │ │ ├── clusters/
│ │ │ │ │ └── deleteclusters.go
│ │ │ │ └── delete.go
│ │ │ ├── export/
│ │ │ │ ├── export.go
│ │ │ │ ├── kubeconfig/
│ │ │ │ │ └── kubeconfig.go
│ │ │ │ └── logs/
│ │ │ │ └── logs.go
│ │ │ ├── get/
│ │ │ │ ├── clusters/
│ │ │ │ │ └── clusters.go
│ │ │ │ ├── get.go
│ │ │ │ ├── kubeconfig/
│ │ │ │ │ └── kubeconfig.go
│ │ │ │ └── nodes/
│ │ │ │ └── nodes.go
│ │ │ ├── load/
│ │ │ │ ├── docker-image/
│ │ │ │ │ ├── docker-image.go
│ │ │ │ │ └── docker-image_test.go
│ │ │ │ ├── image-archive/
│ │ │ │ │ └── image-archive.go
│ │ │ │ └── load.go
│ │ │ ├── root.go
│ │ │ └── version/
│ │ │ ├── version.go
│ │ │ └── version_test.go
│ │ └── logger.go
│ ├── errors/
│ │ ├── aggregate.go
│ │ ├── aggregate_forked.go
│ │ ├── aggregate_test.go
│ │ ├── concurrent.go
│ │ ├── concurrent_test.go
│ │ ├── doc.go
│ │ ├── errors.go
│ │ └── errors_test.go
│ ├── exec/
│ │ ├── default.go
│ │ ├── doc.go
│ │ ├── helpers.go
│ │ ├── local.go
│ │ └── types.go
│ ├── fs/
│ │ └── fs.go
│ ├── internal/
│ │ ├── apis/
│ │ │ └── config/
│ │ │ ├── cluster_util.go
│ │ │ ├── cluster_util_test.go
│ │ │ ├── convert_v1alpha4.go
│ │ │ ├── default.go
│ │ │ ├── doc.go
│ │ │ ├── encoding/
│ │ │ │ ├── convert.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── load.go
│ │ │ │ ├── load_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── invalid-apiversion.yaml
│ │ │ │ ├── invalid-kind.yaml
│ │ │ │ ├── invalid-yaml.yaml
│ │ │ │ └── v1alpha4/
│ │ │ │ ├── invalid-bad-indent.yaml
│ │ │ │ ├── invalid-bogus-field.yaml
│ │ │ │ ├── valid-full-ha.yaml
│ │ │ │ ├── valid-kind-patches.yaml
│ │ │ │ ├── valid-kind-workers-patches.yaml
│ │ │ │ ├── valid-many-fields.yaml
│ │ │ │ ├── valid-minimal-two-nodes.yaml
│ │ │ │ ├── valid-minimal.yaml
│ │ │ │ └── valid-port-and-mount.yaml
│ │ │ ├── types.go
│ │ │ ├── validate.go
│ │ │ ├── validate_test.go
│ │ │ └── zz_generated.deepcopy.go
│ │ ├── assert/
│ │ │ ├── assert.go
│ │ │ └── assert_test.go
│ │ ├── cli/
│ │ │ ├── logger.go
│ │ │ ├── override.go
│ │ │ ├── spinner.go
│ │ │ └── status.go
│ │ ├── env/
│ │ │ ├── term.go
│ │ │ └── term_test.go
│ │ ├── integration/
│ │ │ └── integration.go
│ │ ├── patch/
│ │ │ ├── doc.go
│ │ │ ├── json6902patch.go
│ │ │ ├── kubeyaml.go
│ │ │ ├── kubeyaml_test.go
│ │ │ ├── matchinfo.go
│ │ │ ├── mergepatch.go
│ │ │ ├── resource.go
│ │ │ ├── toml.go
│ │ │ └── toml_test.go
│ │ ├── runtime/
│ │ │ └── runtime.go
│ │ ├── sets/
│ │ │ ├── doc.go
│ │ │ ├── empty.go
│ │ │ └── string.go
│ │ └── version/
│ │ ├── doc.go
│ │ ├── version.go
│ │ └── version_test.go
│ └── log/
│ ├── doc.go
│ ├── noop.go
│ └── types.go
└── site/
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── assets/
│ ├── css/
│ │ └── inline.css
│ └── js/
│ └── inline.js
├── config.toml
├── content/
│ ├── _index.md
│ └── docs/
│ ├── contributing/
│ │ ├── 1.0-roadmap.md
│ │ ├── development.md
│ │ ├── getting-started.md
│ │ └── project-scope.md
│ ├── design/
│ │ ├── base-image.md
│ │ ├── initial.md
│ │ ├── node-image.md
│ │ └── principles.md
│ └── user/
│ ├── auditing.md
│ ├── configuration.md
│ ├── ingress.md
│ ├── kind-example-config.yaml
│ ├── known-issues.md
│ ├── loadbalancer.md
│ ├── local-registry.md
│ ├── private-registries.md
│ ├── quick-start.md
│ ├── resources.md
│ ├── rootless.md
│ ├── using-wsl2.md
│ └── working-offline.md
├── data/
│ └── apiVersions.yaml
├── go.mod
├── go.sum
├── layouts/
│ ├── docs/
│ │ ├── index.html
│ │ ├── section.html
│ │ └── single.html
│ ├── index.html
│ ├── index.redirects
│ ├── partials/
│ │ ├── fancymarkdown.html
│ │ ├── footer.html
│ │ ├── header.html
│ │ ├── inlinecss.html
│ │ ├── inlinescript.html
│ │ ├── navbar.html
│ │ └── sidebar.html
│ ├── robots.txt
│ └── shortcodes/
│ ├── absURL.html
│ ├── codeFromFile.html
│ ├── codeFromInline.html
│ ├── minify.html
│ ├── readFile.html
│ ├── securitygoose.html
│ └── stableVersion.html
├── static/
│ ├── browserconfig.xml
│ ├── examples/
│ │ ├── LICENSE
│ │ ├── config-with-mounts.yaml
│ │ ├── config-with-port-mapping.yaml
│ │ ├── ingress/
│ │ │ ├── deploy-ingress-nginx.yaml
│ │ │ └── usage.yaml
│ │ ├── kind-gcr.sh
│ │ ├── kind-with-registry.sh
│ │ └── loadbalancer/
│ │ └── usage.yaml
│ ├── logo/
│ │ └── LICENSE
│ └── site.webmanifest
└── tools.go
SYMBOL INDEX (916 symbols across 189 files)
FILE: cmd/kind/app/main.go
function Main (line 35) | func Main() {
function Run (line 43) | func Run(logger log.Logger, streams cmd.IOStreams, args []string) error {
function checkQuiet (line 62) | func checkQuiet(args []string) bool {
function logError (line 82) | func logError(logger log.Logger, err error) {
FILE: cmd/kind/app/main_test.go
function TestCheckQuiet (line 25) | func TestCheckQuiet(t *testing.T) {
function Test_CommandErrReturn (line 84) | func Test_CommandErrReturn(t *testing.T) {
FILE: cmd/kind/main.go
function main (line 24) | func main() {
FILE: images/kindnetd/cmd/kindnetd/cni.go
type CNIConfigInputs (line 34) | type CNIConfigInputs struct
function ComputeCNIConfigInputs (line 41) | func ComputeCNIConfigInputs(node *corev1.Node) CNIConfigInputs {
function computeBridgeMTU (line 67) | func computeBridgeMTU() (int, error) {
constant cniConfigPath (line 81) | cniConfigPath = "/etc/cni/net.d/10-kindnet.conflist"
constant cniConfigTemplate (line 83) | cniConfigTemplate = `
type CNIConfigWriter (line 125) | type CNIConfigWriter struct
method Write (line 132) | func (c *CNIConfigWriter) Write(inputs CNIConfigInputs) error {
function writeCNIConfig (line 165) | func writeCNIConfig(w io.Writer, rawTemplate string, data CNIConfigInput...
FILE: images/kindnetd/cmd/kindnetd/main.go
constant probeTCPtimeout (line 44) | probeTCPtimeout = 1 * time.Second
type IPFamily (line 61) | type IPFamily
constant IPv4Family (line 65) | IPv4Family IPFamily = "ipv4"
constant IPv6Family (line 67) | IPv6Family IPFamily = "ipv6"
constant DualStackFamily (line 69) | DualStackFamily IPFamily = "dualstack"
function main (line 72) | func main() {
function makeNodesReconciler (line 292) | func makeNodesReconciler(cniConfig *CNIConfigWriter, hostIP string, ipFa...
function internalIPs (line 363) | func internalIPs(node *corev1.Node) sets.Set[string] {
function splitCIDRs (line 376) | func splitCIDRs(cidrs []string) ([]string, []string) {
function probeTCP (line 390) | func probeTCP(address string, timeout time.Duration) bool {
function isIPv6String (line 418) | func isIPv6String(ip string) bool {
function isIPv6CIDRString (line 425) | func isIPv6CIDRString(cidr string) bool {
FILE: images/kindnetd/cmd/kindnetd/masq.go
function NewIPMasqAgent (line 29) | func NewIPMasqAgent(ipv6 bool, noMasqueradeCIDRs []string) (*IPMasqAgent...
type IPMasqAgent (line 50) | type IPMasqAgent struct
method SyncRulesForever (line 59) | func (ma *IPMasqAgent) SyncRulesForever(ctx context.Context, interval ...
method SyncRules (line 85) | func (ma *IPMasqAgent) SyncRules() error {
constant masqChainName (line 82) | masqChainName = "KIND-MASQ-AGENT"
FILE: images/kindnetd/cmd/kindnetd/routes.go
function syncRoute (line 27) | func syncRoute(nodeIP string, podCIDRs []string) error {
FILE: main.go
function main (line 24) | func main() {
FILE: pkg/apis/config/defaults/image.go
constant Image (line 21) | Image = "kindest/node:v1.35.1@sha256:05d7bcdefbda08b4e038f644c4df690cdac...
FILE: pkg/apis/config/v1alpha4/default.go
function SetDefaultsCluster (line 24) | func SetDefaultsCluster(obj *Cluster) {
function SetDefaultsNode (line 82) | func SetDefaultsNode(obj *Node) {
FILE: pkg/apis/config/v1alpha4/types.go
type Cluster (line 20) | type Cluster struct
type TypeMeta (line 91) | type TypeMeta struct
type Node (line 99) | type Node struct
type NodeRole (line 154) | type NodeRole
constant ControlPlaneRole (line 161) | ControlPlaneRole NodeRole = "control-plane"
constant WorkerRole (line 163) | WorkerRole NodeRole = "worker"
type Networking (line 167) | type Networking struct
type ClusterIPFamily (line 200) | type ClusterIPFamily
constant IPv4Family (line 204) | IPv4Family ClusterIPFamily = "ipv4"
constant IPv6Family (line 206) | IPv6Family ClusterIPFamily = "ipv6"
constant DualStackFamily (line 208) | DualStackFamily ClusterIPFamily = "dual"
type ProxyMode (line 212) | type ProxyMode
constant IPTablesProxyMode (line 216) | IPTablesProxyMode ProxyMode = "iptables"
constant IPVSProxyMode (line 218) | IPVSProxyMode ProxyMode = "ipvs"
constant NFTablesProxyMode (line 220) | NFTablesProxyMode ProxyMode = "nftables"
type PatchJSON6902 (line 225) | type PatchJSON6902 struct
type Mount (line 254) | type Mount struct
type PortMapping (line 276) | type PortMapping struct
type MountPropagation (line 296) | type MountPropagation
constant MountPropagationNone (line 301) | MountPropagationNone MountPropagation = "None"
constant MountPropagationHostToContainer (line 304) | MountPropagationHostToContainer MountPropagation = "HostToContainer"
constant MountPropagationBidirectional (line 308) | MountPropagationBidirectional MountPropagation = "Bidirectional"
type PortMappingProtocol (line 313) | type PortMappingProtocol
constant PortMappingProtocolTCP (line 317) | PortMappingProtocolTCP PortMappingProtocol = "TCP"
constant PortMappingProtocolUDP (line 319) | PortMappingProtocolUDP PortMappingProtocol = "UDP"
constant PortMappingProtocolSCTP (line 321) | PortMappingProtocolSCTP PortMappingProtocol = "SCTP"
FILE: pkg/apis/config/v1alpha4/yaml.go
method UnmarshalYAML (line 31) | func (m *Mount) UnmarshalYAML(unmarshal func(interface{}) error) error {
method UnmarshalYAML (line 54) | func (p *PortMapping) UnmarshalYAML(unmarshal func(interface{}) error) e...
FILE: pkg/apis/config/v1alpha4/zz_generated.deepcopy.go
method DeepCopyInto (line 25) | func (in *Cluster) DeepCopyInto(out *Cluster) {
method DeepCopy (line 74) | func (in *Cluster) DeepCopy() *Cluster {
method DeepCopyInto (line 84) | func (in *Mount) DeepCopyInto(out *Mount) {
method DeepCopy (line 90) | func (in *Mount) DeepCopy() *Mount {
method DeepCopyInto (line 100) | func (in *Networking) DeepCopyInto(out *Networking) {
method DeepCopy (line 115) | func (in *Networking) DeepCopy() *Networking {
method DeepCopyInto (line 125) | func (in *Node) DeepCopyInto(out *Node) {
method DeepCopy (line 158) | func (in *Node) DeepCopy() *Node {
method DeepCopyInto (line 168) | func (in *PatchJSON6902) DeepCopyInto(out *PatchJSON6902) {
method DeepCopy (line 174) | func (in *PatchJSON6902) DeepCopy() *PatchJSON6902 {
method DeepCopyInto (line 184) | func (in *PortMapping) DeepCopyInto(out *PortMapping) {
method DeepCopy (line 190) | func (in *PortMapping) DeepCopy() *PortMapping {
method DeepCopyInto (line 200) | func (in *TypeMeta) DeepCopyInto(out *TypeMeta) {
method DeepCopy (line 206) | func (in *TypeMeta) DeepCopy() *TypeMeta {
FILE: pkg/build/nodeimage/build.go
function Build (line 32) | func Build(options ...Option) error {
function detectBuildType (line 125) | func detectBuildType(param string) string {
function supportedArch (line 147) | func supportedArch(arch string) bool {
FILE: pkg/build/nodeimage/buildcontext.go
constant httpProxy (line 39) | httpProxy = "HTTP_PROXY"
constant httpsProxy (line 41) | httpsProxy = "HTTPS_PROXY"
constant noProxy (line 43) | noProxy = "NO_PROXY"
type buildContext (line 48) | type buildContext struct
method Build (line 62) | func (c *buildContext) Build() (err error) {
method buildImage (line 77) | func (c *buildContext) buildImage(bits kube.Bits) error {
method getBuiltImages (line 154) | func (c *buildContext) getBuiltImages(bits kube.Bits) (sets.String, er...
method prePullImagesAndWriteManifests (line 167) | func (c *buildContext) prePullImagesAndWriteManifests(bits kube.Bits, ...
method createBuildContainer (line 337) | func (c *buildContext) createBuildContainer() (id string, err error) {
FILE: pkg/build/nodeimage/const.go
constant kubernetesVersionLocation (line 22) | kubernetesVersionLocation = "/kind/version"
constant defaultCNIManifestLocation (line 23) | defaultCNIManifestLocation = "/kind/manifests/default-cni.yaml"
constant defaultStorageManifestLocation (line 24) | defaultStorageManifestLocation = "/kind/manifests/default-storage.yaml"
FILE: pkg/build/nodeimage/const_cni.go
constant kindnetdImage (line 23) | kindnetdImage = "docker.io/kindest/kindnetd:v20260213-ea8e5717"
constant defaultCNIManifest (line 28) | defaultCNIManifest = `
FILE: pkg/build/nodeimage/const_storage.go
constant storageProvisionerImage (line 29) | storageProvisionerImage = "docker.io/kindest/local-path-provisioner:v202...
constant storageHelperImage (line 30) | storageHelperImage = "docker.io/kindest/local-path-helper:v20260131-7181...
constant defaultStorageManifest (line 35) | defaultStorageManifest = `
FILE: pkg/build/nodeimage/containerd.go
constant containerdConfigPath (line 28) | containerdConfigPath = "/etc/containerd/config.toml"
constant containerdConfigPatchSystemdCgroupFalse (line 30) | containerdConfigPatchSystemdCgroupFalse = `
function configureContainerdSystemdCgroupFalse (line 38) | func configureContainerdSystemdCgroupFalse(containerCmdr exec.Cmder, con...
FILE: pkg/build/nodeimage/defaults.go
constant DefaultImage (line 20) | DefaultImage = "kindest/node:latest"
constant DefaultBaseImage (line 25) | DefaultBaseImage = "docker.io/kindest/base:v20260214-ea8e5717"
FILE: pkg/build/nodeimage/helpers.go
function createFile (line 30) | func createFile(containerCmder exec.Cmder, filePath, contents string) er...
function findSandboxImage (line 45) | func findSandboxImage(config string) (string, error) {
function dockerBuildOsAndArch (line 53) | func dockerBuildOsAndArch(arch string) string {
FILE: pkg/build/nodeimage/imageimporter.go
type containerdImporter (line 26) | type containerdImporter struct
method Prepare (line 36) | func (c *containerdImporter) Prepare() error {
method WaitForReady (line 45) | func (c *containerdImporter) WaitForReady() error {
method End (line 67) | func (c *containerdImporter) End() error {
method Pull (line 71) | func (c *containerdImporter) Pull(image, platform string) error {
method LoadCommand (line 77) | func (c *containerdImporter) LoadCommand() exec.Cmd {
method Tag (line 84) | func (c *containerdImporter) Tag(src, target string) error {
method ListImported (line 90) | func (c *containerdImporter) ListImported() ([]string, error) {
function newContainerdImporter (line 30) | func newContainerdImporter(containerCmder exec.Cmder) *containerdImporter {
FILE: pkg/build/nodeimage/internal/container/docker/archive.go
function GetArchiveTags (line 37) | func GetArchiveTags(path string) ([]string, error) {
type archiveRepositories (line 92) | type archiveRepositories
type metadataEntry (line 95) | type metadataEntry struct
function parseRepositories (line 102) | func parseRepositories(data []byte) (archiveRepositories, error) {
function parseDockerV1Manifest (line 112) | func parseDockerV1Manifest(data []byte) ([]metadataEntry, error) {
FILE: pkg/build/nodeimage/internal/container/docker/exec.go
type containerCmder (line 27) | type containerCmder struct
method Command (line 38) | func (c *containerCmder) Command(command string, args ...string) exec....
method CommandContext (line 46) | func (c *containerCmder) CommandContext(ctx context.Context, command s...
function ContainerCmder (line 32) | func ContainerCmder(containerNameOrID string) exec.Cmder {
type containerCmd (line 56) | type containerCmd struct
method Run (line 67) | func (c *containerCmd) Run() error {
method SetEnv (line 114) | func (c *containerCmd) SetEnv(env ...string) exec.Cmd {
method SetStdin (line 119) | func (c *containerCmd) SetStdin(r io.Reader) exec.Cmd {
method SetStdout (line 124) | func (c *containerCmd) SetStdout(w io.Writer) exec.Cmd {
method SetStderr (line 129) | func (c *containerCmd) SetStderr(w io.Writer) exec.Cmd {
FILE: pkg/build/nodeimage/internal/container/docker/image.go
function SplitImage (line 39) | func SplitImage(image string) (registry, tag string, err error) {
function ImageInspect (line 67) | func ImageInspect(containerNameOrID, format string) ([]string, error) {
function ImageID (line 77) | func ImageID(containerNameOrID string) (string, error) {
FILE: pkg/build/nodeimage/internal/container/docker/image_test.go
function TestSplitImage (line 21) | func TestSplitImage(t *testing.T) {
FILE: pkg/build/nodeimage/internal/container/docker/pull.go
function Pull (line 27) | func Pull(logger log.Logger, image string, platform string, retries int)...
FILE: pkg/build/nodeimage/internal/container/docker/run.go
function Run (line 24) | func Run(image string, runArgs []string, containerArgs []string) error {
FILE: pkg/build/nodeimage/internal/container/docker/save.go
function Save (line 24) | func Save(image, dest string) error {
FILE: pkg/build/nodeimage/internal/kube/bits.go
type Bits (line 22) | type Bits interface
type bits (line 35) | type bits struct
method BinaryPaths (line 44) | func (b *bits) BinaryPaths() []string {
method ImagePaths (line 48) | func (b *bits) ImagePaths() []string {
method Version (line 52) | func (b *bits) Version() string {
FILE: pkg/build/nodeimage/internal/kube/builder.go
type Builder (line 21) | type Builder interface
FILE: pkg/build/nodeimage/internal/kube/builder_docker.go
type dockerBuilder (line 34) | type dockerBuilder struct
method Build (line 53) | func (b *dockerBuilder) Build() (Bits, error) {
function NewDockerBuilder (line 44) | func NewDockerBuilder(logger log.Logger, kubeRoot, arch string) (Builder...
function dockerBuildOsAndArch (line 148) | func dockerBuildOsAndArch(arch string) string {
FILE: pkg/build/nodeimage/internal/kube/builder_remote.go
type remoteBuilder (line 34) | type remoteBuilder struct
method Build (line 62) | func (b *remoteBuilder) Build() (Bits, error) {
method downloadURL (line 109) | func (b *remoteBuilder) downloadURL(url string, destPath string) error {
function NewURLBuilder (line 43) | func NewURLBuilder(logger log.Logger, url string) (Builder, error) {
function NewReleaseBuilder (line 52) | func NewReleaseBuilder(logger log.Logger, version, arch string) (Builder...
FILE: pkg/build/nodeimage/internal/kube/builder_tarball.go
type directoryBuilder (line 32) | type directoryBuilder struct
method Build (line 49) | func (b *directoryBuilder) Build() (Bits, error) {
function NewTarballBuilder (line 41) | func NewTarballBuilder(logger log.Logger, tarballPath string) (Builder, ...
FILE: pkg/build/nodeimage/internal/kube/source.go
function FindSource (line 33) | func FindSource() (root string, err error) {
function probablyKubeDir (line 60) | func probablyKubeDir(dir string) bool {
function sourceVersion (line 73) | func sourceVersion(kubeRoot string) (string, error) {
FILE: pkg/build/nodeimage/internal/kube/tar.go
function extractTarball (line 15) | func extractTarball(tarPath, destDirectory string, logger log.Logger) (e...
FILE: pkg/build/nodeimage/options.go
type Option (line 24) | type Option interface
type optionAdapter (line 28) | type optionAdapter
method apply (line 30) | func (c optionAdapter) apply(o *buildContext) error {
function WithImage (line 35) | func WithImage(image string) Option {
function WithBaseImage (line 43) | func WithBaseImage(image string) Option {
function WithKubeParam (line 51) | func WithKubeParam(root string) Option {
function WithLogger (line 59) | func WithLogger(logger log.Logger) Option {
function WithArch (line 67) | func WithArch(arch string) Option {
function WithBuildType (line 77) | func WithBuildType(buildType string) Option {
FILE: pkg/cluster/constants/constants.go
constant DefaultClusterName (line 21) | DefaultClusterName = "kind"
constant ControlPlaneNodeRoleValue (line 29) | ControlPlaneNodeRoleValue string = "control-plane"
constant WorkerNodeRoleValue (line 32) | WorkerNodeRoleValue string = "worker"
constant ExternalLoadBalancerNodeRoleValue (line 39) | ExternalLoadBalancerNodeRoleValue string = "external-load-balancer"
constant ExternalEtcdNodeRoleValue (line 48) | ExternalEtcdNodeRoleValue string = "external-etcd"
FILE: pkg/cluster/createoption.go
type CreateOption (line 28) | type CreateOption interface
type createOptionAdapter (line 32) | type createOptionAdapter
method apply (line 34) | func (c createOptionAdapter) apply(o *internalcreate.ClusterOptions) e...
function CreateWithConfigFile (line 39) | func CreateWithConfigFile(path string) CreateOption {
function CreateWithRawConfig (line 48) | func CreateWithRawConfig(raw []byte) CreateOption {
function CreateWithV1Alpha4Config (line 57) | func CreateWithV1Alpha4Config(config *v1alpha4.Cluster) CreateOption {
function CreateWithNodeImage (line 66) | func CreateWithNodeImage(nodeImage string) CreateOption {
function CreateWithRetain (line 76) | func CreateWithRetain(retain bool) CreateOption {
function CreateWithWaitForReady (line 85) | func CreateWithWaitForReady(waitTime time.Duration) CreateOption {
function CreateWithKubeconfigPath (line 93) | func CreateWithKubeconfigPath(explicitPath string) CreateOption {
function CreateWithStopBeforeSettingUpKubernetes (line 104) | func CreateWithStopBeforeSettingUpKubernetes(stopBeforeSettingUpKubernet...
function CreateWithDisplayUsage (line 112) | func CreateWithDisplayUsage(displayUsage bool) CreateOption {
function CreateWithDisplaySalutation (line 121) | func CreateWithDisplaySalutation(displaySalutation bool) CreateOption {
FILE: pkg/cluster/internal/create/actions/action.go
type Action (line 34) | type Action interface
type ActionContext (line 39) | type ActionContext struct
method Nodes (line 81) | func (ac *ActionContext) Nodes() ([]nodes.Node, error) {
function NewActionContext (line 48) | func NewActionContext(
type cachedData (line 63) | type cachedData struct
method getNodes (line 68) | func (cd *cachedData) getNodes() []nodes.Node {
method setNodes (line 74) | func (cd *cachedData) setNodes(n []nodes.Node) {
FILE: pkg/cluster/internal/create/actions/config/config.go
type Action (line 39) | type Action struct
method Execute (line 47) | func (a *Action) Execute(ctx *actions.ActionContext) error {
function NewAction (line 42) | func NewAction() actions.Action {
function getKubeadmConfig (line 157) | func getKubeadmConfig(cfg *config.Cluster, data kubeadm.ConfigData, node...
function removeMetadata (line 246) | func removeMetadata(kustomized string) string {
function allPatchesFromConfig (line 256) | func allPatchesFromConfig(cfg *config.Cluster) (patches []string, jsonPa...
function writeKubeadmConfig (line 261) | func writeKubeadmConfig(kubeadmConfig string, node nodes.Node) error {
function hashMapLabelsToCommaSeparatedLabels (line 272) | func hashMapLabelsToCommaSeparatedLabels(labels map[string]string) string {
FILE: pkg/cluster/internal/create/actions/installcni/cni.go
type action (line 33) | type action struct
method Execute (line 41) | func (a *action) Execute(ctx *actions.ActionContext) error {
function NewAction (line 36) | func NewAction() actions.Action {
FILE: pkg/cluster/internal/create/actions/installstorage/storage.go
type action (line 33) | type action struct
method Execute (line 41) | func (a *action) Execute(ctx *actions.ActionContext) error {
function NewAction (line 36) | func NewAction() actions.Action {
constant defaultStorageManifest (line 70) | defaultStorageManifest = `# host-path based default storage class
function addDefaultStorage (line 80) | func addDefaultStorage(logger log.Logger, controlPlane nodes.Node) error {
FILE: pkg/cluster/internal/create/actions/kubeadminit/init.go
type action (line 36) | type action struct
method Execute (line 46) | func (a *action) Execute(ctx *actions.ActionContext) error {
function NewAction (line 41) | func NewAction(cfg *config.Cluster) actions.Action {
FILE: pkg/cluster/internal/create/actions/kubeadmjoin/join.go
type Action (line 37) | type Action struct
method Execute (line 45) | func (a *Action) Execute(ctx *actions.ActionContext) error {
function NewAction (line 40) | func NewAction() actions.Action {
function joinSecondaryControlPlanes (line 76) | func joinSecondaryControlPlanes(
function joinWorkers (line 96) | func joinWorkers(
function runKubeadmJoin (line 120) | func runKubeadmJoin(logger log.Logger, node nodes.Node) error {
FILE: pkg/cluster/internal/create/actions/loadbalancer/loadbalancer.go
type Action (line 35) | type Action struct
method Execute (line 43) | func (a *Action) Execute(ctx *actions.ActionContext) error {
function NewAction (line 38) | func NewAction() actions.Action {
FILE: pkg/cluster/internal/create/actions/waitforready/waitforready.go
type Action (line 34) | type Action struct
method Execute (line 46) | func (a *Action) Execute(ctx *actions.ActionContext) error {
function NewAction (line 39) | func NewAction(waitTime time.Duration) actions.Action {
function waitForReady (line 102) | func waitForReady(node nodes.Node, until time.Time, selectorLabel string...
function tryUntil (line 136) | func tryUntil(until time.Time, try func() bool) bool {
function formatDuration (line 145) | func formatDuration(duration time.Duration) string {
FILE: pkg/cluster/internal/create/create.go
constant clusterNameMax (line 49) | clusterNameMax = 50
type ClusterOptions (line 53) | type ClusterOptions struct
function Cluster (line 69) | func Cluster(logger log.Logger, p providers.Provider, opts *ClusterOptio...
function alreadyExists (line 177) | func alreadyExists(p providers.Provider, name string) error {
function logUsage (line 188) | func logUsage(logger log.Logger, name, explicitKubeconfigPath string) {
function logSalutation (line 200) | func logSalutation(logger log.Logger) {
function fixupOptions (line 212) | func fixupOptions(opts *ClusterOptions) error {
function validateProvider (line 244) | func validateProvider(p providers.Provider) error {
FILE: pkg/cluster/internal/delete/delete.go
function Cluster (line 31) | func Cluster(logger log.Logger, p providers.Provider, name, explicitKube...
FILE: pkg/cluster/internal/kubeadm/config.go
type ConfigData (line 34) | type ConfigData struct
method Derive (line 118) | func (c *ConfigData) Derive() {
type DerivedConfigData (line 88) | type DerivedConfigData struct
type FeatureGate (line 112) | type FeatureGate struct
constant ConfigTemplateBetaV2 (line 186) | ConfigTemplateBetaV2 = `# config generated by kind
constant ConfigTemplateBetaV3 (line 329) | ConfigTemplateBetaV3 = `# config generated by kind
function Config (line 485) | func Config(data ConfigData) (config string, err error) {
FILE: pkg/cluster/internal/kubeadm/const.go
constant Token (line 20) | Token = "abcdef.0123456789abcdef"
constant ObjectName (line 24) | ObjectName = "config"
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/encode.go
function Encode (line 30) | func Encode(cfg *Config) ([]byte, error) {
function normYaml (line 51) | func normYaml(y []byte) ([]byte, error) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/encode_test.go
function TestEncodeRoundtrip (line 25) | func TestEncodeRoundtrip(t *testing.T) {
function TestEncodeEmpty (line 59) | func TestEncodeEmpty(t *testing.T) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/helpers.go
function KINDClusterKey (line 24) | func KINDClusterKey(clusterName string) string {
function checkKubeadmExpectations (line 30) | func checkKubeadmExpectations(cfg *Config) error {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/helpers_test.go
function TestKINDClusterKey (line 25) | func TestKINDClusterKey(t *testing.T) {
function TestCheckKubeadmExpectations (line 30) | func TestCheckKubeadmExpectations(t *testing.T) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/lock.go
function lockFile (line 27) | func lockFile(filename string) error {
function unlockFile (line 43) | func unlockFile(filename string) error {
function lockName (line 47) | func lockName(filename string) string {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/merge.go
function WriteMerged (line 28) | func WriteMerged(kindConfig *Config, explicitConfigPath string) error {
function merge (line 56) | func merge(existing, kind *Config) error {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/merge_test.go
function TestMerge (line 29) | func TestMerge(t *testing.T) {
function TestWriteMerged (line 228) | func TestWriteMerged(t *testing.T) {
function testWriteMergedNormal (line 235) | func testWriteMergedNormal(t *testing.T) {
function testWriteMergedBogusConfig (line 355) | func testWriteMergedBogusConfig(t *testing.T) {
function testWriteMergedNoExistingFile (line 367) | func testWriteMergedNoExistingFile(t *testing.T) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/paths.go
constant kubeconfigEnv (line 28) | kubeconfigEnv = "KUBECONFIG"
function paths (line 44) | func paths(explicitPath string, getEnv func(string) string) []string {
function pathForMerge (line 60) | func pathForMerge(explicitPath string, getEnv func(string) string) string {
function fileExists (line 75) | func fileExists(filename string) bool {
function discardEmptyAndDuplicates (line 83) | func discardEmptyAndDuplicates(paths []string) []string {
function homeDir (line 106) | func homeDir(GOOS string, getEnv func(string) string) string {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/paths_test.go
function TestPaths (line 31) | func TestPaths(t *testing.T) {
function TestPathForMerge (line 69) | func TestPathForMerge(t *testing.T) {
function TestHomeDir (line 129) | func TestHomeDir(t *testing.T) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/read.go
function KINDFromRawKubeadm (line 31) | func KINDFromRawKubeadm(rawKubeadmKubeConfig, clusterName, server string...
function read (line 62) | func read(configPath string) (*Config, error) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/read_test.go
function TestKINDFromRawKubeadm (line 26) | func TestKINDFromRawKubeadm(t *testing.T) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/remove.go
function RemoveKIND (line 27) | func RemoveKIND(kindClusterName string, explicitPath string) error {
function remove (line 62) | func remove(cfg *Config, kindClusterName string) bool {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/remove_test.go
function TestRemove (line 28) | func TestRemove(t *testing.T) {
function TestRemoveKIND (line 145) | func TestRemoveKIND(t *testing.T) {
function testRemoveKINDTrivial (line 151) | func testRemoveKINDTrivial(t *testing.T) {
function testRemoveKINDKeepOther (line 206) | func testRemoveKINDKeepOther(t *testing.T) {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/types.go
type Config (line 32) | type Config struct
type NamedCluster (line 47) | type NamedCluster struct
type Cluster (line 55) | type Cluster struct
type NamedUser (line 64) | type NamedUser struct
type NamedContext (line 73) | type NamedContext struct
type Context (line 81) | type Context struct
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/write.go
function write (line 28) | func write(cfg *Config, configPath string) error {
FILE: pkg/cluster/internal/kubeconfig/internal/kubeconfig/write_test.go
function TestWrite (line 28) | func TestWrite(t *testing.T) {
function testWriteNoExistingFile (line 33) | func testWriteNoExistingFile(t *testing.T) {
FILE: pkg/cluster/internal/kubeconfig/kubeconfig.go
function Export (line 35) | func Export(p providers.Provider, name, explicitPath string, external bo...
function Remove (line 47) | func Remove(clusterName, explicitPath string) error {
function Get (line 53) | func Get(p providers.Provider, name string, external bool) (string, erro...
function ContextForCluster (line 67) | func ContextForCluster(kindClusterName string) string {
function get (line 71) | func get(p providers.Provider, name string, external bool) (*kubeconfig....
FILE: pkg/cluster/internal/loadbalancer/config.go
type ConfigData (line 27) | type ConfigData struct
constant DefaultConfigTemplate (line 34) | DefaultConfigTemplate = `# generated by kind
function Config (line 73) | func Config(data *ConfigData) (config string, err error) {
FILE: pkg/cluster/internal/loadbalancer/const.go
constant Image (line 20) | Image = "docker.io/kindest/haproxy:v20260131-7181c60a"
constant ConfigPath (line 23) | ConfigPath = "/usr/local/etc/haproxy/haproxy.cfg"
FILE: pkg/cluster/internal/logs/logs.go
function DumpDir (line 36) | func DumpDir(logger log.Logger, node nodes.Node, nodeDir, hostDir string...
function untar (line 59) | func untar(logger log.Logger, r io.Reader, dir string) (err error) {
FILE: pkg/cluster/internal/providers/common/cgroups.go
function NodeReachedCgroupsReadyRegexp (line 41) | func NodeReachedCgroupsReadyRegexp() *regexp.Regexp {
function WaitUntilLogRegexpMatches (line 53) | func WaitUntilLogRegexpMatches(logCtx context.Context, logCmd exec.Cmd, ...
FILE: pkg/cluster/internal/providers/common/constants.go
constant APIServerInternalPort (line 21) | APIServerInternalPort = 6443
FILE: pkg/cluster/internal/providers/common/getport.go
function PortOrGetFreePort (line 25) | func PortOrGetFreePort(port int32, listenAddr string) (int32, func(), er...
function GetFreePort (line 42) | func GetFreePort(listenAddr string) (int32, func(), error) {
FILE: pkg/cluster/internal/providers/common/getport_test.go
function TestPortOrGetFreePort (line 21) | func TestPortOrGetFreePort(t *testing.T) {
function TestGetFreePort (line 59) | func TestGetFreePort(t *testing.T) {
FILE: pkg/cluster/internal/providers/common/images.go
function RequiredNodeImages (line 27) | func RequiredNodeImages(cfg *config.Cluster) sets.String {
FILE: pkg/cluster/internal/providers/common/images_test.go
function TestRequiredNodeImages (line 27) | func TestRequiredNodeImages(t *testing.T) {
FILE: pkg/cluster/internal/providers/common/logs.go
function FileOnHost (line 11) | func FileOnHost(path string) (*os.File, error) {
FILE: pkg/cluster/internal/providers/common/namer.go
function MakeNodeNamer (line 25) | func MakeNodeNamer(clusterName string) func(string) string {
FILE: pkg/cluster/internal/providers/common/namer_test.go
function TestMakeNodeNamer (line 25) | func TestMakeNodeNamer(t *testing.T) {
FILE: pkg/cluster/internal/providers/common/proxy.go
constant HTTPProxy (line 28) | HTTPProxy = "HTTP_PROXY"
constant HTTPSProxy (line 30) | HTTPSProxy = "HTTPS_PROXY"
constant NOProxy (line 32) | NOProxy = "NO_PROXY"
function GetProxyEnvs (line 37) | func GetProxyEnvs(cfg *config.Cluster) map[string]string {
function getProxyEnvs (line 41) | func getProxyEnvs(cfg *config.Cluster, getEnv func(string) string) map[s...
FILE: pkg/cluster/internal/providers/common/proxy_test.go
function TestGetProxyEnvs (line 26) | func TestGetProxyEnvs(t *testing.T) {
FILE: pkg/cluster/internal/providers/docker/constants.go
constant clusterLabelKey (line 21) | clusterLabelKey = "io.x-k8s.kind.cluster"
constant nodeRoleLabelKey (line 25) | nodeRoleLabelKey = "io.x-k8s.kind.role"
FILE: pkg/cluster/internal/providers/docker/images.go
function ensureNodeImages (line 35) | func ensureNodeImages(logger log.Logger, status *cli.Status, cfg *config...
function pullIfNotPresent (line 52) | func pullIfNotPresent(logger log.Logger, image string, retries int) (pul...
function pull (line 66) | func pull(logger log.Logger, image string, retries int) error {
function sanitizeImage (line 86) | func sanitizeImage(image string) (string, string) {
FILE: pkg/cluster/internal/providers/docker/network.go
constant fixedNetworkName (line 47) | fixedNetworkName = "kind"
function ensureNetwork (line 50) | func ensureNetwork(name string) error {
function createNetworkNoDuplicates (line 128) | func createNetworkNoDuplicates(name, ipv6Subnet string, mtu int) error {
function removeDuplicateNetworks (line 136) | func removeDuplicateNetworks(name string) (bool, error) {
function createNetwork (line 149) | func createNetwork(name, ipv6Subnet string, mtu int) error {
function getDefaultNetworkMTU (line 164) | func getDefaultNetworkMTU() int {
function sortedNetworksWithName (line 178) | func sortedNetworksWithName(name string) ([]string, error) {
function sortNetworkInspectEntries (line 204) | func sortNetworkInspectEntries(networks []networkInspectEntry) {
function inspectNetworks (line 214) | func inspectNetworks(networkIDs []string) ([]networkInspectEntry, error) {
type networkInspectEntry (line 229) | type networkInspectEntry struct
function networksWithName (line 237) | func networksWithName(name string) ([]string, error) {
function checkIfNetworkExists (line 253) | func checkIfNetworkExists(name string) (bool, error) {
function isIPv6UnavailableError (line 262) | func isIPv6UnavailableError(err error) bool {
function isPoolOverlapError (line 280) | func isPoolOverlapError(err error) bool {
function isNetworkAlreadyExistsError (line 285) | func isNetworkAlreadyExistsError(err error) bool {
function isOnlyErrorNoSuchNetwork (line 292) | func isOnlyErrorNoSuchNetwork(err error) bool {
function deleteNetworks (line 320) | func deleteNetworks(networks ...string) error {
function generateULASubnetFromName (line 326) | func generateULASubnetFromName(name string, attempt int32) string {
FILE: pkg/cluster/internal/providers/docker/network_integration_test.go
function TestIntegrationEnsureNetworkConcurrent (line 33) | func TestIntegrationEnsureNetworkConcurrent(t *testing.T) {
FILE: pkg/cluster/internal/providers/docker/network_test.go
function Test_generateULASubnetFromName (line 26) | func Test_generateULASubnetFromName(t *testing.T) {
function Test_sortNetworkInspectEntries (line 72) | func Test_sortNetworkInspectEntries(t *testing.T) {
FILE: pkg/cluster/internal/providers/docker/node.go
type node (line 30) | type node struct
method String (line 34) | func (n *node) String() string {
method Role (line 38) | func (n *node) Role() (string, error) {
method IP (line 53) | func (n *node) IP() (ipv4 string, ipv6 string, err error) {
method Command (line 73) | func (n *node) Command(command string, args ...string) exec.Cmd {
method CommandContext (line 81) | func (n *node) CommandContext(ctx context.Context, command string, arg...
method SerialLogs (line 169) | func (n *node) SerialLogs(w io.Writer) error {
type nodeCmd (line 91) | type nodeCmd struct
method Run (line 102) | func (c *nodeCmd) Run() error {
method SetEnv (line 149) | func (c *nodeCmd) SetEnv(env ...string) exec.Cmd {
method SetStdin (line 154) | func (c *nodeCmd) SetStdin(r io.Reader) exec.Cmd {
method SetStdout (line 159) | func (c *nodeCmd) SetStdout(w io.Writer) exec.Cmd {
method SetStderr (line 164) | func (c *nodeCmd) SetStderr(w io.Writer) exec.Cmd {
FILE: pkg/cluster/internal/providers/docker/provider.go
function NewProvider (line 42) | func NewProvider(logger log.Logger) providers.Provider {
type provider (line 50) | type provider struct
method String (line 58) | func (p *provider) String() string {
method Provision (line 63) | func (p *provider) Provision(status *cli.Status, cfg *config.Cluster) ...
method ListClusters (line 97) | func (p *provider) ListClusters() ([]string, error) {
method ListNodes (line 114) | func (p *provider) ListNodes(cluster string) ([]nodes.Node, error) {
method DeleteNodes (line 136) | func (p *provider) DeleteNodes(n []nodes.Node) error {
method GetAPIServerEndpoint (line 157) | func (p *provider) GetAPIServerEndpoint(cluster string) (string, error) {
method GetAPIServerInternalEndpoint (line 215) | func (p *provider) GetAPIServerInternalEndpoint(cluster string) (strin...
method node (line 230) | func (p *provider) node(name string) nodes.Node {
method CollectLogs (line 237) | func (p *provider) CollectLogs(dir string, nodes []nodes.Node) error {
method Info (line 271) | func (p *provider) Info() (*providers.ProviderInfo, error) {
type dockerInfo (line 280) | type dockerInfo struct
function info (line 289) | func info() (*providers.ProviderInfo, error) {
FILE: pkg/cluster/internal/providers/docker/provision.go
function planCreation (line 38) | func planCreation(cfg *config.Cluster, networkName string) (createContai...
function commonArgs (line 133) | func commonArgs(cluster string, cfg *config.Cluster, networkName string,...
function runArgsForNode (line 215) | func runArgsForNode(node *config.Node, clusterIPFamily config.ClusterIPF...
function runArgsForLoadBalancer (line 262) | func runArgsForLoadBalancer(cfg *config.Cluster, name string, args []str...
function getProxyEnv (line 288) | func getProxyEnv(cfg *config.Cluster, networkName string, nodeNames []st...
function getSubnets (line 312) | func getSubnets(networkName string) ([]string, error) {
function generateMountBindings (line 327) | func generateMountBindings(mounts ...config.Mount) []string {
function generatePortMappings (line 360) | func generatePortMappings(clusterIPFamily config.ClusterIPFamily, portMa...
function createContainer (line 405) | func createContainer(name string, args []string) error {
function createContainerWithWaitUntilSystemdReachesMultiUserSystem (line 409) | func createContainerWithWaitUntilSystemdReachesMultiUserSystem(name stri...
FILE: pkg/cluster/internal/providers/docker/util.go
function IsAvailable (line 27) | func IsAvailable() bool {
function usernsRemap (line 37) | func usernsRemap() bool {
function mountDevMapper (line 53) | func mountDevMapper() bool {
function mountFuse (line 91) | func mountFuse() bool {
FILE: pkg/cluster/internal/providers/nerdctl/constants.go
constant clusterLabelKey (line 21) | clusterLabelKey = "io.x-k8s.kind.cluster"
constant nodeRoleLabelKey (line 25) | nodeRoleLabelKey = "io.x-k8s.kind.role"
FILE: pkg/cluster/internal/providers/nerdctl/images.go
function ensureNodeImages (line 35) | func ensureNodeImages(logger log.Logger, status *cli.Status, cfg *config...
function pullIfNotPresent (line 52) | func pullIfNotPresent(logger log.Logger, image string, retries int, bina...
function pull (line 66) | func pull(logger log.Logger, image string, retries int, binaryName strin...
function sanitizeImage (line 86) | func sanitizeImage(image string) (string, string) {
FILE: pkg/cluster/internal/providers/nerdctl/network.go
constant fixedNetworkName (line 42) | fixedNetworkName = "kind"
function ensureNetwork (line 45) | func ensureNetwork(name, binaryName string) error {
function createNetwork (line 119) | func createNetwork(name, ipv6Subnet string, mtu int, binaryName string) ...
function getDefaultNetworkMTU (line 134) | func getDefaultNetworkMTU(binaryName string) int {
function checkIfNetworkExists (line 148) | func checkIfNetworkExists(name, binaryName string) (bool, error) {
function isIPv6UnavailableError (line 159) | func isIPv6UnavailableError(err error) bool {
function isPoolOverlapError (line 164) | func isPoolOverlapError(err error) bool {
function generateULASubnetFromName (line 171) | func generateULASubnetFromName(name string, attempt int32) string {
FILE: pkg/cluster/internal/providers/nerdctl/network_test.go
function Test_generateULASubnetFromName (line 24) | func Test_generateULASubnetFromName(t *testing.T) {
FILE: pkg/cluster/internal/providers/nerdctl/node.go
type node (line 30) | type node struct
method String (line 35) | func (n *node) String() string {
method Role (line 39) | func (n *node) Role() (string, error) {
method IP (line 54) | func (n *node) IP() (ipv4 string, ipv6 string, err error) {
method Command (line 74) | func (n *node) Command(command string, args ...string) exec.Cmd {
method CommandContext (line 83) | func (n *node) CommandContext(ctx context.Context, command string, arg...
method SerialLogs (line 173) | func (n *node) SerialLogs(w io.Writer) error {
type nodeCmd (line 94) | type nodeCmd struct
method Run (line 106) | func (c *nodeCmd) Run() error {
method SetEnv (line 153) | func (c *nodeCmd) SetEnv(env ...string) exec.Cmd {
method SetStdin (line 158) | func (c *nodeCmd) SetStdin(r io.Reader) exec.Cmd {
method SetStdout (line 163) | func (c *nodeCmd) SetStdout(w io.Writer) exec.Cmd {
method SetStderr (line 168) | func (c *nodeCmd) SetStderr(w io.Writer) exec.Cmd {
FILE: pkg/cluster/internal/providers/nerdctl/provider.go
function NewProvider (line 42) | func NewProvider(logger log.Logger, binaryName string) providers.Provider {
type provider (line 67) | type provider struct
method String (line 76) | func (p *provider) String() string {
method Binary (line 80) | func (p *provider) Binary() string {
method Provision (line 85) | func (p *provider) Provision(status *cli.Status, cfg *config.Cluster) ...
method ListClusters (line 120) | func (p *provider) ListClusters() ([]string, error) {
method ListNodes (line 137) | func (p *provider) ListNodes(cluster string) ([]nodes.Node, error) {
method DeleteNodes (line 162) | func (p *provider) DeleteNodes(n []nodes.Node) error {
method GetAPIServerEndpoint (line 204) | func (p *provider) GetAPIServerEndpoint(cluster string) (string, error) {
method GetAPIServerInternalEndpoint (line 262) | func (p *provider) GetAPIServerInternalEndpoint(cluster string) (strin...
method node (line 277) | func (p *provider) node(name string) nodes.Node {
method CollectLogs (line 285) | func (p *provider) CollectLogs(dir string, nodes []nodes.Node) error {
method Info (line 319) | func (p *provider) Info() (*providers.ProviderInfo, error) {
type dockerInfo (line 328) | type dockerInfo struct
function info (line 337) | func info(binaryName string) (*providers.ProviderInfo, error) {
FILE: pkg/cluster/internal/providers/nerdctl/provision.go
function planCreation (line 38) | func planCreation(cfg *config.Cluster, networkName, binaryName string) (...
function commonArgs (line 133) | func commonArgs(cluster string, cfg *config.Cluster, networkName string,...
function runArgsForNode (line 185) | func runArgsForNode(node *config.Node, clusterIPFamily config.ClusterIPF...
function runArgsForLoadBalancer (line 232) | func runArgsForLoadBalancer(cfg *config.Cluster, name string, args []str...
function getProxyEnv (line 258) | func getProxyEnv(cfg *config.Cluster, networkName string, nodeNames []st...
function getSubnets (line 282) | func getSubnets(networkName, binaryName string) ([]string, error) {
function generateMountBindings (line 297) | func generateMountBindings(mounts ...config.Mount) []string {
function generatePortMappings (line 330) | func generatePortMappings(clusterIPFamily config.ClusterIPFamily, portMa...
function createContainer (line 375) | func createContainer(name string, args []string, binaryName string) error {
function createContainerWithWaitUntilSystemdReachesMultiUserSystem (line 379) | func createContainerWithWaitUntilSystemdReachesMultiUserSystem(name stri...
FILE: pkg/cluster/internal/providers/nerdctl/util.go
function IsAvailable (line 26) | func IsAvailable() bool {
function mountFuse (line 43) | func mountFuse(binaryName string) bool {
FILE: pkg/cluster/internal/providers/podman/constants.go
constant clusterLabelKey (line 21) | clusterLabelKey = "io.x-k8s.kind.cluster"
constant nodeRoleLabelKey (line 25) | nodeRoleLabelKey = "io.x-k8s.kind.role"
FILE: pkg/cluster/internal/providers/podman/images.go
function ensureNodeImages (line 35) | func ensureNodeImages(logger log.Logger, status *cli.Status, cfg *config...
function pullIfNotPresent (line 52) | func pullIfNotPresent(logger log.Logger, image string, retries int) (pul...
function pull (line 66) | func pull(logger log.Logger, image string, retries int) error {
function sanitizeImage (line 86) | func sanitizeImage(image string) (friendlyImageName, pullImageName strin...
FILE: pkg/cluster/internal/providers/podman/images_test.go
function Test_sanitizeImage (line 23) | func Test_sanitizeImage(t *testing.T) {
FILE: pkg/cluster/internal/providers/podman/network.go
constant fixedNetworkName (line 41) | fixedNetworkName = "kind"
function ensureNetwork (line 45) | func ensureNetwork(name string) error {
function createNetwork (line 89) | func createNetwork(name, ipv6Subnet string) error {
function checkIfNetworkExists (line 97) | func checkIfNetworkExists(name string) bool {
function isUnknownIPv6FlagError (line 105) | func isUnknownIPv6FlagError(err error) bool {
function isIPv6DisabledError (line 111) | func isIPv6DisabledError(err error) bool {
function isPoolOverlapError (line 117) | func isPoolOverlapError(err error) bool {
function generateULASubnetFromName (line 130) | func generateULASubnetFromName(name string, attempt int32) string {
FILE: pkg/cluster/internal/providers/podman/node.go
type node (line 30) | type node struct
method String (line 34) | func (n *node) String() string {
method Role (line 38) | func (n *node) Role() (string, error) {
method IP (line 53) | func (n *node) IP() (ipv4 string, ipv6 string, err error) {
method Command (line 73) | func (n *node) Command(command string, args ...string) exec.Cmd {
method CommandContext (line 81) | func (n *node) CommandContext(ctx context.Context, command string, arg...
method SerialLogs (line 169) | func (n *node) SerialLogs(w io.Writer) error {
type nodeCmd (line 91) | type nodeCmd struct
method Run (line 102) | func (c *nodeCmd) Run() error {
method SetEnv (line 149) | func (c *nodeCmd) SetEnv(env ...string) exec.Cmd {
method SetStdin (line 154) | func (c *nodeCmd) SetStdin(r io.Reader) exec.Cmd {
method SetStdout (line 159) | func (c *nodeCmd) SetStdout(w io.Writer) exec.Cmd {
method SetStderr (line 164) | func (c *nodeCmd) SetStderr(w io.Writer) exec.Cmd {
FILE: pkg/cluster/internal/providers/podman/provider.go
function NewProvider (line 43) | func NewProvider(logger log.Logger) providers.Provider {
type provider (line 52) | type provider struct
method String (line 60) | func (p *provider) String() string {
method Provision (line 65) | func (p *provider) Provision(status *cli.Status, cfg *config.Cluster) ...
method ListClusters (line 103) | func (p *provider) ListClusters() ([]string, error) {
method ListNodes (line 120) | func (p *provider) ListNodes(cluster string) ([]nodes.Node, error) {
method DeleteNodes (line 142) | func (p *provider) DeleteNodes(n []nodes.Node) error {
method GetAPIServerEndpoint (line 183) | func (p *provider) GetAPIServerEndpoint(cluster string) (string, error) {
method GetAPIServerInternalEndpoint (line 297) | func (p *provider) GetAPIServerInternalEndpoint(cluster string) (strin...
method node (line 312) | func (p *provider) node(name string) nodes.Node {
method CollectLogs (line 319) | func (p *provider) CollectLogs(dir string, nodes []nodes.Node) error {
method Info (line 353) | func (p *provider) Info() (*providers.ProviderInfo, error) {
function getHostIPOrDefault (line 175) | func getHostIPOrDefault(hostIP string) string {
type podmanInfo (line 367) | type podmanInfo struct
function info (line 378) | func info(logger log.Logger) (*providers.ProviderInfo, error) {
FILE: pkg/cluster/internal/providers/podman/provision.go
function planCreation (line 38) | func planCreation(cfg *config.Cluster, networkName string) (createContai...
function commonArgs (line 129) | func commonArgs(cfg *config.Cluster, networkName string, nodeNames []str...
function runArgsForNode (line 176) | func runArgsForNode(node *config.Node, clusterIPFamily config.ClusterIPF...
function runArgsForLoadBalancer (line 233) | func runArgsForLoadBalancer(cfg *config.Cluster, name string, args []str...
function getProxyEnv (line 260) | func getProxyEnv(cfg *config.Cluster, networkName string, nodeNames []st...
type podmanNetworks (line 285) | type podmanNetworks
function getSubnets (line 302) | func getSubnets(networkName string) ([]string, error) {
function generateMountBindings (line 340) | func generateMountBindings(mounts ...config.Mount) []string {
function generatePortMappings (line 373) | func generatePortMappings(clusterIPFamily config.ClusterIPFamily, portMa...
function createContainer (line 423) | func createContainer(name string, args []string) error {
function createContainerWithWaitUntilSystemdReachesMultiUserSystem (line 427) | func createContainerWithWaitUntilSystemdReachesMultiUserSystem(name stri...
FILE: pkg/cluster/internal/providers/podman/util.go
function IsAvailable (line 31) | func IsAvailable() bool {
function getPodmanVersion (line 40) | func getPodmanVersion() (*version.Version, error) {
constant minSupportedVersion (line 59) | minSupportedVersion = "1.8.0"
function ensureMinVersion (line 62) | func ensureMinVersion() error {
function createAnonymousVolume (line 77) | func createAnonymousVolume(label string) (string, error) {
function getVolumes (line 92) | func getVolumes(label string) ([]string, error) {
function deleteVolumes (line 113) | func deleteVolumes(names []string) error {
function mountDevMapper (line 125) | func mountDevMapper() bool {
type podmanStorageInfo (line 149) | type podmanStorageInfo struct
function mountFuse (line 160) | func mountFuse() bool {
FILE: pkg/cluster/internal/providers/provider.go
type Provider (line 30) | type Provider interface
type ProviderInfo (line 55) | type ProviderInfo struct
FILE: pkg/cluster/nodes/types.go
type Node (line 26) | type Node interface
FILE: pkg/cluster/nodeutils/roles.go
function SelectNodesByRole (line 31) | func SelectNodesByRole(allNodes []nodes.Node, role string) ([]nodes.Node...
function InternalNodes (line 47) | func InternalNodes(allNodes []nodes.Node) ([]nodes.Node, error) {
function ExternalLoadBalancerNode (line 63) | func ExternalLoadBalancerNode(allNodes []nodes.Node) (nodes.Node, error) {
function APIServerEndpointNode (line 88) | func APIServerEndpointNode(allNodes []nodes.Node) (nodes.Node, error) {
function ControlPlaneNodes (line 106) | func ControlPlaneNodes(allNodes []nodes.Node) ([]nodes.Node, error) {
function BootstrapControlPlaneNode (line 125) | func BootstrapControlPlaneNode(allNodes []nodes.Node) (nodes.Node, error) {
function SecondaryControlPlaneNodes (line 141) | func SecondaryControlPlaneNodes(allNodes []nodes.Node) ([]nodes.Node, er...
FILE: pkg/cluster/nodeutils/util.go
function KubeVersion (line 35) | func KubeVersion(n nodes.Node) (version string, err error) {
function WriteFile (line 49) | func WriteFile(n nodes.Node, dest, content string) error {
function CopyNodeToNode (line 60) | func CopyNodeToNode(a, b nodes.Node, file string) error {
function LoadImageArchive (line 81) | func LoadImageArchive(n nodes.Node, image io.Reader) error {
function getSnapshotter (line 93) | func getSnapshotter(n nodes.Node) (string, error) {
function parseSnapshotter (line 101) | func parseSnapshotter(config string) (string, error) {
function ImageID (line 129) | func ImageID(n nodes.Node, image string) (string, error) {
function ImageTags (line 148) | func ImageTags(n nodes.Node, imageID string) (map[string]bool, error) {
function ReTagImage (line 169) | func ReTagImage(n nodes.Node, imageID, imageName string) error {
FILE: pkg/cluster/nodeutils/util_test.go
function TestParseSnapshotter (line 23) | func TestParseSnapshotter(t *testing.T) {
FILE: pkg/cluster/provider.go
constant DefaultName (line 45) | DefaultName = constants.DefaultClusterName
function defaultName (line 48) | func defaultName(name string) string {
type Provider (line 56) | type Provider struct
method Create (line 185) | func (p *Provider) Create(name string, options ...CreateOption) error {
method Delete (line 199) | func (p *Provider) Delete(name, explicitKubeconfigPath string) error {
method List (line 204) | func (p *Provider) List() ([]string, error) {
method KubeConfig (line 211) | func (p *Provider) KubeConfig(name string, internal bool) (string, err...
method ExportKubeConfig (line 219) | func (p *Provider) ExportKubeConfig(name string, explicitPath string, ...
method ListNodes (line 224) | func (p *Provider) ListNodes(name string) ([]nodes.Node, error) {
method ListInternalNodes (line 230) | func (p *Provider) ListInternalNodes(name string) ([]nodes.Node, error) {
method CollectLogs (line 239) | func (p *Provider) CollectLogs(name, dir string) error {
function NewProvider (line 62) | func NewProvider(options ...ProviderOption) *Provider {
function DetectNodeProvider (line 117) | func DetectNodeProvider() (ProviderOption, error) {
type ProviderOption (line 132) | type ProviderOption interface
type providerLoggerOption (line 138) | type providerLoggerOption
method apply (line 140) | func (a providerLoggerOption) apply(p *Provider) {
function ProviderWithLogger (line 147) | func ProviderWithLogger(logger log.Logger) ProviderOption {
type providerRuntimeOption (line 155) | type providerRuntimeOption
method apply (line 157) | func (a providerRuntimeOption) apply(p *Provider) {
function ProviderWithDocker (line 164) | func ProviderWithDocker() ProviderOption {
function ProviderWithPodman (line 171) | func ProviderWithPodman() ProviderOption {
function ProviderWithNerdctl (line 178) | func ProviderWithNerdctl(binaryName string) ProviderOption {
function collectNodeLogs (line 281) | func collectNodeLogs(logger log.Logger, n nodes.Node, dir string) error {
FILE: pkg/cmd/iostreams.go
type IOStreams (line 25) | type IOStreams struct
function StandardIOStreams (line 35) | func StandardIOStreams() IOStreams {
FILE: pkg/cmd/kind/build/build.go
function NewCommand (line 31) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/build/nodeimage/nodeimage.go
type flagpole (line 29) | type flagpole struct
function NewCommand (line 38) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 77) | func runE(logger log.Logger, flags *flagpole, args []string) error {
FILE: pkg/cmd/kind/completion/bash/bash.go
function NewCommand (line 28) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/completion/completion.go
function NewCommand (line 34) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
constant longDescription (line 54) | longDescription = `
FILE: pkg/cmd/kind/completion/fish/fish.go
function NewCommand (line 28) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/completion/powershell/powershell.go
function NewCommand (line 28) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/completion/zsh/zsh.go
function NewCommand (line 28) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/create/cluster/createcluster.go
type flagpole (line 35) | type flagpole struct
function NewCommand (line 45) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 97) | func runE(logger log.Logger, streams cmd.IOStreams, flags *flagpole) err...
function configOption (line 128) | func configOption(rawConfigFlag string, stdin io.Reader) (cluster.Create...
FILE: pkg/cmd/kind/create/create.go
function NewCommand (line 31) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/delete/cluster/deletecluster.go
type flagpole (line 32) | type flagpole struct
function NewCommand (line 38) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function deleteCluster (line 73) | func deleteCluster(logger log.Logger, flags *flagpole) error {
FILE: pkg/cmd/kind/delete/clusters/deleteclusters.go
type flagpole (line 31) | type flagpole struct
function NewCommand (line 37) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function deleteClusters (line 75) | func deleteClusters(logger log.Logger, flags *flagpole, clusters []strin...
FILE: pkg/cmd/kind/delete/delete.go
function NewCommand (line 32) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/export/export.go
function NewCommand (line 32) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/export/kubeconfig/kubeconfig.go
type flagpole (line 31) | type flagpole struct
function NewCommand (line 38) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 72) | func runE(logger log.Logger, flags *flagpole) error {
FILE: pkg/cmd/kind/export/logs/logs.go
type flagpole (line 34) | type flagpole struct
function NewCommand (line 39) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 62) | func runE(logger log.Logger, streams cmd.IOStreams, flags *flagpole, arg...
FILE: pkg/cmd/kind/get/clusters/clusters.go
function NewCommand (line 33) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 47) | func runE(logger log.Logger, streams cmd.IOStreams) error {
FILE: pkg/cmd/kind/get/get.go
function NewCommand (line 33) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/get/kubeconfig/kubeconfig.go
type flagpole (line 33) | type flagpole struct
function NewCommand (line 39) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 67) | func runE(logger log.Logger, streams cmd.IOStreams, flags *flagpole) err...
FILE: pkg/cmd/kind/get/nodes/nodes.go
type flagpole (line 34) | type flagpole struct
function NewCommand (line 40) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 69) | func runE(logger log.Logger, streams cmd.IOStreams, flags *flagpole) err...
FILE: pkg/cmd/kind/load/docker-image/docker-image.go
type imageTagFetcher (line 42) | type imageTagFetcher
type flagpole (line 45) | type flagpole struct
function NewCommand (line 51) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 84) | func runE(logger log.Logger, flags *flagpole, args []string) error {
function loadImage (line 199) | func loadImage(imageTarName string, node nodes.Node) error {
function save (line 209) | func save(images []string, dest string) error {
function imageID (line 215) | func imageID(containerNameOrID string) (string, error) {
function removeDuplicates (line 231) | func removeDuplicates(slice []string) []string {
function checkIfImageReTagRequired (line 244) | func checkIfImageReTagRequired(node nodes.Node, imageID, imageName strin...
function sanitizeImage (line 262) | func sanitizeImage(image string) (sanitizedName string) {
FILE: pkg/cmd/kind/load/docker-image/docker-image_test.go
function Test_removeDuplicates (line 28) | func Test_removeDuplicates(t *testing.T) {
function Test_sanitizeImage (line 67) | func Test_sanitizeImage(t *testing.T) {
function Test_checkIfImageReTagRequired (line 108) | func Test_checkIfImageReTagRequired(t *testing.T) {
FILE: pkg/cmd/kind/load/image-archive/image-archive.go
type flagpole (line 37) | type flagpole struct
function NewCommand (line 43) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 81) | func runE(logger log.Logger, flags *flagpole, args []string) error {
function loadArchiveToNodes (line 101) | func loadArchiveToNodes(logger log.Logger, provider *cluster.Provider, c...
function loadImage (line 145) | func loadImage(logger log.Logger, imageTarName string, node nodes.Node) ...
FILE: pkg/cmd/kind/load/load.go
function NewCommand (line 32) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
FILE: pkg/cmd/kind/root.go
type flagpole (line 37) | type flagpole struct
function NewCommand (line 43) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function runE (line 84) | func runE(logger log.Logger, flags *flagpole) error {
function maybeSetWriter (line 96) | func maybeSetWriter(logger log.Logger, w io.Writer) {
function maybeSetVerbosity (line 108) | func maybeSetVerbosity(logger log.Logger, verbosity log.Level) {
FILE: pkg/cmd/kind/version/version.go
function Version (line 31) | func Version() string {
function version (line 35) | func version(core, preRelease, commit, commitCount string) string {
function DisplayVersion (line 56) | func DisplayVersion() string {
constant versionCore (line 61) | versionCore = "0.32.0"
function NewCommand (line 76) | func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command {
function truncate (line 95) | func truncate(s string, maxLen int) string {
FILE: pkg/cmd/kind/version/version_test.go
function TestTruncate (line 23) | func TestTruncate(t *testing.T) {
function TestVersion (line 64) | func TestVersion(t *testing.T) {
FILE: pkg/cmd/logger.go
function NewLogger (line 31) | func NewLogger() log.Logger {
function ColorEnabled (line 41) | func ColorEnabled(logger log.Logger) bool {
FILE: pkg/errors/aggregate.go
function NewAggregate (line 22) | func NewAggregate(errlist []error) error {
function Errors (line 33) | func Errors(err error) []error {
FILE: pkg/errors/aggregate_forked.go
type Aggregate (line 42) | type Aggregate interface
function newAggregate (line 48) | func newAggregate(errlist []error) Aggregate {
function flatten (line 67) | func flatten(agg Aggregate) Aggregate {
function reduce (line 89) | func reduce(err error) error {
type aggregate (line 104) | type aggregate
method Error (line 107) | func (agg aggregate) Error() string {
method Is (line 135) | func (agg aggregate) Is(target error) bool {
method visit (line 141) | func (agg aggregate) visit(f func(err error) bool) bool {
method Errors (line 165) | func (agg aggregate) Errors() []error {
FILE: pkg/errors/aggregate_test.go
function TestErrors (line 25) | func TestErrors(t *testing.T) {
FILE: pkg/errors/concurrent.go
function UntilErrorConcurrent (line 25) | func UntilErrorConcurrent(funcs []func() error) error {
function AggregateConcurrent (line 42) | func AggregateConcurrent(funcs []func() error) error {
FILE: pkg/errors/concurrent_test.go
function TestUntilErrorConcurrent (line 26) | func TestUntilErrorConcurrent(t *testing.T) {
function TestAggregateConcurrent (line 57) | func TestAggregateConcurrent(t *testing.T) {
FILE: pkg/errors/errors.go
function New (line 27) | func New(message string) error {
function NewWithoutStack (line 33) | func NewWithoutStack(message string) error {
function Errorf (line 40) | func Errorf(format string, args ...interface{}) error {
function Wrap (line 46) | func Wrap(err error, message string) error {
function Wrapf (line 52) | func Wrapf(err error, format string, args ...interface{}) error {
function WithStack (line 58) | func WithStack(err error) error {
type Causer (line 63) | type Causer interface
type StackTracer (line 69) | type StackTracer interface
function StackTrace (line 78) | func StackTrace(err error) pkgerrors.StackTrace {
FILE: pkg/errors/errors_test.go
function TestStackTrace (line 27) | func TestStackTrace(t *testing.T) {
FILE: pkg/exec/default.go
function Command (line 29) | func Command(command string, args ...string) Cmd {
function CommandContext (line 34) | func CommandContext(ctx context.Context, command string, args ...string)...
FILE: pkg/exec/helpers.go
function PrettyCommand (line 33) | func PrettyCommand(name string, args ...string) string {
function RunErrorForError (line 45) | func RunErrorForError(err error) *RunError {
function CombinedOutputLines (line 63) | func CombinedOutputLines(cmd Cmd) (lines []string, err error) {
function OutputLines (line 78) | func OutputLines(cmd Cmd) (lines []string, err error) {
function Output (line 90) | func Output(cmd Cmd) ([]byte, error) {
function InheritOutput (line 98) | func InheritOutput(cmd Cmd) Cmd {
function RunWithStdoutReader (line 105) | func RunWithStdoutReader(cmd Cmd, readerFunc func(io.Reader) error) error {
function RunWithStdinWriter (line 125) | func RunWithStdinWriter(cmd Cmd, writerFunc func(io.Writer) error) error {
FILE: pkg/exec/local.go
type LocalCmd (line 30) | type LocalCmd struct
method SetEnv (line 56) | func (cmd *LocalCmd) SetEnv(env ...string) Cmd {
method SetStdin (line 62) | func (cmd *LocalCmd) SetStdin(r io.Reader) Cmd {
method SetStdout (line 68) | func (cmd *LocalCmd) SetStdout(w io.Writer) Cmd {
method SetStderr (line 74) | func (cmd *LocalCmd) SetStderr(w io.Writer) Cmd {
method Run (line 81) | func (cmd *LocalCmd) Run() error {
type LocalCmder (line 37) | type LocalCmder struct
method Command (line 42) | func (c *LocalCmder) Command(name string, arg ...string) Cmd {
method CommandContext (line 49) | func (c *LocalCmder) CommandContext(ctx context.Context, name string, ...
function interfaceEqual (line 139) | func interfaceEqual(a, b interface{}) bool {
type mutexWriter (line 147) | type mutexWriter struct
method Write (line 152) | func (m *mutexWriter) Write(b []byte) (int, error) {
FILE: pkg/exec/types.go
type Cmd (line 26) | type Cmd interface
type Cmder (line 38) | type Cmder interface
type RunError (line 45) | type RunError struct
method Error (line 53) | func (e *RunError) Error() string {
method PrettyCommand (line 60) | func (e *RunError) PrettyCommand() string {
method Cause (line 65) | func (e *RunError) Cause() error {
FILE: pkg/fs/fs.go
function TempDir (line 32) | func TempDir(dir, prefix string) (name string, err error) {
function IsAbs (line 49) | func IsAbs(hostPath string) bool {
function Copy (line 56) | func Copy(src, dst string) error {
function copyWithSrcInfo (line 70) | func copyWithSrcInfo(src, dst string, info os.FileInfo) error {
function CopyFile (line 81) | func CopyFile(src, dst string) (err error) {
function copyFile (line 90) | func copyFile(src, dst string, info os.FileInfo) error {
function copySymlink (line 120) | func copySymlink(src, dst string) error {
function copyDir (line 134) | func copyDir(src, dst string, info os.FileInfo) error {
FILE: pkg/internal/apis/config/cluster_util.go
function ClusterHasIPv6 (line 21) | func ClusterHasIPv6(c *Cluster) bool {
function ClusterHasImplicitLoadBalancer (line 26) | func ClusterHasImplicitLoadBalancer(c *Cluster) bool {
FILE: pkg/internal/apis/config/cluster_util_test.go
function TestClusterHasIPv6 (line 25) | func TestClusterHasIPv6(t *testing.T) {
function TestClusterHasImplicitLoadBalancer (line 68) | func TestClusterHasImplicitLoadBalancer(t *testing.T) {
FILE: pkg/internal/apis/config/convert_v1alpha4.go
function Convertv1alpha4 (line 24) | func Convertv1alpha4(in *v1alpha4.Cluster) *Cluster {
function convertv1alpha4Node (line 50) | func convertv1alpha4Node(in *v1alpha4.Node, out *Node) {
function convertv1alpha4PatchJSON6902 (line 73) | func convertv1alpha4PatchJSON6902(in *v1alpha4.PatchJSON6902, out *Patch...
function convertv1alpha4Networking (line 80) | func convertv1alpha4Networking(in *v1alpha4.Networking, out *Networking) {
function convertv1alpha4Mount (line 91) | func convertv1alpha4Mount(in *v1alpha4.Mount, out *Mount) {
function convertv1alpha4PortMapping (line 99) | func convertv1alpha4PortMapping(in *v1alpha4.PortMapping, out *PortMappi...
FILE: pkg/internal/apis/config/default.go
function SetDefaultsCluster (line 29) | func SetDefaultsCluster(obj *Cluster) {
function SetDefaultsNode (line 96) | func SetDefaultsNode(obj *Node) {
FILE: pkg/internal/apis/config/encoding/convert.go
function V1Alpha4ToInternal (line 26) | func V1Alpha4ToInternal(cluster *v1alpha4.Cluster) *config.Cluster {
FILE: pkg/internal/apis/config/encoding/load.go
function Load (line 35) | func Load(path string) (*config.Cluster, error) {
function Parse (line 56) | func Parse(raw []byte) (*config.Cluster, error) {
type typeMeta (line 84) | type typeMeta struct
function yamlUnmarshalStrict (line 89) | func yamlUnmarshalStrict(raw []byte, v interface{}) error {
FILE: pkg/internal/apis/config/encoding/load_test.go
function TestLoadCurrent (line 23) | func TestLoadCurrent(t *testing.T) {
FILE: pkg/internal/apis/config/types.go
type Cluster (line 26) | type Cluster struct
type Node (line 77) | type Node struct
type NodeRole (line 113) | type NodeRole
constant ControlPlaneRole (line 120) | ControlPlaneRole NodeRole = "control-plane"
constant WorkerRole (line 122) | WorkerRole NodeRole = "worker"
type Networking (line 126) | type Networking struct
type ClusterIPFamily (line 158) | type ClusterIPFamily
constant IPv4Family (line 162) | IPv4Family ClusterIPFamily = "ipv4"
constant IPv6Family (line 164) | IPv6Family ClusterIPFamily = "ipv6"
constant DualStackFamily (line 166) | DualStackFamily ClusterIPFamily = "dual"
type ProxyMode (line 170) | type ProxyMode
constant IPTablesProxyMode (line 174) | IPTablesProxyMode ProxyMode = "iptables"
constant IPVSProxyMode (line 176) | IPVSProxyMode ProxyMode = "ipvs"
constant NFTablesProxyMode (line 178) | NFTablesProxyMode ProxyMode = "nftables"
constant NoneProxyMode (line 180) | NoneProxyMode ProxyMode = "none"
type PatchJSON6902 (line 185) | type PatchJSON6902 struct
type Mount (line 209) | type Mount struct
type PortMapping (line 231) | type PortMapping struct
type MountPropagation (line 251) | type MountPropagation
constant MountPropagationNone (line 256) | MountPropagationNone MountPropagation = "None"
constant MountPropagationHostToContainer (line 259) | MountPropagationHostToContainer MountPropagation = "HostToContainer"
constant MountPropagationBidirectional (line 263) | MountPropagationBidirectional MountPropagation = "Bidirectional"
type PortMappingProtocol (line 268) | type PortMappingProtocol
constant PortMappingProtocolTCP (line 272) | PortMappingProtocolTCP PortMappingProtocol = "TCP"
constant PortMappingProtocolUDP (line 274) | PortMappingProtocolUDP PortMappingProtocol = "UDP"
constant PortMappingProtocolSCTP (line 276) | PortMappingProtocolSCTP PortMappingProtocol = "SCTP"
FILE: pkg/internal/apis/config/validate.go
method Validate (line 37) | func (c *Cluster) Validate() error {
method Validate (line 106) | func (n *Node) Validate() error {
function validatePortMappings (line 144) | func validatePortMappings(portMappings []PortMapping) error {
function validatePort (line 205) | func validatePort(port int32) error {
function validateSubnets (line 214) | func validateSubnets(subnetStr string, ipFamily ClusterIPFamily) error {
function isDualStackCIDRs (line 261) | func isDualStackCIDRs(cidrs []*net.IPNet) (bool, error) {
FILE: pkg/internal/apis/config/validate_test.go
function TestClusterValidate (line 27) | func TestClusterValidate(t *testing.T) {
function newDefaultedNode (line 289) | func newDefaultedNode(role NodeRole) Node {
function TestNodeValidate (line 298) | func TestNodeValidate(t *testing.T) {
function TestPortValidate (line 432) | func TestPortValidate(t *testing.T) {
function TestValidatePortMappings (line 478) | func TestValidatePortMappings(t *testing.T) {
FILE: pkg/internal/apis/config/zz_generated.deepcopy.go
method DeepCopyInto (line 25) | func (in *Cluster) DeepCopyInto(out *Cluster) {
method DeepCopy (line 73) | func (in *Cluster) DeepCopy() *Cluster {
method DeepCopyInto (line 83) | func (in *Mount) DeepCopyInto(out *Mount) {
method DeepCopy (line 89) | func (in *Mount) DeepCopy() *Mount {
method DeepCopyInto (line 99) | func (in *Networking) DeepCopyInto(out *Networking) {
method DeepCopy (line 114) | func (in *Networking) DeepCopy() *Networking {
method DeepCopyInto (line 124) | func (in *Node) DeepCopyInto(out *Node) {
method DeepCopy (line 157) | func (in *Node) DeepCopy() *Node {
method DeepCopyInto (line 167) | func (in *PatchJSON6902) DeepCopyInto(out *PatchJSON6902) {
method DeepCopy (line 173) | func (in *PatchJSON6902) DeepCopy() *PatchJSON6902 {
method DeepCopyInto (line 183) | func (in *PortMapping) DeepCopyInto(out *PortMapping) {
method DeepCopy (line 189) | func (in *PortMapping) DeepCopy() *PortMapping {
FILE: pkg/internal/assert/assert.go
type testingDotT (line 23) | type testingDotT interface
function ExpectError (line 29) | func ExpectError(t testingDotT, expectError bool, err error) {
function BoolEqual (line 40) | func BoolEqual(t testingDotT, expected, result bool) {
function StringEqual (line 50) | func StringEqual(t testingDotT, expected, result string) {
function DeepEqual (line 60) | func DeepEqual(t testingDotT, expected, result interface{}) {
FILE: pkg/internal/assert/assert_test.go
type fakeT (line 25) | type fakeT
method Errorf (line 27) | func (t *fakeT) Errorf(format string, args ...interface{}) {
function TestExpectError (line 31) | func TestExpectError(t *testing.T) {
function TestBoolEqual (line 67) | func TestBoolEqual(t *testing.T) {
function TestStringEqual (line 87) | func TestStringEqual(t *testing.T) {
function TestDeepEqual (line 107) | func TestDeepEqual(t *testing.T) {
FILE: pkg/internal/cli/logger.go
type Logger (line 36) | type Logger struct
method SetWriter (line 58) | func (l *Logger) SetWriter(w io.Writer) {
method ColorEnabled (line 67) | func (l *Logger) ColorEnabled() bool {
method getVerbosity (line 73) | func (l *Logger) getVerbosity() log.Level {
method SetVerbosity (line 78) | func (l *Logger) SetVerbosity(verbosity log.Level) {
method write (line 83) | func (l *Logger) write(p []byte) (n int, err error) {
method writeBuffer (line 90) | func (l *Logger) writeBuffer(buf *bytes.Buffer) {
method print (line 101) | func (l *Logger) print(message string) {
method printf (line 107) | func (l *Logger) printf(format string, args ...interface{}) {
method debug (line 140) | func (l *Logger) debug(message string) {
method debugf (line 149) | func (l *Logger) debugf(format string, args ...interface{}) {
method Warn (line 158) | func (l *Logger) Warn(message string) {
method Warnf (line 163) | func (l *Logger) Warnf(format string, args ...interface{}) {
method Error (line 168) | func (l *Logger) Error(message string) {
method Errorf (line 173) | func (l *Logger) Errorf(format string, args ...interface{}) {
method V (line 178) | func (l *Logger) V(level log.Level) log.InfoLogger {
function NewLogger (line 48) | func NewLogger(writer io.Writer, verbosity log.Level) *Logger {
function addDebugHeader (line 115) | func addDebugHeader(buf *bytes.Buffer) {
type infoLogger (line 187) | type infoLogger struct
method Enabled (line 194) | func (i infoLogger) Enabled() bool {
method Info (line 199) | func (i infoLogger) Info(message string) {
method Infof (line 212) | func (i infoLogger) Infof(format string, args ...interface{}) {
type bufferPool (line 225) | type bufferPool struct
method Get (line 244) | func (b *bufferPool) Get() *bytes.Buffer {
method Put (line 249) | func (b *bufferPool) Put(x *bytes.Buffer) {
function newBufferPool (line 230) | func newBufferPool() *bufferPool {
FILE: pkg/internal/cli/override.go
function OverrideDefaultName (line 12) | func OverrideDefaultName(fs *pflag.FlagSet) {
FILE: pkg/internal/cli/spinner.go
type Spinner (line 48) | type Spinner struct
method SetPrefix (line 85) | func (s *Spinner) SetPrefix(prefix string) {
method SetSuffix (line 92) | func (s *Spinner) SetSuffix(suffix string) {
method Start (line 99) | func (s *Spinner) Start() {
method Stop (line 140) | func (s *Spinner) Stop() {
method Write (line 155) | func (s *Spinner) Write(p []byte) (n int, err error) {
function NewSpinner (line 67) | func NewSpinner(w io.Writer) *Spinner {
FILE: pkg/internal/cli/status.go
type Status (line 27) | type Status struct
method Start (line 60) | func (s *Status) Start(status string) {
method End (line 74) | func (s *Status) End(success bool) {
function StatusForLogger (line 39) | func StatusForLogger(l log.Logger) *Status {
FILE: pkg/internal/env/term.go
type isTestFakeTTY (line 30) | type isTestFakeTTY interface
function IsTerminal (line 35) | func IsTerminal(w io.Writer) bool {
function IsSmartTerminal (line 49) | func IsSmartTerminal(w io.Writer) bool {
function isSmartTerminal (line 53) | func isSmartTerminal(w io.Writer, GOOS string, lookupEnv func(string) (s...
type testFakeTTY (line 103) | type testFakeTTY struct
method Write (line 105) | func (t *testFakeTTY) Write(p []byte) (int, error) {
method isTestFakeTTY (line 109) | func (t *testFakeTTY) isTestFakeTTY() {}
FILE: pkg/internal/env/term_test.go
function TestIsTerminal (line 28) | func TestIsTerminal(t *testing.T) {
function TestIsSmartTerminal (line 55) | func TestIsSmartTerminal(t *testing.T) {
FILE: pkg/internal/integration/integration.go
type testingDotT (line 23) | type testingDotT interface
function MaybeSkip (line 30) | func MaybeSkip(t testingDotT) {
FILE: pkg/internal/patch/json6902patch.go
type json6902Patch (line 29) | type json6902Patch struct
function convertJSON6902Patches (line 35) | func convertJSON6902Patches(patchesJSON6902 []config.PatchJSON6902) ([]j...
FILE: pkg/internal/patch/kubeyaml.go
function KubeYAML (line 37) | func KubeYAML(toPatch string, patches []string, patches6902 []config.Pat...
FILE: pkg/internal/patch/kubeyaml_test.go
function TestKubeYAML (line 26) | func TestKubeYAML(t *testing.T) {
constant normalKubeadmConfig (line 78) | normalKubeadmConfig = `# config generated by kind
constant normalKubeadmConfigKustomized (line 164) | normalKubeadmConfigKustomized = `apiServer:
constant trivialPatch (line 234) | trivialPatch = `
constant normalKubeadmConfigTrivialPatched (line 249) | normalKubeadmConfigTrivialPatched = `apiServer:
constant normalKubeadmConfigTrivialPatchedAnd6902Patched (line 332) | normalKubeadmConfigTrivialPatchedAnd6902Patched = `apiServer:
FILE: pkg/internal/patch/matchinfo.go
type matchInfo (line 28) | type matchInfo struct
function parseYAMLMatchInfo (line 33) | func parseYAMLMatchInfo(raw string) (matchInfo, error) {
function matchInfoForConfigJSON6902Patch (line 41) | func matchInfoForConfigJSON6902Patch(patch config.PatchJSON6902) matchIn...
function groupVersionToAPIVersion (line 48) | func groupVersionToAPIVersion(group, version string) string {
FILE: pkg/internal/patch/mergepatch.go
type mergePatch (line 25) | type mergePatch struct
function parseMergePatches (line 31) | func parseMergePatches(rawPatches []string) ([]mergePatch, error) {
FILE: pkg/internal/patch/resource.go
type resource (line 32) | type resource struct
method apply6902Patch (line 38) | func (r *resource) apply6902Patch(patch json6902Patch) (matches bool, ...
method applyMergePatch (line 50) | func (r *resource) applyMergePatch(patch mergePatch) (matches bool, er...
method matches (line 62) | func (r resource) matches(o matchInfo) bool {
method encodeTo (line 69) | func (r *resource) encodeTo(w io.Writer) error {
function parseResources (line 80) | func parseResources(yamlDocumentStream string) ([]resource, error) {
function splitYAMLDocuments (line 104) | func splitYAMLDocuments(yamlDocumentStream string) ([]string, error) {
constant yamlSeparator (line 117) | yamlSeparator = "\n---"
function splitYAMLDocument (line 121) | func splitYAMLDocument(data []byte, atEOF bool) (advance int, token []by...
FILE: pkg/internal/patch/toml.go
function ContainerdTOML (line 33) | func ContainerdTOML(toPatch string, patches []string, patches6902 []stri...
function containerdConfigVersion (line 82) | func containerdConfigVersion(configTOML string) (int, error) {
function tomlToJSON (line 94) | func tomlToJSON(t []byte) ([]byte, error) {
function jsonToTOMLString (line 108) | func jsonToTOMLString(j []byte) (string, error) {
FILE: pkg/internal/patch/toml_test.go
function TestContainerdTOML (line 25) | func TestContainerdTOML(t *testing.T) {
FILE: pkg/internal/runtime/runtime.go
function GetDefault (line 28) | func GetDefault(logger log.Logger) cluster.ProviderOption {
FILE: pkg/internal/sets/empty.go
type Empty (line 23) | type Empty struct
FILE: pkg/internal/sets/string.go
type String (line 27) | type String
method Insert (line 49) | func (s String) Insert(items ...string) String {
method Delete (line 57) | func (s String) Delete(items ...string) String {
method Has (line 65) | func (s String) Has(item string) bool {
method HasAll (line 71) | func (s String) HasAll(items ...string) bool {
method HasAny (line 81) | func (s String) HasAny(items ...string) bool {
method Difference (line 96) | func (s String) Difference(s2 String) String {
method Union (line 112) | func (s1 String) Union(s2 String) String {
method Intersection (line 128) | func (s1 String) Intersection(s2 String) String {
method IsSuperset (line 147) | func (s1 String) IsSuperset(s2 String) bool {
method Equal (line 159) | func (s1 String) Equal(s2 String) bool {
method List (line 170) | func (s String) List() []string {
method UnsortedList (line 180) | func (s String) UnsortedList() []string {
method PopAny (line 189) | func (s String) PopAny() (string, bool) {
method Len (line 199) | func (s String) Len() int {
function NewString (line 30) | func NewString(items ...string) String {
function StringKeySet (line 38) | func StringKeySet(theMap interface{}) String {
type sortableSliceOfString (line 163) | type sortableSliceOfString
method Len (line 165) | func (s sortableSliceOfString) Len() int { return len(s) }
method Less (line 166) | func (s sortableSliceOfString) Less(i, j int) bool { return lessString...
method Swap (line 167) | func (s sortableSliceOfString) Swap(i, j int) { s[i], s[j] = s[j]...
function lessString (line 203) | func lessString(lhs, rhs string) bool {
FILE: pkg/internal/version/version.go
type Version (line 28) | type Version struct
method Major (line 125) | func (v *Version) Major() uint {
method Minor (line 130) | func (v *Version) Minor() uint {
method Patch (line 135) | func (v *Version) Patch() uint {
method BuildMetadata (line 143) | func (v *Version) BuildMetadata() string {
method PreRelease (line 148) | func (v *Version) PreRelease() string {
method Components (line 153) | func (v *Version) Components() []uint {
method WithMajor (line 158) | func (v *Version) WithMajor(major uint) *Version {
method WithMinor (line 165) | func (v *Version) WithMinor(minor uint) *Version {
method WithPatch (line 172) | func (v *Version) WithPatch(patch uint) *Version {
method WithPreRelease (line 179) | func (v *Version) WithPreRelease(preRelease string) *Version {
method WithBuildMetadata (line 187) | func (v *Version) WithBuildMetadata(buildMetadata string) *Version {
method String (line 197) | func (v *Version) String() string {
method compareInternal (line 223) | func (v *Version) compareInternal(other *Version) int {
method AtLeast (line 305) | func (v *Version) AtLeast(min *Version) bool {
method LessThan (line 312) | func (v *Version) LessThan(other *Version) bool {
method Compare (line 319) | func (v *Version) Compare(other string) (int, error) {
function parse (line 42) | func parse(str string, semver bool) (*Version, error) {
function ParseGeneric (line 93) | func ParseGeneric(str string) (*Version, error) {
function MustParseGeneric (line 98) | func MustParseGeneric(str string) *Version {
function ParseSemantic (line 111) | func ParseSemantic(str string) (*Version, error) {
function MustParseSemantic (line 116) | func MustParseSemantic(str string) *Version {
function onlyZeros (line 292) | func onlyZeros(array []uint) bool {
FILE: pkg/internal/version/version_test.go
type testItem (line 25) | type testItem struct
function testOne (line 31) | func testOne(v *Version, item, prev testItem) error {
function TestSemanticVersions (line 72) | func TestSemanticVersions(t *testing.T) {
function TestBadSemanticVersions (line 125) | func TestBadSemanticVersions(t *testing.T) {
function TestGenericVersions (line 181) | func TestGenericVersions(t *testing.T) {
function TestBadGenericVersions (line 250) | func TestBadGenericVersions(t *testing.T) {
function TestComponents (line 278) | func TestComponents(t *testing.T) {
function TestVersion_LessThan_AtLeast (line 350) | func TestVersion_LessThan_AtLeast(t *testing.T) {
FILE: pkg/log/noop.go
type NoopLogger (line 20) | type NoopLogger struct
method Warn (line 23) | func (n NoopLogger) Warn(message string) {}
method Warnf (line 26) | func (n NoopLogger) Warnf(format string, args ...interface{}) {}
method Error (line 29) | func (n NoopLogger) Error(message string) {}
method Errorf (line 32) | func (n NoopLogger) Errorf(format string, args ...interface{}) {}
method V (line 35) | func (n NoopLogger) V(level Level) InfoLogger { return NoopInfoLogger{} }
type NoopInfoLogger (line 38) | type NoopInfoLogger struct
method Enabled (line 41) | func (n NoopInfoLogger) Enabled() bool { return false }
method Info (line 44) | func (n NoopInfoLogger) Info(message string) {}
method Infof (line 47) | func (n NoopInfoLogger) Infof(format string, args ...interface{}) {}
FILE: pkg/log/types.go
type Level (line 21) | type Level
type Logger (line 25) | type Logger interface
type InfoLogger (line 54) | type InfoLogger interface
FILE: site/assets/js/inline.js
function toggleSidebar (line 2) | function toggleSidebar() {
function showSideBar (line 12) | function showSideBar() {
function hideSideBar (line 16) | function hideSideBar() {
function getWidth (line 21) | function getWidth() {
function copyText (line 67) | function copyText(elementID) {
Condensed preview — 411 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,610K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug-report.md",
"chars": 1264,
"preview": "---\nname: Bug Report\nabout: Report a bug encountered using kind\nlabels: kind/bug\n\n---\n\n<!-- Please use this template whi"
},
{
"path": ".github/ISSUE_TEMPLATE/cleanup.md",
"chars": 296,
"preview": "---\nname: Cleanup \nabout: Pay down technical debt, reduce friction, etc.\nlabels: kind/cleanup\n\n---\n\n<!-- Please use this"
},
{
"path": ".github/ISSUE_TEMPLATE/documentation.md",
"chars": 258,
"preview": "---\nname: Documentation Request\nabout: Suggest what should be documented in kind\nlabels: kind/documentation\n\n---\n<!-- Pl"
},
{
"path": ".github/ISSUE_TEMPLATE/enhancement.md",
"chars": 232,
"preview": "---\nname: Enhancement Request\nabout: Suggest an enhancement to kind\nlabels: kind/feature\n\n---\n<!-- Please only use this "
},
{
"path": ".github/ISSUE_TEMPLATE/question.md",
"chars": 245,
"preview": "---\nname: Question\nabout: Ask a question about using kind\nlabels: kind/support\n\n---\n\n<!-- Consider also checking https:/"
},
{
"path": ".github/actions/setup-env/action.yaml",
"chars": 1005,
"preview": "name: \"Setup environment\"\ndescription: \"Performs common setup operations.\"\nruns:\n using: \"composite\"\n steps:\n - nam"
},
{
"path": ".github/dependabot.yml",
"chars": 331,
"preview": "---\nversion: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"weekly"
},
{
"path": ".github/workflows/docker.yaml",
"chars": 2361,
"preview": "name: Docker\n\non:\n workflow_dispatch:\n pull_request:\n branches:\n - main\n paths-ignore:\n - 'site/**'\n\np"
},
{
"path": ".github/workflows/nerdctl.yaml",
"chars": 3611,
"preview": "name: Nerdctl\n\non:\n workflow_dispatch:\n pull_request:\n branches:\n - main\n paths-ignore:\n - 'site/**'\n\n"
},
{
"path": ".github/workflows/podman.yml",
"chars": 3554,
"preview": "name: Podman\n\non:\n workflow_dispatch:\n pull_request:\n branches:\n - main\n paths-ignore:\n - 'site/**'\n\np"
},
{
"path": ".github/workflows/vm.yaml",
"chars": 4102,
"preview": "name: VM\n\non:\n workflow_dispatch:\n pull_request:\n branches:\n - main\n paths-ignore:\n - 'site/**'\n\npermi"
},
{
"path": ".gitignore",
"chars": 218,
"preview": "# build and test outputs\n/bin/\n/_output/\n/_artifacts/\n\n# used for the code generators only\n/vendor/\n\n# macOS\n.DS_Store\n\n"
},
{
"path": ".go-version",
"chars": 7,
"preview": "1.25.7\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 1313,
"preview": "# Contributing Guidelines\n\nWelcome to Kubernetes. We are excited about the prospect of you joining our [community](https"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "Makefile",
"chars": 4832,
"preview": "# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "OWNERS",
"chars": 197,
"preview": "# See the OWNERS docs at https://go.k8s.io/owners\n\nreviewers:\n - aojea\n - BenTheElder\n - stmcginnis\napprovers:\n - ao"
},
{
"path": "README.md",
"chars": 6864,
"preview": "<p align=\"center\"><img alt=\"kind\" src=\"./logo/logo.png\" width=\"300px\" /></p>\n\n# Please see [Our Documentation](https://k"
},
{
"path": "SECURITY_CONTACTS",
"chars": 597,
"preview": "# Defined below are the security contacts for this repo.\n#\n# They are the contact point for the Product Security Team to"
},
{
"path": "cmd/kind/app/main.go",
"chars": 3163,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "cmd/kind/app/main_test.go",
"chars": 3152,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "cmd/kind/main.go",
"chars": 715,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "code-of-conduct.md",
"chars": 148,
"preview": "# Kubernetes Community Code of Conduct\n\nPlease refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/co"
},
{
"path": "go.mod",
"chars": 1046,
"preview": "module sigs.k8s.io/kind\n\n// NOTE: This is the go language version, NOT the compiler version.\n//\n// This controls the *mi"
},
{
"path": "go.sum",
"chars": 3790,
"preview": "al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=\nal.essio.dev/pkg/shellescape v1.5.1/"
},
{
"path": "hack/build/README.md",
"chars": 49,
"preview": "This directory contains tooling used for building"
},
{
"path": "hack/build/goinstalldir.sh",
"chars": 1280,
"preview": "#!/bin/sh\n# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "hack/build/gotoolchain.sh",
"chars": 840,
"preview": "#!/bin/bash\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
},
{
"path": "hack/build/init-buildx.sh",
"chars": 1751,
"preview": "#!/usr/bin/env bash\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/build/setup-go.sh",
"chars": 1757,
"preview": "#!/bin/bash\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
},
{
"path": "hack/ci/README.md",
"chars": 161,
"preview": "This directory contains glue used to test the kind repo in CI.\n\nWe don't recommend reusing anything from these scripts, "
},
{
"path": "hack/ci/build-all.sh",
"chars": 888,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/ci/cache-wrapper.sh",
"chars": 2144,
"preview": "#!/bin/bash\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
},
{
"path": "hack/ci/e2e-k8s.sh",
"chars": 10538,
"preview": "#!/bin/sh\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "hack/ci/e2e.sh",
"chars": 1505,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/ci/init-vm.sh",
"chars": 1600,
"preview": "#!/bin/bash\nset -eux -o pipefail\n# Ensure network-related modules to be loaded\nmodprobe tap ip_tables iptable_nat ip6_ta"
},
{
"path": "hack/ci/lima-helper.sh",
"chars": 818,
"preview": "#!/usr/bin/env bash\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/ci/push-latest-cli/README.md",
"chars": 280,
"preview": "This tooling is used for our automated builds.\n\nThese are meant to be consumed *only* by The Kubernetes Project's CI for"
},
{
"path": "hack/ci/push-latest-cli/cloudbuild.yaml",
"chars": 327,
"preview": "# See https://cloud.google.com/cloud-build/docs/build-config\noptions:\n substitution_option: ALLOW_LOOSE\nsteps:\n- name: "
},
{
"path": "hack/ci/push-latest-cli/push-latest-cli.sh",
"chars": 1996,
"preview": "#!/usr/bin/env bash\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/test.sh",
"chars": 2112,
"preview": "#!/usr/bin/env bash\n# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/update/README.md",
"chars": 80,
"preview": "This directory contains tools used to update dependencies, generated files, etc."
},
{
"path": "hack/make-rules/update/all.sh",
"chars": 919,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/update/deps.sh",
"chars": 1087,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/update/generated.sh",
"chars": 1602,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/update/gofmt.sh",
"chars": 915,
"preview": "#!/bin/bash\n\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
},
{
"path": "hack/make-rules/verify/README.md",
"chars": 74,
"preview": "This directory contains tools to verify the state and quality of the repo."
},
{
"path": "hack/make-rules/verify/all.sh",
"chars": 1558,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/verify/generated.sh",
"chars": 2210,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/verify/lint.sh",
"chars": 1297,
"preview": "#!/usr/bin/env bash\n# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/make-rules/verify/shellcheck.sh",
"chars": 3349,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "hack/release/build/README.md",
"chars": 78,
"preview": "This directory contains temporary tooling used to make releasing kind easier.\n"
},
{
"path": "hack/release/build/cross.sh",
"chars": 1924,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/release/build/push-node.sh",
"chars": 2901,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/release/create.sh",
"chars": 2527,
"preview": "#!/usr/bin/env bash\n# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/release/get-contributors.sh",
"chars": 1879,
"preview": "#!/usr/bin/env bash\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/release/push-node.sh",
"chars": 2673,
"preview": "#!/usr/bin/env bash\n# Copyright 2024 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Li"
},
{
"path": "hack/third_party/gimme/LICENSE",
"chars": 1090,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015-2018 gimme contributors\n\nPermission is hereby granted, free of charge, to any "
},
{
"path": "hack/third_party/gimme/README.md",
"chars": 143,
"preview": "# gimme\n\nThis is an unmodified copy of [gimme], so we don't have to download it\nfrom the internet.\n\n[gimme]: https://git"
},
{
"path": "hack/third_party/gimme/gimme",
"chars": 27812,
"preview": "#!/usr/bin/env bash\n# vim:noexpandtab:ts=2:sw=2:\n#\n#+ Usage: $(basename $0) [flags] [go-version] [version-prefix]\n#+ -"
},
{
"path": "hack/tools/.golangci.yml",
"chars": 1486,
"preview": "version: \"2\"\n\nrun:\n timeout: 3m\n\nlinters:\n default: none\n\n enable:\n - errcheck\n - govet\n - ineffassign\n -"
},
{
"path": "hack/tools/README.md",
"chars": 120,
"preview": "This directory contains a stub go module used to track version of development\ntools like the Kubernetes code generators."
},
{
"path": "hack/tools/boilerplate.go.txt",
"chars": 570,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "hack/tools/go.mod",
"chars": 11244,
"preview": "module sigs.k8s.io/kind/hack/tools\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/golangci/golangci-lint/v2 v2.11.3\n\tgotest.tools/got"
},
{
"path": "hack/tools/go.sum",
"chars": 99651,
"preview": "4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A=\n4d63.com/gocheckcompilerdirect"
},
{
"path": "hack/tools/tools.go",
"chars": 417,
"preview": "//go:build tools\n// +build tools\n\n/*\nPackage tools is used to track binary dependencies with go modules\nhttps://github.c"
},
{
"path": "images/Makefile.common.in",
"chars": 1897,
"preview": "# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/base/Dockerfile",
"chars": 11590,
"preview": "# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/base/Makefile",
"chars": 628,
"preview": "# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/base/README.md",
"chars": 1094,
"preview": "<!--TODO(bentheelder): fill this in much more thoroughly-->\n# images/base\n\nThis directory contains sources for building "
},
{
"path": "images/base/cloudbuild.yaml",
"chars": 261,
"preview": "# See https://cloud.google.com/cloud-build/docs/build-config\noptions:\n substitution_option: ALLOW_LOOSE\n machineType: "
},
{
"path": "images/base/files/LICENSES/README.txt",
"chars": 180,
"preview": "This directory contains license files and notices from binaries built for this\nimage and the dependencies of those binar"
},
{
"path": "images/base/files/etc/containerd/config.toml",
"chars": 1739,
"preview": "# explicitly use v2 config format\nversion = 2\n\n[proxy_plugins]\n# fuse-overlayfs is used for rootless\n[proxy_plugins.\"fus"
},
{
"path": "images/base/files/etc/crictl.yaml",
"chars": 56,
"preview": "runtime-endpoint: unix:///run/containerd/containerd.sock"
},
{
"path": "images/base/files/etc/default/kubelet",
"chars": 69,
"preview": "KUBELET_EXTRA_ARGS=--runtime-cgroups=/system.slice/containerd.service"
},
{
"path": "images/base/files/etc/sysctl.d/10-network-magic.conf",
"chars": 1524,
"preview": "# Do not consider loopback addresses as martian source or destination while routing\n# - Docker with custom networks uses"
},
{
"path": "images/base/files/etc/sysctl.d/10-network-security.conf",
"chars": 156,
"preview": "# Turn on Source Address Verification in all interfaces to\n# prevent some spoofing attacks.\nnet.ipv4.conf.default.rp_fil"
},
{
"path": "images/base/files/etc/systemd/system/containerd-fuse-overlayfs.service",
"chars": 299,
"preview": "[Unit]\nDescription=containerd fuse-overlayfs snapshotter\nPartOf=containerd.service\n\n[Service]\nExecStart=/usr/local/bin/c"
},
{
"path": "images/base/files/etc/systemd/system/containerd.service",
"chars": 754,
"preview": "# derived containerd systemd service file from the official:\n# https://github.com/containerd/containerd/blob/master/cont"
},
{
"path": "images/base/files/etc/systemd/system/kubelet.service",
"chars": 878,
"preview": "# slightly modified from:\n# https://github.com/kubernetes/kubernetes/blob/ba8fcafaf8c502a454acd86b728c857932555315/build"
},
{
"path": "images/base/files/etc/systemd/system/kubelet.service.d/10-kubeadm.conf",
"chars": 1014,
"preview": "# https://github.com/kubernetes/kubernetes/blob/ba8fcafaf8c502a454acd86b728c857932555315/build/debs/10-kubeadm.conf\n# No"
},
{
"path": "images/base/files/etc/systemd/system/kubelet.service.d/11-kind.conf",
"chars": 791,
"preview": "# kind specific additions go in this file\n[Service]\n# On cgroup v1, the /kubelet cgroup is created in the entrypoint scr"
},
{
"path": "images/base/files/etc/systemd/system/kubelet.slice",
"chars": 129,
"preview": "[Unit]\nDescription=slice used to run Kubernetes / Kubelet\nBefore=slices.target\n\n[Slice]\nMemoryAccounting=true\nCPUAccount"
},
{
"path": "images/base/files/etc/systemd/system/undo-mount-hacks.service",
"chars": 205,
"preview": "[Unit]\nDescription=Undo KIND mount hacks\nAfter=slices.target\nBefore=containerd.service kubelet.service\n\n[Service]\nType=o"
},
{
"path": "images/base/files/kind/README.txt",
"chars": 187,
"preview": "This directory is reserved for KIND [^1] internal purposes.\n\nModifying or depending on the contents of this directory is"
},
{
"path": "images/base/files/kind/bin/create-kubelet-cgroup-v2.sh",
"chars": 1999,
"preview": "#!/bin/bash\n\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
},
{
"path": "images/base/files/kind/bin/mount-product-files.sh",
"chars": 2455,
"preview": "#!/bin/bash\n\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
},
{
"path": "images/base/files/kind/bin/undo-mount-hacks.sh",
"chars": 858,
"preview": "#!/bin/bash\n\n# Copyright 2023 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
},
{
"path": "images/base/files/usr/local/bin/clean-install",
"chars": 1166,
"preview": "#!/bin/sh\n\n# Copyright 2017 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n"
},
{
"path": "images/base/files/usr/local/bin/entrypoint",
"chars": 24428,
"preview": "#!/bin/bash\n\n# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
},
{
"path": "images/base/scripts/target-cc",
"chars": 832,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2023 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "images/base/scripts/third_party/gimme/LICENSE",
"chars": 1090,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015-2018 gimme contributors\n\nPermission is hereby granted, free of charge, to any "
},
{
"path": "images/base/scripts/third_party/gimme/README.md",
"chars": 143,
"preview": "# gimme\n\nThis is an unmodified copy of [gimme], so we don't have to download it\nfrom the internet.\n\n[gimme]: https://git"
},
{
"path": "images/base/scripts/third_party/gimme/gimme",
"chars": 27812,
"preview": "#!/usr/bin/env bash\n# vim:noexpandtab:ts=2:sw=2:\n#\n#+ Usage: $(basename $0) [flags] [go-version] [version-prefix]\n#+ -"
},
{
"path": "images/haproxy/Dockerfile",
"chars": 2578,
"preview": "# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/haproxy/Makefile",
"chars": 39,
"preview": "include $(CURDIR)/../Makefile.common.in"
},
{
"path": "images/haproxy/README.md",
"chars": 459,
"preview": "# haproxy\n\nThis image is used internally by kind to implement kubeadm's \"HA\" mode,\nspecifically to load balance the API "
},
{
"path": "images/haproxy/cloudbuild.yaml",
"chars": 263,
"preview": "# See https://cloud.google.com/cloud-build/docs/build-config\noptions:\n substitution_option: ALLOW_LOOSE\n machineType: "
},
{
"path": "images/haproxy/haproxy.cfg",
"chars": 916,
"preview": "# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/haproxy/stage-binary-and-deps.sh",
"chars": 3720,
"preview": "#!/bin/bash\n\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
},
{
"path": "images/kindnetd/Dockerfile",
"chars": 1641,
"preview": "# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/kindnetd/LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "images/kindnetd/Makefile",
"chars": 39,
"preview": "include $(CURDIR)/../Makefile.common.in"
},
{
"path": "images/kindnetd/README.md",
"chars": 956,
"preview": "# kindnetd\n\n`kindnetd` is a simple networking daemon with the following responsibilities:\n\n- IP masquerade (of traffic l"
},
{
"path": "images/kindnetd/cloudbuild.yaml",
"chars": 265,
"preview": "# See https://cloud.google.com/cloud-build/docs/build-config\noptions:\n substitution_option: ALLOW_LOOSE\n machineType: "
},
{
"path": "images/kindnetd/cmd/kindnetd/cni.go",
"chars": 4179,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "images/kindnetd/cmd/kindnetd/main.go",
"chars": 12006,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "images/kindnetd/cmd/kindnetd/masq.go",
"chars": 3775,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "images/kindnetd/cmd/kindnetd/routes.go",
"chars": 1809,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "images/kindnetd/files/LICENSES/README.txt",
"chars": 180,
"preview": "This directory contains license files and notices from binaries built for this\nimage and the dependencies of those binar"
},
{
"path": "images/kindnetd/go.mod",
"chars": 3287,
"preview": "module sigs.k8s.io/kind/images/kindnetd\n\ngo 1.24.0\n\nrequire (\n\tgithub.com/coreos/go-iptables v0.8.0\n\tgithub.com/vishvana"
},
{
"path": "images/kindnetd/go.sum",
"chars": 22456,
"preview": "github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=\ngithub.com/armon/go-radix v1.0.0/go.mod"
},
{
"path": "images/kindnetd/scripts/third_party/gimme/LICENSE",
"chars": 1090,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015-2018 gimme contributors\n\nPermission is hereby granted, free of charge, to any "
},
{
"path": "images/kindnetd/scripts/third_party/gimme/README.md",
"chars": 143,
"preview": "# gimme\n\nThis is an unmodified copy of [gimme], so we don't have to download it\nfrom the internet.\n\n[gimme]: https://git"
},
{
"path": "images/kindnetd/scripts/third_party/gimme/gimme",
"chars": 27812,
"preview": "#!/usr/bin/env bash\n# vim:noexpandtab:ts=2:sw=2:\n#\n#+ Usage: $(basename $0) [flags] [go-version] [version-prefix]\n#+ -"
},
{
"path": "images/local-path-helper/Dockerfile",
"chars": 1899,
"preview": "# Copyright 2022 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/local-path-helper/Makefile",
"chars": 627,
"preview": "# Copyright 2022 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/local-path-helper/README.md",
"chars": 237,
"preview": "# local-path-helper\n\nThis image is the image used for the https://github.com/rancher/local-path-provisioner helper pod.\n"
},
{
"path": "images/local-path-helper/cloudbuild.yaml",
"chars": 273,
"preview": "# See https://cloud.google.com/cloud-build/docs/build-config\noptions:\n substitution_option: ALLOW_LOOSE\n machineType: "
},
{
"path": "images/local-path-helper/stage-binary-and-deps.sh",
"chars": 3720,
"preview": "#!/bin/bash\n\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
},
{
"path": "images/local-path-provisioner/Dockerfile",
"chars": 1708,
"preview": "# Copyright 2022 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/local-path-provisioner/Makefile",
"chars": 689,
"preview": "# Copyright 2022 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
},
{
"path": "images/local-path-provisioner/README.md",
"chars": 405,
"preview": "# local-path-provisioner\n\nThis image packages https://github.com/rancher/local-path-provisioner to meet\nour requirements"
},
{
"path": "images/local-path-provisioner/cloudbuild.yaml",
"chars": 278,
"preview": "# See https://cloud.google.com/cloud-build/docs/build-config\noptions:\n substitution_option: ALLOW_LOOSE\n machineType: "
},
{
"path": "images/local-path-provisioner/files/LICENSES/README.txt",
"chars": 180,
"preview": "This directory contains license files and notices from binaries built for this\nimage and the dependencies of those binar"
},
{
"path": "images/local-path-provisioner/scripts/third_party/gimme/LICENSE",
"chars": 1090,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015-2018 gimme contributors\n\nPermission is hereby granted, free of charge, to any "
},
{
"path": "images/local-path-provisioner/scripts/third_party/gimme/README.md",
"chars": 143,
"preview": "# gimme\n\nThis is an unmodified copy of [gimme], so we don't have to download it\nfrom the internet.\n\n[gimme]: https://git"
},
{
"path": "images/local-path-provisioner/scripts/third_party/gimme/gimme",
"chars": 27812,
"preview": "#!/usr/bin/env bash\n# vim:noexpandtab:ts=2:sw=2:\n#\n#+ Usage: $(basename $0) [flags] [go-version] [version-prefix]\n#+ -"
},
{
"path": "images/node/README.md",
"chars": 817,
"preview": "## images/node\n\nSee: [`pkg/build/nodeimage/build.go`][pkg/build/nodeimage/build.go] \nand [`pkg/build/nodeimage/buildcont"
},
{
"path": "logo/LICENSE",
"chars": 134,
"preview": "# The kind logo files are licensed under a choice of either Apache-2.0 or CC-BY-4.0 (Creative Commons Attribution 4.0 In"
},
{
"path": "main.go",
"chars": 714,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "netlify.toml",
"chars": 454,
"preview": "# netlify configuration\n[build]\nbase = \"site/\"\npublish = \"site/public/\"\ncommand = \"hugo\"\n\n[build.environment]\nHUGO_VERSI"
},
{
"path": "pkg/apis/config/defaults/image.go",
"chars": 848,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/apis/config/v1alpha4/default.go",
"chars": 3024,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/apis/config/v1alpha4/doc.go",
"chars": 710,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/apis/config/v1alpha4/types.go",
"chars": 14484,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/apis/config/v1alpha4/yaml.go",
"chars": 2148,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/apis/config/v1alpha4/zz_generated.deepcopy.go",
"chars": 5928,
"preview": "//go:build !ignore_autogenerated\n// +build !ignore_autogenerated\n\n/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed un"
},
{
"path": "pkg/build/nodeimage/build.go",
"chars": 4110,
"preview": "/*\nCopyright 2020 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/buildcontext.go",
"chars": 12289,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/const.go",
"chars": 918,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/const_cni.go",
"chars": 3614,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/const_storage.go",
"chars": 5727,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/containerd.go",
"chars": 1561,
"preview": "/*\nCopyright 2022 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/defaults.go",
"chars": 921,
"preview": "/*\nCopyright 2020 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/doc.go",
"chars": 664,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/helpers.go",
"chars": 1682,
"preview": "/*\nCopyright 2020 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/imageimporter.go",
"chars": 2686,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/archive.go",
"chars": 3381,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/doc.go",
"chars": 701,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/exec.go",
"chars": 2982,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/image.go",
"chars": 2940,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/image_test.go",
"chars": 4140,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/pull.go",
"chars": 1358,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/run.go",
"chars": 998,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/container/docker/save.go",
"chars": 781,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/bits.go",
"chars": 1416,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/builder.go",
"chars": 930,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/builder_docker.go",
"chars": 4013,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/builder_remote.go",
"chars": 4862,
"preview": "/*\nCopyright 2024 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/builder_tarball.go",
"chars": 2860,
"preview": "/*\nCopyright 2024 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/doc.go",
"chars": 704,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/source.go",
"chars": 3243,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/build/nodeimage/internal/kube/tar.go",
"chars": 1395,
"preview": "package kube\n\nimport (\n\t\"archive/tar\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"sigs.k8s.io/kind/pkg/log\"\n"
},
{
"path": "pkg/build/nodeimage/options.go",
"chars": 2077,
"preview": "/*\nCopyright 2020 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/constants/constants.go",
"chars": 1723,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/createoption.go",
"chars": 4260,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/doc.go",
"chars": 662,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/action.go",
"chars": 2208,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/config/config.go",
"chars": 9613,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/installcni/cni.go",
"chars": 3987,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/installstorage/storage.go",
"chars": 2793,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/kubeadminit/init.go",
"chars": 6070,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/kubeadmjoin/join.go",
"chars": 4080,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/loadbalancer/loadbalancer.go",
"chars": 3028,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/actions/waitforready/waitforready.go",
"chars": 4276,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/create/create.go",
"chars": 8411,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/delete/delete.go",
"chars": 1534,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeadm/config.go",
"chars": 17665,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeadm/const.go",
"chars": 830,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeadm/doc.go",
"chars": 659,
"preview": "/*\nCopyright 2018 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/encode.go",
"chars": 1920,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/encode_test.go",
"chars": 1621,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/helpers.go",
"chars": 1365,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/helpers_test.go",
"chars": 2113,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/lock.go",
"chars": 1303,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/merge.go",
"chars": 3163,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/merge_test.go",
"chars": 9084,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/paths.go",
"chars": 5262,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/paths_test.go",
"chars": 5951,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/read.go",
"chars": 2167,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/read_test.go",
"chars": 2664,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/remove.go",
"chars": 2636,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/remove_test.go",
"chars": 6465,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/types.go",
"chars": 3548,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/write.go",
"chars": 1256,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/internal/kubeconfig/write_test.go",
"chars": 2610,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/kubeconfig/kubeconfig.go",
"chars": 3382,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/loadbalancer/config.go",
"chars": 2321,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
},
{
"path": "pkg/cluster/internal/loadbalancer/const.go",
"chars": 818,
"preview": "/*\nCopyright 2019 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
}
]
// ... and 211 more files (download for full content)
About this extraction
This page contains the full source code of the kubernetes-sigs/kind GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 411 files (1.4 MB), approximately 480.9k tokens, and a symbol index with 916 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.