Full Code of aws/karpenter-provider-aws for AI

main dae2c1888f3a cached
982 files
14.1 MB
3.8M tokens
1596 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (14,986K chars total). Download the full file to get everything.
Repository: aws/karpenter-provider-aws
Branch: main
Commit: dae2c1888f3a
Files: 982
Total size: 14.1 MB

Directory structure:
gitextract___izru8g/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yaml
│   │   ├── documentation.yaml
│   │   └── feature.yaml
│   ├── actionlint-matcher.json
│   ├── actions/
│   │   ├── commit-status/
│   │   │   ├── end/
│   │   │   │   └── action.yaml
│   │   │   └── start/
│   │   │       └── action.yaml
│   │   ├── deploy-website/
│   │   │   └── action.yml
│   │   ├── download-artifact/
│   │   │   └── action.yaml
│   │   ├── e2e/
│   │   │   ├── cleanup/
│   │   │   │   └── action.yaml
│   │   │   ├── dump-logs/
│   │   │   │   └── action.yaml
│   │   │   ├── install-eksctl/
│   │   │   │   └── action.yaml
│   │   │   ├── install-helm/
│   │   │   │   └── action.yaml
│   │   │   ├── install-karpenter/
│   │   │   │   └── action.yaml
│   │   │   ├── install-prometheus/
│   │   │   │   ├── action.yaml
│   │   │   │   └── values.yaml
│   │   │   ├── run-tests-private-cluster/
│   │   │   │   └── action.yaml
│   │   │   ├── setup-cluster/
│   │   │   │   └── action.yaml
│   │   │   ├── slack/
│   │   │   │   ├── notify/
│   │   │   │   │   └── action.yaml
│   │   │   │   └── send-message/
│   │   │   │       └── action.yaml
│   │   │   └── upgrade-crds/
│   │   │       └── action.yaml
│   │   └── install-deps/
│   │       └── action.yaml
│   ├── dependabot.yaml
│   ├── pull-request-template.md
│   ├── security-notice.md
│   └── workflows/
│       ├── approval-comment.yaml
│       ├── ci-test.yaml
│       ├── ci.yaml
│       ├── codegen.yaml
│       ├── codeql-analysis.yaml
│       ├── dryrun-gen-pr.yaml
│       ├── dryrun-gen.yaml
│       ├── e2e-cleanup.yaml
│       ├── e2e-matrix-trigger.yaml
│       ├── e2e-matrix.yaml
│       ├── e2e-private-cluster-trigger.yaml
│       ├── e2e-scale-trigger.yaml
│       ├── e2e-soak-trigger.yaml
│       ├── e2e-upgrade.yaml
│       ├── e2e-version-compatibility-trigger.yaml
│       ├── e2e.yaml
│       ├── image-canary.yaml
│       ├── postsubmit.yaml
│       ├── release.yaml
│       ├── resolve-args.yaml
│       ├── resource-count.yaml
│       ├── snapshot-pr.yaml
│       ├── snapshot.yaml
│       ├── stale.yaml
│       ├── sweeper.yaml
│       ├── website-cleanup-preview.yaml
│       ├── website-deploy.yaml
│       ├── website-preview-trigger.yaml
│       └── website-preview.yaml
├── .gitignore
├── .gitmodules
├── .golangci.yaml
├── .ko.yaml
├── ADOPTERS.md
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── THIRD_PARTY_LICENSES
├── charts/
│   ├── index.yaml
│   ├── karpenter/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── README.md.gotmpl
│   │   ├── artifacthub-repo.yaml
│   │   ├── templates/
│   │   │   ├── _helpers.tpl
│   │   │   ├── aggregate-clusterrole.yaml
│   │   │   ├── clusterrole-core.yaml
│   │   │   ├── clusterrole.yaml
│   │   │   ├── deployment.yaml
│   │   │   ├── poddisruptionbudget.yaml
│   │   │   ├── role.yaml
│   │   │   ├── rolebinding.yaml
│   │   │   ├── service.yaml
│   │   │   ├── serviceaccount.yaml
│   │   │   └── servicemonitor.yaml
│   │   └── values.yaml
│   ├── karpenter-0.1.1.tgz
│   ├── karpenter-0.1.2.tgz
│   ├── karpenter-0.1.3.tgz
│   ├── karpenter-0.10.0.tgz
│   ├── karpenter-0.10.1.tgz
│   ├── karpenter-0.11.0.tgz
│   ├── karpenter-0.11.1.tgz
│   ├── karpenter-0.12.0.tgz
│   ├── karpenter-0.12.1.tgz
│   ├── karpenter-0.13.0.tgz
│   ├── karpenter-0.13.1.tgz
│   ├── karpenter-0.13.2.tgz
│   ├── karpenter-0.14.0-rc.0.tgz
│   ├── karpenter-0.14.0.tgz
│   ├── karpenter-0.15.0.tgz
│   ├── karpenter-0.16.0.tgz
│   ├── karpenter-0.16.1.tgz
│   ├── karpenter-0.16.2.tgz
│   ├── karpenter-0.16.3.tgz
│   ├── karpenter-0.2.0.tgz
│   ├── karpenter-0.2.1.tgz
│   ├── karpenter-0.2.2.tgz
│   ├── karpenter-0.2.3.tgz
│   ├── karpenter-0.2.4.tgz
│   ├── karpenter-0.2.5.tgz
│   ├── karpenter-0.2.6.tgz
│   ├── karpenter-0.2.7.tgz
│   ├── karpenter-0.2.8.tgz
│   ├── karpenter-0.2.9.tgz
│   ├── karpenter-0.3.0.tgz
│   ├── karpenter-0.3.1.tgz
│   ├── karpenter-0.3.2.tgz
│   ├── karpenter-0.3.3.tgz
│   ├── karpenter-0.3.4.tgz
│   ├── karpenter-0.4.0.tgz
│   ├── karpenter-0.4.1.tgz
│   ├── karpenter-0.4.2.tgz
│   ├── karpenter-0.4.3.tgz
│   ├── karpenter-0.5.0.tgz
│   ├── karpenter-0.5.1.tgz
│   ├── karpenter-0.5.2.tgz
│   ├── karpenter-0.5.3.tgz
│   ├── karpenter-0.5.4.tgz
│   ├── karpenter-0.5.5.tgz
│   ├── karpenter-0.5.6.tgz
│   ├── karpenter-0.6.0.tgz
│   ├── karpenter-0.6.1.tgz
│   ├── karpenter-0.6.2.tgz
│   ├── karpenter-0.6.3.tgz
│   ├── karpenter-0.6.4.tgz
│   ├── karpenter-0.6.5.tgz
│   ├── karpenter-0.7.0.tgz
│   ├── karpenter-0.7.1.tgz
│   ├── karpenter-0.7.2.tgz
│   ├── karpenter-0.7.3.tgz
│   ├── karpenter-0.8.0.tgz
│   ├── karpenter-0.8.1.tgz
│   ├── karpenter-0.8.2.tgz
│   ├── karpenter-0.9.0-rc.0.tgz
│   ├── karpenter-0.9.0-rc.1.tgz
│   ├── karpenter-0.9.0.tgz
│   ├── karpenter-0.9.1.tgz
│   ├── karpenter-crd/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── README.md.gotmpl
│   │   ├── artifacthub-repo.yaml
│   │   ├── templates/
│   │   │   ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│   │   │   ├── karpenter.sh_nodeclaims.yaml
│   │   │   ├── karpenter.sh_nodeoverlays.yaml
│   │   │   └── karpenter.sh_nodepools.yaml
│   │   └── values.yaml
│   └── karpenter-v0-66626bc5e21dc14b2cceaaeb3ad5933c0b4e2046.tgz
├── cmd/
│   └── controller/
│       └── main.go
├── designs/
│   ├── README.md
│   ├── ami-selector.md
│   ├── aws-launch-templates-options.md
│   ├── aws-launch-templates-v2.md
│   ├── bin-packing.md
│   ├── capacity-block-support.md
│   ├── consolidation.md
│   ├── custom-user-data-and-amis.md
│   ├── deprecated-ami-observability.md
│   ├── deprovisioning.md
│   ├── integration-testing.md
│   ├── interruption-handling.md
│   ├── limits.md
│   ├── metrics.md
│   ├── node-ownership.md
│   ├── node-upgrades.md
│   ├── odcr.md
│   ├── provisioner-priority.md
│   ├── runtime-defaulting.md
│   ├── termination.md
│   ├── unmanaged-launch-template-removal.md
│   ├── v1-api.md
│   ├── v1-roadmap.md
│   ├── v1alpha4-api.md
│   ├── v1beta1-api.md
│   └── v1beta1-full-changelist.md
├── examples/
│   ├── README.md
│   ├── v1/
│   │   ├── 100-cpu-limit.yaml
│   │   ├── al2-custom-ami.yaml
│   │   ├── al2-custom-userdata.yaml
│   │   ├── al2-kubelet-log-query.yaml
│   │   ├── al2023-custom-userdata.yaml
│   │   ├── bottlerocket.yaml
│   │   ├── br-custom-userdata.yaml
│   │   ├── custom-family-with-alias.yaml
│   │   ├── custom-family.yaml
│   │   ├── general-purpose.yaml
│   │   ├── instance-store-ephemeral-storage.yaml
│   │   ├── large-instances.yaml
│   │   ├── max-node-lifetime.yaml
│   │   ├── min-values-family.yaml
│   │   ├── min-values-multiple-keys.yaml
│   │   ├── multiple-arch.yaml
│   │   ├── multiple-ebs.yaml
│   │   ├── spot.yaml
│   │   ├── windows-2019.yaml
│   │   ├── windows-2022.yaml
│   │   ├── windows-2025.yaml
│   │   └── windows-custom-userdata.yaml
│   └── workloads/
│       ├── arm64.yaml
│       ├── disruption-budget.yaml
│       ├── gpu-amd.yaml
│       ├── gpu-nvidia.yaml
│       ├── inflate.yaml
│       ├── neuron.yaml
│       ├── prefer-arm.yaml
│       ├── spot.yaml
│       ├── spread-hostname-zone.yaml
│       ├── spread-hostname.yaml
│       └── spread-zone.yaml
├── go.mod
├── go.sum
├── hack/
│   ├── boilerplate.go.txt
│   ├── boilerplate.sh
│   ├── code/
│   │   ├── bandwidth_gen/
│   │   │   ├── example/
│   │   │   │   └── gp.html
│   │   │   └── main.go
│   │   ├── instancetype_testdata_gen/
│   │   │   └── main.go
│   │   ├── prices_gen/
│   │   │   └── main.go
│   │   └── vpc_limits_gen/
│   │       └── main.go
│   ├── codegen.sh
│   ├── docgen.sh
│   ├── docs/
│   │   ├── compatibilitymatrix_gen/
│   │   │   ├── compatibility.yaml
│   │   │   └── main.go
│   │   ├── configuration_gen/
│   │   │   └── main.go
│   │   ├── instancetypes_gen/
│   │   │   └── main.go
│   │   ├── metrics_gen/
│   │   │   └── main.go
│   │   ├── parse-redirects/
│   │   │   ├── go.mod
│   │   │   └── main.go
│   │   └── version_compatibility_gen/
│   │       └── main.go
│   ├── github/
│   │   ├── community-contributors.sh
│   │   ├── count-flakes.sh
│   │   ├── dependabot.sh
│   │   ├── feature_request_reactions.py
│   │   ├── label_issue_count.py
│   │   └── requirements.txt
│   ├── image_canary.sh
│   ├── mutation/
│   │   └── crd_annotations.sh
│   ├── release/
│   │   ├── common.sh
│   │   ├── prepare-website.sh
│   │   ├── release.sh
│   │   ├── snapshot.sh
│   │   └── stable-pr.sh
│   ├── toolchain.sh
│   ├── tools/
│   │   ├── allocatable_diff/
│   │   │   ├── README.md
│   │   │   └── main.go
│   │   └── launchtemplate_counter/
│   │       └── main.go
│   └── validation/
│       ├── kubelet.sh
│       ├── labels.sh
│       └── requirements.sh
├── kwok/
│   ├── Makefile
│   ├── README.md
│   ├── cloudprovider/
│   │   └── cloudprovider.go
│   ├── ec2/
│   │   ├── ec2.go
│   │   └── ratelimiting.go
│   ├── main.go
│   ├── manifests/
│   │   └── clusterrole.yaml
│   ├── operator/
│   │   └── operator.go
│   └── strategy/
│       └── strategy.go
├── pkg/
│   ├── apis/
│   │   ├── apis.go
│   │   ├── crds/
│   │   │   ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│   │   │   ├── karpenter.sh_nodeclaims.yaml
│   │   │   ├── karpenter.sh_nodeoverlays.yaml
│   │   │   └── karpenter.sh_nodepools.yaml
│   │   └── v1/
│   │       ├── doc.go
│   │       ├── ec2nodeclass.go
│   │       ├── ec2nodeclass_defaults.go
│   │       ├── ec2nodeclass_hash_test.go
│   │       ├── ec2nodeclass_status.go
│   │       ├── ec2nodeclass_validation_cel_test.go
│   │       ├── labels.go
│   │       ├── nodepool_validation_cel_test.go
│   │       ├── suite_test.go
│   │       └── zz_generated.deepcopy.go
│   ├── aws/
│   │   └── sdk.go
│   ├── batcher/
│   │   ├── batcher.go
│   │   ├── createfleet.go
│   │   ├── createfleet_test.go
│   │   ├── describeinstances.go
│   │   ├── describeinstances_test.go
│   │   ├── ec2api.go
│   │   ├── metrics.go
│   │   ├── suite_test.go
│   │   ├── terminateinstances.go
│   │   └── terminateinstances_test.go
│   ├── cache/
│   │   ├── cache.go
│   │   ├── suite_test.go
│   │   └── unavailableofferings.go
│   ├── cloudprovider/
│   │   ├── cloudprovider.go
│   │   ├── drift.go
│   │   ├── events/
│   │   │   └── events.go
│   │   └── suite_test.go
│   ├── controllers/
│   │   ├── capacityreservation/
│   │   │   ├── capacitytype/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   └── expiration/
│   │   │       ├── controller.go
│   │   │       └── suite_test.go
│   │   ├── controllers.go
│   │   ├── interruption/
│   │   │   ├── controller.go
│   │   │   ├── events/
│   │   │   │   └── events.go
│   │   │   ├── interruption_benchmark_test.go
│   │   │   ├── messages/
│   │   │   │   ├── capacityreservationinterruption/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── noop/
│   │   │   │   │   └── model.go
│   │   │   │   ├── rebalancerecommendation/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── scheduledchange/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── spotinterruption/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── statechange/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   └── types.go
│   │   │   ├── metrics.go
│   │   │   ├── parser.go
│   │   │   └── suite_test.go
│   │   ├── metrics/
│   │   │   ├── controller.go
│   │   │   ├── metrics.go
│   │   │   └── suite_test.go
│   │   ├── nodeclaim/
│   │   │   ├── garbagecollection/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   └── tagging/
│   │   │       ├── controller.go
│   │   │       └── suite_test.go
│   │   ├── nodeclass/
│   │   │   ├── ami.go
│   │   │   ├── ami_test.go
│   │   │   ├── capacityreservation.go
│   │   │   ├── capacityreservation_test.go
│   │   │   ├── controller.go
│   │   │   ├── events.go
│   │   │   ├── garbagecollection/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   ├── hash/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   ├── instanceprofile.go
│   │   │   ├── instanceprofile_test.go
│   │   │   ├── securitygroup.go
│   │   │   ├── securitygroup_test.go
│   │   │   ├── subnet.go
│   │   │   ├── subnet_test.go
│   │   │   ├── suite_test.go
│   │   │   ├── validation.go
│   │   │   └── validation_test.go
│   │   └── providers/
│   │       ├── instancetype/
│   │       │   ├── capacity/
│   │       │   │   ├── controller.go
│   │       │   │   └── suite_test.go
│   │       │   ├── controller.go
│   │       │   └── suite_test.go
│   │       ├── pricing/
│   │       │   ├── controller.go
│   │       │   └── suite_test.go
│   │       ├── ssm/
│   │       │   └── invalidation/
│   │       │       ├── controller.go
│   │       │       └── suite_test.go
│   │       └── version/
│   │           ├── controller.go
│   │           └── suite_test.go
│   ├── errors/
│   │   └── errors.go
│   ├── fake/
│   │   ├── atomic.go
│   │   ├── cloudprovider.go
│   │   ├── ec2api.go
│   │   ├── eksapi.go
│   │   ├── iamapi.go
│   │   ├── pricingapi.go
│   │   ├── sqsapi.go
│   │   ├── ssmapi.go
│   │   ├── types.go
│   │   ├── utils.go
│   │   └── zz_generated.describe_instance_types.go
│   ├── operator/
│   │   ├── operator.go
│   │   ├── options/
│   │   │   ├── options.go
│   │   │   ├── options_validation.go
│   │   │   └── suite_test.go
│   │   └── suite_test.go
│   ├── providers/
│   │   ├── amifamily/
│   │   │   ├── al2.go
│   │   │   ├── al2023.go
│   │   │   ├── ami.go
│   │   │   ├── bootstrap/
│   │   │   │   ├── bootstrap.go
│   │   │   │   ├── bottlerocket.go
│   │   │   │   ├── bottlerocket_test.go
│   │   │   │   ├── bottlerocketsettings.go
│   │   │   │   ├── custom.go
│   │   │   │   ├── eksbootstrap.go
│   │   │   │   ├── mime/
│   │   │   │   │   ├── mime.go
│   │   │   │   │   ├── suite_test.go
│   │   │   │   │   └── test_data/
│   │   │   │   │       ├── mime_bad_header.txt
│   │   │   │   │       ├── mime_valid.txt
│   │   │   │   │       ├── nodeconfig.txt
│   │   │   │   │       └── shell.txt
│   │   │   │   ├── nodeadm.go
│   │   │   │   └── windows.go
│   │   │   ├── bottlerocket.go
│   │   │   ├── bottlerocket_test.go
│   │   │   ├── custom.go
│   │   │   ├── resolver.go
│   │   │   ├── suite_test.go
│   │   │   ├── types.go
│   │   │   └── windows.go
│   │   ├── capacityreservation/
│   │   │   ├── provider.go
│   │   │   ├── suite_test.go
│   │   │   └── types.go
│   │   ├── instance/
│   │   │   ├── events.go
│   │   │   ├── filter/
│   │   │   │   ├── filter.go
│   │   │   │   └── filter_test.go
│   │   │   ├── instance.go
│   │   │   ├── suite_test.go
│   │   │   └── types.go
│   │   ├── instanceprofile/
│   │   │   ├── instanceprofile.go
│   │   │   └── suite_test.go
│   │   ├── instancetype/
│   │   │   ├── instancetype.go
│   │   │   ├── metrics.go
│   │   │   ├── offering/
│   │   │   │   └── offering.go
│   │   │   ├── suite_test.go
│   │   │   ├── types.go
│   │   │   ├── zz_generated.bandwidth.go
│   │   │   └── zz_generated.vpclimits.go
│   │   ├── launchtemplate/
│   │   │   ├── launchtemplate.go
│   │   │   ├── suite_test.go
│   │   │   ├── testdata/
│   │   │   │   ├── al2023_mime_userdata_input.golden
│   │   │   │   ├── al2023_mime_userdata_merged.golden
│   │   │   │   ├── al2023_shell_userdata_input.golden
│   │   │   │   ├── al2023_shell_userdata_merged.golden
│   │   │   │   ├── al2023_userdata_unmerged.golden
│   │   │   │   ├── al2023_yaml_userdata_input.golden
│   │   │   │   ├── al2023_yaml_userdata_merged.golden
│   │   │   │   ├── al2_no_mime_userdata_input.golden
│   │   │   │   ├── al2_userdata_content_type_first_input.golden
│   │   │   │   ├── al2_userdata_input.golden
│   │   │   │   ├── al2_userdata_merged.golden
│   │   │   │   ├── al2_userdata_unmerged.golden
│   │   │   │   ├── br_userdata_input.golden
│   │   │   │   ├── br_userdata_merged.golden
│   │   │   │   ├── br_userdata_unmerged.golden
│   │   │   │   ├── windows_userdata_input.golden
│   │   │   │   ├── windows_userdata_merged.golden
│   │   │   │   └── windows_userdata_unmerged.golden
│   │   │   └── types.go
│   │   ├── pricing/
│   │   │   ├── pricing.go
│   │   │   ├── zz_generated.pricing_aws.go
│   │   │   ├── zz_generated.pricing_aws_cn.go
│   │   │   └── zz_generated.pricing_aws_us_gov.go
│   │   ├── securitygroup/
│   │   │   ├── securitygroup.go
│   │   │   └── suite_test.go
│   │   ├── sqs/
│   │   │   └── sqs.go
│   │   ├── ssm/
│   │   │   ├── provider.go
│   │   │   └── types.go
│   │   ├── subnet/
│   │   │   ├── subnet.go
│   │   │   └── suite_test.go
│   │   └── version/
│   │       ├── suite_test.go
│   │       ├── version.go
│   │       └── version_test.go
│   ├── test/
│   │   ├── environment.go
│   │   ├── nodeclass.go
│   │   ├── options.go
│   │   └── utils.go
│   └── utils/
│       ├── suite_test.go
│       └── utils.go
├── test/
│   ├── README.md
│   ├── assets/
│   │   └── gha_architecture.excalidraw
│   ├── cloudformation/
│   │   ├── README.md
│   │   ├── grafana_cloudformation.yaml
│   │   ├── iam_cloudformation.yaml
│   │   ├── prometheus_cloudformation.yaml
│   │   └── timestream_cloudformation.yaml
│   ├── hack/
│   │   ├── e2e_scripts/
│   │   │   ├── clean_private_cluster.sh
│   │   │   ├── configure_private_cluster.sh
│   │   │   ├── diff_karpenter.sh
│   │   │   ├── install_helm.sh
│   │   │   ├── install_karpenter.sh
│   │   │   ├── install_prometheus.sh
│   │   │   └── noderole_bootstrap_permission.sh
│   │   ├── resource/
│   │   │   ├── clean/
│   │   │   │   └── main.go
│   │   │   ├── count/
│   │   │   │   └── main.go
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── pkg/
│   │   │       ├── metrics/
│   │   │       │   └── metrics.go
│   │   │       └── resourcetypes/
│   │   │           ├── eni.go
│   │   │           ├── instance.go
│   │   │           ├── instanceprofile.go
│   │   │           ├── launchtemplate.go
│   │   │           ├── oidc.go
│   │   │           ├── resourcetypes.go
│   │   │           ├── securitygroup.go
│   │   │           ├── stack.go
│   │   │           ├── vpc_endpoint.go
│   │   │           └── vpc_peering_connection.go
│   │   └── soak/
│   │       ├── get_clusters.go
│   │       ├── go.mod
│   │       └── go.sum
│   ├── pkg/
│   │   ├── debug/
│   │   │   ├── events.go
│   │   │   ├── monitor.go
│   │   │   ├── node.go
│   │   │   ├── nodeclaim.go
│   │   │   ├── pod.go
│   │   │   └── setup.go
│   │   └── environment/
│   │       ├── aws/
│   │       │   ├── default_ec2nodeclass.yaml
│   │       │   ├── default_nodepool.yaml
│   │       │   ├── environment.go
│   │       │   ├── expectations.go
│   │       │   ├── metrics.go
│   │       │   └── setup.go
│   │       └── common/
│   │           ├── environment.go
│   │           ├── expectations.go
│   │           ├── monitor.go
│   │           └── setup.go
│   └── suites/
│       ├── ami/
│       │   ├── suite_test.go
│       │   └── testdata/
│       │       ├── al2023_userdata_input.yaml
│       │       ├── al2_no_mime_userdata_input.sh
│       │       ├── al2_userdata_input.sh
│       │       ├── br_userdata_input.sh
│       │       └── windows_userdata_input.ps1
│       ├── consolidation/
│       │   ├── suite_test.go
│       │   └── testdata/
│       │       └── hugepage_userdata_input.sh
│       ├── drift/
│       │   └── suite_test.go
│       ├── integration/
│       │   ├── aws_metadata_test.go
│       │   ├── block_device_mappings_test.go
│       │   ├── cni_test.go
│       │   ├── extended_resources_test.go
│       │   ├── hash_test.go
│       │   ├── instance_profile_test.go
│       │   ├── kubelet_config_test.go
│       │   ├── launch_template_test.go
│       │   ├── metrics_test.go
│       │   ├── network_interface_test.go
│       │   ├── nodeclass_test.go
│       │   ├── repair_policy_test.go
│       │   ├── security_group_test.go
│       │   ├── subnet_test.go
│       │   ├── suite_test.go
│       │   ├── tags_test.go
│       │   ├── testdata/
│       │   │   └── amd_driver_input.sh
│       │   └── validation_test.go
│       ├── interruption/
│       │   └── suite_test.go
│       ├── ipv6/
│       │   └── suite_test.go
│       ├── localzone/
│       │   └── suite_test.go
│       ├── nodeclaim/
│       │   └── suite_test.go
│       ├── scale/
│       │   ├── deprovisioning_test.go
│       │   ├── provisioning_test.go
│       │   └── suite_test.go
│       ├── scheduling/
│       │   ├── suite_test.go
│       │   └── testdata/
│       │       └── hugepage_userdata_input.sh
│       └── storage/
│           └── suite_test.go
├── tools/
│   └── kompat/
│       ├── README.md
│       ├── cmd/
│       │   └── kompat/
│       │       └── main.go
│       ├── go.mod
│       ├── go.sum
│       └── pkg/
│           └── kompat/
│               └── kompat.go
└── website/
    ├── .gitignore
    ├── .node-version
    ├── README.md
    ├── archetypes/
    │   └── default.md
    ├── assets/
    │   ├── js/
    │   │   └── search.js
    │   ├── jsconfig.json
    │   └── scss/
    │       ├── _search.scss
    │       └── _variables_project.scss
    ├── content/
    │   └── en/
    │       ├── _index.html
    │       ├── docs/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       ├── preview/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       ├── v1.0/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   └── managing-amis.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       ├── get-controller-policy.sh
    │       │       ├── upgrade-guide.md
    │       │       ├── v1-migration.md
    │       │       ├── v1beta1-controller-policy.json
    │       │       └── v1beta1-migration.md
    │       ├── v1.7/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       ├── v1.8/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       └── v1.9/
    │           ├── _index.md
    │           ├── concepts/
    │           │   ├── _index.md
    │           │   ├── disruption.md
    │           │   ├── nodeclaims.md
    │           │   ├── nodeclasses.md
    │           │   ├── nodeoverlays.md
    │           │   ├── nodepools.md
    │           │   └── scheduling.md
    │           ├── contributing/
    │           │   ├── _index.md
    │           │   ├── community-meetings.md
    │           │   ├── design-guide.md
    │           │   ├── development-guide.md
    │           │   └── documentation-updates.md
    │           ├── faq.md
    │           ├── getting-started/
    │           │   ├── _index.md
    │           │   ├── getting-started-with-karpenter/
    │           │   │   ├── _index.md
    │           │   │   ├── cloudformation.yaml
    │           │   │   ├── grafana-values.yaml
    │           │   │   ├── karpenter-capacity-dashboard.json
    │           │   │   ├── karpenter-controllers-allocation.json
    │           │   │   ├── karpenter-controllers.json
    │           │   │   ├── karpenter-performance-dashboard.json
    │           │   │   ├── prometheus-values.yaml
    │           │   │   └── scripts/
    │           │   │       ├── step01-config.sh
    │           │   │       ├── step02-create-cluster-fargate.sh
    │           │   │       ├── step02-create-cluster.sh
    │           │   │       ├── step03-iam-cloud-formation.sh
    │           │   │       ├── step04-grant-access.sh
    │           │   │       ├── step05-controller-iam.sh
    │           │   │       ├── step06-add-spot-role.sh
    │           │   │       ├── step08-apply-helm-chart-fargate.sh
    │           │   │       ├── step08-apply-helm-chart.sh
    │           │   │       ├── step09-add-prometheus-grafana.sh
    │           │   │       ├── step10-add-grafana-port-forward.sh
    │           │   │       ├── step11-grafana-get-password.sh
    │           │   │       ├── step12-add-nodepool.sh
    │           │   │       ├── step13-automatic-node-provisioning.sh
    │           │   │       ├── step14-deprovisioning.sh
    │           │   │       ├── step15-apply-flowschemas.sh
    │           │   │       ├── step16-delete-node.sh
    │           │   │       └── step17-cleanup.sh
    │           │   └── migrating-from-cas/
    │           │       ├── _index.md
    │           │       └── scripts/
    │           │           ├── step01-env.sh
    │           │           ├── step02-node-iam.sh
    │           │           ├── step03-node-policies.sh
    │           │           ├── step04-controller-iam.sh
    │           │           ├── step05-tag-subnets.sh
    │           │           ├── step06-tag-security-groups.sh
    │           │           ├── step07-edit-aws-auth.sh
    │           │           ├── step08-generate-chart.sh
    │           │           ├── step09-deploy.sh
    │           │           ├── step10-create-nodepool.sh
    │           │           ├── step11-scale-cas.sh
    │           │           ├── step12-scale-multiple-ng.sh
    │           │           └── step12-scale-single-ng.sh
    │           ├── reference/
    │           │   ├── _index.md
    │           │   ├── cloudformation.md
    │           │   ├── instance-types.md
    │           │   ├── metrics.md
    │           │   ├── settings.md
    │           │   └── threat-model.md
    │           ├── tasks/
    │           │   ├── _index.md
    │           │   ├── managing-amis.md
    │           │   └── odcrs.md
    │           ├── troubleshooting.md
    │           └── upgrading/
    │               ├── _index.md
    │               ├── compatibility.md
    │               └── upgrade-guide.md
    ├── go.mod
    ├── go.sum
    ├── hugo.yaml
    ├── layouts/
    │   ├── 404.html
    │   ├── partials/
    │   │   ├── favicons.html
    │   │   ├── footer.html
    │   │   └── navbar-version-selector.html
    │   ├── robots.txt
    │   └── shortcodes/
    │       ├── blocks/
    │       │   └── feature.html
    │       ├── github.html
    │       ├── githubRelRef.html
    │       └── script.html
    ├── netlify.toml
    ├── package.json
    └── static/
        ├── _redirects
        └── favicons/
            └── browserconfig.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug.yaml
================================================
name: Bug
description: Report a bug
labels:
- bug
- needs-triage
body:
- type: markdown
  attributes:
    value: |
      > [!IMPORTANT]
      > If your issue is not specific to AWS, please cut a ticket in [kubernetes-sigs/karpenter](https://github.com/kubernetes-sigs/karpenter/issues/new/choose).
- type: textarea
  attributes:
    label: Description
    value: |
      **Observed Behavior**:

      **Expected Behavior**:

      **Reproduction Steps** (Please include YAML):

      **Versions**:
      - Chart Version:
      - Kubernetes Version (`kubectl version`):

      * Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request
      * Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
      * If you are interested in working on this issue or have submitted a pull request, please leave a comment


================================================
FILE: .github/ISSUE_TEMPLATE/documentation.yaml
================================================
name: Documentation
description: How the docs be improved?
labels:
- documentation
- needs-triage
body:
- type: textarea
  attributes:
    label: Description
    value: |
      **How can the docs be improved?**

      * Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request
      * Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
      * If you are interested in working on this issue or have submitted a pull request, please leave a comment


================================================
FILE: .github/ISSUE_TEMPLATE/feature.yaml
================================================
name: Feature
description: Suggest an idea for a new feature
labels:
- feature
- needs-triage
body:
- type: markdown
  attributes:
    value: |
      > [!IMPORTANT]
      > If your issue is not specific to AWS, please cut a ticket in [kubernetes-sigs/karpenter](https://github.com/kubernetes-sigs/karpenter/issues/new/choose).
- type: textarea
  attributes:
    label: Description
    value: |
      **What problem are you trying to solve?**

      **How important is this feature to you?**

      * Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request
      * Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
      * If you are interested in working on this issue or have submitted a pull request, please leave a comment


================================================
FILE: .github/actionlint-matcher.json
================================================
{
  "problemMatcher": [
    {
      "owner": "actionlint",
      "pattern": [
        {
          "regexp": "^(?:\\x1b\\[\\d+m)?(.+?)(?:\\x1b\\[\\d+m)*:(?:\\x1b\\[\\d+m)*(\\d+)(?:\\x1b\\[\\d+m)*:(?:\\x1b\\[\\d+m)*(\\d+)(?:\\x1b\\[\\d+m)*: (?:\\x1b\\[\\d+m)*(.+?)(?:\\x1b\\[\\d+m)* \\[(.+?)\\]$",
          "file": 1,
          "line": 2,
          "column": 3,
          "message": 4,
          "code": 5
        }
      ]
    }
  ]
}

================================================
FILE: .github/actions/commit-status/end/action.yaml
================================================
name: CommitStatusEnd
description: 'Adds a commit status at the end of the test run based on success, failure, or cancelled'
inputs:
  name:
    description: "Name of the check"
    required: true
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
    required: true
runs:
  using: "composite"
  steps:
    - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
      if: job.status == 'success'
      env:
        NAME: ${{ inputs.name }}
        SHA: ${{ inputs.git_ref }}
        REPO: ${{ github.repository }}
        RUN_ID: ${{ github.run_id }}
      with:
        script: |
          github.rest.repos.createCommitStatus({
            owner: context.repo.owner,
            repo: context.repo.repo,
            context: process.env.NAME,
            sha: process.env.SHA,
            state: "success",
            target_url: `https://github.com/${process.env.REPO}/actions/runs/${process.env.RUN_ID}`,
          });
    - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
      if: job.status == 'failure' || job.status == 'cancelled'
      env:
        NAME: ${{ inputs.name }}
        SHA: ${{ inputs.git_ref }}
        REPO: ${{ github.repository }}
        RUN_ID: ${{ github.run_id }}
      with:
        script: |
          github.rest.repos.createCommitStatus({
            owner: context.repo.owner,
            repo: context.repo.repo,
            context: process.env.NAME,
            sha: process.env.SHA,
            state: "failure",
            target_url: `https://github.com/${process.env.REPO}/actions/runs/${process.env.RUN_ID}`,
          });


================================================
FILE: .github/actions/commit-status/start/action.yaml
================================================
name: CommitStatusStart
description: 'Adds a commit status at the start of the test run to set the status to pending'
inputs:
  name:
    description: "Name of the check"
    required: true
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
    required: true
runs:
  using: "composite"
  steps:
    - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
      if: always()
      env:
        NAME: ${{ inputs.name }}
        SHA: ${{ inputs.git_ref }}
        REPO: ${{ github.repository }}
        RUN_ID: ${{ github.run_id }}
      with:
        script: |
          github.rest.repos.createCommitStatus({
            owner: context.repo.owner,
            repo: context.repo.repo,
            context: process.env.NAME,
            sha: process.env.SHA,
            state: "pending",
            target_url: `https://github.com/${process.env.REPO}/actions/runs/${process.env.RUN_ID}`,
          });


================================================
FILE: .github/actions/deploy-website/action.yml
================================================
name: 'Deploy Website to Amplify'
description: 'Build Hugo site and deploy to AWS Amplify'
inputs:
  role:
    description: 'AWS IAM role ARN to assume'
    required: true
  region:
    description: 'AWS region for Amplify'
    required: true
  amplify-app-id:
    description: 'AWS Amplify App ID'
    required: true
  amplify-branch-name:
    description: 'AWS Amplify branch name'
    required: true
  s3-bucket:
    description: 'S3 bucket for website files'
    required: true
  s3-prefix:
    description: 'S3 prefix/path for website files'
    required: false
    default: ''
  hugo-base-url:
    description: 'Base URL for Hugo build'
    required: false
    default: ''
runs:
  using: 'composite'
  steps:
    - name: Install Go
      uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
      with:
        go-version-file: hack/docs/parse-redirects/go.mod
        check-latest: true
    - name: Install Hugo
      uses: peaceiris/actions-hugo@16361eb4acea8698b220b76c0d4e84e1fd22c61d # v2.6.0
      with:
        hugo-version: '0.120.3'
        extended: true
    - name: Build Hugo site (preview)
      working-directory: website
      shell: bash
      env:
        HUGO_ENV: production
        HUGO_ENABLEGITINFO: true
        TZ: America/Los_Angeles
        HUGO_CACHEDIR: ${{ github.workspace }}/.hugo
        NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm
      if: github.event_name == 'workflow_run'
      run: |
        npm ci --prefer-offline
        hugo --gc --minify --buildFuture -b "${{ inputs.hugo-base-url }}"
    - name: Build Hugo site (production) 
      working-directory: website
      shell: bash
      env:
        HUGO_ENV: production
        HUGO_ENABLEGITINFO: true
        TZ: America/Los_Angeles
        HUGO_CACHEDIR: ${{ github.workspace }}/.hugo
        NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm
      if: github.event_name == 'push'
      run: |
        npm ci --prefer-offline
        hugo --gc --minify
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@b47578312673ae6fa5b5096b330d9fbac3d116df # v4.2.1
      with:
        role-to-assume: ${{ inputs.role }}
        aws-region: ${{ inputs.region }}
    - name: Upload to S3
      shell: bash
      run: |
        S3_PATH="s3://${{ inputs.s3-bucket }}/${{ inputs.s3-prefix }}"
        aws s3 sync website/public/ "$S3_PATH" --delete
    - name: Create Amplify branch (if preview and doesn't exist)
      shell: bash
      if: github.event_name == 'workflow_run'
      run: |
        if ! aws amplify get-branch --app-id ${{ inputs.amplify-app-id }} --branch-name "${{ inputs.amplify-branch-name }}" 2>/dev/null; then
          aws amplify create-branch \
            --app-id ${{ inputs.amplify-app-id }} \
            --branch-name "${{ inputs.amplify-branch-name }}"
        fi
    - name: Configure redirects
      shell: bash
      run: |
        REDIRECT_RULES=$(go run hack/docs/parse-redirects/main.go)
        aws amplify update-app \
          --app-id ${{ inputs.amplify-app-id }} \
          --custom-rules "$REDIRECT_RULES"
    - name: Deploy to Amplify
      shell: bash
      run: |
        SOURCE_URL="s3://${{ inputs.s3-bucket }}/${{ inputs.s3-prefix }}"
        aws amplify start-deployment \
          --app-id ${{ inputs.amplify-app-id }} \
          --branch-name "${{ inputs.amplify-branch-name }}" \
          --source-url "$SOURCE_URL" \
          --source-url-type BUCKET_PREFIX


================================================
FILE: .github/actions/download-artifact/action.yaml
================================================
name: DownloadArtifacts
description: 'Downloads and unarchives artifacts for a workflow that runs on workflow_run so that it can use its data'
runs:
  using: "composite"
  steps:
    - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
      with:
        script: |
          let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
             owner: context.repo.owner,
             repo: context.repo.repo,
             run_id: context.payload.workflow_run.id,
          });
          let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
            return artifact.name == "artifacts"
          })[0];
          let download = await github.rest.actions.downloadArtifact({
             owner: context.repo.owner,
             repo: context.repo.repo,
             artifact_id: matchArtifact.id,
             archive_format: 'zip',
          });
          let fs = require('fs');
          fs.writeFileSync(`/tmp/artifacts.zip`, Buffer.from(download.data));
    - run: |
        mkdir -p /tmp/artifacts
        unzip /tmp/artifacts.zip -d /tmp/artifacts
      shell: bash
    - run: |
        echo "Downloaded artifacts:"
        ls -ablh /tmp/artifacts
      shell: bash


================================================
FILE: .github/actions/e2e/cleanup/action.yaml
================================================
name: Cleanup
description: 'Runs all the cleanup tasks to cleanup resources deployed during E2E'
inputs:
  account_id:
    description: "Account ID to access AWS"
    required: true
  role:
    description: "Role to access AWS"
    required: true
  region:
    description: "Region to access AWS"
    required: true
  cluster_name:
    description: 'Name of the cluster to be launched by eksctl'
    required: true
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
  eksctl_version:
    description: "Version of eksctl to install"
    default: v0.202.0
  private_cluster:
    description: "Whether the cluster that has to be deleted is private or not. Valid values are 'true' or 'false'"
    default: 'false'
runs:
  using: "composite"
  steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      with:
        ref: ${{ inputs.git_ref }}
    - uses: ./.github/actions/e2e/install-eksctl
      with:
        version: ${{ inputs.eksctl_version }}
    - name: delete-cluster
      if: ${{ inputs.private_cluster == 'false' }}
      shell: bash
      env:
        CLUSTER_NAME: ${{ inputs.cluster_name }}
      run: |
        eksctl delete cluster --name "$CLUSTER_NAME" --timeout 60m --wait || true
    - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
      with:
        go-version-file: test/hack/resource/go.mod
        cache-dependency-path: test/hack/resource/go.sum
        check-latest: true
        cache: false
    - name: "Run cleanup script"
      shell: bash
      env:
        CLUSTER_NAME: ${{ inputs.cluster_name }}
      run: |
        go run main.go --cluster-name "$CLUSTER_NAME"
      working-directory: ./test/hack/resource/clean


================================================
FILE: .github/actions/e2e/dump-logs/action.yaml
================================================
name: DumpLogs
description: 'Dump logs and debug information from the cluster after a test run'
inputs:
  account_id:
    description: "Account ID to access AWS"
    required: true
  role:
    description: "Role to access AWS"
    required: true
  region:
    description: "Region to access AWS"
    required: true
  cluster_name:
    description: 'Name of the cluster to be launched by eksctl'
    required: true
runs:
  using: "composite"
  steps:
    - name: configure aws credentials
      uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
      with:
        role-to-assume: arn:aws:iam::${{ inputs.account_id }}:role/${{ inputs.role }}
        aws-region: ${{ inputs.region }}
        role-duration-seconds: 21600
    - name: update cluster context
      shell: bash
      env:
        CLUSTER_NAME: ${{ inputs.cluster_name }}
      run: |
        aws eks update-kubeconfig --name "$CLUSTER_NAME"
    - name: controller-logs
      shell: bash
      run: |
        kubectl logs -n kube-system -l app.kubernetes.io/name=karpenter --all-containers --ignore-errors
    - name: describe karpenter pods
      shell: bash
      run: |
        kubectl describe pods -n kube-system -l app.kubernetes.io/name=karpenter
    - name: describe nodes
      shell: bash
      run: |
        kubectl describe nodes


================================================
FILE: .github/actions/e2e/install-eksctl/action.yaml
================================================
name: InstallEKSCTL
description: 'Installs eksctl'
inputs:
  version:
    description: "Version of EKSCTL to use for the launched cluster"
    required: true
runs:
  using: "composite"
  steps:
    - shell: bash
      env:
        VERSION: ${{ inputs.version }}
      run: |
        # for ARM systems, set ARCH to: `arm64`, `armv6` or `armv7`
        ARCH=amd64
        PLATFORM=$(uname -s)_$ARCH
        curl -sLO "https://github.com/weaveworks/eksctl/releases/download/$VERSION/eksctl_$PLATFORM.tar.gz"

        # (Optional) Verify checksum
        curl -sL "https://github.com/weaveworks/eksctl/releases/download/$VERSION/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check
        tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz
        sudo mv /tmp/eksctl /usr/local/bin


================================================
FILE: .github/actions/e2e/install-helm/action.yaml
================================================
name: InstallHelm
description: 'Installs helm'
inputs:
  version:
    description: "Version of Helm to install"
    required: true
runs:
  using: "composite"
  steps:
    - name: install helm
      shell: bash
      env:
        HELM_VERSION: ${{ inputs.version }}
      run: |
        ./test/hack/e2e_scripts/install_helm.sh
    - name: install helm-diff
      shell: bash
      run: |
        helm plugin install https://github.com/databus23/helm-diff || true

================================================
FILE: .github/actions/e2e/install-karpenter/action.yaml
================================================
name: InstallKarpenter
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
  account_id:
    description: "Account ID to access AWS"
    required: true
  role:
    description: "Role to access AWS"
    required: true
  region:
    description: "Region to access AWS"
    required: true
  ecr_account_id:
    description: "Account ID for the ECR repo"
    required: true
  ecr_region:
    description: "Region for the ECR repo"
    required: true
  cluster_name:
    description: 'Name of the cluster to be launched by eksctl'
    required: true
  k8s_version:
    description: 'Version of Kubernetes to use for the launched cluster'
    default: "1.35"
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
  private_cluster:
    description: "Whether the cluster is private or not. Valid values are 'true' or 'false'"
    default: 'false'
runs:
  using: "composite"
  steps:
  - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
    with:
      ref: ${{ inputs.git_ref }}
  - uses: ./.github/actions/e2e/install-helm
    with:
      version: v3.18.6
  # Label namespace to enforce security stranded and scrape prometheus metrics
  # https://kubernetes.io/docs/concepts/security/pod-security-standards/
  - name: add labels to kube-system namespace
    shell: bash
    run: |
      kubectl label ns kube-system scrape=enabled --overwrite=true
      kubectl label ns kube-system pod-security.kubernetes.io/warn=restricted --overwrite=true
  - name: login to ecr via docker
    uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
    with:
      registry: ${{ inputs.ecr_account_id }}.dkr.ecr.${{ inputs.ecr_region }}.amazonaws.com
      logout: true
  - name: install-karpenter
    shell: bash
    env:
      ECR_ACCOUNT_ID: ${{ inputs.ecr_account_id }}
      ECR_REGION: ${{ inputs.ecr_region }}
      ACCOUNT_ID: ${{ inputs.account_id }}
      CLUSTER_NAME: ${{ inputs.cluster_name }}
      PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
    run: |
      output=$(./test/hack/e2e_scripts/install_karpenter.sh 2>&1)
      if echo "$output" | grep -i "warning.*violate.*podsecurity"; then
        echo "ERROR: Karpenter does not respect restricted Pod Security Standard"
        exit 1
      fi
  - name: diff-karpenter
    shell: bash
    env:
      ECR_ACCOUNT_ID: ${{ inputs.ecr_account_id }}
      ECR_REGION: ${{ inputs.ecr_region }}
    run: |
      ./test/hack/e2e_scripts/diff_karpenter.sh


================================================
FILE: .github/actions/e2e/install-prometheus/action.yaml
================================================
name: InstallPrometheus
description: 'Installs prometheus'
inputs:
  account_id:
    description: "Account ID to access AWS"
    required: true
  role:
    description: "Role to access AWS"
    required: true
  region:
    description: "Region to access AWS"
    required: true
  prometheus_region:
    description: "Prometheus region"
    required: true
  cluster_name:
    description: 'Name of the cluster to be launched by eksctl'
    required: true
  workspace_id:
    description: "Id of the prometheus remote_write workspace"
    required: true
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
  private_cluster:
    description: "Whether the cluster is private or not. Valid values are 'true' or 'false'"
    default: 'false'
runs:
  using: "composite"
  steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      with:
        ref: ${{ inputs.git_ref }}
    - uses: ./.github/actions/e2e/install-helm
      with:
        version: v3.18.6
    - name: add prometheus repo
      shell: bash
      run: |
        helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    - name: create prometheus namespace
      shell: bash
      run: |
        kubectl create ns prometheus || true
        kubectl label ns prometheus scrape=enabled --overwrite=true
    - name: install prometheus
      shell: bash
      env:
        PROMETHEUS_REGION: ${{ inputs.prometheus_region }}
        REGION: ${{ inputs.region }}
        WORKSPACE_ID: ${{ inputs.workspace_id }}
        ACCOUNT_ID: ${{ inputs.account_id }}
        CLUSTER_NAME: ${{ inputs.cluster_name }}
        PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
      run: |
        ./test/hack/e2e_scripts/install_prometheus.sh


================================================
FILE: .github/actions/e2e/install-prometheus/values.yaml
================================================
prometheusOperator:
  tolerations:
    - key: CriticalAddonsOnly
      operator: Exists
  admissionWebhooks:
    patch:
      tolerations:
        - key: CriticalAddonsOnly
          operator: Exists
prometheus-node-exporter:
  tolerations:
    - key: CriticalAddonsOnly
      operator: Exists
nodeExporter:
  enabled: false
kube-state-metrics:
  tolerations:
    - key: CriticalAddonsOnly
      operator: Exists
grafana:
  tolerations:
    - key: CriticalAddonsOnly
      operator: Exists
alertmanager:
  alertmanagerSpec:
    tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
kubelet:
  serviceMonitor:
    # Enable CAdvisor metrics (this is enabled by default but explicitly specified for clarity)
    # https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml#L41
    cAdvisor: true
    # Disable probes scrape endpoint
    # https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml#L68
    probes: false
    # Disable resource scrape endpoint
    # https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml#L95
    resource: false
    additionalLabels:
      scrape: enabled
prometheus:
  prometheusSpec:
    tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
    resources:
      requests:
        cpu: 1
        memory: 15Gi
      limits:
        cpu: 1
        memory: 15Gi
    serviceMonitorSelector:
      matchLabels:
        scrape: enabled
    serviceMonitorNamespaceSelector:
      matchLabels:
        scrape: enabled
    remoteWrite:
      - queueConfig:
          maxSamplesPerSend: 1000
          maxShards: 200
          capacity: 2500

================================================
FILE: .github/actions/e2e/run-tests-private-cluster/action.yaml
================================================
name: RunTestsPrivateCluster
description: 'Installs Karpenter, Prometheus, runs tests on private cluster and performs clean up'
inputs:
  account_id:
    description: "Account ID to access AWS"
    required: true
  suite:
    description: "Test suite to run"
    required: true
  ecr_account_id:
    description: "Account ID to access ECR Repository"
    required: true
  prometheus_workspace_id:
    description: "Workspace ID for the Prometheus workspace"
    required: true
  metrics_region:
    description: "Metrics region"
    required: true
  node_role:
    description: "Private cluster node role"
    required: true
  region:
    description: "Region to access AWS"
    required: true
  ecr_region:
    description: "Region to access ECR Repository"
    required: true
  prometheus_region:
    description: Region to access Prometheus
    required: true
  cluster_name:
    description: 'Name of the cluster to be launched by eksctl'
    required: true
  k8s_version:
    description: 'Version of Kubernetes to use for the launched cluster'
    default: "1.35"
  private_cluster:
    description: "Whether to create a private cluster which does not add access to the public internet. Valid values are 'true' or 'false'"
    default: 'false'
  enable_metrics:
    description: "Whether to enable metrics for the cluster"
    default: 'false'
  codebuild_sg:
    description: "Codebuild security group to run private cluster tests"
    required: true
  codebuild_vpc:
    description: "Codebuild VPC to run private cluster tests"
    required: true
  cleanup:
    description: "Whether to cleanup resources on failure"
    default: 'false'
runs:
  using: "composite"
  steps:
  - name: login to ecr via docker
    uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
    with:
      registry: ${{ inputs.account_id }}.dkr.ecr.${{ inputs.region }}.amazonaws.com
      logout: true
  - name: configure private cluster
    if: ${{ inputs.private_cluster }}
    shell: bash
    env:
      REGION: ${{ inputs.region }}
      CLUSTER_NAME: ${{ inputs.cluster_name }}
      ACCOUNT_ID: ${{ inputs.account_id }}
      REPOSITORY: ${{ github.repository }}
      RUN_ID: ${{ github.run_id }}
      CODEBUILD_SG: ${{ inputs.codebuild_sg }}
      CODEBUILD_VPC: ${{ inputs.codebuild_vpc }}
    run: |
      ./test/hack/e2e_scripts/configure_private_cluster.sh
  - name: run private cluster tests on codebuild
    env:
      SUITE: ${{ inputs.suite }}
      CLUSTER_NAME: ${{ inputs.cluster_name }}
      INTERRUPTION_QUEUE: ${{ inputs.cluster_name }}
      REGION: ${{ inputs.region }}
      HELM_VERSION: v3.12.3 # Pinned to this version since v3.13.0 has issues with anonymous pulls: https://github.com/helm/helm/issues/12423
      PROMETHEUS_REGION: ${{ inputs.prometheus_region }}
      WORKSPACE_ID: ${{ inputs.prometheus_workspace_id }}
      ACCOUNT_ID: ${{ inputs.account_id }}
      K8S_VERSION: ${{ inputs.k8s_version }}
      ECR_ACCOUNT_ID: ${{ inputs.ecr_account_id }}
      ECR_REGION: ${{ inputs.ecr_region }}
      PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
      ENABLE_METRICS: ${{ inputs.enable_metrics }}
      METRICS_REGION: ${{ inputs.metrics_region }}
      VPC_PEERING_CONNECTION_ID: ${{ env.VPC_PEERING_CONNECTION_ID }}
      NODE_ROLE: ${{ env.NODE_ROLE }}
      SG_CB: ${{ inputs.codebuild_sg }}
      VPC_CB: ${{ inputs.codebuild_vpc }}
      CLUSTER_VPC_ID: ${{ env.CLUSTER_VPC_ID }}
      EKS_CLUSTER_SG: ${{ env.EKS_CLUSTER_SG }}
      CLEANUP: ${{ inputs.cleanup }}
    uses: aws-actions/aws-codebuild-run-build@4d15a47425739ac2296ba5e7eee3bdd4bfbdd767 # v1.0.18
    with:
      project-name: E2EPrivateClusterCodeBuildProject-us-east-1
      buildspec-override: |
        version: 0.2
        phases:
          install:
            commands:
              # Make sure goenv is up to date
              - cd $HOME/.goenv && git pull --ff-only && cd -
              # Install Go 1.22
              - goenv install 1.22 && goenv global 1.22
          build:
            commands:
              - aws eks update-kubeconfig --name $CLUSTER_NAME
              - ./test/hack/e2e_scripts/noderole_bootstrap_permission.sh
              - ./test/hack/e2e_scripts/install_helm.sh
              - helm plugin install https://github.com/databus23/helm-diff || true
              - aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
              - helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
              - helm pull prometheus-community/kube-prometheus-stack
              - kubectl create ns prometheus || true
              - kubectl label ns prometheus scrape=enabled --overwrite=true
              - ./test/hack/e2e_scripts/install_prometheus.sh
              - kubectl label ns kube-system scrape=enabled --overwrite=true
              - kubectl label ns kube-system pod-security.kubernetes.io/warn=restricted --overwrite=true
              - ./test/hack/e2e_scripts/install_karpenter.sh
              - ./test/hack/e2e_scripts/diff_karpenter.sh
              - kubectl delete nodepool --all
              - kubectl delete ec2nodeclass --all
              - kubectl delete deployment --all
              - PRIVATE_CLUSTER=$CLUSTER_NAME TEST_SUITE=$SUITE ENABLE_METRICS=$ENABLE_METRICS METRICS_REGION=$METRICS_REGION GIT_REF="$(git rev-parse HEAD)" CLUSTER_NAME=$CLUSTER_NAME CLUSTER_ENDPOINT="$(aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.endpoint" --output text)" INTERRUPTION_QUEUE=$CLUSTER_NAME make e2etests
          post_build:
            commands:
              # Describe karpenter pods
              - kubectl describe pods -n kube-system -l app.kubernetes.io/name=karpenter
              # Describe nodes
              - kubectl describe nodes
              - |
                if [ "${CLEANUP}" = true ]; then
                  ./test/hack/e2e_scripts/clean_private_cluster.sh
                fi
      env-vars-for-codebuild: |
        SUITE,
        CLUSTER_NAME,
        INTERRUPTION_QUEUE,
        REGION,
        HELM_VERSION,
        PROMETHEUS_REGION,
        WORKSPACE_ID,
        ACCOUNT_ID,
        K8S_VERSION,
        ECR_ACCOUNT_ID,
        ECR_REGION,
        PRIVATE_CLUSTER,
        ENABLE_METRICS,
        METRICS_REGION,
        VPC_PEERING_CONNECTION_ID,
        NODE_ROLE,
        SG_CB,
        VPC_CB,
        CLUSTER_VPC_ID,
        EKS_CLUSTER_SG,
        CLEANUP


================================================
FILE: .github/actions/e2e/setup-cluster/action.yaml
================================================
name: SetupCluster
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
  account_id:
    description: "Account ID to access AWS"
    required: true
  ecr_account_id:
    description: "Account ID to access ECR Repository"
    required: true
  prometheus_workspace_id:
    description: Workspace ID for the Prometheus workspace
    required: true
  role:
    description: "Role to access AWS"
    required: true
  region:
    description: "Region to access AWS"
    required: true
  ecr_region:
    description: "Region to access ECR Repository"
    required: true
  prometheus_region:
    description: Region to access Prometheus
    required: true
  cluster_name:
    description: 'Name of the cluster to be launched by eksctl'
    required: true
  k8s_version:
    description: 'Version of Kubernetes to use for the launched cluster'
    default: "1.35"
  eksctl_version:
    description: "Version of eksctl to install"
    default: v0.202.0
  ip_family:
    description: "IP Family of the cluster. Valid values are IPv4 or IPv6"
    default: "IPv4"
  private_cluster:
    description: "Whether to create a private cluster which does not add access to the public internet. Valid values are 'true' or 'false'"
    default: 'false'
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
  enable_local_zones:
    description: "Whether to include local zones in the VPC created for the cluster."
    default: 'false'
  cleanup:
    description: "Whether to cleanup resources on failure"
    default: 'false'
  codebuild_role:
    description: "Codebuild Role that must be given an access entry in case of private cluster"
runs:
  using: "composite"
  steps:
  - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
    with:
      ref: ${{ inputs.git_ref }}
  - uses: ./.github/actions/e2e/install-eksctl
    with:
      version: ${{ inputs.eksctl_version }}
  - name: create iam policies
    shell: bash
    env:
      ACCOUNT_ID: ${{ inputs.account_id }}
      CLUSTER_NAME: ${{ inputs.cluster_name }}
    run: |
      # Resolve the cloudformation path with fallback
      CLOUDFORMATION_PATH=website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml

      # Update the Cloudformation policy to add the permissionBoundary to the NodeRole
      yq -i ".Resources.KarpenterNodeRole.Properties.PermissionsBoundary = \"arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary\"" $CLOUDFORMATION_PATH

      # Update the PassRole resource to use wildcard
      awk '{gsub(/"Resource": "\${KarpenterNodeRole.Arn}"/, "\"Resource\": \"arn:${AWS::Partition}:iam::${AWS::AccountId}:role/KarpenterNodeRole-*\"")}1' $CLOUDFORMATION_PATH > $CLOUDFORMATION_PATH.tmp && mv $CLOUDFORMATION_PATH.tmp $CLOUDFORMATION_PATH

      aws iam create-service-linked-role --aws-service-name spot.amazonaws.com || true
      aws cloudformation deploy \
        --stack-name "iam-$CLUSTER_NAME" \
        --template-file $CLOUDFORMATION_PATH \
        --capabilities CAPABILITY_NAMED_IAM \
        --parameter-overrides "ClusterName=$CLUSTER_NAME" \
        --tags "testing/type=e2e" "testing/cluster=$CLUSTER_NAME" "github.com/run-url=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" "karpenter.sh/discovery=$CLUSTER_NAME"
  - name: create or upgrade cluster
    shell: bash
    env:
      ACCOUNT_ID: ${{ inputs.account_id }}
      CLUSTER_NAME: ${{ inputs.cluster_name }}
      REGION: ${{ inputs.region }}
      K8S_VERSION: ${{ inputs.k8s_version }}
      IP_FAMILY: ${{ inputs.ip_family }}
      PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
      GIT_REF:  ${{ inputs.git_ref }}
      ENABLE_LOCAL_ZONES: ${{ inputs.enable_local_zones }}
      CLEANUP: ${{ inputs.cleanup }}
      CODEBUILD_ROLE: ${{ inputs.codebuild_role }}
    run: |
      if [[ "$GIT_REF" == '' ]]; then
        GIT_REF=$(git rev-parse HEAD)
      fi

      # Disable Pod Identity for Private Clusters
      # https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html#pod-id-considerations
      if [[ "$PRIVATE_CLUSTER" == 'true' ]]; then
        KARPENTER_IAM="""
          - metadata:
              name: karpenter
              namespace: kube-system
            attachPolicyARNs:
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerNodeLifecyclePolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerIAMIntegrationPolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerEKSIntegrationPolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerInterruptionPolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerResourceDiscoveryPolicy-${{ inputs.cluster_name }}"
            permissionsBoundary: "arn:aws:iam::${{ inputs.account_id }}:policy/GithubActionsPermissionsBoundary"
            roleName: karpenter-irsa-${{ inputs.cluster_name }}
            roleOnly: true"""
      else
        KARPENTER_IAM="""podIdentityAssociations:
          - namespace: kube-system
            serviceAccountName: karpenter
            roleName: karpenter-irsa-${{ inputs.cluster_name }}
            permissionsBoundaryARN: "arn:aws:iam::${{ inputs.account_id }}:policy/GithubActionsPermissionsBoundary"
            permissionPolicyARNs:
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerNodeLifecyclePolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerIAMIntegrationPolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerEKSIntegrationPolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerInterruptionPolicy-${{ inputs.cluster_name }}"
              - "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerResourceDiscoveryPolicy-${{ inputs.cluster_name }}""""
        POD_IDENTITY="""- name: eks-pod-identity-agent
        permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
        configurationValues: |
          tolerations:
            - operator: Exists"""
      fi

      # Create or Upgrade the cluster based on whether the cluster already exists
      cmd="create"
      eksctl get cluster --name "$CLUSTER_NAME" && cmd="upgrade"

      cat << EOF >> clusterconfig.yaml
      ---
      apiVersion: eksctl.io/v1alpha5
      kind: ClusterConfig
      metadata:
        name: "$CLUSTER_NAME"
        region: "$REGION"
        version: "$K8S_VERSION"
        tags:
          karpenter.sh/discovery: "$CLUSTER_NAME"
          github.com/run-url: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
          testing/type: "e2e"
          testing/cluster: "$CLUSTER_NAME"
          test/git_ref: "$GIT_REF"
      kubernetesNetworkConfig:
        ipFamily: "$IP_FAMILY"
      managedNodeGroups:
        - instanceType: c5.4xlarge
          amiFamily: AmazonLinux2023
          name: "$CLUSTER_NAME-system-pool"
          desiredCapacity: 2
          disableIMDSv1: true
          minSize: 2
          maxSize: 2
          iam:
            instanceRolePermissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
          taints:
          - key: CriticalAddonsOnly
            value: "true"
            effect: NoSchedule
      cloudWatch:
        clusterLogging:
          enableTypes: ["*"]
          logRetentionInDays: 30
      iam:
        serviceRolePermissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
        serviceAccounts:
          - metadata:
              name: prometheus-kube-prometheus-prometheus
              namespace: prometheus
            attachPolicyARNs:
              - "arn:aws:iam::$ACCOUNT_ID:policy/PrometheusWorkspaceIngestionPolicy"
            permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
            roleName: "prometheus-irsa-$CLUSTER_NAME"
            roleOnly: true
        $KARPENTER_IAM
        withOIDC: true
      addons:
      - name: vpc-cni
        permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
      - name: coredns
        permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
      - name: kube-proxy
        permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
      - name: aws-ebs-csi-driver
        permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
        wellKnownPolicies:
          ebsCSIController: true
      $POD_IDENTITY
      EOF

      if [[ $ENABLE_LOCAL_ZONES == "true" ]]; then
        local_zones=$(AWS_REGION=$REGION aws ec2 describe-availability-zones | yq '.AvailabilityZones | filter(.ZoneType == "local-zone") | [.[].ZoneName] | join(" ")')
        for zone in $local_zones; do
          yq -i ".localZones += [\"$zone\"]" clusterconfig.yaml
        done
      fi

      if [[ $PRIVATE_CLUSTER == 'true' ]]; then
        yq -i '.privateCluster.enabled=true' clusterconfig.yaml
        yq -i '.managedNodeGroups[0].privateNetworking=true' clusterconfig.yaml
        yq -i '.accessConfig.authenticationMode="API_AND_CONFIG_MAP"' clusterconfig.yaml
        CODEBUILD_ROLE_ARN="arn:aws:iam::$ACCOUNT_ID:role/$CODEBUILD_ROLE"
        yq -i ".accessConfig.accessEntries[0].principalARN=\"$CODEBUILD_ROLE_ARN\"" clusterconfig.yaml
        yq -i '.accessConfig.accessEntries[0].accessPolicies[0].policyARN="arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy"' clusterconfig.yaml
        yq -i '.accessConfig.accessEntries[0].accessPolicies[0].accessScope.type="cluster"' clusterconfig.yaml
      fi

      # Disable rollback of the CloudFormation on Create if we aren't cleaning up the run
      if [[ $CLEANUP == 'false' ]] && [[ $cmd == 'create' ]]; then
        eksctl ${cmd} cluster -f clusterconfig.yaml --cfn-disable-rollback
      else
        eksctl ${cmd} cluster -f clusterconfig.yaml
      fi
  - name: tag oidc provider of the cluster
    if: always()
    shell: bash
    env:
      ACCOUNT_ID: ${{ inputs.account_id }}
      CLUSTER_NAME: ${{ inputs.cluster_name }}
      GIT_REF: ${{ inputs.git_ref }}
    run: |
      if [[ "$GIT_REF" == '' ]]; then
        GIT_REF=$(git rev-parse HEAD)
      fi
      oidc_id=$(aws eks describe-cluster --name "$CLUSTER_NAME" --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 3,4,5)
      arn="arn:aws:iam::$ACCOUNT_ID:oidc-provider/${oidc_id}"
      aws iam tag-open-id-connect-provider --open-id-connect-provider-arn $arn \
         --tags Key=test/git_ref,Value=$GIT_REF Key=testing/type,Value=e2e Key=testing/cluster,Value=$CLUSTER_NAME Key=github.com/run-url,Value=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
  - name: give KarpenterNodeRole permission to bootstrap
    if: ${{ inputs.private_cluster == 'false' }}
    shell: bash
    env:
      ACCOUNT_ID: ${{ inputs.account_id }}
      CLUSTER_NAME: ${{ inputs.cluster_name }}
    run: |
      ./test/hack/e2e_scripts/noderole_bootstrap_permission.sh
  - name: cloudformation describe stack events
    shell: bash
    if: failure()
    env:
      CLUSTER_NAME: ${{ inputs.cluster_name }}
    run: |
      stack_names=$(aws cloudformation describe-stacks --query "Stacks[?Tags[?Key == 'karpenter.sh/discovery' && Value == '$CLUSTER_NAME']].{StackName: StackName}" --output text)
      for stack_name in $stack_names; do
        echo "Stack Events for $stack_name:"
        aws cloudformation describe-stack-events --stack-name $stack_name
      done
  - name: install prometheus
    if: ${{ inputs.private_cluster == 'false' }}
    uses: ./.github/actions/e2e/install-prometheus
    with:
      account_id: ${{ inputs.account_id }}
      role: ${{ inputs.role }}
      prometheus_region: ${{ inputs.prometheus_region }}
      region: ${{ inputs.region }}
      cluster_name: ${{ inputs.cluster_name }}
      workspace_id: ${{ inputs.prometheus_workspace_id }}
      git_ref: ${{ inputs.git_ref }}
  - name: install karpenter
    if: ${{ inputs.private_cluster == 'false' }}
    uses: ./.github/actions/e2e/install-karpenter
    with:
      account_id: ${{ inputs.account_id  }}
      role: ${{ inputs.role }}
      region: ${{ inputs.region }}
      ecr_account_id: ${{ inputs.ecr_account_id }}
      ecr_region: ${{ inputs.ecr_region }}
      cluster_name: ${{ inputs.cluster_name }}
      k8s_version: ${{ inputs.k8s_version }}
      git_ref: ${{ inputs.git_ref }}
      private_cluster: ${{ inputs.private_cluster }}


================================================
FILE: .github/actions/e2e/slack/notify/action.yaml
================================================
name: SlackNotify
description: 'Notifies slack of the success or failure of the suite'
inputs:
  cluster_name:
    description: "Name of the cluster"
    required: false
  suite:
    description: "Suite that's running"
    required: true
  url:
    description: "Webhook URL to send the Slack notification to"
    required: true
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
  workflow_trigger:
    description: "Workflow trigger for this run"
runs:
  using: "composite"
  steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      with:
        ref: ${{ inputs.git_ref }}
    - id: get-run-name
      shell: bash
      env:
        SUITE: ${{ inputs.suite }}
        WORKFLOW: ${{ inputs.workflow_trigger }}
      run: |
        if [[ ${{ github.event_name }} == "schedule" && "$WORKFLOW" == 'private_cluster' ]]; then
          RUN_NAME="privateCluster-periodic"
        elif [[ ${{ github.event_name }} == "schedule" && "$WORKFLOW" == 'soak' ]]; then
          RUN_NAME="soak-periodic"
        elif [[ ${{ github.event_name }} == "schedule" ]]; then
          RUN_NAME="$SUITE-periodic"
        else
          RUN_NAME="$SUITE-${GITHUB_SHA::7}"
        fi

        # Convert the RUN_NAME to all lowercase
        echo RUN_NAME=${RUN_NAME,,} >> $GITHUB_OUTPUT
    - uses: ./.github/actions/e2e/slack/send-message
      if: ${{ job.status == 'success' }}
      with:
        url: ${{ inputs.url }}
        message: ":white_check_mark: ${{ steps.get-run-name.outputs.RUN_NAME }} (https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
    - uses: ./.github/actions/e2e/slack/send-message
      if: ${{ job.status == 'failure' }}
      with:
        url: ${{ inputs.url }}
        message: ":x: ${{ steps.get-run-name.outputs.RUN_NAME }} (https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"


================================================
FILE: .github/actions/e2e/slack/send-message/action.yaml
================================================
name: SlackSendMessage
description: 'Notifies slack of the success or failure of the suite'
inputs:
  message:
    description: "Message to send to the Slack webhook notification channel"
    required: true
  url:
    description: "Webhook URL to send the Slack notification to"
    required: true
runs:
  using: "composite"
  steps:
    - shell: bash
      env:
        URL: ${{ inputs.url }}
        MESSAGE: ${{ inputs.message }}
      run: |
        JSON="{'message': '$MESSAGE'}"
        curl -X POST -H 'Content-Type: application/json' --data "${JSON}" "$(printf "$URL" | tr -d "\n")"

================================================
FILE: .github/actions/e2e/upgrade-crds/action.yaml
================================================
name: UpgradeCRDs
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
  account_id:
    description: "Account ID to access AWS"
    required: true
  role:
    description: "Role to access AWS"
    required: true
  region:
    description: "Region to access AWS"
    required: true
  cluster_name:
    description: 'Name of the cluster to be launched by eksctl'
    required: true
  git_ref:
    description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
runs:
  using: "composite"
  steps:
    - name: configure aws credentials
      uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
      with:
        role-to-assume: arn:aws:iam::${{ inputs.account_id }}:role/${{ inputs.role }}
        aws-region: ${{ inputs.region }}
        role-duration-seconds: 21600
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      with:
        ref: ${{ inputs.git_ref }}
    - name: install-karpenter
      shell: bash
      env:
        CLUSTER_NAME: ${{ inputs.cluster_name }}
      run: |
        aws eks update-kubeconfig --name "$CLUSTER_NAME"
        kubectl apply -f pkg/apis/crds/


================================================
FILE: .github/actions/install-deps/action.yaml
================================================
name: InstallDependencies
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
  k8sVersion:
    description: Kubernetes version to use when installing the toolchain
    default: "1.35.x"
  use-cache:
    description: 'Whether to cache dependencies'
    default: true
runs:
  using: "composite"
  steps:
    - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
      id: setup-go
      with:
        cache: ${{ inputs.use-cache == 'true' }}
        go-version-file: go.mod
        check-latest: true
        cache-dependency-path: "**/go.sum"
    # Root path permission workaround for caching https://github.com/actions/cache/issues/845#issuecomment-1252594999
    - run: sudo chown "$USER" /usr/local
      shell: bash
    - uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5.0.2
      id: cache-toolchain
      if: ${{ inputs.use-cache == 'true' }}
      with:
        path: |
          /usr/local/kubebuilder/bin
          ~/go/bin
        # Added go version to compensate for this issue with govulncheck: https://github.com/golang/go/issues/65590. Could re-evaluate if this is necessary once the
        # upstream go issue is corrected and if this is causing too many cache misses.
        key: ${{ runner.os }}-${{ inputs.k8sVersion }}-${{ steps.setup-go.outputs.go-version }}-toolchain-cache-${{ hashFiles('hack/toolchain.sh') }}
    - if: ${{ steps.cache-toolchain.outputs.cache-hit != 'true' }}
      shell: bash
      env:
        K8S_VERSION: ${{ inputs.k8sVersion }}
      run: make toolchain


================================================
FILE: .github/dependabot.yaml
================================================
# See https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-ecosystem
version: 2
updates:
  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "weekly"
    ignore:
      # We are currently pinning to pseudo-version for sigs.k8s.io/karpenter package, so that we can take later changes into the AWS provider. 
      # This may change later, but this is how we have it configured right now.
      # https://github.com/aws/karpenter-provider-aws/issues/7826
      - dependency-name: sigs.k8s.io/karpenter
    groups:
      # Group updates together, so that they are all applied in a single PR.
      # Grouped updates are currently in beta and is subject to change.
      # xref: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups
      k8s-go-deps:
        patterns:
          - "k8s.io/*"
          - "sigs.k8s.io/*"
          - "knative.dev/*"
        exclude-patterns:
          - "sigs.k8s.io/karpenter"
      go-deps:
        patterns:
          - "*"
        exclude-patterns:
          - "k8s.io/*"
          - "sigs.k8s.io/*"
          - "knative.dev/*"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      # Group updates together, so that they are all applied in a single PR.
      # Grouped updates are currently in beta and is subject to change.
      # xref: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups
      actions-deps:
        patterns:
          - "*"
  - package-ecosystem: "npm"
    directory: "/website"
    schedule:
      interval: "weekly"
    groups:
      # Group updates together, so that they are all applied in a single PR.
      # Grouped updates are currently in beta and is subject to change.
      # xref: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups
      website-deps:
        patterns:
          - "*"
  # Everything under this line is currently auto-generated by hack/github/dependabot.sh
  # This needs to be generated since composite actions are currently not supported for auto-updates
  # through dependabot without explicitly setting their directory: https://github.com/dependabot/dependabot-core/issues/6704
  # If you need to make a change to this file, ensure that you make a change to hack/github/dependabot.sh first
  # That script assumes that the number of elements above this line is static and bases the append operation on it
  - package-ecosystem: github-actions
    directory: .github/actions/commit-status/end
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/commit-status/start
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/download-artifact
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/cleanup
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/dump-logs
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/install-eksctl
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/install-helm
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/install-karpenter
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/install-prometheus
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/run-tests-private-cluster
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/setup-cluster
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/slack/notify
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/slack/send-message
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/e2e/upgrade-crds
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'
  - package-ecosystem: github-actions
    directory: .github/actions/install-deps
    schedule:
      interval: weekly
    groups:
      action-deps:
        patterns:
          - '*'


================================================
FILE: .github/pull-request-template.md
================================================
<!-- Please follow the guidelines at https://www.conventionalcommits.org/en/v1.0.0/ and use one of the following in your title:
feat:            <-- New features that require a MINOR version update
fix:             <-- Bug fixes that require at PATCH version update
chore:           <-- Smaller changes that impact behavior but aren't large enough to be features
perf:            <-- Code changes that improve performance but do not impact behavior
docs:            <-- Documentation changes that do not impact code
test:            <-- Test changes that do not impact behavior
ci:              <-- Changes that affect test or rollout automation
!${type}:        <-- Include ! if your change includes a backwards incompatible change.

Please review the Karpenter contribution docs at https://karpenter.sh/docs/contributing/ before submitting your pull request.
-->

Fixes #N/A <!-- issue number -->

**Description**

**How was this change tested?**

**Does this change impact docs?**
- [ ] Yes, PR includes docs updates <!-- docs must be added to /preview to be included in future version releases -->
- [ ] Yes, issue opened: # <!-- issue number -->
- [x] No

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

================================================
FILE: .github/security-notice.md
================================================
# Github Workflows Security Notice

Writing security workflows that can be accessed by third parties outside of your repository is inherently dangerous. There is a full list of vulnerabilities that you can subject yourself to when you enable external users to interact with your workflows. These vulnerabilities are well-described here: https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions as well as detail on how to mitigate these risks.

As a rule-of-thumb within the Karpenter workflows, we have chosen to always assign any input that _might_ come from a user in either a Github workflow or a composite action into environment variables any we are using a bash or javascript script as a step in the workflow or action. An example of this can be seen below:

```yaml
- name: Save info about the review comment as an artifact for other workflows that run on workflow_run to download them
  env:
    # We store these values in environment variables to avoid bash script injection
    # Specifically, it's important that we do this for github.event.review.body since this is user-controlled input
    # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
    REVIEW_BODY: ${{ github.event.review.body }}
    PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
    COMMIT_ID: ${{ github.event.review.commit_id }}
  run: |
    mkdir -p /tmp/artifacts
    { echo "$REVIEW_BODY"; echo "$PULL_REQUEST_NUMBER"; echo "$COMMIT_ID"; } >> /tmp/artifacts/metadata.txt
    cat /tmp/artifacts/metadata.txt
```

Note that, when you are writing Github workflows or composite actions to ensure to follow this code-style to reduce the attack surface could result from attempted script injection to the workflows.

================================================
FILE: .github/workflows/approval-comment.yaml
================================================
name: ApprovalComment
on:
  pull_request_review:
    types: [submitted]
jobs:
  approval-comment:
    if: startsWith(github.event.review.body, '/karpenter snapshot') || startsWith(github.event.review.body, '/karpenter scale') || startsWith(github.event.review.body, '/karpenter versionCompatibility')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
      - name: Save info about the review comment as an artifact for other workflows that run on workflow_run to download them
        env:
          REVIEW_BODY: ${{ github.event.review.body }}
          PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
          COMMIT_ID: ${{ github.event.review.commit_id }}
        run: |
          mkdir -p /tmp/artifacts
          { echo "$REVIEW_BODY"; echo "$PULL_REQUEST_NUMBER"; echo "$COMMIT_ID"; } >> /tmp/artifacts/metadata.txt
          cat /tmp/artifacts/metadata.txt
      - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
        with:
          name: artifacts
          path: /tmp/artifacts


================================================
FILE: .github/workflows/ci-test.yaml
================================================
name: CI-TEST
on:
  push:
    branches:
      - 'main'
      - 'release-v*'
      - 'staging/*'
  pull_request:
  workflow_dispatch:
jobs:
  ci-test:
    runs-on: ubuntu-latest
    if: github.repository == 'aws/karpenter-provider-aws'
    strategy:
        fail-fast: false
        matrix:
          k8sVersion: ["1.29.x", "1.30.x", "1.31.x", "1.32.x", "1.33.x", "1.34.x", "1.35.x"]
    steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
    - uses: ./.github/actions/install-deps
      with:
        k8sVersion: ${{ matrix.k8sVersion }}
    - run: K8S_VERSION=${{ matrix.k8sVersion }} make ci-test
    - name: Send coverage
      # should only send converage once https://docs.coveralls.io/parallel-builds
      if: matrix.k8sVersion == '1.35.x'
      env:
        COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: goveralls -coverprofile=coverage.out -service=github


================================================
FILE: .github/workflows/ci.yaml
================================================
name: CI
on:
  push:
    branches:
      - 'main'
      - 'release-v*'
      - 'staging/*'
  pull_request:
  workflow_dispatch:
jobs:
  ci:
    runs-on: ubuntu-latest
    if: github.repository == 'aws/karpenter-provider-aws'
    steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
    - uses: ./.github/actions/install-deps
    - name: Enable the actionlint matcher
      run: echo "::add-matcher::.github/actionlint-matcher.json"
    - run: make ci-non-test
      shell: bash


================================================
FILE: .github/workflows/codegen.yaml
================================================
name: "CodeGenCI"
on:
  workflow_dispatch:
  schedule:
    - cron: '0 13 * * MON'
jobs:
  codegen:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      pull-requests: write # name: Create Pull Request
      contents: write # name: Create Pull Request
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - uses: ./.github/actions/install-deps
        with:
          use-cache: false
      - run: |
          git config user.name "APICodeGen"
          git config user.email "APICodeGen@users.noreply.github.com"
          git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
          git config pull.rebase false
      - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: 'arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}'
          aws-region: ${{ vars.READONLY_REGION }}
      - run: make codegen
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ENABLE_GIT_PUSH: true
      - id: detect-changes
        run: |
          # If we have a committed change, mark that we committed with a variable
          if [[ $(git rev-list --count main..codegen) != "0" ]]; then
            echo APICodeGenUpdate=true >> "$GITHUB_OUTPUT"
          fi
      - name: Create Pull Request
        if: steps.detect-changes.outputs.APICodeGenUpdate == 'true'
        uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          script: |
            const { repo, owner } = context.repo;
            const result = await github.rest.pulls.create({
              title: 'chore: Update data from AWS APIs',
              owner,
              repo,
              head: 'codegen',
              base: 'main',
              body: [
                'Updates auto generated files with data from the AWS APIs for pricing and VPC limits. Please remove the branch after merging.',
                'This PR is generated by [APICodeGen](https://github.com/aws/karpenter/actions/workflows/codegen.yml).'
              ].join('\n')
            });
            github.rest.issues.addLabels({
              owner,
              repo,
              issue_number: result.data.number,
              labels: ['aws', 'dependencies']
            });
      - name: notify slack of success or failure
        uses: ./.github/actions/e2e/slack/notify
        if: (success() || failure())
        with:
          url: ${{ secrets.SLACK_WEBHOOK_URL }}
          suite: codegen

================================================
FILE: .github/workflows/codeql-analysis.yaml
================================================
name: "CodeQL"
on:
  push:
    branches:
      - 'main'
      - 'release-v*'
      - 'staging/*'
  pull_request:
  schedule:
    - cron: '0 12 * * *'
jobs:
  analyze-go:
    name: Analyze Go
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    permissions:
      actions: read # github/codeql-action/init@v2
      security-events: write # github/codeql-action/init@v2
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - uses: ./.github/actions/install-deps
      - run: make vulncheck
      - uses: github/codeql-action/init@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
        with:
          languages: go
      - uses: github/codeql-action/autobuild@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
      - uses: github/codeql-action/analyze@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
  # Javascript is added here for evaluating Github Action vulnerabilities
  # https://github.blog/2023-08-09-four-tips-to-keep-your-github-actions-workflows-secure/#2-enable-code-scanning-for-workflows
  analyze-github-actions:
    name: Analyze Github Actions
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    permissions:
      actions: read # github/codeql-action/init@v3
      security-events: write # github/codeql-action/init@v3
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - uses: github/codeql-action/init@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
        with:
          languages: actions
      - uses: github/codeql-action/analyze@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10


================================================
FILE: .github/workflows/dryrun-gen-pr.yaml
================================================
name: DryRunGenPR
on:
  pull_request:
  workflow_dispatch:
jobs:
  dryrun-gen:
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - run: make prepare-website
        env:
          GIT_TAG: v0.10000.0 # Mock version for testing website generation


================================================
FILE: .github/workflows/dryrun-gen.yaml
================================================
name: DryRunGen
on:
  push:
    branches:
      - 'main'
      - 'release-v*'
      - 'staging/*'
jobs:
  dryrun-gen:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - uses: ./.github/actions/install-deps
        with:
          use-cache: false
      - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: 'arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}'
          aws-region: ${{ vars.READONLY_REGION }}
      - run: make docgen
      - run: make codegen
        env:
          ENABLE_GIT_PUSH: false
      - run: make prepare-website
        env:
          GIT_TAG: v0.10000.0 # Mock version for testing website generation


================================================
FILE: .github/workflows/e2e-cleanup.yaml
================================================
name: E2ECleanup
on:
  workflow_dispatch:
    inputs:
      cluster_name:
        type: string
        required: true
      git_ref:
        type: string
      region:
        type: choice
        options:
          - "us-east-1"
          - "us-east-2"
          - "us-west-2"
          - "eu-west-1"
jobs:
  cleanup:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
    name: cleanup-${{ inputs.cluster_name }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          ref: ${{ inputs.git_ref }}
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
          aws-region: ${{ inputs.region }}
          role-duration-seconds: 21600
      - name: cleanup karpenter and cluster '${{ inputs.cluster_name }}' resources
        uses: ./.github/actions/e2e/cleanup
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ inputs.cluster_name }}
          git_ref: ${{ inputs.git_ref }}
          eksctl_version: v0.202.0


================================================
FILE: .github/workflows/e2e-matrix-trigger.yaml
================================================
name: E2EMatrixTrigger
on:
  schedule:
    - cron: '7 */8 * * *'
  push:
    branches:
      - 'main'
      - 'release-v*'
      - 'staging/*'
  workflow_run:
    workflows:
      - ApprovalComment
    types:
      - completed
  workflow_dispatch:
    inputs:
      region:
        required: true
        default: 'us-east-2'
        type: choice
        options:
          - "us-east-1"
          - "us-east-2"
      cleanup:
        required: true
        default: true
        type: boolean
jobs:
  resolve:
    if: (github.repository == 'aws/karpenter-provider-aws' && (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success')) || github.event_name == 'workflow_dispatch'
    uses: ./.github/workflows/resolve-args.yaml
    with:
      allowed_comment: "snapshot"
  e2e-matrix:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    needs: [resolve]
    if: needs.resolve.outputs.SHOULD_RUN == 'true'
    uses: ./.github/workflows/e2e-matrix.yaml
    with:
      git_ref: ${{ needs.resolve.outputs.GIT_REF }}
      region: ${{ inputs.region || 'us-east-2' }}
      workflow_trigger: "matrix"
      # Default to true unless using a workflow_dispatch
      cleanup: ${{ github.event_name != 'workflow_dispatch' && true || inputs.cleanup }}
    secrets:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}


================================================
FILE: .github/workflows/e2e-matrix.yaml
================================================
name: E2EMatrix
on:
  workflow_call:
    inputs:
      region:
        type: string
        default: "us-east-2"
      k8s_version:
        type: string
        default: "1.35"
      cleanup:
        type: boolean
        required: true
      git_ref:
        type: string
      workflow_trigger:
        type: string
        required: true
      parallelism:
        type: number
    secrets:
      SLACK_WEBHOOK_URL:
        required: true
  workflow_dispatch:
    inputs:
      region:
        type: choice
        options:
          - "us-east-1"
          - "us-east-2"
          - "us-west-2"
          - "eu-west-1"
        default: "us-east-2"
      k8s_version:
        type: choice
        options:
          - "1.29"
          - "1.30"
          - "1.31"
          - "1.32"
          - "1.33"
          - "1.34"
          - "1.35"
        default: "1.35"
      cleanup:
        type: boolean
        required: true
        default: true
# All jobs will run under the following conditions:
#   1. Upstream Karpenter repo triggered the job by schedule, push, or dispatch
#   2. Upstream Karpenter repo triggered the job by workflow_run, which requires maintainer check to succeed
#   3. Downstream fork triggered the job through dispatch and has set 'ENABLE_E2E' in repo environment variables
jobs:
  e2e:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    strategy:
      fail-fast: false
      max-parallel: ${{ inputs.parallelism || 100 }}
      matrix:
        suite:
          - name: IPv6
            region: ${{ inputs.region }}
            source: aws
          - name: AMI
            region: ${{ inputs.region }}
            source: aws
          - name: Scheduling
            region: ${{ inputs.region }}
            source: aws
          - name: Storage
            region: ${{ inputs.region }}
            source: aws
          - name: Integration
            region: ${{ inputs.region }}
            source: all
          - name: NodeClaim
            region: ${{ inputs.region }}
            source: all
          - name: Consolidation
            region: ${{ inputs.region }}
            source: aws
          - name: Interruption
            region: ${{ inputs.region }}
            source: aws
          - name: Drift
            region: ${{ inputs.region }}
            source: all
          - name: Expiration
            region: ${{ inputs.region }}
            source: upstream
          - name: Chaos
            region: ${{ inputs.region }}
            source: upstream
          - name: Termination
            region: ${{ inputs.region }}
            source: upstream
          - name: LocalZone
            # LAX is the only local zone available in the CI account, therefore only use us-west-2
            region: us-west-2
            source: aws
    uses: ./.github/workflows/e2e.yaml
    with:
      suite: ${{ matrix.suite.name }}
      git_ref: ${{ inputs.git_ref }}
      region: ${{ matrix.suite.region }}
      k8s_version: ${{ inputs.k8s_version }}
      cleanup: ${{ inputs.cleanup }}
      workflow_trigger: ${{ inputs.workflow_trigger }}
      source: ${{ matrix.suite.source }}
    secrets:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
  e2e-upgrade:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    uses: ./.github/workflows/e2e-upgrade.yaml
    with:
      from_git_ref: e169c8f9b56a7ce0b0c4b7f4ae233d5740365590
      to_git_ref: ${{ inputs.git_ref }}
      region: ${{ inputs.region }}
      k8s_version: ${{ inputs.k8s_version }}
      cleanup: ${{ inputs.cleanup }}
      workflow_trigger: ${{ inputs.workflow_trigger }}
      source: all
    secrets:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}


================================================
FILE: .github/workflows/e2e-private-cluster-trigger.yaml
================================================
name: E2EPrivateClusterTrigger
on:
  schedule:
    - cron: '7 0 * * 4'
jobs:
  private-cluster-trigger:
    if: github.repository == 'aws/karpenter-provider-aws'
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    uses: ./.github/workflows/e2e.yaml
    with:
      suite: Integration
      region: us-east-1
      workflow_trigger: "private_cluster"
      cleanup: true
      codebuild_region: US_EAST_1
      source: aws
    secrets:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}


================================================
FILE: .github/workflows/e2e-scale-trigger.yaml
================================================
name: E2EScaleTrigger
on:
  schedule:
    - cron: '7 18 * * *'
  workflow_run:
    workflows: [ApprovalComment]
    types: [completed]
  workflow_dispatch:
    inputs:
      region:
        required: true
        default: 'us-west-2'
        type: choice
        options:
          - "us-east-1"
          - "us-west-2"
      cleanup:
        required: true
        default: true
        type: boolean
      enable_metrics:
        required: true
        default: false
        type: boolean
jobs:
  resolve:
    if: (github.repository == 'aws/karpenter-provider-aws' && (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success')) || github.event_name == 'workflow_dispatch'
    uses: ./.github/workflows/resolve-args.yaml
    with:
      allowed_comment: "scale"
  scale:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    needs: [resolve]
    if: needs.resolve.outputs.SHOULD_RUN == 'true'
    uses: ./.github/workflows/e2e.yaml
    with:
      suite: Scale
      git_ref: ${{ needs.resolve.outputs.GIT_REF }}
      region: ${{ inputs.region || 'us-west-2' }}
      enable_metrics: ${{ inputs.enable_metrics || true }}
      workflow_trigger: "scale"
      source: aws
      # Default to true unless using a workflow_dispatch
      cleanup: ${{ github.event_name != 'workflow_dispatch' && true || inputs.cleanup }}
    secrets:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}


================================================
FILE: .github/workflows/e2e-soak-trigger.yaml
================================================
name: E2ESoakTrigger
on:
  schedule:
    - cron: '0 */3 * * *'
jobs:
  resolve_cluster:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    outputs:
      PREEXISTING_CLUSTERS: ${{ steps.list_clusters.outputs.PREEXISTING_CLUSTERS }}
    steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
    - name: configure aws credentials
      uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708
      with:
       role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
       aws-region: eu-north-1
    - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
      with:
        go-version-file: test/hack/soak/go.mod
        cache-dependency-path: test/hack/soak/go.sum
        check-latest: true
        cache: false
    # Grab all the names of the soak testing clusters, and identify clusters that will need to be deleted
    # Empty cluster_name will indicate that a new cluster will be created
    - id: list_clusters 
      name: "Run list clusters script"
      run: |
        PREEXISTING_CLUSTERS="$(go run get_clusters.go)" 
        echo PREEXISTING_CLUSTERS="$PREEXISTING_CLUSTERS" >> "$GITHUB_OUTPUT"
      working-directory: ./test/hack/soak
      shell: bash
  soak:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # required by e2e.yaml
    needs: [resolve_cluster]
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.resolve_cluster.outputs.PREEXISTING_CLUSTERS) }}
    uses: ./.github/workflows/e2e.yaml
    with:
      suite: Integration
      region: eu-north-1
      workflow_trigger: "soak"
      cluster_name: ${{ matrix.cluster_name }}
      cleanup: ${{ matrix.cluster_cleanup }}
      git_ref: ${{ matrix.git_ref }}
      source: aws
    secrets:
      SLACK_WEBHOOK_SOAK_URL: ${{ secrets.SLACK_WEBHOOK_SOAK_URL }}


================================================
FILE: .github/workflows/e2e-upgrade.yaml
================================================
name: E2EUpgrade
on:
  workflow_dispatch:
    inputs:
      from_git_ref:
        type: string
        required: true
      region:
        type: choice
        options:
          - "us-east-2"
          - "us-west-2"
        default: "us-east-2"
      to_git_ref:
        type: string
      k8s_version:
        type: choice
        options:
          - "1.29"
          - "1.30"
          - "1.31"
          - "1.32"
          - "1.33"
          - "1.34"
          - "1.35"
        default: "1.35"
      cleanup:
        required: true
        default: true
        type: boolean
      source:
        type: string
        default: "aws" 
  workflow_call:
    inputs:
      from_git_ref:
        type: string
        required: true
      to_git_ref:
        type: string
      region:
        type: string
        default: "us-east-2"
      k8s_version:
        type: string
        default: "1.35"
      cleanup:
        required: true
        type: boolean
      workflow_trigger:
        type: string
      source:
        type: string
        default: "aws" 
    secrets:
      SLACK_WEBHOOK_URL:
        required: true
jobs:
  run-suite:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    name: suite-upgrade
    runs-on: ubuntu-latest
    steps:
      # This additional checkout can be removed when the commit status action is added to the from_git_ref version of Karpenter
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          ref: ${{ inputs.to_git_ref }}
      - if: always() && github.event_name == 'workflow_run'
        uses: ./.github/actions/commit-status/start
        with:
          name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (Upgrade)
          git_ref: ${{ inputs.to_git_ref }}
      - uses: ./.github/actions/install-deps
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          ref: ${{ inputs.from_git_ref }}
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
          aws-region: ${{ inputs.region }}
          role-duration-seconds: 21600
      - id: generate-cluster-name
        name: generate cluster name
        run: |
          CLUSTER_NAME="upgrade-$RANDOM$RANDOM"
          echo "Using cluster name \"$CLUSTER_NAME\""
          echo CLUSTER_NAME="$CLUSTER_NAME" >> "$GITHUB_OUTPUT"
      - name: setup eks cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}'
        uses: ./.github/actions/e2e/setup-cluster
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          k8s_version: ${{ inputs.k8s_version }}
          eksctl_version: v0.202.0
          ip_family: IPv4 # Set the value to IPv6 if IPv6 suite, else IPv4
          git_ref: ${{ inputs.from_git_ref }}
          ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
          ecr_region: ${{ vars.SNAPSHOT_REGION }}
          prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
          prometheus_region: ${{ vars.PROMETHEUS_REGION }}
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          ref: ${{ inputs.to_git_ref }}
      - name: upgrade crds
        uses: ./.github/actions/e2e/upgrade-crds
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          git_ref: ${{ inputs.to_git_ref }}
      - name: upgrade eks cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}'
        uses: ./.github/actions/e2e/setup-cluster
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          k8s_version: ${{ inputs.k8s_version }}
          eksctl_version: v0.202.0
          ip_family: IPv4 # Set the value to IPv6 if IPv6 suite, else IPv4
          git_ref: ${{ inputs.to_git_ref }}
          ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
          ecr_region: ${{ vars.SNAPSHOT_REGION }}
          prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
          prometheus_region: ${{ vars.PROMETHEUS_REGION }}
      - name: run the Upgrade test suite
        env:
          SOURCE: ${{ inputs.source }}
        run: |
          aws eks update-kubeconfig --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}

          if [[ "$SOURCE" == 'aws' ]]; then
          CLUSTER_NAME=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} INTERRUPTION_QUEUE=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" TEST_SUITE="Integration" make e2etests
          elif [[ "$SOURCE" == 'upstream' ]]; then
            FOCUS="Integration" CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
          elif [[ "$SOURCE" == 'all' ]]; then
            CLUSTER_NAME=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} INTERRUPTION_QUEUE=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" TEST_SUITE="Integration" make e2etests
            FOCUS="Integration" CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
          fi
      - name: notify slack of success or failure
        uses: ./.github/actions/e2e/slack/notify
        if: (success() || failure()) && github.event_name != 'workflow_run' && inputs.workflow_trigger != 'versionCompatibility'
        with:
          cluster_name:  ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          url: ${{ secrets.SLACK_WEBHOOK_URL }}
          suite: Upgrade
          git_ref: ${{ inputs.to_git_ref }}
      - name: dump logs on failure
        uses: ./.github/actions/e2e/dump-logs
        if: failure() || cancelled()
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
      - name: cleanup karpenter and cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}' resources
        uses: ./.github/actions/e2e/cleanup
        if: always() && inputs.cleanup
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          git_ref: ${{ inputs.to_git_ref }}
          eksctl_version: v0.202.0
      - if: always() && github.event_name == 'workflow_run'
        uses: ./.github/actions/commit-status/end
        with:
          name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (Upgrade)
          git_ref: ${{ inputs.to_git_ref }}


================================================
FILE: .github/workflows/e2e-version-compatibility-trigger.yaml
================================================
name: E2EVersionCompatibilityTrigger
on:
  schedule:
    # The test will run every Monday, Thursday at 12:07 AM UTC
    - cron: '7 0 * * 1,4'
  workflow_run:
    workflows: [ApprovalComment]
    types: [completed]
  workflow_dispatch:
    inputs:
      region:
        required: true
        default: 'eu-west-1'
        type: choice
        options:
          - "us-east-1"
          - "eu-west-1"
      cleanup:
        required: true
        default: true
        type: boolean
jobs:
  resolve:
    if: (github.repository == 'aws/karpenter-provider-aws' && (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success')) || github.event_name == 'workflow_dispatch'
    uses: ./.github/workflows/resolve-args.yaml
    with:
      allowed_comment: "versionCompatibility"
  versionCompatibility:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    needs: [resolve]
    if: needs.resolve.outputs.SHOULD_RUN == 'true'
    strategy:
      fail-fast: false
      matrix:
        k8s_version: ["1.29", "1.30", "1.31", "1.32", "1.33", "1.34", "1.35"]
    uses: ./.github/workflows/e2e-matrix.yaml
    with:
      region: ${{ inputs.region || 'eu-west-1' }}
      git_ref: ${{ needs.resolve.outputs.GIT_REF }}
      k8s_version: ${{ matrix.k8s_version }}
      workflow_trigger: "versionCompatibility"
      # Default to true unless using a workflow_dispatch
      cleanup: ${{ github.event_name != 'workflow_dispatch' && true || inputs.cleanup }}
      parallelism: 1
    secrets:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}


================================================
FILE: .github/workflows/e2e.yaml
================================================
name: E2E
on:
  workflow_dispatch:
    inputs:
      git_ref:
        type: string
      region:
        type: choice
        options:
          - "us-east-1"
          - "us-east-2"
          - "us-west-2"
          - "eu-west-1"
        default: "us-east-2"
      suite:
        type: choice
        required: true
        options:
          - Integration
          - NodeClaim
          - Consolidation
          - Interruption
          - Drift
          - Expiration
          - Chaos
          - IPv6
          - Scale
          - PrivateCluster
          - LocalZone
      k8s_version:
        type: choice
        options:
          - "1.29"
          - "1.30"
          - "1.31"
          - "1.32"
          - "1.33"
          - "1.34"
          - "1.35"
        default: "1.35"
      cluster_name:
        type: string
      cleanup:
        type: boolean
        required: true
        default: true
      enable_metrics:
        type: boolean
        default: false
      codebuild_region:
        type: string
      source:
        type: string
        default: "aws" 
  workflow_call:
    inputs:
      git_ref:
        type: string
      source:
        type: string
        default: "aws" 
      region:
        type: string
        default: "us-east-2"
      suite:
        type: string
        required: true
      k8s_version:
        type: string
        default: "1.35"
      enable_metrics:
        type: boolean
        default: false
      cleanup:
        type: boolean
        required: true
      workflow_trigger:
        type: string
      codebuild_region:
        type: string
      cluster_name:
        type: string
        description: If cluster_name is empty, a new cluster will be created. Otherwise, tests will run on an existing cluster
    secrets:
      SLACK_WEBHOOK_URL:
        required: false
      SLACK_WEBHOOK_SOAK_URL:
        required: false
jobs:
  run-suite:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      statuses: write # ./.github/actions/commit-status/start
    name: suite-${{ inputs.suite }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          ref: ${{ inputs.git_ref }}
      - if: always() && github.event_name == 'workflow_run'
        uses: ./.github/actions/commit-status/start
        with:
          name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (${{ inputs.suite }})
          git_ref: ${{ inputs.git_ref }}
      - uses: ./.github/actions/install-deps
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
          aws-region: ${{ inputs.region }}
          role-duration-seconds: 21600
      - name: add jitter on cluster setup
        if: github.repository == 'aws/karpenter-provider-aws'
        run: |
          # Creating jitter so that we can stagger cluster creation to avoid throttling
          sleep $(( RANDOM % 300 + 1 ))
      - id: generate-cluster-name
        name: generate cluster name
        env:
          SUITE: ${{ inputs.suite }}
          CLUSTER_NAME: ${{ inputs.cluster_name }}
          WORKFLOW_TRIGGER: ${{ inputs.workflow_trigger }}
        run: |
          if [[ "$CLUSTER_NAME" == '' ]]; then
            if [[ "$WORKFLOW_TRIGGER" == 'soak' ]]; then
              CLUSTER_NAME=$(echo "soak-periodic-$RANDOM$RANDOM" | awk '{print tolower($0)}' | tr / -)
            else
              CLUSTER_NAME=$(echo "$SUITE-$RANDOM$RANDOM" | awk '{print tolower($0)}' | tr / -)
            fi
          fi
          echo "Using cluster name \"$CLUSTER_NAME\""
          echo CLUSTER_NAME="$CLUSTER_NAME" >> "$GITHUB_OUTPUT"
      - name: setup eks cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}'
        if: inputs.cluster_name == ''
        uses: ./.github/actions/e2e/setup-cluster
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          k8s_version: ${{ inputs.k8s_version }}
          eksctl_version: v0.202.0
          ip_family: ${{ contains(inputs.suite, 'IPv6') && 'IPv6' || 'IPv4' }} # Set the value to IPv6 if IPv6 suite, else IPv4
          private_cluster: ${{ inputs.workflow_trigger == 'private_cluster' }}
          git_ref: ${{ inputs.git_ref }}
          ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
          ecr_region: ${{ vars.SNAPSHOT_REGION }}
          prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
          prometheus_region: ${{ vars.PROMETHEUS_REGION }}
          enable_local_zones: ${{ inputs.suite == 'LocalZone' }}
          cleanup: ${{ inputs.cleanup }}
          codebuild_role: ${{ vars[format('{0}_CODEBUILD_ROLE', inputs.codebuild_region)] }}
      - name: run tests for private cluster
        if: ${{ inputs.workflow_trigger == 'private_cluster' }}
        uses: ./.github/actions/e2e/run-tests-private-cluster
        with:
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          suite: ${{ inputs.suite }}
          prometheus_region: ${{ vars.PROMETHEUS_REGION }}
          prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
          region: ${{ inputs.region }}
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          k8s_version: ${{ inputs.k8s_version }}
          ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
          ecr_region: ${{ vars.SNAPSHOT_REGION }}
          private_cluster: ${{ inputs.workflow_trigger == 'private_cluster' }}
          enable_metrics: ${{ inputs.enable_metrics }}
          metrics_region: ${{ vars.TIMESTREAM_REGION }}
          node_role: ${{ env.NODE_ROLE }}
          cleanup: ${{ inputs.cleanup }}
          codebuild_sg: ${{ vars[format('{0}_CODEBUILD_SG', inputs.codebuild_region)] }}
          codebuild_vpc: ${{ vars[format('{0}_CODEBUILD_VPC', inputs.codebuild_region)] }}
      - name: run the ${{ inputs.suite }} test suite
        if: ${{ inputs.workflow_trigger != 'private_cluster' }}
        env:
          SUITE: ${{ inputs.suite }}
          ENABLE_METRICS: ${{ inputs.enable_metrics }}
          SOURCE: ${{ inputs.source }}
        run: |
          aws eks update-kubeconfig --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          # Clean up the cluster before running all tests
          kubectl delete nodepool --all
          kubectl delete ec2nodeclass --all
          kubectl delete deployment --all

          if [[ "$SOURCE" == 'aws' ]]; then
            TEST_SUITE="$SUITE" ENABLE_METRICS=$ENABLE_METRICS METRICS_REGION=${{ vars.TIMESTREAM_REGION }} GIT_REF="$(git rev-parse HEAD)" \
              CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" \
              INTERRUPTION_QUEUE="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make e2etests
          elif [[ "$SOURCE" == 'upstream' ]]; then
            FOCUS="$SUITE" GIT_REF="$(git rev-parse HEAD)" \
              CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
          elif [[ "$SOURCE" == 'all' ]]; then
            TEST_SUITE="$SUITE" ENABLE_METRICS=$ENABLE_METRICS METRICS_REGION=${{ vars.TIMESTREAM_REGION }} GIT_REF="$(git rev-parse HEAD)" \
              CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" \
              INTERRUPTION_QUEUE="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make e2etests
            FOCUS="$SUITE" GIT_REF="$(git rev-parse HEAD)" \
              CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
          fi
      - name: notify slack of success or failure
        uses: ./.github/actions/e2e/slack/notify
        if: (success() || failure()) && github.event_name != 'workflow_run' && inputs.workflow_trigger != 'versionCompatibility'
        with:
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          url: ${{ inputs.workflow_trigger == 'soak' && secrets.SLACK_WEBHOOK_SOAK_URL || secrets.SLACK_WEBHOOK_URL }}
          suite: ${{ inputs.suite }}
          git_ref: ${{ inputs.git_ref }}
          workflow_trigger: ${{ inputs.workflow_trigger }}
      - name: dump logs on failure
        uses: ./.github/actions/e2e/dump-logs
        if: (failure() || cancelled()) && inputs.workflow_trigger != 'private_cluster'
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
      - name: cleanup karpenter and cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}' resources
        uses: ./.github/actions/e2e/cleanup
        if: always() && inputs.cleanup
        with:
          account_id: ${{ vars.CI_ACCOUNT_ID }}
          role: ${{ vars.CI_ROLE_NAME }}
          region: ${{ inputs.region }}
          cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
          git_ref: ${{ inputs.git_ref }}
          eksctl_version: v0.202.0
          private_cluster: ${{ inputs.workflow_trigger == 'private_cluster' }}
      - if: always() && github.event_name == 'workflow_run'
        uses: ./.github/actions/commit-status/end
        with:
          name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (${{ inputs.suite }})
          git_ref: ${{ inputs.git_ref }}


================================================
FILE: .github/workflows/image-canary.yaml
================================================
name: ImageCanary
on:
  workflow_dispatch:
  schedule:
  - cron: '0 */1 * * *'
jobs:
  image-canary:
    runs-on: ubuntu-latest
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
    if: github.repository == 'aws/karpenter-provider-aws'
    steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
      with:
        role-to-assume: arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}
        aws-region: ${{ vars.READONLY_REGION }}
        role-duration-seconds: 900
    # Authenticate to public ECR to prevent rate limiting
    - uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
      with:
        registry: public.ecr.aws
        logout: true
      env:
        AWS_REGION: us-east-1
    - name: Run image canary
      env:
        GH_TOKEN: ${{ github.token }}
      run: ./hack/image_canary.sh
    - name: Notify slack of failure
      if: failure() && github.event_name != 'workflow_run'
      uses: ./.github/actions/e2e/slack/send-message
      with:
        message: ":alert: image canary failure (https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) @channel"
        url: ${{ secrets.SLACK_WEBHOOK_URL }}


================================================
FILE: .github/workflows/postsubmit.yaml
================================================
name: PostSubmit
on:
  push:
    branches:
      - main
  workflow_dispatch:
jobs:
  postsubmit:
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - uses: ./.github/actions/install-deps
      - name: hydrate-goproxy
        run: |
          mkdir -p hydrate-goproxy
          cd hydrate-goproxy
          go mod init hydrate-goproxy
          go get "github.com/${GITHUB_REPOSITORY}@${GITHUB_SHA}"

================================================
FILE: .github/workflows/release.yaml
================================================
name: Release
on:
  push:
    # Only release on supported semantic version tagging e.g. v0.0.1-rc.0
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'
      - 'v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+'
      - 'v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+'
      - 'v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+'
jobs:
  release:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
      contents: write # marvinpinto/action-automatic-releases@v1.2.1
      pull-requests: write # name: Create PR
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
      - name: Create GitHub Release
        uses: marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0 # v1.2.1
        with:
          repo_token: '${{ secrets.GITHUB_TOKEN }}'
          prerelease: false
      - uses: ./.github/actions/install-deps
        with:
          use-cache: false
      - uses: ./.github/actions/e2e/install-helm
        with:
          version: v3.18.6
      - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: 'arn:aws:iam::${{ vars.RELEASE_ACCOUNT_ID }}:role/${{ vars.RELEASE_ROLE_NAME }}'
          aws-region: ${{ vars.RELEASE_REGION }}
      - run: make release
        env:
          RELEASE_ACCOUNT_ID: ${{ vars.RELEASE_ACCOUNT_ID }}
          CACHED_ECR_NAME: ${{ vars.CACHED_ECR_NAME }}
      - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: 'arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}'
          aws-region: ${{ vars.READONLY_REGION }}
      - run: make docgen
      - run: make prepare-website
      - run: make stable-release-pr
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_REPO: ${{ github.repository }}
      - name: Create PR
        uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          script: |
            const { repo, owner } = context.repo;
            const tag = context.ref.replace("refs/tags/", '');
            const result = await github.rest.pulls.create({
              title: `chore: Release ${tag}`,
              owner,
              repo,
              head: `release-${tag}`,
              base: 'main',
              body: [
                `Stable Release Changes for ${tag}.`,
                'Please disregard this PR if it is for a patch release.',
                'Please remove the branch after merging.',
                'This PR is generated by [StableRelease](https://github.com/aws/karpenter-provider-aws/actions/workflows/stable-release.yml).'
              ].join('\n')
            });
            github.rest.issues.addLabels({
              owner,
              repo,
              issue_number: result.data.number,
              labels: ['stable-release','website','helm-charts']
            });


================================================
FILE: .github/workflows/resolve-args.yaml
================================================
name: ResolveArgs
on:
  workflow_call:
    inputs:
      allowed_comment:
        type: string
        required: true
    outputs:
      SHOULD_RUN:
        value: ${{ jobs.resolve.outputs.SHOULD_RUN }}
      GIT_REF:
        value: ${{ jobs.resolve.outputs.GIT_REF }}
jobs:
  resolve:
    runs-on: ubuntu-latest
    outputs:
      SHOULD_RUN: ${{ steps.resolve-step.outputs.SHOULD_RUN }}
      GIT_REF: ${{ steps.resolve-step.outputs.GIT_REF }}
    steps:
      # Download the artifact and resolve the commit if initiated by PR snapshot
      # Otherwise, use the currently checked-out branch to run the E2E tests against
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - if: github.event_name == 'workflow_run'
        uses: ./.github/actions/download-artifact
      - id: resolve-step
        env:
          ALLOWED_COMMENT: ${{ inputs.allowed_comment }}
        run: |
          if [[ "${{ github.event_name }}" == "workflow_run" ]]; then
            if [[ "$(head -n 1 /tmp/artifacts/metadata.txt)" == *"$ALLOWED_COMMENT"* ]]; then
               echo SHOULD_RUN=true >> "$GITHUB_OUTPUT"
            else
               echo SHOULD_RUN=false >> "$GITHUB_OUTPUT"
            fi
            echo GIT_REF="$(tail -n 1 /tmp/artifacts/metadata.txt)" >> "$GITHUB_OUTPUT"
          else
            echo SHOULD_RUN=true >> "$GITHUB_OUTPUT"
            echo GIT_REF="" >> "$GITHUB_OUTPUT"
          fi


================================================
FILE: .github/workflows/resource-count.yaml
================================================
name: ResourceCount
on:
  schedule:
    - cron: '3 */1 * * *' # every hour
  workflow_dispatch:
permissions:
  id-token: write # aws-actions/configure-aws-credentials@v4.0.1
jobs:
  counter:
    if: vars.CI_ACCOUNT_ID != '' || github.event_name == 'workflow_dispatch'
    strategy:
      fail-fast: false
      matrix:
        region: [us-east-2, us-west-2, eu-west-1, eu-north-1, us-east-1]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
          aws-region: ${{ matrix.region }}
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
        with:
          go-version-file: test/hack/resource/go.mod
          check-latest: true
          cache-dependency-path: "test/hack/resource/go.sum"
      - run: go run main.go
        working-directory: ./test/hack/resource/count
        name: "Run resource count script"


================================================
FILE: .github/workflows/snapshot-pr.yaml
================================================
name: SnapshotPR
on:
  workflow_run:
    workflows:
      - ApprovalComment
    types:
      - completed
jobs:
  snapshot:
    permissions:
      id-token: write
      pull-requests: write
      statuses: write
    if: github.event.workflow_run.conclusion == 'success'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - uses: ./.github/actions/download-artifact
      - id: metadata
        run: |
          pr_number="$(head -n 2 /tmp/artifacts/metadata.txt | tail -n 1)"
          pr_commit="$(tail -n 1 /tmp/artifacts/metadata.txt)"
          echo PR_COMMIT="$pr_commit" >> "$GITHUB_ENV"
          echo PR_NUMBER="$pr_number" >> "$GITHUB_ENV"
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          ref: ${{ env.PR_COMMIT }}
      - uses: ./.github/actions/commit-status/start
        with:
          name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
          git_ref: ${{ env.PR_COMMIT }}
      - uses: ./.github/actions/install-deps
      - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: 'arn:aws:iam::${{ vars.SNAPSHOT_ACCOUNT_ID }}:role/${{ vars.SNAPSHOT_ROLE_NAME }}'
          aws-region: ${{ vars.SNAPSHOT_REGION }}
      - run: make snapshot
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        env:
          SNAPSHOT_ACCOUNT_ID: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
          SNAPSHOT_REGION: ${{ vars.SNAPSHOT_REGION }}
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: process.env.PR_NUMBER,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `Snapshot successfully published to \`oci://${process.env.SNAPSHOT_ACCOUNT_ID}.dkr.ecr.${process.env.SNAPSHOT_REGION}.amazonaws.com/karpenter/snapshot/karpenter:0-${process.env.PR_COMMIT}\`.
            To install you must login to the ECR repo with an AWS account:
            ~~~
            aws ecr get-login-password --region ${process.env.SNAPSHOT_REGION} | docker login --username AWS --password-stdin ${process.env.SNAPSHOT_ACCOUNT_ID}.dkr.ecr.${process.env.SNAPSHOT_REGION}.amazonaws.com
            
            helm upgrade --install karpenter oci://${process.env.SNAPSHOT_ACCOUNT_ID}.dkr.ecr.${process.env.SNAPSHOT_REGION}.amazonaws.com/karpenter/snapshot/karpenter --version "0-${process.env.PR_COMMIT}" --namespace "kube-system" --create-namespace \\
              --set "settings.clusterName=\${CLUSTER_NAME}" \\
              --set "settings.interruptionQueue=\${CLUSTER_NAME}" \\
              --set controller.resources.requests.cpu=1 \\
              --set controller.resources.requests.memory=1Gi \\
              --set controller.resources.limits.cpu=1 \\
              --set controller.resources.limits.memory=1Gi \\
              --wait
            ~~~
            `
            })
      - if: always()
        uses: ./.github/actions/commit-status/end
        with:
          name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
          git_ref: ${{ env.PR_COMMIT }}


================================================
FILE: .github/workflows/snapshot.yaml
================================================
name: Snapshot
on:
  push:
    branches:
      - 'main'
      - 'release-v*'
      - 'staging/*'
jobs:
  snapshot:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
    if: github.repository == 'aws/karpenter-provider-aws'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
      - uses: ./.github/actions/install-deps
        with:
          use-cache: false
      - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: 'arn:aws:iam::${{ vars.SNAPSHOT_ACCOUNT_ID }}:role/${{ vars.SNAPSHOT_ROLE_NAME }}'
          aws-region: ${{ vars.SNAPSHOT_REGION }}
      - run: make snapshot


================================================
FILE: .github/workflows/stale.yaml
================================================
name: StaleBot
on:
  workflow_dispatch:
  schedule:
    - cron: '0 12 * * *'
jobs:
  StaleBot:
    runs-on: ubuntu-latest
    permissions:
      issues: write # actions/stale@v8.0.0
      pull-requests: write # actions/stale@v8.0.0
    if: github.repository == 'aws/karpenter-provider-aws'
    name: Stale issue bot
    steps:
      # Issue stale-out for "triage/needs-information"
      - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          stale-issue-message: 'This issue has been inactive for 14 days. StaleBot will close this stale issue after 14 more days of inactivity.'
          only-issue-labels: 'triage/needs-information'
          stale-issue-label: 'lifecycle/stale'
          close-issue-label: 'lifecycle/closed'
          only-pr-labels: 'ignore' # Ignore this step for PRs
          days-before-stale: 14
          days-before-close: 14
          operations-per-run: 300
      # Issue stale-out for "triage/solved"
      - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          stale-issue-message: 'This issue has been inactive for 7 days and is marked as "triage/solved". StaleBot will close this stale issue after 7 more days of inactivity.'
          only-issue-labels: 'triage/solved'
          stale-issue-label: 'lifecycle/stale'
          close-issue-label: 'lifecycle/closed'
          only-pr-labels: 'ignore' # Ignore this step for PRs
          days-before-stale: 7
          days-before-close: 7
          operations-per-run: 300


================================================
FILE: .github/workflows/sweeper.yaml
================================================
name: Sweeper
on:
  schedule:
    - cron: '0 */12 * * *'
  workflow_dispatch:
jobs:
  sweeper:
    permissions:
      id-token: write # aws-actions/configure-aws-credentials@v4.0.1
    if: vars.CI_ACCOUNT_ID != '' || github.event_name == 'workflow_dispatch'
    strategy:
      fail-fast: false
      max-parallel: 1
      matrix:
        region: [us-east-2, us-west-2, eu-west-1, eu-north-1, us-east-1]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
          aws-region: ${{ matrix.region }}
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
        with:
          go-version-file: test/hack/resource/go.mod
          check-latest: true
          cache-dependency-path: "test/hack/resource/go.sum"
      # eu-north-1 contains the soak tests and resources should be swept if they are older than 8 days
      - run: |
          if [[ "${{ matrix.region }}" == "eu-north-1" ]]; then
            go run main.go --expiration 192h
          else
            go run main.go --expiration 12h
          fi
        working-directory: ./test/hack/resource/clean
        name: "Run cleanup script"


================================================
FILE: .github/workflows/website-cleanup-preview.yaml
================================================
name: Cleanup Website PR Preview
on:
  pull_request_target:
    types: [ closed ]
jobs:
  cleanup:
    runs-on: ubuntu-latest
    if: github.repository == 'aws/karpenter-provider-aws'
    permissions:
      id-token: write
      contents: read
    steps:
      - id: metadata
        run: |
          pr_number="${{ github.event.number }}"
          echo PR_NUMBER="$pr_number" >> "$GITHUB_ENV"
          echo BRANCH_NAME="pr-$pr_number" >> "$GITHUB_ENV"
      - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: arn:aws:iam::${{ vars.RELEASE_PREVIEW_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
          aws-region: ${{ vars.AMPLIFY_REGION }}
      - run: |
          if aws amplify get-branch --app-id ${{ vars.AMPLIFY_APP_ID_PREVIEW }} --branch-name "${{ env.BRANCH_NAME }}" 2>/dev/null; then
            aws amplify delete-branch --app-id ${{ vars.AMPLIFY_APP_ID_PREVIEW }} --branch-name "${{ env.BRANCH_NAME }}"
          fi
      - run: aws s3 rm s3://${{ vars.AMPLIFY_S3_BUCKET_BETA }}/pr-${{ env.PR_NUMBER }}/ --recursive


================================================
FILE: .github/workflows/website-deploy.yaml
================================================
name: Deploy Website to Amplify
on:
  push:
    branches: [ main ]
    paths: [ website/** ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    if: github.repository == 'aws/karpenter-provider-aws'
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - name: Deploy website
        uses: ./.github/actions/deploy-website
        with:
          role: arn:aws:iam::${{ vars.RELEASE_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
          region: ${{ vars.AMPLIFY_REGION }}
          amplify-app-id: ${{ vars.AMPLIFY_APP_ID }}
          amplify-branch-name: ${{ vars.BRANCH_NAME }}
          s3-bucket: ${{ vars.AMPLIFY_S3_BUCKET }}


================================================
FILE: .github/workflows/website-preview-trigger.yaml
================================================
name: WebsitePreviewTrigger
on:
  pull_request:
    types: [ opened, synchronize, reopened ]
jobs:
  preview-trigger:
    runs-on: ubuntu-latest
    if: github.repository == 'aws/karpenter-provider-aws'
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
      - name: Save info about the PR as an artifact for other workflows that run on workflow_run to download them
        env:
          PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
          COMMIT_ID: ${{ github.event.pull_request.head.sha }}
        run: |
          mkdir -p /tmp/artifacts
          { echo "$PULL_REQUEST_NUMBER"; echo "$COMMIT_ID"; } >> /tmp/artifacts/website-metadata.txt
          cat /tmp/artifacts/website-metadata.txt
      - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
        with:
          name: artifacts
          path: /tmp/artifacts


================================================
FILE: .github/workflows/website-preview.yaml
================================================
name: Deploy Website Preview to Amplify
on:
  workflow_run:
    workflows: [ WebsitePreviewTrigger ]
    types: [ completed ]
jobs:
  preview:
    permissions:
      id-token: write
      contents: read
      pull-requests: write
      statuses: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - uses: ./.github/actions/download-artifact
      - id: website-metadata
        run: |
          pr_number="$(head -n 1 /tmp/artifacts/website-metadata.txt)"
          pr_commit="$(tail -n 1 /tmp/artifacts/website-metadata.txt)"
          {
            echo PR_COMMIT="$pr_commit"
            echo PR_NUMBER="$pr_number"
            echo BRANCH_NAME="pr-$pr_number"
          } >> "$GITHUB_ENV"
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          ref: ${{ env.PR_COMMIT }}
      - uses: ./.github/actions/commit-status/start
        with:
          name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
          git_ref: ${{ env.PR_COMMIT }}
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
        with:
          role-to-assume: arn:aws:iam::${{ vars.RELEASE_PREVIEW_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
          aws-region: ${{ vars.AMPLIFY_REGION }}
      - name: Get preview URL
        run: |
          APP_DOMAIN=$(aws amplify get-app --app-id ${{ vars.AMPLIFY_APP_ID_PREVIEW }} --query 'app.defaultDomain' --output text)
          PREVIEW_URL="https://${{ env.BRANCH_NAME }}.$APP_DOMAIN"
          echo PREVIEW_URL="$PREVIEW_URL" >> "$GITHUB_ENV"
      - name: Deploy website
        uses: ./.github/actions/deploy-website
        with:
          role: arn:aws:iam::${{ vars.RELEASE_PREVIEW_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
          region: ${{ vars.AMPLIFY_REGION }}
          amplify-app-id: ${{ vars.AMPLIFY_APP_ID_PREVIEW }}
          amplify-branch-name: ${{ env.BRANCH_NAME }}
          s3-bucket: ${{ vars.AMPLIFY_S3_BUCKET_BETA }}
          s3-prefix: pr-${{ env.PR_NUMBER }}/
          hugo-base-url: ${{ env.PREVIEW_URL }}
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        env:
          PREVIEW_URL: ${{ env.PREVIEW_URL }}
          PR_COMMIT: ${{ env.PR_COMMIT }}
        with:
          script: |
            const commentBody = `**Preview deployment ready!**
            
            **Preview URL:** ${process.env.PREVIEW_URL}
            
            Built from commit \`${process.env.PR_COMMIT}\``;
            
            const existingComment = (await github.rest.issues.listComments({
              issue_number: process.env.PR_NUMBER,
              owner: context.repo.owner,
              repo: context.repo.repo,
            })).data.find(comment => 
              comment.user.login === 'github-actions[bot]' && 
              comment.body.includes('**Preview deployment ready!**')
            );
            
            if (existingComment) {
              await github.rest.issues.updateComment({
                comment_id: existingComment.id,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body: commentBody
              });
            } else {
              await github.rest.issues.createComment({
                issue_number: process.env.PR_NUMBER,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body: commentBody
              });
            }
      - if: always()
        uses: ./.github/actions/commit-status/end
        with:
          name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
          git_ref: ${{ env.PR_COMMIT }}


================================================
FILE: .gitignore
================================================
# Go toolchain
coverage.out
coverage.html
*.test
*.cpuprofile
*.heapprofile
go.work
go.work.sum

# Environment
.idea
.vscode
.DS_Store

# Project Specific
*.csv

# Binary output
karpenter-provider-aws-*

================================================
FILE: .gitmodules
================================================


================================================
FILE: .golangci.yaml
================================================
version: "2"
run:
  tests: true
  timeout: 5m
linters:
  enable:
    - asciicheck
    - bidichk
    - copyloopvar
    - errorlint
    - gocyclo
    - goheader
    - gosec
    - misspell
    - nilerr
    - revive
    - staticcheck
    - tparallel
    - unconvert
    - unparam
  disable:
    - prealloc
  settings:
    gocyclo:
      min-complexity: 11
    goheader:
      template: |-
        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.
    govet:
      disable:
        - fieldalignment
      enable-all: true
    misspell:
      locale: US
    revive:
      rules:
        - name: dot-imports
          disabled: true
    staticcheck:
      dot-import-whitelist:
        - github.com/onsi/ginkgo/v2
        - github.com/onsi/gomega
  exclusions:
    generated: lax
    presets:
      - comments
      - common-false-positives
      - legacy
      - std-error-handling
    rules:
      - linters:
          - goheader
        path: zz_(.+)\.go
      - path: (.+)\.go$
        text: declaration of "(err|ctx)" shadows declaration at
    paths:
      - tools
      - website
      - hack
      - charts
      - designs
      - third_party$
      - builtin$
      - examples$
issues:
  fix: true
formatters:
  enable:
    - goimports
  settings:
    goimports:
      local-prefixes:
        - github.com/aws/karpenter-provider-aws
  exclusions:
    generated: lax
    paths:
      - tools
      - website
      - hack
      - charts
      - designs
      - third_party$
      - builtin$
      - examples$


================================================
FILE: .ko.yaml
================================================
defaultBaseImage: public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base
defaultPlatforms:
  - linux/arm64
  - linux/amd64


================================================
FILE: ADOPTERS.md
================================================
# Who is using Karpenter?
Karpenter has a variety of users and use cases for scaling Kubernetes.
Many customers want to learn from others who have already implemented Karpenter in their environments.

The following is a self-reported list of users to help identify adoption and points of contact.

## Community
If you would like to ask question from the community please join the [Karpenter slack channel in the Kubernetes Slack](https://kubernetes.slack.com/archives/C02SFFZSA2K) or join the [Karpenter working group](https://karpenter.sh/docs/contributing/working-group/) bi-weekly calls.

## Add yourself
If you are using Karpenter please consider adding yourself as a user by opening a pull request to this file.
If you are open to others contacting you about your use of Karpenter on Slack, add your Slack name as well.

## Adopters (Alphabetical)

| Organization | Description | Contacts | Link |
| --- | --- | --- | --- |
| Amazon, Inc. | Scaling production workloads and batch jobs in all AWS regions | `@Alex Kestner`, `@Ellis Tarn` | [Introducing Karpenter](https://aws.amazon.com/blogs/aws/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler/) |
| Airtel Digital Ltd. | Karpenter for all kind of spiky and base workload and to increase spot coverage. | `@Sagar Arora` | [Homepage](https://www.wynk.in)
| Anthropic | Better utilizing mixes of instance types for more reliable capacity | N/A | [Homepage](https://anthropic.com) |
| AppsFlyer | Managing statefull workloads like Kafka and more | `@alicvsroxas` `@danielvrog`| [Homepage](https://www.appsflyer.com/)|
| Astradot | Using Karpenter on all K8s clusters in production and staging | N/A | [Homepage](https://astradot.com) |
| Beeswax | Using Karpenter to scale our high load AdTech platform efficiently | `@James Wojewoda` | [Homepage](https://www.beeswax.com) |
| Cabify | Replace cluster-autoscaler in our EKS clusters | N/A | [Homepage](https://tech.cabify.com) |
| Canva | Using Karpetner to scale CPU and GPU workloads on EKS | `@groodt` | [Canva](https://www.canva.com/) |
| Cloud Posse, LLC | Karpenter ships out-of-the-box in our Terraform Blueprint for EKS and is offered as part of our comprehensive multi-account [AWS reference architecture](https://cloudposse.com/reference-architecture/). Everything is Open Source (APACHE2). | `@osterman` | [Karpenter : The Cloud Posse Developer Hub](https://docs.cloudposse.com/components/catalog/aws/eks/karpenter/) |
| Codefresh | Juggling workloads for the SAAS CD/GitOps offering | `@Yonatan Koren`, `@Ilia Medvedev` | [Codefresh](https://codefresh.io/) |
| Conveyor | Using karpenter to scale our customers data pipelines on EKS | `@stijndehaes` | [Conveyor](https://conveyordata.com/) |
| Coralogix   | Using Karpenter on all of our EKS K8S Clusters in multi-tenant high scale production environments | `@doryer` | [Coralogix](https://coralogix.com/) |
| Cordial   | Using Karpenter to scale multiple EKS clusters quickly | `@dschaaff` | [Cordial](https://cordial.com) |
| Dig Security | Protecting our customers data - Using Karpenter to manage production and development workloads on EKS, We are using only Spot Instances in production. | `@Shahar Danus` | [Dig Security](https://dig.security/) |
| Docker | Using Karpenter to scale Docker Hub on our EKS clusters | N/A | [Docker](https://www.docker.com) |
| GlobalDots | Using Karpenter to scale Kubernetes clusters for a lot of our clients & for internal needs | `@vainkop` | [GlobalDots](https://globaldots.com) |
| Grafana Labs | Using Karpenter as our Autoscaling tool on EKS | `@paulajulve`, `@logyball` | [Homepage](https://grafana.com/) & [Blog](https://grafana.com/blog/2023/11/09/how-grafana-labs-switched-to-karpenter-to-reduce-costs-and-complexities-in-amazon-eks/) |
| Hazelcast | Running Hazelcast Cloud workloads on EKS with Karpenter—fast provisioning, intelligent consolidation, and resilience under spiky traffic. | `@atilsensalduz`, `@taylanerden` | [Hazelcast](https://hazelcast.com/) |
| H2O.ai | Dynamically scaling CPU and GPU nodes for AI workloads  | `@Ophir Zahavi`, `@Asaf Oren` | [H2O.ai](https://h2o.ai/) |
| HENNGE K.K. | Dynamically scaling production workloads in Tokyo region | `@furqan.habibi`, `@Hans Gunawan` | [HENNGE](https://hennge.com/global/) |
| Homa | Using Karpenter to manage dynamically big instances and save cost effectively with disruptions | `@afreyermuth98`, `@alexbescond` | [Homa](https://www.homagames.com/) |
| idealo | Scaling multi-arch IPv6 clusters hosting web and event-driven applications | `@Heiko Rothe` | [Homepage](https://www.idealo.de) |
| Kaltura | Using karpenter to deliver video to millions of end users | `@Ido Ziv` | [Homepage](https://corp.kaltura.com/) |
| Livspace | Replacement for cluster autoscaler on production and staging EKS clusters | `@praveen-livspace` | [Homepage](https://www.livspace.com) |
| Nexxiot | Easier, Safer, Cleaner Global Transportation - Using Karpenter to manage EKS nodes | `@Alex Berger` | [Homepage](https://nexxiot.com/) |
| OccMundial | Using karpenter to manage our production workloads, using the dynamic scaling according to workload that needs to scale.  | `@parraletz` | [Homepage](https://www.occ.com.mx) |
| Omaze | Intelligently using Karpenter's autoscaling to power our platforms | `@devopsidiot` | [Homepage](https://www.omaze.com/) |
| PITS Global Data Recovery Services | Used to manage continuous integration and continuous delivery/deployment workflows. | N/A | [PITS Global Data Recovery Services](https://www.pitsdatarecovery.net/) |
| PlanetScale | Leveraging Karpenter to dynamically deploy serverless MySQL workloads. | `@jtcunning` | [Homepage](https://www.planetscale.com/) |
| Postnord | Using Karpenter for Node Lifecycle Management & Autoscaling. | `@dhaval-vithalani`, `@christianOps`, `@sjam11`  | [Postnord](https://www.postnord.com/) |
| QuestDB | Using Karpenter for the service nodes of the QuestBD Cloud (time-series database). | [questdb slack group](https://slack.questdb.io/) | [QuestDB](https://questdb.io/) |
| Rapid7 | Using Karpenter across all of our Kubernetes infrastructure for efficient autoscaling, both in terms of speed and cost | `@arobinson`, `@Ross Kirk`, `@Ryan Williams` | [Homepage](https://www.rapid7.com/) |
| Sendcloud | Using Karpenter to scale our k8s clusters for Europe’s #1 shipping automation platform  | N/A | [Homepage](https://www.sendcloud.com/) |
| Sentra | Using Karpenter to scale our EKS clusters, running our platform and workflows while maximizing cost-efficiency with minimal operational overhead | `@Roei Jacobovich` | [Homepage](https://sentra.io/) |
| Sophotech | We rely on Karpenter to keep our clients' Kubernetes clusters fast, efficient, and cost-optimized. It is an irreplaceable part of our infrastructure toolkit, instantly scaling nodes to match demand. Once you use Karpenter, there is no going back. | `@archy-rock3t-cloud` | [Homepage](https://sopho.tech) |
| SternumIOT | Using Karpenter to efficiently autoscale & manage our EKS clusters with GitOps, optimizing node lifecycle management for both performance and cost-effectiveness across our Kubernetes workloads | `@itayvolo` `@amitde69` | [SternumIOT](https://sternumiot.com/) |
| Stone Pagamentos | Using Karpenter to do smart sizing of our clusters  | `@fabiano-amaral` | [Stone Pagamentos](https://www.stone.com.br/) |
| Stytch | Powering the scaling needs of Stytch's authentication and user-management APIs  | `@Elijah Chanakira`, `@Ovadia Harary` | [Homepage](https://www.stytch.com/) |
| Superbexperience | Using Karpenter to scale the k8s clusters running our Guest Experience Management platform  | `@Wernich Bekker` | [Homepage](https://www.superbexperience.com/) |
| Target Australia | Using Karpenter to manage (scale, auto update etc) the containerised (EKS) compute that powers much of the Target Online platform | `@gazal-k` | [Target Australia Online Shopping](https://www.target.com.au) |
| The Scale Factory | Using Karpenter (controllers on EC2/Fargate) to efficiently scale K8s workloads and empowering our customer teams to do the same  | `@marko` | [Homepage](https://www.scalefactory.com) |
| Tyk Cloud | Scaling workloads for the Cloud Free plan  | `@Artem Hluvchynskyi`, `@gowtham` | [Tyk Cloud](https://tyk.io/cloud/) |
| VictoriaMetrics Cloud | Managed Time Series Database Services from VictoriaMetrics | `@Max G` | [VictoriaMetrics Cloud](https://victoriametrics.com/products/managed/) |
| Wehkamp | Using Karpenter to scale the EKS clusters for our e-commerce platforms | `@ChrisV` | [Wehkamp](https://www.wehkamp.nl) & [Wehkamp Techblog](https://medium.com/wehkamp-techblog)|
| Whoosh | Using Karpenter to scale the EKS clusters for many purposes | `@vainkop` | [Whoosh](https://whoosh.bike) |
| Next Insurance | Using Karpenter to manage the nodes in all our EKS clusters, including dev and prod, on demand and spots | `@moshebs` | [Homepage](https://www.nextinsurance.com)|
| Grover Group GmbH | We use Karpenter for efficient and cost effective scaling of our nodes in all of our EKS clusters | `@suraj2410` | [Homepage](https://www.grover.com/de-en) & [Engineering Techblog](https://engineering.grover.com)|
| Legit Security | We run Karpenter across all our EKS clusters to ensure efficient and cost-effective scaling across our infrastructure | `@Tal Balash`, `@Matan Ryngler` | [Homepage](https://www.legitsecurity.com)|
| Logz.io | Using Karpenter in all of our EKS clusters for efficient and cost effective scaling of all our K8s workloads | `@pincher95`, `@Samplify` | [Homepage](https://logz.io/)|
| X3M ads | We have been using Karpenter for (almost) all our workloads since 2023 | `@mreparaz`, `@fmansilla`, `@mrmartinez95` | [Homepage](https://x3mads.com) |


================================================
FILE: CODEOWNERS
================================================
# Require approvals from someone in the owner team before merging
# More information here: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners

* @aws/karpenter


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
The Karpenter project follows the [CNCF Community Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md).


================================================
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
================================================
CLUSTER_NAME ?= $(shell kubectl config view --minify -o jsonpath='{.clusters[].name}' | rev | cut -d"/" -f1 | rev | cut -d"." -f1)

## Inject the app version into operator.Version
LDFLAGS ?= -ldflags=-X=sigs.k8s.io/karpenter/pkg/operator.Version=$(shell git describe --tags --always | cut -d"v" -f2)

GOFLAGS += $(LDFLAGS)
WITH_GOFLAGS = GOFLAGS="$(GOFLAGS)"

## Extra helm options
CLUSTER_ENDPOINT ?= $(shell kubectl config view --minify -o jsonpath='{.clusters[].cluster.server}')
AWS_ACCOUNT_ID ?= $(shell aws sts get-caller-identity --query Account --output text)
KARPENTER_IAM_ROLE_ARN ?= arn:aws:iam::${AWS_ACCOUNT_ID}:role/${CLUSTER_NAME}-karpenter
HELM_OPTS ?= --set serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn=${KARPENTER_IAM_ROLE_ARN} \
      		--set settings.clusterName=${CLUSTER_NAME} \
			--set settings.interruptionQueue=${CLUSTER_NAME} \
			--set controller.resources.requests.cpu=1 \
			--set controller.resources.requests.memory=1Gi \
			--set controller.resources.limits.cpu=1 \
			--set controller.resources.limits.memory=1Gi \
			--set settings.featureGates.nodeRepair=true \
			--set settings.featureGates.reservedCapacity=true \
			--set settings.featureGates.spotToSpotConsolidation=true \
			--set settings.featureGates.nodeOverlay=true \
			--set settings.featureGates.staticCapacity=true \
			--set settings.preferencePolicy=Ignore \
			--set logLevel=debug \
			--create-namespace

# CR for local builds of Karpenter
KARPENTER_NAMESPACE ?= kube-system
KARPENTER_VERSION ?= $(shell git tag --sort=committerdate | tail -1 | cut -d"v" -f2)
KO_DOCKER_REPO ?= ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/dev
KOCACHE ?= ~/.ko

# Common Directories
MOD_DIRS = $(shell find . -path "./website" -prune -o -name go.mod -type f -print | xargs dirname)
KARPENTER_CORE_DIR = $(shell go list -m -f '{{ .Dir }}' sigs.k8s.io/karpenter)

# TEST_SUITE enables you to select a specific test suite directory to run "make e2etests" against
TEST_SUITE ?= "..."
TMPFILE := $(shell mktemp)

# Filename when building the binary controller only
GOARCH ?= $(shell go env GOARCH)
BINARY_FILENAME = karpenter-provider-aws-$(GOARCH)

help: ## Display help
	@awk 'BEGIN {FS = ":.*##"; printf "Usage:\n  make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

presubmit: verify test ## Run all steps in the developer loop

ci-test: test coverage ## Runs tests and submits coverage

ci-non-test: verify licenses vulncheck ## Runs checks other than tests

run: ## Run Karpenter controller binary against your local cluster with latest CRD's
	kubectl apply -f ./pkg/apis/crds/
	SYSTEM_NAMESPACE=${KARPENTER_NAMESPACE} \
		KUBERNETES_MIN_VERSION="1.19.0-0" \
		DISABLE_LEADER_ELECTION=true \
		CLUSTER_NAME=${CLUSTER_NAME} \
		INTERRUPTION_QUEUE=${CLUSTER_NAME} \
		FEATURE_GATES="SpotToSpotConsolidation=true,NodeOverlay=true,StaticCapacity=true" \
		LOG_LEVEL="debug" \
		go run ./cmd/controller/main.go

test: ## Run tests
	go test ./pkg/... \
		-cover -coverprofile=coverage.out -outputdir=. -coverpkg=./... \
		--ginkgo.focus="${FOCUS}" \
		--ginkgo.randomize-all \
		--ginkgo.vv

deflake: ## Run randomized, racing tests until the test fails to catch flakes
	ginkgo \
		--race \
		--focus="${FOCUS}" \
		--randomize-all \
		--until-it-fails \
		-v \
		./pkg/...

e2etests: ## Run the e2e suite against your local cluster
	cd test && CLUSTER_ENDPOINT=${CLUSTER_ENDPOINT} \
		CLUSTER_NAME=${CLUSTER_NAME} \
		INTERRUPTION_QUEUE=${CLUSTER_NAME} \
		go test \
		-p 1 \
		-count 1 \
		-timeout 3.25h \
		-v \
		./suites/$(shell echo $(TEST_SUITE) | tr A-Z a-z)/... \
		--ginkgo.focus="${FOCUS}" \
		--ginkgo.timeout=3h \
		--ginkgo.grace-period=3m \
		--ginkgo.vv

upstream-e2etests: tidy download
	CLUSTER_NAME=${CLUSTER_NAME} envsubst < $(shell pwd)/test/pkg/environment/aws/default_ec2nodeclass.yaml > ${TMPFILE}
	cd $(KARPENTER_CORE_DIR) && go test \
		-count 1 \
		-timeout 3.25h \
		-v \
		./test/suites/regression/... \
		--ginkgo.focus="${FOCUS}" \
		--ginkgo.timeout=3h \
		--ginkgo.grace-period=5m \
		--ginkgo.vv \
		--default-nodeclass="$(TMPFILE)"\
		--default-nodepool="$(shell pwd)/test/pkg/environment/aws/default_nodepool.yaml"

e2etests-deflake: ## Run the e2e suite against your local cluster
	cd test && CLUSTER_NAME=${CLUSTER_NAME} ginkgo \
		--focus="${FOCUS}" \
		--timeout=3h \
		--grace-period=3m \
		--until-it-fails \
		--vv \
		./suites/$(shell echo $(TEST_SUITE) | tr A-Z a-z) \

benchmark:
	go test -tags=test_performance -run=NoTests -bench=. ./...

coverage:
	go tool cover -html coverage.out -o coverage.html

verify: tidy download ## Verify code. Includes dependencies, linting, formatting, etc
	go generate ./...
	hack/boilerplate.sh
	cp  $(KARPENTER_CORE_DIR)/pkg/apis/crds/* pkg/apis/crds
	hack/validation/kubelet.sh
	bash -c 'source ./hack/validation/requirements.sh && injectDomainRequirementRestrictions "karpenter.k8s.aws"'
	bash -c 'source ./hack/validation/labels.sh && injectDomainLabelRestrictions "karpenter.k8s.aws"'
	cp pkg/apis/crds/* charts/karpenter-crd/templates
	hack/mutation/crd_annotations.sh
	hack/github/dependabot.sh
	$(foreach dir,$(MOD_DIRS),cd $(dir) && golangci-lint run $(newline))
	@git diff --quiet ||\
		{ echo "New file modification detected in the Git working tree. Please check in before commit."; git --no-pager diff --name-only | uniq | awk '{print "  - " $$0}'; \
		if [ "${CI}" = true ]; then\
			exit 1;\
		fi;}
	@echo "Validating codegen/docgen build scripts..."
	@find hack/code hack/docs -name "*.go" -type f -print0 | xargs -0 -I {} go build -o /dev/null {}
	actionlint -oneline

vulncheck: ## Verify code vulnerabilities
	@govulncheck ./pkg/...

licenses: download ## Verifies dependency licenses
	# TODO: remove nodeadm check once license is updated
	! go-licenses csv ./... | grep -v -e 'MIT' -e 'Apache-2.0' -e 'BSD-3-Clause' -e 'BSD-2-Clause' -e 'ISC' -e 'MPL-2.0' -e 'github.com/awslabs/amazon-eks-ami/nodeadm'

image: ## Build the Karpenter controller images using ko build
	$(eval CONTROLLER_IMG=$(shell $(WITH_GOFLAGS) KOCACHE=$(KOCACHE) KO_DOCKER_REPO="$(KO_DOCKER_REPO)" ko build --bare github.com/aws/karpenter-provider-aws/cmd/controller))
	$(eval IMG_REPOSITORY=$(shell echo $(CONTROLLER_IMG) | cut -d "@" -f 1 | cut -d ":" -f 1))
	$(eval IMG_TAG=$(shell echo $(CONTROLLER_IMG) | cut -d "@" -f 1 | cut -d ":" -f 2 -s))
	$(eval IMG_DIGEST=$(shell echo $(CONTROLLER_IMG) | cut -d "@" -f 2))

binary: ## Build the Karpenter controller binary using go build
	go build $(GOFLAGS) -o $(BINARY_FILENAME) ./cmd/controller/...

apply: verify image ## Deploy the controller from the current state of your git repository into your ~/.kube/config cluster
	kubectl apply -f ./pkg/apis/crds/
	helm upgrade --install karpenter charts/karpenter --namespace ${KARPENTER_NAMESPACE} \
        $(HELM_OPTS) \
        --set controller.image.repository=$(IMG_REPOSITORY) \
        --set controller.image.tag=$(IMG_TAG) \
        --set controller.image.digest=$(IMG_DIGEST)

install:  ## Deploy the latest released version into your ~/.kube/config cluster
	@echo Upgrading to ${KARPENTER_VERSION}
	helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter --version ${KARPENTER_VERSION} --namespace ${KARPENTER_NAMESPACE} \
		$(HELM_OPTS)

delete: ## Delete the controller from your ~/.kube/config cluster
	helm uninstall karpenter --namespace ${KARPENTER_NAMESPACE}

docgen: ## Generate docs
	KARPENTER_CORE_DIR=$(KARPENTER_CORE_DIR) $(WITH_GOFLAGS) ./hack/docgen.sh

codegen: ## Auto generate files based on AWS APIs response
	$(WITH_GOFLAGS) ./hack/codegen.sh

stable-release-pr: ## Generate PR for stable release
	$(WITH_GOFLAGS) ./hack/release/stable-pr.sh

snapshot: ## Builds and publishes snapshot release
	$(WITH_GOFLAGS) ./hack/release/snapshot.sh

release: ## Builds and publishes stable release
	$(WITH_GOFLAGS) ./hack/release/release.sh

prepare-website: ## prepare the website for release
	./hack/release/prepare-website.sh

toolchain: ## Install developer toolchain
	./hack/toolchain.sh

issues: ## Run GitHub issue analysis scripts
	pip install -r ./hack/github/requirements.txt
	@echo "Set GH_TOKEN env variable to avoid being rate limited by Github"
	./hack/github/feature_request_reactions.py > "karpenter-feature-requests-$(shell date +"%Y-%m-%d").csv"
	./hack/github/label_issue_count.py > "karpenter-labels-$(shell date +"%Y-%m-%d").csv"

website: ## Serve the docs website locally
	cd website && npm install && hugo mod tidy && hugo server

tidy: ## Recursively "go mod tidy" on all directories where go.mod exists
	$(foreach dir,$(MOD_DIRS),cd $(dir) && go mod tidy $(newline))

download: ## Recursively "go mod download" on all directories where go.mod exists
	$(foreach dir,$(MOD_DIRS),cd $(dir) && go mod download $(newline))

update-karpenter: ## Update kubernetes-sigs/karpenter to latest
	go get -u sigs.k8s.io/karpenter@HEAD
	go mod tidy

.PHONY: deploy-cfn
deploy-cfn: ## Deploys the cloudformation stack defined in the docs preview directory
	aws cloudformation deploy \
		--stack-name "Karpenter-${CLUSTER_NAME}" \
		--template-file "./website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml" \
		--capabilities CAPABILITY_NAMED_IAM \
		--parameter-overrides "ClusterName=${CLUSTER_NAME}"


.PHONY: help presubmit ci-test ci-non-test run test deflake e2etests e2etests-deflake benchmark coverage verify vulncheck licenses image apply install delete docgen codegen stable-release-pr snapshot release prepare-website toolchain issues website tidy download update-karpenter

define newline


endef


================================================
FILE: NOTICE
================================================
Karpenter
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.


================================================
FILE: README.md
================================================
[![CI](https://github.com/aws/karpenter-provider-aws/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/aws/karpenter/actions/workflows/ci.yaml)
![GitHub stars](https://img.shields.io/github/stars/aws/karpenter-provider-aws)
![GitHub forks](https://img.shields.io/github/forks/aws/karpenter-provider-aws)
[![GitHub License](https://img.shields.io/badge/License-Apache%202.0-ff69b4.svg)](https://github.com/aws/karpenter-provider-aws/blob/main/LICENSE)
[![Go Report Card](https://goreportcard.com/badge/github.com/aws/karpenter-provider-aws)](https://goreportcard.com/report/github.com/aws/karpenter)
[![Coverage Status](https://coveralls.io/repos/github/aws/karpenter-provider-aws/badge.svg?branch=main)](https://coveralls.io/github/aws/karpenter?branch=main)
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/aws/karpenter-provider-aws/issues)

![](website/static/banner.png)

Karpenter is an open-source node provisioning project built for Kubernetes.
Karpenter improves the efficiency and cost of running workloads on Kubernetes clusters by:

* **Watching** for pods that the Kubernetes scheduler has marked as unschedulable
* **Evaluating** scheduling constraints (resource requests, nodeselectors, affinities, tolerations, and topology spread constraints) requested by the pods
* **Provisioning** nodes that meet the requirements of the pods
* **Removing** the nodes when the nodes are no longer needed

Come discuss Karpenter in the [#karpenter](https://kubernetes.slack.com/archives/C02SFFZSA2K) channel, in the [Kubernetes slack](https://slack.k8s.io/) or join the [Karpenter working group](https://karpenter.sh/docs/contributing/community-meetings/#working-group-meetings) bi-weekly calls. If you want to contribute to the Karpenter project, please refer to the Karpenter docs.

Check out the [Docs](https://karpenter.sh/docs/) to learn more.

## Talks
- 03/19/2024 [Harnessing Karpenter: Transforming Kubernetes Clusters with Argo Workflows](https://www.youtube.com/watch?v=rq57liGu0H4)
- 12/04/2023 [AWS re:Invent 2023 - Harness the power of Karpenter to scale, optimize & upgrade Kubernetes](https://www.youtube.com/watch?v=lkg_9ETHeks)
- 09/08/2022 [Workload Consolidation with Karpenter](https://youtu.be/BnksdJ3oOEs)
- 05/19/2022 [Scaling K8s Nodes Without Breaking the Bank or Your Sanity](https://www.youtube.com/watch?v=UBb8wbfSc34)
- 03/25/2022 [Karpenter @ AWS Community Day 2022](https://youtu.be/sxDtmzbNHwE?t=3931)
- 12/20/2021 [How To Auto-Scale Kubernetes Clusters With Karpenter](https://youtu.be/C-2v7HT-uSA)
- 11/30/2021 [Karpenter vs Kubernetes Cluster Autoscaler](https://youtu.be/3QsVRHVdOnM)
- 11/19/2021 [Karpenter @ Container Day](https://youtu.be/qxWJRUF6JJc)
- 05/14/2021 [Groupless Autoscaling with Karpenter @ Kubecon](https://www.youtube.com/watch?v=43g8uPohTgc)
- 05/04/2021 [Karpenter @ Container Day](https://youtu.be/MZ-4HzOC_ac?t=7137)


================================================
FILE: THIRD_PARTY_LICENSES
================================================
** go.uber.org/zap; v1.24.0 ---


Copyright (c) 2016-2017 Uber Technologies, Inc.

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.
------
** sigs.k8s.io/json; v0.0.0-20220713155537-f223a00ba0e2 ---


Files other than internal/golang/* licensed under:


                                 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.


------------------

internal/golang/* files licensed under:


Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

   * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
   * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
   * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
------
** github.com/aws/aws-sdk-go; v1.44.154 ---


AWS SDK for Go
Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Copyright 2014-2015 Stripe, Inc.

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.
------
** github.com/aws/karpenter-core; v0.22.2-0.20230124174026-a2d4c9b50fdb ---


Karpenter
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

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.
------
** github.com/grpc-ecosystem/grpc-gateway; v1.16.0 ---


Copyright (c) 2015, Gengo, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.

    * Neither the name of Gengo, Inc. nor the names of its
      contributors may be used to endorse or promote products derived from this
      software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
------
** github.com/kelseyhightower/envconfig; v1.4.0 ---


Copyright (c) 2013 Kelsey Hightower

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.
------
** github.com/matttproud/golang_protobuf_extensions; v1.0.2-0.20181231171920-c182affec369 ---


Copyright 2012 Matt T. Proud (matt.proud@gmail.com)

Apache Licens
Download .txt
gitextract___izru8g/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yaml
│   │   ├── documentation.yaml
│   │   └── feature.yaml
│   ├── actionlint-matcher.json
│   ├── actions/
│   │   ├── commit-status/
│   │   │   ├── end/
│   │   │   │   └── action.yaml
│   │   │   └── start/
│   │   │       └── action.yaml
│   │   ├── deploy-website/
│   │   │   └── action.yml
│   │   ├── download-artifact/
│   │   │   └── action.yaml
│   │   ├── e2e/
│   │   │   ├── cleanup/
│   │   │   │   └── action.yaml
│   │   │   ├── dump-logs/
│   │   │   │   └── action.yaml
│   │   │   ├── install-eksctl/
│   │   │   │   └── action.yaml
│   │   │   ├── install-helm/
│   │   │   │   └── action.yaml
│   │   │   ├── install-karpenter/
│   │   │   │   └── action.yaml
│   │   │   ├── install-prometheus/
│   │   │   │   ├── action.yaml
│   │   │   │   └── values.yaml
│   │   │   ├── run-tests-private-cluster/
│   │   │   │   └── action.yaml
│   │   │   ├── setup-cluster/
│   │   │   │   └── action.yaml
│   │   │   ├── slack/
│   │   │   │   ├── notify/
│   │   │   │   │   └── action.yaml
│   │   │   │   └── send-message/
│   │   │   │       └── action.yaml
│   │   │   └── upgrade-crds/
│   │   │       └── action.yaml
│   │   └── install-deps/
│   │       └── action.yaml
│   ├── dependabot.yaml
│   ├── pull-request-template.md
│   ├── security-notice.md
│   └── workflows/
│       ├── approval-comment.yaml
│       ├── ci-test.yaml
│       ├── ci.yaml
│       ├── codegen.yaml
│       ├── codeql-analysis.yaml
│       ├── dryrun-gen-pr.yaml
│       ├── dryrun-gen.yaml
│       ├── e2e-cleanup.yaml
│       ├── e2e-matrix-trigger.yaml
│       ├── e2e-matrix.yaml
│       ├── e2e-private-cluster-trigger.yaml
│       ├── e2e-scale-trigger.yaml
│       ├── e2e-soak-trigger.yaml
│       ├── e2e-upgrade.yaml
│       ├── e2e-version-compatibility-trigger.yaml
│       ├── e2e.yaml
│       ├── image-canary.yaml
│       ├── postsubmit.yaml
│       ├── release.yaml
│       ├── resolve-args.yaml
│       ├── resource-count.yaml
│       ├── snapshot-pr.yaml
│       ├── snapshot.yaml
│       ├── stale.yaml
│       ├── sweeper.yaml
│       ├── website-cleanup-preview.yaml
│       ├── website-deploy.yaml
│       ├── website-preview-trigger.yaml
│       └── website-preview.yaml
├── .gitignore
├── .gitmodules
├── .golangci.yaml
├── .ko.yaml
├── ADOPTERS.md
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── THIRD_PARTY_LICENSES
├── charts/
│   ├── index.yaml
│   ├── karpenter/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── README.md.gotmpl
│   │   ├── artifacthub-repo.yaml
│   │   ├── templates/
│   │   │   ├── _helpers.tpl
│   │   │   ├── aggregate-clusterrole.yaml
│   │   │   ├── clusterrole-core.yaml
│   │   │   ├── clusterrole.yaml
│   │   │   ├── deployment.yaml
│   │   │   ├── poddisruptionbudget.yaml
│   │   │   ├── role.yaml
│   │   │   ├── rolebinding.yaml
│   │   │   ├── service.yaml
│   │   │   ├── serviceaccount.yaml
│   │   │   └── servicemonitor.yaml
│   │   └── values.yaml
│   ├── karpenter-0.1.1.tgz
│   ├── karpenter-0.1.2.tgz
│   ├── karpenter-0.1.3.tgz
│   ├── karpenter-0.10.0.tgz
│   ├── karpenter-0.10.1.tgz
│   ├── karpenter-0.11.0.tgz
│   ├── karpenter-0.11.1.tgz
│   ├── karpenter-0.12.0.tgz
│   ├── karpenter-0.12.1.tgz
│   ├── karpenter-0.13.0.tgz
│   ├── karpenter-0.13.1.tgz
│   ├── karpenter-0.13.2.tgz
│   ├── karpenter-0.14.0-rc.0.tgz
│   ├── karpenter-0.14.0.tgz
│   ├── karpenter-0.15.0.tgz
│   ├── karpenter-0.16.0.tgz
│   ├── karpenter-0.16.1.tgz
│   ├── karpenter-0.16.2.tgz
│   ├── karpenter-0.16.3.tgz
│   ├── karpenter-0.2.0.tgz
│   ├── karpenter-0.2.1.tgz
│   ├── karpenter-0.2.2.tgz
│   ├── karpenter-0.2.3.tgz
│   ├── karpenter-0.2.4.tgz
│   ├── karpenter-0.2.5.tgz
│   ├── karpenter-0.2.6.tgz
│   ├── karpenter-0.2.7.tgz
│   ├── karpenter-0.2.8.tgz
│   ├── karpenter-0.2.9.tgz
│   ├── karpenter-0.3.0.tgz
│   ├── karpenter-0.3.1.tgz
│   ├── karpenter-0.3.2.tgz
│   ├── karpenter-0.3.3.tgz
│   ├── karpenter-0.3.4.tgz
│   ├── karpenter-0.4.0.tgz
│   ├── karpenter-0.4.1.tgz
│   ├── karpenter-0.4.2.tgz
│   ├── karpenter-0.4.3.tgz
│   ├── karpenter-0.5.0.tgz
│   ├── karpenter-0.5.1.tgz
│   ├── karpenter-0.5.2.tgz
│   ├── karpenter-0.5.3.tgz
│   ├── karpenter-0.5.4.tgz
│   ├── karpenter-0.5.5.tgz
│   ├── karpenter-0.5.6.tgz
│   ├── karpenter-0.6.0.tgz
│   ├── karpenter-0.6.1.tgz
│   ├── karpenter-0.6.2.tgz
│   ├── karpenter-0.6.3.tgz
│   ├── karpenter-0.6.4.tgz
│   ├── karpenter-0.6.5.tgz
│   ├── karpenter-0.7.0.tgz
│   ├── karpenter-0.7.1.tgz
│   ├── karpenter-0.7.2.tgz
│   ├── karpenter-0.7.3.tgz
│   ├── karpenter-0.8.0.tgz
│   ├── karpenter-0.8.1.tgz
│   ├── karpenter-0.8.2.tgz
│   ├── karpenter-0.9.0-rc.0.tgz
│   ├── karpenter-0.9.0-rc.1.tgz
│   ├── karpenter-0.9.0.tgz
│   ├── karpenter-0.9.1.tgz
│   ├── karpenter-crd/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── README.md.gotmpl
│   │   ├── artifacthub-repo.yaml
│   │   ├── templates/
│   │   │   ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│   │   │   ├── karpenter.sh_nodeclaims.yaml
│   │   │   ├── karpenter.sh_nodeoverlays.yaml
│   │   │   └── karpenter.sh_nodepools.yaml
│   │   └── values.yaml
│   └── karpenter-v0-66626bc5e21dc14b2cceaaeb3ad5933c0b4e2046.tgz
├── cmd/
│   └── controller/
│       └── main.go
├── designs/
│   ├── README.md
│   ├── ami-selector.md
│   ├── aws-launch-templates-options.md
│   ├── aws-launch-templates-v2.md
│   ├── bin-packing.md
│   ├── capacity-block-support.md
│   ├── consolidation.md
│   ├── custom-user-data-and-amis.md
│   ├── deprecated-ami-observability.md
│   ├── deprovisioning.md
│   ├── integration-testing.md
│   ├── interruption-handling.md
│   ├── limits.md
│   ├── metrics.md
│   ├── node-ownership.md
│   ├── node-upgrades.md
│   ├── odcr.md
│   ├── provisioner-priority.md
│   ├── runtime-defaulting.md
│   ├── termination.md
│   ├── unmanaged-launch-template-removal.md
│   ├── v1-api.md
│   ├── v1-roadmap.md
│   ├── v1alpha4-api.md
│   ├── v1beta1-api.md
│   └── v1beta1-full-changelist.md
├── examples/
│   ├── README.md
│   ├── v1/
│   │   ├── 100-cpu-limit.yaml
│   │   ├── al2-custom-ami.yaml
│   │   ├── al2-custom-userdata.yaml
│   │   ├── al2-kubelet-log-query.yaml
│   │   ├── al2023-custom-userdata.yaml
│   │   ├── bottlerocket.yaml
│   │   ├── br-custom-userdata.yaml
│   │   ├── custom-family-with-alias.yaml
│   │   ├── custom-family.yaml
│   │   ├── general-purpose.yaml
│   │   ├── instance-store-ephemeral-storage.yaml
│   │   ├── large-instances.yaml
│   │   ├── max-node-lifetime.yaml
│   │   ├── min-values-family.yaml
│   │   ├── min-values-multiple-keys.yaml
│   │   ├── multiple-arch.yaml
│   │   ├── multiple-ebs.yaml
│   │   ├── spot.yaml
│   │   ├── windows-2019.yaml
│   │   ├── windows-2022.yaml
│   │   ├── windows-2025.yaml
│   │   └── windows-custom-userdata.yaml
│   └── workloads/
│       ├── arm64.yaml
│       ├── disruption-budget.yaml
│       ├── gpu-amd.yaml
│       ├── gpu-nvidia.yaml
│       ├── inflate.yaml
│       ├── neuron.yaml
│       ├── prefer-arm.yaml
│       ├── spot.yaml
│       ├── spread-hostname-zone.yaml
│       ├── spread-hostname.yaml
│       └── spread-zone.yaml
├── go.mod
├── go.sum
├── hack/
│   ├── boilerplate.go.txt
│   ├── boilerplate.sh
│   ├── code/
│   │   ├── bandwidth_gen/
│   │   │   ├── example/
│   │   │   │   └── gp.html
│   │   │   └── main.go
│   │   ├── instancetype_testdata_gen/
│   │   │   └── main.go
│   │   ├── prices_gen/
│   │   │   └── main.go
│   │   └── vpc_limits_gen/
│   │       └── main.go
│   ├── codegen.sh
│   ├── docgen.sh
│   ├── docs/
│   │   ├── compatibilitymatrix_gen/
│   │   │   ├── compatibility.yaml
│   │   │   └── main.go
│   │   ├── configuration_gen/
│   │   │   └── main.go
│   │   ├── instancetypes_gen/
│   │   │   └── main.go
│   │   ├── metrics_gen/
│   │   │   └── main.go
│   │   ├── parse-redirects/
│   │   │   ├── go.mod
│   │   │   └── main.go
│   │   └── version_compatibility_gen/
│   │       └── main.go
│   ├── github/
│   │   ├── community-contributors.sh
│   │   ├── count-flakes.sh
│   │   ├── dependabot.sh
│   │   ├── feature_request_reactions.py
│   │   ├── label_issue_count.py
│   │   └── requirements.txt
│   ├── image_canary.sh
│   ├── mutation/
│   │   └── crd_annotations.sh
│   ├── release/
│   │   ├── common.sh
│   │   ├── prepare-website.sh
│   │   ├── release.sh
│   │   ├── snapshot.sh
│   │   └── stable-pr.sh
│   ├── toolchain.sh
│   ├── tools/
│   │   ├── allocatable_diff/
│   │   │   ├── README.md
│   │   │   └── main.go
│   │   └── launchtemplate_counter/
│   │       └── main.go
│   └── validation/
│       ├── kubelet.sh
│       ├── labels.sh
│       └── requirements.sh
├── kwok/
│   ├── Makefile
│   ├── README.md
│   ├── cloudprovider/
│   │   └── cloudprovider.go
│   ├── ec2/
│   │   ├── ec2.go
│   │   └── ratelimiting.go
│   ├── main.go
│   ├── manifests/
│   │   └── clusterrole.yaml
│   ├── operator/
│   │   └── operator.go
│   └── strategy/
│       └── strategy.go
├── pkg/
│   ├── apis/
│   │   ├── apis.go
│   │   ├── crds/
│   │   │   ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│   │   │   ├── karpenter.sh_nodeclaims.yaml
│   │   │   ├── karpenter.sh_nodeoverlays.yaml
│   │   │   └── karpenter.sh_nodepools.yaml
│   │   └── v1/
│   │       ├── doc.go
│   │       ├── ec2nodeclass.go
│   │       ├── ec2nodeclass_defaults.go
│   │       ├── ec2nodeclass_hash_test.go
│   │       ├── ec2nodeclass_status.go
│   │       ├── ec2nodeclass_validation_cel_test.go
│   │       ├── labels.go
│   │       ├── nodepool_validation_cel_test.go
│   │       ├── suite_test.go
│   │       └── zz_generated.deepcopy.go
│   ├── aws/
│   │   └── sdk.go
│   ├── batcher/
│   │   ├── batcher.go
│   │   ├── createfleet.go
│   │   ├── createfleet_test.go
│   │   ├── describeinstances.go
│   │   ├── describeinstances_test.go
│   │   ├── ec2api.go
│   │   ├── metrics.go
│   │   ├── suite_test.go
│   │   ├── terminateinstances.go
│   │   └── terminateinstances_test.go
│   ├── cache/
│   │   ├── cache.go
│   │   ├── suite_test.go
│   │   └── unavailableofferings.go
│   ├── cloudprovider/
│   │   ├── cloudprovider.go
│   │   ├── drift.go
│   │   ├── events/
│   │   │   └── events.go
│   │   └── suite_test.go
│   ├── controllers/
│   │   ├── capacityreservation/
│   │   │   ├── capacitytype/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   └── expiration/
│   │   │       ├── controller.go
│   │   │       └── suite_test.go
│   │   ├── controllers.go
│   │   ├── interruption/
│   │   │   ├── controller.go
│   │   │   ├── events/
│   │   │   │   └── events.go
│   │   │   ├── interruption_benchmark_test.go
│   │   │   ├── messages/
│   │   │   │   ├── capacityreservationinterruption/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── noop/
│   │   │   │   │   └── model.go
│   │   │   │   ├── rebalancerecommendation/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── scheduledchange/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── spotinterruption/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   ├── statechange/
│   │   │   │   │   ├── model.go
│   │   │   │   │   └── parser.go
│   │   │   │   └── types.go
│   │   │   ├── metrics.go
│   │   │   ├── parser.go
│   │   │   └── suite_test.go
│   │   ├── metrics/
│   │   │   ├── controller.go
│   │   │   ├── metrics.go
│   │   │   └── suite_test.go
│   │   ├── nodeclaim/
│   │   │   ├── garbagecollection/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   └── tagging/
│   │   │       ├── controller.go
│   │   │       └── suite_test.go
│   │   ├── nodeclass/
│   │   │   ├── ami.go
│   │   │   ├── ami_test.go
│   │   │   ├── capacityreservation.go
│   │   │   ├── capacityreservation_test.go
│   │   │   ├── controller.go
│   │   │   ├── events.go
│   │   │   ├── garbagecollection/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   ├── hash/
│   │   │   │   ├── controller.go
│   │   │   │   └── suite_test.go
│   │   │   ├── instanceprofile.go
│   │   │   ├── instanceprofile_test.go
│   │   │   ├── securitygroup.go
│   │   │   ├── securitygroup_test.go
│   │   │   ├── subnet.go
│   │   │   ├── subnet_test.go
│   │   │   ├── suite_test.go
│   │   │   ├── validation.go
│   │   │   └── validation_test.go
│   │   └── providers/
│   │       ├── instancetype/
│   │       │   ├── capacity/
│   │       │   │   ├── controller.go
│   │       │   │   └── suite_test.go
│   │       │   ├── controller.go
│   │       │   └── suite_test.go
│   │       ├── pricing/
│   │       │   ├── controller.go
│   │       │   └── suite_test.go
│   │       ├── ssm/
│   │       │   └── invalidation/
│   │       │       ├── controller.go
│   │       │       └── suite_test.go
│   │       └── version/
│   │           ├── controller.go
│   │           └── suite_test.go
│   ├── errors/
│   │   └── errors.go
│   ├── fake/
│   │   ├── atomic.go
│   │   ├── cloudprovider.go
│   │   ├── ec2api.go
│   │   ├── eksapi.go
│   │   ├── iamapi.go
│   │   ├── pricingapi.go
│   │   ├── sqsapi.go
│   │   ├── ssmapi.go
│   │   ├── types.go
│   │   ├── utils.go
│   │   └── zz_generated.describe_instance_types.go
│   ├── operator/
│   │   ├── operator.go
│   │   ├── options/
│   │   │   ├── options.go
│   │   │   ├── options_validation.go
│   │   │   └── suite_test.go
│   │   └── suite_test.go
│   ├── providers/
│   │   ├── amifamily/
│   │   │   ├── al2.go
│   │   │   ├── al2023.go
│   │   │   ├── ami.go
│   │   │   ├── bootstrap/
│   │   │   │   ├── bootstrap.go
│   │   │   │   ├── bottlerocket.go
│   │   │   │   ├── bottlerocket_test.go
│   │   │   │   ├── bottlerocketsettings.go
│   │   │   │   ├── custom.go
│   │   │   │   ├── eksbootstrap.go
│   │   │   │   ├── mime/
│   │   │   │   │   ├── mime.go
│   │   │   │   │   ├── suite_test.go
│   │   │   │   │   └── test_data/
│   │   │   │   │       ├── mime_bad_header.txt
│   │   │   │   │       ├── mime_valid.txt
│   │   │   │   │       ├── nodeconfig.txt
│   │   │   │   │       └── shell.txt
│   │   │   │   ├── nodeadm.go
│   │   │   │   └── windows.go
│   │   │   ├── bottlerocket.go
│   │   │   ├── bottlerocket_test.go
│   │   │   ├── custom.go
│   │   │   ├── resolver.go
│   │   │   ├── suite_test.go
│   │   │   ├── types.go
│   │   │   └── windows.go
│   │   ├── capacityreservation/
│   │   │   ├── provider.go
│   │   │   ├── suite_test.go
│   │   │   └── types.go
│   │   ├── instance/
│   │   │   ├── events.go
│   │   │   ├── filter/
│   │   │   │   ├── filter.go
│   │   │   │   └── filter_test.go
│   │   │   ├── instance.go
│   │   │   ├── suite_test.go
│   │   │   └── types.go
│   │   ├── instanceprofile/
│   │   │   ├── instanceprofile.go
│   │   │   └── suite_test.go
│   │   ├── instancetype/
│   │   │   ├── instancetype.go
│   │   │   ├── metrics.go
│   │   │   ├── offering/
│   │   │   │   └── offering.go
│   │   │   ├── suite_test.go
│   │   │   ├── types.go
│   │   │   ├── zz_generated.bandwidth.go
│   │   │   └── zz_generated.vpclimits.go
│   │   ├── launchtemplate/
│   │   │   ├── launchtemplate.go
│   │   │   ├── suite_test.go
│   │   │   ├── testdata/
│   │   │   │   ├── al2023_mime_userdata_input.golden
│   │   │   │   ├── al2023_mime_userdata_merged.golden
│   │   │   │   ├── al2023_shell_userdata_input.golden
│   │   │   │   ├── al2023_shell_userdata_merged.golden
│   │   │   │   ├── al2023_userdata_unmerged.golden
│   │   │   │   ├── al2023_yaml_userdata_input.golden
│   │   │   │   ├── al2023_yaml_userdata_merged.golden
│   │   │   │   ├── al2_no_mime_userdata_input.golden
│   │   │   │   ├── al2_userdata_content_type_first_input.golden
│   │   │   │   ├── al2_userdata_input.golden
│   │   │   │   ├── al2_userdata_merged.golden
│   │   │   │   ├── al2_userdata_unmerged.golden
│   │   │   │   ├── br_userdata_input.golden
│   │   │   │   ├── br_userdata_merged.golden
│   │   │   │   ├── br_userdata_unmerged.golden
│   │   │   │   ├── windows_userdata_input.golden
│   │   │   │   ├── windows_userdata_merged.golden
│   │   │   │   └── windows_userdata_unmerged.golden
│   │   │   └── types.go
│   │   ├── pricing/
│   │   │   ├── pricing.go
│   │   │   ├── zz_generated.pricing_aws.go
│   │   │   ├── zz_generated.pricing_aws_cn.go
│   │   │   └── zz_generated.pricing_aws_us_gov.go
│   │   ├── securitygroup/
│   │   │   ├── securitygroup.go
│   │   │   └── suite_test.go
│   │   ├── sqs/
│   │   │   └── sqs.go
│   │   ├── ssm/
│   │   │   ├── provider.go
│   │   │   └── types.go
│   │   ├── subnet/
│   │   │   ├── subnet.go
│   │   │   └── suite_test.go
│   │   └── version/
│   │       ├── suite_test.go
│   │       ├── version.go
│   │       └── version_test.go
│   ├── test/
│   │   ├── environment.go
│   │   ├── nodeclass.go
│   │   ├── options.go
│   │   └── utils.go
│   └── utils/
│       ├── suite_test.go
│       └── utils.go
├── test/
│   ├── README.md
│   ├── assets/
│   │   └── gha_architecture.excalidraw
│   ├── cloudformation/
│   │   ├── README.md
│   │   ├── grafana_cloudformation.yaml
│   │   ├── iam_cloudformation.yaml
│   │   ├── prometheus_cloudformation.yaml
│   │   └── timestream_cloudformation.yaml
│   ├── hack/
│   │   ├── e2e_scripts/
│   │   │   ├── clean_private_cluster.sh
│   │   │   ├── configure_private_cluster.sh
│   │   │   ├── diff_karpenter.sh
│   │   │   ├── install_helm.sh
│   │   │   ├── install_karpenter.sh
│   │   │   ├── install_prometheus.sh
│   │   │   └── noderole_bootstrap_permission.sh
│   │   ├── resource/
│   │   │   ├── clean/
│   │   │   │   └── main.go
│   │   │   ├── count/
│   │   │   │   └── main.go
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── pkg/
│   │   │       ├── metrics/
│   │   │       │   └── metrics.go
│   │   │       └── resourcetypes/
│   │   │           ├── eni.go
│   │   │           ├── instance.go
│   │   │           ├── instanceprofile.go
│   │   │           ├── launchtemplate.go
│   │   │           ├── oidc.go
│   │   │           ├── resourcetypes.go
│   │   │           ├── securitygroup.go
│   │   │           ├── stack.go
│   │   │           ├── vpc_endpoint.go
│   │   │           └── vpc_peering_connection.go
│   │   └── soak/
│   │       ├── get_clusters.go
│   │       ├── go.mod
│   │       └── go.sum
│   ├── pkg/
│   │   ├── debug/
│   │   │   ├── events.go
│   │   │   ├── monitor.go
│   │   │   ├── node.go
│   │   │   ├── nodeclaim.go
│   │   │   ├── pod.go
│   │   │   └── setup.go
│   │   └── environment/
│   │       ├── aws/
│   │       │   ├── default_ec2nodeclass.yaml
│   │       │   ├── default_nodepool.yaml
│   │       │   ├── environment.go
│   │       │   ├── expectations.go
│   │       │   ├── metrics.go
│   │       │   └── setup.go
│   │       └── common/
│   │           ├── environment.go
│   │           ├── expectations.go
│   │           ├── monitor.go
│   │           └── setup.go
│   └── suites/
│       ├── ami/
│       │   ├── suite_test.go
│       │   └── testdata/
│       │       ├── al2023_userdata_input.yaml
│       │       ├── al2_no_mime_userdata_input.sh
│       │       ├── al2_userdata_input.sh
│       │       ├── br_userdata_input.sh
│       │       └── windows_userdata_input.ps1
│       ├── consolidation/
│       │   ├── suite_test.go
│       │   └── testdata/
│       │       └── hugepage_userdata_input.sh
│       ├── drift/
│       │   └── suite_test.go
│       ├── integration/
│       │   ├── aws_metadata_test.go
│       │   ├── block_device_mappings_test.go
│       │   ├── cni_test.go
│       │   ├── extended_resources_test.go
│       │   ├── hash_test.go
│       │   ├── instance_profile_test.go
│       │   ├── kubelet_config_test.go
│       │   ├── launch_template_test.go
│       │   ├── metrics_test.go
│       │   ├── network_interface_test.go
│       │   ├── nodeclass_test.go
│       │   ├── repair_policy_test.go
│       │   ├── security_group_test.go
│       │   ├── subnet_test.go
│       │   ├── suite_test.go
│       │   ├── tags_test.go
│       │   ├── testdata/
│       │   │   └── amd_driver_input.sh
│       │   └── validation_test.go
│       ├── interruption/
│       │   └── suite_test.go
│       ├── ipv6/
│       │   └── suite_test.go
│       ├── localzone/
│       │   └── suite_test.go
│       ├── nodeclaim/
│       │   └── suite_test.go
│       ├── scale/
│       │   ├── deprovisioning_test.go
│       │   ├── provisioning_test.go
│       │   └── suite_test.go
│       ├── scheduling/
│       │   ├── suite_test.go
│       │   └── testdata/
│       │       └── hugepage_userdata_input.sh
│       └── storage/
│           └── suite_test.go
├── tools/
│   └── kompat/
│       ├── README.md
│       ├── cmd/
│       │   └── kompat/
│       │       └── main.go
│       ├── go.mod
│       ├── go.sum
│       └── pkg/
│           └── kompat/
│               └── kompat.go
└── website/
    ├── .gitignore
    ├── .node-version
    ├── README.md
    ├── archetypes/
    │   └── default.md
    ├── assets/
    │   ├── js/
    │   │   └── search.js
    │   ├── jsconfig.json
    │   └── scss/
    │       ├── _search.scss
    │       └── _variables_project.scss
    ├── content/
    │   └── en/
    │       ├── _index.html
    │       ├── docs/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       ├── preview/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       ├── v1.0/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   └── managing-amis.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       ├── get-controller-policy.sh
    │       │       ├── upgrade-guide.md
    │       │       ├── v1-migration.md
    │       │       ├── v1beta1-controller-policy.json
    │       │       └── v1beta1-migration.md
    │       ├── v1.7/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       ├── v1.8/
    │       │   ├── _index.md
    │       │   ├── concepts/
    │       │   │   ├── _index.md
    │       │   │   ├── disruption.md
    │       │   │   ├── nodeclaims.md
    │       │   │   ├── nodeclasses.md
    │       │   │   ├── nodeoverlays.md
    │       │   │   ├── nodepools.md
    │       │   │   └── scheduling.md
    │       │   ├── contributing/
    │       │   │   ├── _index.md
    │       │   │   ├── community-meetings.md
    │       │   │   ├── design-guide.md
    │       │   │   ├── development-guide.md
    │       │   │   └── documentation-updates.md
    │       │   ├── faq.md
    │       │   ├── getting-started/
    │       │   │   ├── _index.md
    │       │   │   ├── getting-started-with-karpenter/
    │       │   │   │   ├── _index.md
    │       │   │   │   ├── cloudformation.yaml
    │       │   │   │   ├── grafana-values.yaml
    │       │   │   │   ├── karpenter-capacity-dashboard.json
    │       │   │   │   ├── karpenter-controllers-allocation.json
    │       │   │   │   ├── karpenter-controllers.json
    │       │   │   │   ├── karpenter-performance-dashboard.json
    │       │   │   │   ├── prometheus-values.yaml
    │       │   │   │   └── scripts/
    │       │   │   │       ├── step01-config.sh
    │       │   │   │       ├── step02-create-cluster-fargate.sh
    │       │   │   │       ├── step02-create-cluster.sh
    │       │   │   │       ├── step03-iam-cloud-formation.sh
    │       │   │   │       ├── step04-grant-access.sh
    │       │   │   │       ├── step05-controller-iam.sh
    │       │   │   │       ├── step06-add-spot-role.sh
    │       │   │   │       ├── step08-apply-helm-chart-fargate.sh
    │       │   │   │       ├── step08-apply-helm-chart.sh
    │       │   │   │       ├── step09-add-prometheus-grafana.sh
    │       │   │   │       ├── step10-add-grafana-port-forward.sh
    │       │   │   │       ├── step11-grafana-get-password.sh
    │       │   │   │       ├── step12-add-nodepool.sh
    │       │   │   │       ├── step13-automatic-node-provisioning.sh
    │       │   │   │       ├── step14-deprovisioning.sh
    │       │   │   │       ├── step15-apply-flowschemas.sh
    │       │   │   │       ├── step16-delete-node.sh
    │       │   │   │       └── step17-cleanup.sh
    │       │   │   └── migrating-from-cas/
    │       │   │       ├── _index.md
    │       │   │       └── scripts/
    │       │   │           ├── step01-env.sh
    │       │   │           ├── step02-node-iam.sh
    │       │   │           ├── step03-node-policies.sh
    │       │   │           ├── step04-controller-iam.sh
    │       │   │           ├── step05-tag-subnets.sh
    │       │   │           ├── step06-tag-security-groups.sh
    │       │   │           ├── step07-edit-aws-auth.sh
    │       │   │           ├── step08-generate-chart.sh
    │       │   │           ├── step09-deploy.sh
    │       │   │           ├── step10-create-nodepool.sh
    │       │   │           ├── step11-scale-cas.sh
    │       │   │           ├── step12-scale-multiple-ng.sh
    │       │   │           └── step12-scale-single-ng.sh
    │       │   ├── reference/
    │       │   │   ├── _index.md
    │       │   │   ├── cloudformation.md
    │       │   │   ├── instance-types.md
    │       │   │   ├── metrics.md
    │       │   │   ├── settings.md
    │       │   │   └── threat-model.md
    │       │   ├── tasks/
    │       │   │   ├── _index.md
    │       │   │   ├── managing-amis.md
    │       │   │   └── odcrs.md
    │       │   ├── troubleshooting.md
    │       │   └── upgrading/
    │       │       ├── _index.md
    │       │       ├── compatibility.md
    │       │       └── upgrade-guide.md
    │       └── v1.9/
    │           ├── _index.md
    │           ├── concepts/
    │           │   ├── _index.md
    │           │   ├── disruption.md
    │           │   ├── nodeclaims.md
    │           │   ├── nodeclasses.md
    │           │   ├── nodeoverlays.md
    │           │   ├── nodepools.md
    │           │   └── scheduling.md
    │           ├── contributing/
    │           │   ├── _index.md
    │           │   ├── community-meetings.md
    │           │   ├── design-guide.md
    │           │   ├── development-guide.md
    │           │   └── documentation-updates.md
    │           ├── faq.md
    │           ├── getting-started/
    │           │   ├── _index.md
    │           │   ├── getting-started-with-karpenter/
    │           │   │   ├── _index.md
    │           │   │   ├── cloudformation.yaml
    │           │   │   ├── grafana-values.yaml
    │           │   │   ├── karpenter-capacity-dashboard.json
    │           │   │   ├── karpenter-controllers-allocation.json
    │           │   │   ├── karpenter-controllers.json
    │           │   │   ├── karpenter-performance-dashboard.json
    │           │   │   ├── prometheus-values.yaml
    │           │   │   └── scripts/
    │           │   │       ├── step01-config.sh
    │           │   │       ├── step02-create-cluster-fargate.sh
    │           │   │       ├── step02-create-cluster.sh
    │           │   │       ├── step03-iam-cloud-formation.sh
    │           │   │       ├── step04-grant-access.sh
    │           │   │       ├── step05-controller-iam.sh
    │           │   │       ├── step06-add-spot-role.sh
    │           │   │       ├── step08-apply-helm-chart-fargate.sh
    │           │   │       ├── step08-apply-helm-chart.sh
    │           │   │       ├── step09-add-prometheus-grafana.sh
    │           │   │       ├── step10-add-grafana-port-forward.sh
    │           │   │       ├── step11-grafana-get-password.sh
    │           │   │       ├── step12-add-nodepool.sh
    │           │   │       ├── step13-automatic-node-provisioning.sh
    │           │   │       ├── step14-deprovisioning.sh
    │           │   │       ├── step15-apply-flowschemas.sh
    │           │   │       ├── step16-delete-node.sh
    │           │   │       └── step17-cleanup.sh
    │           │   └── migrating-from-cas/
    │           │       ├── _index.md
    │           │       └── scripts/
    │           │           ├── step01-env.sh
    │           │           ├── step02-node-iam.sh
    │           │           ├── step03-node-policies.sh
    │           │           ├── step04-controller-iam.sh
    │           │           ├── step05-tag-subnets.sh
    │           │           ├── step06-tag-security-groups.sh
    │           │           ├── step07-edit-aws-auth.sh
    │           │           ├── step08-generate-chart.sh
    │           │           ├── step09-deploy.sh
    │           │           ├── step10-create-nodepool.sh
    │           │           ├── step11-scale-cas.sh
    │           │           ├── step12-scale-multiple-ng.sh
    │           │           └── step12-scale-single-ng.sh
    │           ├── reference/
    │           │   ├── _index.md
    │           │   ├── cloudformation.md
    │           │   ├── instance-types.md
    │           │   ├── metrics.md
    │           │   ├── settings.md
    │           │   └── threat-model.md
    │           ├── tasks/
    │           │   ├── _index.md
    │           │   ├── managing-amis.md
    │           │   └── odcrs.md
    │           ├── troubleshooting.md
    │           └── upgrading/
    │               ├── _index.md
    │               ├── compatibility.md
    │               └── upgrade-guide.md
    ├── go.mod
    ├── go.sum
    ├── hugo.yaml
    ├── layouts/
    │   ├── 404.html
    │   ├── partials/
    │   │   ├── favicons.html
    │   │   ├── footer.html
    │   │   └── navbar-version-selector.html
    │   ├── robots.txt
    │   └── shortcodes/
    │       ├── blocks/
    │       │   └── feature.html
    │       ├── github.html
    │       ├── githubRelRef.html
    │       └── script.html
    ├── netlify.toml
    ├── package.json
    └── static/
        ├── _redirects
        └── favicons/
            └── browserconfig.xml
Download .txt
SYMBOL INDEX (1596 symbols across 215 files)

FILE: cmd/controller/main.go
  function main (line 31) | func main() {

FILE: hack/code/bandwidth_gen/main.go
  constant fileFormat (line 46) | fileFormat = `
  function main (line 61) | func main() {
  function containsAny (line 138) | func containsAny(value string, excludedSubstrings ...string) bool {
  function getAllInstanceTypes (line 147) | func getAllInstanceTypes() []ec2types.InstanceType {

FILE: hack/code/instancetype_testdata_gen/main.go
  constant packageHeader (line 36) | packageHeader = `
  function init (line 55) | func init() {
  function main (line 61) | func main() {
  function getDescribeInstanceTypesOutput (line 91) | func getDescribeInstanceTypesOutput(ctx context.Context, ec2api sdk.EC2A...
  function getDescribeInstanceTypeOfferingsOutput (line 122) | func getDescribeInstanceTypeOfferingsOutput() string {
  function getInstanceTypeInfo (line 161) | func getInstanceTypeInfo(info ec2types.InstanceTypeInfo) string {
  function getNetworkCardInfo (line 243) | func getNetworkCardInfo(info ec2types.NetworkCardInfo) string {
  function getNeuronDeviceInfo (line 252) | func getNeuronDeviceInfo(info ec2types.NeuronDeviceInfo) string {
  function getGPUDeviceInfo (line 269) | func getGPUDeviceInfo(info ec2types.GpuDeviceInfo) string {
  function getStringSliceData (line 282) | func getStringSliceData[T ec2types.UsageClassType | ec2types.Virtualizat...

FILE: hack/code/prices_gen/main.go
  function getAWSRegions (line 43) | func getAWSRegions(partition string) []string {
  function getPartitionSuffix (line 56) | func getPartitionSuffix(partition string) string {
  type Options (line 69) | type Options struct
  function NewOptions (line 74) | func NewOptions() *Options {
  function main (line 85) | func main() {
  function writePricing (line 143) | func writePricing(src *bytes.Buffer, instanceNames []ec2types.InstanceTy...
  function newline (line 185) | func newline(src *bytes.Buffer) {

FILE: hack/code/vpc_limits_gen/main.go
  type Options (line 29) | type Options struct
  function main (line 34) | func main() {

FILE: hack/docs/compatibilitymatrix_gen/main.go
  function main (line 27) | func main() {

FILE: hack/docs/configuration_gen/main.go
  function main (line 29) | func main() {

FILE: hack/docs/instancetypes_gen/main.go
  type FakeManager (line 57) | type FakeManager struct
    method GetClient (line 61) | func (m *FakeManager) GetClient() client.Client {
    method GetConfig (line 65) | func (m *FakeManager) GetConfig() *rest.Config {
    method GetFieldIndexer (line 69) | func (m *FakeManager) GetFieldIndexer() client.FieldIndexer {
    method Elected (line 73) | func (m *FakeManager) Elected() <-chan struct{} {
  type FakeFieldIndexer (line 77) | type FakeFieldIndexer struct
    method IndexField (line 79) | func (f *FakeFieldIndexer) IndexField(_ context.Context, _ client.Obje...
  function main (line 83) | func main() {

FILE: hack/docs/metrics_gen/main.go
  type metricInfo (line 37) | type metricInfo struct
    method qualifiedName (line 54) | func (i metricInfo) qualifiedName() string {
  function main (line 61) | func main() {
  function getPackages (line 147) | func getPackages(root string) []*ast.Package {
  function getMetricsFromPackages (line 178) | func getMetricsFromPackages(packages ...*ast.Package) []metricInfo {
  function bySubsystem (line 200) | func bySubsystem(metrics []metricInfo) func(i int, j int) bool {
  function handleVariableDeclaration (line 226) | func handleVariableDeclaration(v *ast.GenDecl) []metricInfo {
  function getFuncPackage (line 293) | func getFuncPackage(fun ast.Expr) string {
  function getBinaryExpr (line 316) | func getBinaryExpr(b *ast.BinaryExpr) string {
  function getIdentMapping (line 338) | func getIdentMapping(identName string) (string, error) {

FILE: hack/docs/parse-redirects/main.go
  type RedirectRule (line 26) | type RedirectRule struct
  function getAvailableKarpenterVersions (line 32) | func getAvailableKarpenterVersions() []string {
  function getRule (line 49) | func getRule(source string, target string, versions []string) []Redirect...
  function main (line 76) | func main() {

FILE: hack/docs/version_compatibility_gen/main.go
  function main (line 26) | func main() {

FILE: hack/tools/allocatable_diff/main.go
  function init (line 45) | func init() {
  function main (line 52) | func main() {

FILE: hack/tools/launchtemplate_counter/main.go
  function main (line 45) | func main() {

FILE: kwok/cloudprovider/cloudprovider.go
  type CloudProvider (line 32) | type CloudProvider struct
    method Create (line 60) | func (c *CloudProvider) Create(ctx context.Context, nodeClaim *karpv1....
    method List (line 69) | func (c *CloudProvider) List(ctx context.Context) ([]*karpv1.NodeClaim...
    method Get (line 80) | func (c *CloudProvider) Get(ctx context.Context, providerID string) (*...
  function New (line 36) | func New(

FILE: kwok/ec2/ec2.go
  type Client (line 56) | type Client struct
    method ReadBackup (line 118) | func (c *Client) ReadBackup(ctx context.Context) {
    method backupInstances (line 151) | func (c *Client) backupInstances(ctx context.Context) error {
    method StartBackupThread (line 238) | func (c *Client) StartBackupThread(ctx context.Context) {
    method StartKillNodeThread (line 254) | func (c *Client) StartKillNodeThread(ctx context.Context) {
    method DescribeLaunchTemplates (line 298) | func (c *Client) DescribeLaunchTemplates(_ context.Context, input *ec2...
    method CreateFleet (line 395) | func (c *Client) CreateFleet(ctx context.Context, input *ec2.CreateFle...
    method TerminateInstances (line 641) | func (c *Client) TerminateInstances(_ context.Context, input *ec2.Term...
    method DescribeInstances (line 680) | func (c *Client) DescribeInstances(_ context.Context, input *ec2.Descr...
    method RunInstances (line 731) | func (c *Client) RunInstances(_ context.Context, input *ec2.RunInstanc...
    method CreateTags (line 752) | func (c *Client) CreateTags(_ context.Context, input *ec2.CreateTagsIn...
    method CreateLaunchTemplate (line 811) | func (c *Client) CreateLaunchTemplate(_ context.Context, input *ec2.Cr...
    method DeleteLaunchTemplate (line 844) | func (c *Client) DeleteLaunchTemplate(_ context.Context, input *ec2.De...
    method toNode (line 885) | func (c *Client) toNode(ctx context.Context, instance ec2types.Instanc...
  function NewClient (line 77) | func NewClient(region, namespace string, ec2Client *ec2.Client, rateLimi...
  function removeNullFields (line 284) | func removeNullFields(bytes []byte) []byte {

FILE: kwok/ec2/ratelimiting.go
  type RateLimiterProvider (line 21) | type RateLimiterProvider interface
  type NopRateLimiter (line 32) | type NopRateLimiter struct
    method TryAccept (line 34) | func (*NopRateLimiter) TryAccept() bool {
    method Stop (line 38) | func (*NopRateLimiter) Stop() {}
    method QPS (line 40) | func (*NopRateLimiter) QPS() float32 {
  type NopRateLimiterProvider (line 44) | type NopRateLimiterProvider struct
    method DescribeLaunchTemplates (line 54) | func (p NopRateLimiterProvider) DescribeLaunchTemplates() flowcontrol....
    method CreateFleet (line 58) | func (p NopRateLimiterProvider) CreateFleet() flowcontrol.PassiveRateL...
    method TerminateInstances (line 62) | func (p NopRateLimiterProvider) TerminateInstances() flowcontrol.Passi...
    method DescribeInstances (line 66) | func (p NopRateLimiterProvider) DescribeInstances() flowcontrol.Passiv...
    method RunInstances (line 70) | func (p NopRateLimiterProvider) RunInstances() flowcontrol.PassiveRate...
    method CreateTags (line 74) | func (p NopRateLimiterProvider) CreateTags() flowcontrol.PassiveRateLi...
    method CreateLaunchTemplate (line 78) | func (p NopRateLimiterProvider) CreateLaunchTemplate() flowcontrol.Pas...
    method DeleteLaunchTemplate (line 82) | func (p NopRateLimiterProvider) DeleteLaunchTemplate() flowcontrol.Pas...
  function NewNopRateLimiterProvider (line 48) | func NewNopRateLimiterProvider() *NopRateLimiterProvider {
  type DefaultRateLimiterProvider (line 86) | type DefaultRateLimiterProvider struct
    method DescribeLaunchTemplates (line 106) | func (p *DefaultRateLimiterProvider) DescribeLaunchTemplates() flowcon...
    method CreateFleet (line 110) | func (p *DefaultRateLimiterProvider) CreateFleet() flowcontrol.Passive...
    method TerminateInstances (line 114) | func (p *DefaultRateLimiterProvider) TerminateInstances() flowcontrol....
    method DescribeInstances (line 118) | func (p *DefaultRateLimiterProvider) DescribeInstances() flowcontrol.P...
    method RunInstances (line 122) | func (p *DefaultRateLimiterProvider) RunInstances() flowcontrol.Passiv...
    method CreateTags (line 126) | func (p *DefaultRateLimiterProvider) CreateTags() flowcontrol.PassiveR...
    method CreateLaunchTemplate (line 130) | func (p *DefaultRateLimiterProvider) CreateLaunchTemplate() flowcontro...
    method DeleteLaunchTemplate (line 134) | func (p *DefaultRateLimiterProvider) DeleteLaunchTemplate() flowcontro...
  function NewDefaultRateLimiterProvider (line 95) | func NewDefaultRateLimiterProvider() *DefaultRateLimiterProvider {

FILE: kwok/main.go
  function main (line 32) | func main() {

FILE: kwok/operator/operator.go
  function init (line 72) | func init() {
  type Operator (line 77) | type Operator struct
  function NewOperator (line 99) | func NewOperator(ctx context.Context, operator *operator.Operator) (cont...
  function WithUserAgent (line 223) | func WithUserAgent(cfg aws.Config) aws.Config {
  function CheckEC2Connectivity (line 233) | func CheckEC2Connectivity(ctx context.Context, api sdk.EC2API) error {
  function ResolveClusterEndpoint (line 244) | func ResolveClusterEndpoint(ctx context.Context, eksAPI sdk.EKSAPI) (str...
  function GetCABundle (line 258) | func GetCABundle(ctx context.Context, restConfig *rest.Config) (*string,...
  function KubeDNSIP (line 277) | func KubeDNSIP(ctx context.Context, kubernetesInterface kubernetes.Inter...
  function SetupIndexers (line 292) | func SetupIndexers(ctx context.Context, mgr manager.Manager) {

FILE: kwok/strategy/strategy.go
  type Strategy (line 28) | type Strategy interface
  type LowestPrice (line 32) | type LowestPrice struct
    method GetScore (line 45) | func (p *LowestPrice) GetScore(instanceType, capacityType, availabilit...
  function NewLowestPrice (line 36) | func NewLowestPrice(pricingAPI sdk.PricingAPI, ec2API sdk.EC2API, region...

FILE: pkg/apis/v1/doc.go
  function init (line 30) | func init() {

FILE: pkg/apis/v1/ec2nodeclass.go
  type EC2NodeClassSpec (line 32) | type EC2NodeClassSpec struct
  type SubnetSelectorTerm (line 150) | type SubnetSelectorTerm struct
  type SecurityGroupSelectorTerm (line 165) | type SecurityGroupSelectorTerm struct
  type CapacityReservationSelectorTerm (line 181) | type CapacityReservationSelectorTerm struct
  type AMISelectorTerm (line 204) | type AMISelectorTerm struct
  type KubeletConfiguration (line 245) | type KubeletConfiguration struct
  type MetadataOptions (line 311) | type MetadataOptions struct
  type BlockDeviceMapping (line 359) | type BlockDeviceMapping struct
  type BlockDevice (line 374) | type BlockDevice struct
  type InstanceStorePolicy (line 451) | type InstanceStorePolicy
  constant InstanceStorePolicyRAID0 (line 458) | InstanceStorePolicyRAID0 InstanceStorePolicy = "RAID0"
  type EC2NodeClass (line 469) | type EC2NodeClass struct
    method Hash (line 491) | func (in *EC2NodeClass) Hash() string {
    method LegacyInstanceProfileName (line 505) | func (in *EC2NodeClass) LegacyInstanceProfileName(clusterName, region ...
    method InstanceProfileName (line 509) | func (in *EC2NodeClass) InstanceProfileName(clusterName, region string...
    method InstanceProfileRole (line 513) | func (in *EC2NodeClass) InstanceProfileRole() string {
    method InstanceProfileTags (line 517) | func (in *EC2NodeClass) InstanceProfileTags(clusterName string, region...
    method BlockDeviceMappings (line 526) | func (in *EC2NodeClass) BlockDeviceMappings() []*BlockDeviceMapping {
    method InstanceStorePolicy (line 530) | func (in *EC2NodeClass) InstanceStorePolicy() *InstanceStorePolicy {
    method KubeletConfiguration (line 534) | func (in *EC2NodeClass) KubeletConfiguration() *KubeletConfiguration {
    method AMIFamily (line 543) | func (in *EC2NodeClass) AMIFamily() string {
    method Alias (line 567) | func (in *EC2NodeClass) Alias() *Alias {
  constant EC2NodeClassHashVersion (line 489) | EC2NodeClassHashVersion = "v4"
  type Alias (line 554) | type Alias struct
    method String (line 563) | func (a *Alias) String() string {
  constant AliasVersionLatest (line 560) | AliasVersionLatest = "latest"
  function amiFamilyFromAlias (line 580) | func amiFamilyFromAlias(alias string) string {
  function amiVersionFromAlias (line 601) | func amiVersionFromAlias(alias string) string {
  type EC2NodeClassList (line 611) | type EC2NodeClassList struct

FILE: pkg/apis/v1/ec2nodeclass_defaults.go
  method SetDefaults (line 22) | func (in *EC2NodeClass) SetDefaults(_ context.Context) {}

FILE: pkg/apis/v1/ec2nodeclass_status.go
  constant ConditionTypeSubnetsReady (line 35) | ConditionTypeSubnetsReady              = "SubnetsReady"
  constant ConditionTypeSecurityGroupsReady (line 36) | ConditionTypeSecurityGroupsReady       = "SecurityGroupsReady"
  constant ConditionTypeAMIsReady (line 37) | ConditionTypeAMIsReady                 = "AMIsReady"
  constant ConditionTypeInstanceProfileReady (line 38) | ConditionTypeInstanceProfileReady      = "InstanceProfileReady"
  constant ConditionTypeCapacityReservationsReady (line 39) | ConditionTypeCapacityReservationsReady = "CapacityReservationsReady"
  constant ConditionTypeValidationSucceeded (line 40) | ConditionTypeValidationSucceeded       = "ValidationSucceeded"
  type Subnet (line 44) | type Subnet struct
  type SecurityGroup (line 57) | type SecurityGroup struct
  type AMI (line 67) | type AMI struct
  type CapacityReservation (line 82) | type CapacityReservation struct
  type CapacityReservationType (line 121) | type CapacityReservationType
    method Values (line 128) | func (CapacityReservationType) Values() []CapacityReservationType {
  constant CapacityReservationTypeDefault (line 124) | CapacityReservationTypeDefault       CapacityReservationType = "default"
  constant CapacityReservationTypeCapacityBlock (line 125) | CapacityReservationTypeCapacityBlock CapacityReservationType = "capacity...
  type CapacityReservationState (line 135) | type CapacityReservationState
  constant CapacityReservationStateActive (line 138) | CapacityReservationStateActive   CapacityReservationState = "active"
  constant CapacityReservationStateExpiring (line 139) | CapacityReservationStateExpiring CapacityReservationState = "expiring"
  type EC2NodeClassStatus (line 143) | type EC2NodeClassStatus struct
  method StatusConditions (line 168) | func (in *EC2NodeClass) StatusConditions() status.ConditionSet {
  method GetConditions (line 182) | func (in *EC2NodeClass) GetConditions() []status.Condition {
  method SetConditions (line 186) | func (in *EC2NodeClass) SetConditions(conditions []status.Condition) {
  method AMIs (line 190) | func (in *EC2NodeClass) AMIs() []AMI {
  method CapacityReservations (line 194) | func (in *EC2NodeClass) CapacityReservations() []CapacityReservation {
  type ZoneInfo (line 198) | type ZoneInfo struct
  method ZoneInfo (line 203) | func (in *EC2NodeClass) ZoneInfo() []ZoneInfo {
  function CapacityReservationTypeFromEC2 (line 212) | func CapacityReservationTypeFromEC2(capacityReservationType ec2types.Cap...
  function CapacityReservationFromEC2 (line 228) | func CapacityReservationFromEC2(clk clock.Clock, cr *ec2types.CapacityRe...

FILE: pkg/apis/v1/labels.go
  function init (line 31) | func init() {

FILE: pkg/apis/v1/suite_test.go
  function TestAPIs (line 40) | func TestAPIs(t *testing.T) {

FILE: pkg/apis/v1/zz_generated.deepcopy.go
  method DeepCopyInto (line 29) | func (in *AMI) DeepCopyInto(out *AMI) {
  method DeepCopy (line 41) | func (in *AMI) DeepCopy() *AMI {
  method DeepCopyInto (line 51) | func (in *AMISelectorTerm) DeepCopyInto(out *AMISelectorTerm) {
  method DeepCopy (line 63) | func (in *AMISelectorTerm) DeepCopy() *AMISelectorTerm {
  method DeepCopyInto (line 73) | func (in *Alias) DeepCopyInto(out *Alias) {
  method DeepCopy (line 78) | func (in *Alias) DeepCopy() *Alias {
  method DeepCopyInto (line 88) | func (in *BlockDevice) DeepCopyInto(out *BlockDevice) {
  method DeepCopy (line 138) | func (in *BlockDevice) DeepCopy() *BlockDevice {
  method DeepCopyInto (line 148) | func (in *BlockDeviceMapping) DeepCopyInto(out *BlockDeviceMapping) {
  method DeepCopy (line 163) | func (in *BlockDeviceMapping) DeepCopy() *BlockDeviceMapping {
  method DeepCopyInto (line 173) | func (in *CapacityReservation) DeepCopyInto(out *CapacityReservation) {
  method DeepCopy (line 182) | func (in *CapacityReservation) DeepCopy() *CapacityReservation {
  method DeepCopyInto (line 192) | func (in *CapacityReservationSelectorTerm) DeepCopyInto(out *CapacityRes...
  method DeepCopy (line 204) | func (in *CapacityReservationSelectorTerm) DeepCopy() *CapacityReservati...
  method DeepCopyInto (line 214) | func (in *EC2NodeClass) DeepCopyInto(out *EC2NodeClass) {
  method DeepCopy (line 223) | func (in *EC2NodeClass) DeepCopy() *EC2NodeClass {
  method DeepCopyObject (line 233) | func (in *EC2NodeClass) DeepCopyObject() runtime.Object {
  method DeepCopyInto (line 241) | func (in *EC2NodeClassList) DeepCopyInto(out *EC2NodeClassList) {
  method DeepCopy (line 255) | func (in *EC2NodeClassList) DeepCopy() *EC2NodeClassList {
  method DeepCopyObject (line 265) | func (in *EC2NodeClassList) DeepCopyObject() runtime.Object {
  method DeepCopyInto (line 273) | func (in *EC2NodeClassSpec) DeepCopyInto(out *EC2NodeClassSpec) {
  method DeepCopy (line 374) | func (in *EC2NodeClassSpec) DeepCopy() *EC2NodeClassSpec {
  method DeepCopyInto (line 384) | func (in *EC2NodeClassStatus) DeepCopyInto(out *EC2NodeClassStatus) {
  method DeepCopy (line 420) | func (in *EC2NodeClassStatus) DeepCopy() *EC2NodeClassStatus {
  method DeepCopyInto (line 430) | func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) {
  method DeepCopy (line 505) | func (in *KubeletConfiguration) DeepCopy() *KubeletConfiguration {
  method DeepCopyInto (line 515) | func (in *MetadataOptions) DeepCopyInto(out *MetadataOptions) {
  method DeepCopy (line 540) | func (in *MetadataOptions) DeepCopy() *MetadataOptions {
  method DeepCopyInto (line 550) | func (in *SecurityGroup) DeepCopyInto(out *SecurityGroup) {
  method DeepCopy (line 555) | func (in *SecurityGroup) DeepCopy() *SecurityGroup {
  method DeepCopyInto (line 565) | func (in *SecurityGroupSelectorTerm) DeepCopyInto(out *SecurityGroupSele...
  method DeepCopy (line 577) | func (in *SecurityGroupSelectorTerm) DeepCopy() *SecurityGroupSelectorTe...
  method DeepCopyInto (line 587) | func (in *Subnet) DeepCopyInto(out *Subnet) {
  method DeepCopy (line 592) | func (in *Subnet) DeepCopy() *Subnet {
  method DeepCopyInto (line 602) | func (in *SubnetSelectorTerm) DeepCopyInto(out *SubnetSelectorTerm) {
  method DeepCopy (line 614) | func (in *SubnetSelectorTerm) DeepCopy() *SubnetSelectorTerm {
  method DeepCopyInto (line 624) | func (in *ZoneInfo) DeepCopyInto(out *ZoneInfo) {
  method DeepCopy (line 629) | func (in *ZoneInfo) DeepCopy() *ZoneInfo {

FILE: pkg/aws/sdk.go
  type EC2API (line 29) | type EC2API interface
  type IAMAPI (line 47) | type IAMAPI interface
  type EKSAPI (line 57) | type EKSAPI interface
  type PricingAPI (line 61) | type PricingAPI interface
  type SSMAPI (line 65) | type SSMAPI interface
  type SQSAPI (line 69) | type SQSAPI interface
  type TimestreamWriteAPI (line 75) | type TimestreamWriteAPI interface

FILE: pkg/batcher/batcher.go
  type Options (line 32) | type Options struct
  type Result (line 43) | type Result struct
  type request (line 52) | type request struct
  type Batcher (line 60) | type Batcher struct
  type BatchExecutor (line 78) | type BatchExecutor
  type RequestHasher (line 81) | type RequestHasher
  function NewBatcher (line 84) | func NewBatcher[T input, U output](ctx context.Context, options Options[...
  method Add (line 100) | func (b *Batcher[T, U]) Add(ctx context.Context, input *T) Result[U] {
  function DefaultHasher (line 118) | func DefaultHasher[T input](_ context.Context, input *T) uint64 {
  function OneBucketHasher (line 127) | func OneBucketHasher[T input](_ context.Context, _ *T) uint64 {
  method run (line 131) | func (b *Batcher[T, U]) run() {
  method waitForIdle (line 162) | func (b *Batcher[T, U]) waitForIdle() {
  method runCalls (line 184) | func (b *Batcher[T, U]) runCalls(requests []*request[T, U]) {

FILE: pkg/batcher/createfleet.go
  type CreateFleetBatcher (line 32) | type CreateFleetBatcher struct
    method CreateFleet (line 47) | func (b *CreateFleetBatcher) CreateFleet(ctx context.Context, createFl...
  function NewCreateFleetBatcher (line 36) | func NewCreateFleetBatcher(ctx context.Context, ec2api sdk.EC2API) *Crea...
  function execCreateFleetBatch (line 55) | func execCreateFleetBatch(ec2api sdk.EC2API) BatchExecutor[ec2.CreateFle...

FILE: pkg/batcher/describeinstances.go
  type DescribeInstancesBatcher (line 34) | type DescribeInstancesBatcher struct
    method DescribeInstances (line 50) | func (b *DescribeInstancesBatcher) DescribeInstances(ctx context.Conte...
  function NewDescribeInstancesBatcher (line 38) | func NewDescribeInstancesBatcher(ctx context.Context, ec2api sdk.EC2API)...
  function FilterHasher (line 58) | func FilterHasher(ctx context.Context, input *ec2.DescribeInstancesInput...
  function execDescribeInstancesBatch (line 66) | func execDescribeInstancesBatch(ec2api sdk.EC2API) BatchExecutor[ec2.Des...
  function prepareAggregatedInput (line 129) | func prepareAggregatedInput(inputs []*ec2.DescribeInstancesInput) *ec2.D...

FILE: pkg/batcher/ec2api.go
  type EC2API (line 23) | type EC2API struct
  function EC2 (line 29) | func EC2(ctx context.Context, ec2api sdk.EC2API) *EC2API {

FILE: pkg/batcher/metrics.go
  constant batcherSubsystem (line 26) | batcherSubsystem = "cloudprovider_batcher"
  constant batcherNameLabel (line 27) | batcherNameLabel = "batcher"
  function SizeBuckets (line 32) | func SizeBuckets() []float64 {

FILE: pkg/batcher/suite_test.go
  function TestAWS (line 39) | func TestAWS(t *testing.T) {
  type FakeBatcher (line 133) | type FakeBatcher struct
  function NewFakeBatcher (line 139) | func NewFakeBatcher(ctx context.Context, requestLength time.Duration, ma...

FILE: pkg/batcher/terminateinstances.go
  type TerminateInstancesBatcher (line 33) | type TerminateInstancesBatcher struct
    method TerminateInstances (line 49) | func (b *TerminateInstancesBatcher) TerminateInstances(ctx context.Con...
  function NewTerminateInstancesBatcher (line 37) | func NewTerminateInstancesBatcher(ctx context.Context, ec2api sdk.EC2API...
  function execTerminateInstancesBatch (line 57) | func execTerminateInstancesBatch(ec2api sdk.EC2API) BatchExecutor[ec2.Te...

FILE: pkg/cache/cache.go
  constant DefaultTTL (line 26) | DefaultTTL = time.Minute
  constant UnavailableOfferingsTTL (line 29) | UnavailableOfferingsTTL = 3 * time.Minute
  constant CapacityReservationAvailabilityTTL (line 33) | CapacityReservationAvailabilityTTL = 24 * time.Hour
  constant InstanceTypesZonesAndOfferingsTTL (line 35) | InstanceTypesZonesAndOfferingsTTL = 5 * time.Minute
  constant InstanceProfileTTL (line 37) | InstanceProfileTTL = 15 * time.Minute
  constant AvailableIPAddressTTL (line 39) | AvailableIPAddressTTL = 5 * time.Minute
  constant AssociatePublicIPAddressTTL (line 41) | AssociatePublicIPAddressTTL = 5 * time.Minute
  constant SSMCacheTTL (line 44) | SSMCacheTTL = 24 * time.Hour
  constant DiscoveredCapacityCacheTTL (line 47) | DiscoveredCapacityCacheTTL = 60 * 24 * time.Hour
  constant ValidationTTL (line 49) | ValidationTTL = 30 * time.Minute
  constant RecreationTTL (line 51) | RecreationTTL = 1 * time.Minute
  constant ProtectedProfilesTTL (line 53) | ProtectedProfilesTTL = 1 * time.Hour
  constant DefaultCleanupInterval (line 58) | DefaultCleanupInterval = time.Minute
  constant UnavailableOfferingsCleanupInterval (line 62) | UnavailableOfferingsCleanupInterval = time.Second * 10

FILE: pkg/cache/suite_test.go
  function TestAWS (line 33) | func TestAWS(t *testing.T) {

FILE: pkg/cache/unavailableofferings.go
  type UnavailableOfferings (line 33) | type UnavailableOfferings struct
    method SeqNum (line 74) | func (u *UnavailableOfferings) SeqNum(instanceType ec2types.InstanceTy...
    method IsUnavailable (line 83) | func (u *UnavailableOfferings) IsUnavailable(instanceType ec2types.Ins...
    method MarkUnavailable (line 91) | func (u *UnavailableOfferings) MarkUnavailable(ctx context.Context, in...
    method MarkCapacityTypeUnavailable (line 113) | func (u *UnavailableOfferings) MarkCapacityTypeUnavailable(capacityTyp...
    method MarkAZUnavailable (line 118) | func (u *UnavailableOfferings) MarkAZUnavailable(zone string) {
    method Delete (line 123) | func (u *UnavailableOfferings) Delete(instanceType ec2types.InstanceTy...
    method Flush (line 127) | func (u *UnavailableOfferings) Flush() {
    method key (line 134) | func (u *UnavailableOfferings) key(instanceType ec2types.InstanceType,...
  function NewUnavailableOfferings (line 46) | func NewUnavailableOfferings() *UnavailableOfferings {

FILE: pkg/cloudprovider/cloudprovider.go
  type CloudProvider (line 60) | type CloudProvider struct
    method Create (line 97) | func (c *CloudProvider) Create(ctx context.Context, nodeClaim *karpv1....
    method List (line 157) | func (c *CloudProvider) List(ctx context.Context) ([]*karpv1.NodeClaim...
    method Get (line 177) | func (c *CloudProvider) Get(ctx context.Context, providerID string) (*...
    method GetInstanceTypes (line 199) | func (c *CloudProvider) GetInstanceTypes(ctx context.Context, nodePool...
    method getInstanceType (line 218) | func (c *CloudProvider) getInstanceType(ctx context.Context, nodePool ...
    method Delete (line 242) | func (c *CloudProvider) Delete(ctx context.Context, nodeClaim *karpv1....
    method DisruptionReasons (line 255) | func (c *CloudProvider) DisruptionReasons() []karpv1.DisruptionReason {
    method IsDrifted (line 259) | func (c *CloudProvider) IsDrifted(ctx context.Context, nodeClaim *karp...
    method Name (line 289) | func (c *CloudProvider) Name() string {
    method GetSupportedNodeClasses (line 293) | func (c *CloudProvider) GetSupportedNodeClasses() []status.Object {
    method RepairPolicies (line 297) | func (c *CloudProvider) RepairPolicies() []cloudprovider.RepairPolicy {
    method resolveNodeClassFromNodeClaim (line 340) | func (c *CloudProvider) resolveNodeClassFromNodeClaim(ctx context.Cont...
    method resolveNodeClassFromNodePool (line 354) | func (c *CloudProvider) resolveNodeClassFromNodePool(ctx context.Conte...
    method resolveInstanceTypeFromInstance (line 367) | func (c *CloudProvider) resolveInstanceTypeFromInstance(ctx context.Co...
    method resolveNodeClassFromInstance (line 381) | func (c *CloudProvider) resolveNodeClassFromInstance(ctx context.Conte...
    method resolveNodePoolFromInstance (line 398) | func (c *CloudProvider) resolveNodePoolFromInstance(ctx context.Contex...
    method instanceToNodeClaim (line 410) | func (c *CloudProvider) instanceToNodeClaim(i *instance.Instance, inst...
  function New (line 72) | func New(
  function newTerminatingNodeClassError (line 479) | func newTerminatingNodeClassError(name string) *errors.StatusError {

FILE: pkg/cloudprovider/drift.go
  constant AMIDrift (line 36) | AMIDrift                 cloudprovider.DriftReason = "AMIDrift"
  constant SubnetDrift (line 37) | SubnetDrift              cloudprovider.DriftReason = "SubnetDrift"
  constant SecurityGroupDrift (line 38) | SecurityGroupDrift       cloudprovider.DriftReason = "SecurityGroupDrift"
  constant CapacityReservationDrift (line 39) | CapacityReservationDrift cloudprovider.DriftReason = "CapacityReservatio...
  constant NodeClassDrift (line 40) | NodeClassDrift           cloudprovider.DriftReason = "NodeClassDrift"
  method isNodeClassDrifted (line 43) | func (c *CloudProvider) isNodeClassDrifted(ctx context.Context, nodeClai...
  method isAMIDrifted (line 78) | func (c *CloudProvider) isAMIDrifted(ctx context.Context, nodeClaim *kar...
  method isSubnetDrifted (line 106) | func (c *CloudProvider) isSubnetDrifted(instance *instance.Instance, nod...
  method areSecurityGroupsDrifted (line 124) | func (c *CloudProvider) areSecurityGroupsDrifted(ec2Instance *instance.I...
  method isCapacityReservationDrifted (line 141) | func (c *CloudProvider) isCapacityReservationDrifted(instance *instance....
  method areStaticFieldsDrifted (line 149) | func (c *CloudProvider) areStaticFieldsDrifted(nodeClaim *karpv1.NodeCla...
  method getInstance (line 165) | func (c *CloudProvider) getInstance(ctx context.Context, providerID stri...

FILE: pkg/cloudprovider/events/events.go
  function NodePoolFailedToResolveNodeClass (line 24) | func NodePoolFailedToResolveNodeClass(nodePool *v1.NodePool) events.Event {
  function NodeClaimFailedToResolveNodeClass (line 33) | func NodeClaimFailedToResolveNodeClass(nodeClaim *v1.NodeClaim) events.E...

FILE: pkg/cloudprovider/suite_test.go
  function TestAWS (line 76) | func TestAWS(t *testing.T) {

FILE: pkg/controllers/capacityreservation/capacitytype/controller.go
  type Controller (line 40) | type Controller struct
    method Name (line 52) | func (*Controller) Name() string {
    method Register (line 56) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
    method Reconcile (line 63) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method syncCapacityType (line 109) | func (c *Controller) syncCapacityType(ctx context.Context, capacityTyp...
  function NewController (line 45) | func NewController(kubeClient client.Client, cp cloudprovider.CloudProvi...

FILE: pkg/controllers/capacityreservation/capacitytype/suite_test.go
  function TestAWS (line 56) | func TestAWS(t *testing.T) {

FILE: pkg/controllers/capacityreservation/expiration/controller.go
  type Controller (line 50) | type Controller struct
    method Name (line 71) | func (c *Controller) Name() string {
    method Reconcile (line 75) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 130) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 57) | func NewController(

FILE: pkg/controllers/capacityreservation/expiration/suite_test.go
  function TestAWS (line 56) | func TestAWS(t *testing.T) {
  function withReservationType (line 163) | func withReservationType(crt ec2types.CapacityReservationType) mockCapac...
  function withEndTime (line 169) | func withEndTime(t time.Time) mockCapacityReservationOpts {
  function withInterruptible (line 175) | func withInterruptible(interruptible bool) mockCapacityReservationOpts {
  function makeCapacityReservation (line 181) | func makeCapacityReservation(id string, opts ...mockCapacityReservationO...

FILE: pkg/controllers/controllers.go
  function NewControllers (line 66) | func NewControllers(

FILE: pkg/controllers/interruption/controller.go
  type Action (line 54) | type Action
  constant CordonAndDrain (line 57) | CordonAndDrain Action = "CordonAndDrain"
  constant NoAction (line 58) | NoAction       Action = "NoAction"
  type Controller (line 64) | type Controller struct
    method Reconcile (line 101) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 144) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
    method parseMessage (line 152) | func (c *Controller) parseMessage(raw *sqstypes.Message) (messages.Mes...
    method handleMessage (line 165) | func (c *Controller) handleMessage(ctx context.Context, msg messages.M...
    method deleteMessage (line 204) | func (c *Controller) deleteMessage(ctx context.Context, msg *sqstypes....
    method handleNodeClaim (line 213) | func (c *Controller) handleNodeClaim(ctx context.Context, msg messages...
    method deleteNodeClaim (line 250) | func (c *Controller) deleteNodeClaim(ctx context.Context, msg messages...
    method notifyForMessage (line 268) | func (c *Controller) notifyForMessage(msg messages.Message, nodeClaim ...
  function NewController (line 77) | func NewController(
  function actionForMessage (line 292) | func actionForMessage(msg messages.Message) Action {

FILE: pkg/controllers/interruption/events/events.go
  function SpotInterrupted (line 24) | func SpotInterrupted(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (ev...
  function CapacityReservationInstanceInterrupted (line 44) | func CapacityReservationInstanceInterrupted(node *corev1.Node, nodeClaim...
  function RebalanceRecommendation (line 64) | func RebalanceRecommendation(node *corev1.Node, nodeClaim *karpv1.NodeCl...
  function Stopping (line 84) | func Stopping(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (evts []ev...
  function Terminating (line 104) | func Terminating(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (evts [...
  function Unhealthy (line 124) | func Unhealthy(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (evts []e...
  function TerminatingOnInterruption (line 144) | func TerminatingOnInterruption(node *corev1.Node, nodeClaim *karpv1.Node...

FILE: pkg/controllers/interruption/interruption_benchmark_test.go
  function BenchmarkNotification15000 (line 58) | func BenchmarkNotification15000(b *testing.B) {
  function BenchmarkNotification5000 (line 62) | func BenchmarkNotification5000(b *testing.B) {
  function BenchmarkNotification1000 (line 66) | func BenchmarkNotification1000(b *testing.B) {
  function BenchmarkNotification100 (line 70) | func BenchmarkNotification100(b *testing.B) {
  function benchmarkNotificationController (line 75) | func benchmarkNotificationController(b *testing.B, messageCount int) {
  type providerSet (line 160) | type providerSet struct
    method makeInfrastructure (line 177) | func (p *providerSet) makeInfrastructure(ctx context.Context) (string,...
    method cleanupInfrastructure (line 190) | func (p *providerSet) cleanupInfrastructure(queueURL string) error {
    method provisionMessages (line 199) | func (p *providerSet) provisionMessages(ctx context.Context, messages ...
    method monitorMessagesProcessed (line 208) | func (p *providerSet) monitorMessagesProcessed(ctx context.Context, ev...
  function newProviders (line 166) | func newProviders(ctx context.Context, kubeClient client.Client) provide...
  function provisionNodes (line 226) | func provisionNodes(ctx context.Context, kubeClient client.Client, nodes...
  function makeDiverseMessagesAndNodes (line 238) | func makeDiverseMessagesAndNodes(count int) ([]any, []*corev1.Node) {
  function makeScheduledChangeMessagesAndNodes (line 259) | func makeScheduledChangeMessagesAndNodes(count int) ([]any, []*corev1.No...
  function makeStateChangeMessagesAndNodes (line 277) | func makeStateChangeMessagesAndNodes(count int, states []string) ([]any,...
  function makeSpotInterruptionMessagesAndNodes (line 296) | func makeSpotInterruptionMessagesAndNodes(count int) ([]any, []*corev1.N...

FILE: pkg/controllers/interruption/messages/capacityreservationinterruption/model.go
  type Message (line 23) | type Message struct
    method EC2InstanceIDs (line 34) | func (m Message) EC2InstanceIDs() []string {
    method Kind (line 38) | func (Message) Kind() messages.Kind {
  type Detail (line 29) | type Detail struct

FILE: pkg/controllers/interruption/messages/capacityreservationinterruption/parser.go
  type Parser (line 24) | type Parser struct
    method Parse (line 26) | func (p Parser) Parse(raw string) (messages.Message, error) {
    method Version (line 34) | func (p Parser) Version() string {
    method Source (line 38) | func (p Parser) Source() string {
    method DetailType (line 42) | func (p Parser) DetailType() string {

FILE: pkg/controllers/interruption/messages/noop/model.go
  type Message (line 21) | type Message struct
    method EC2InstanceIDs (line 25) | func (Message) EC2InstanceIDs() []string {
    method Kind (line 29) | func (Message) Kind() messages.Kind {

FILE: pkg/controllers/interruption/messages/rebalancerecommendation/model.go
  type Message (line 23) | type Message struct
    method EC2InstanceIDs (line 33) | func (m Message) EC2InstanceIDs() []string {
    method Kind (line 37) | func (Message) Kind() messages.Kind {
  type Detail (line 29) | type Detail struct

FILE: pkg/controllers/interruption/messages/rebalancerecommendation/parser.go
  type Parser (line 24) | type Parser struct
    method Parse (line 26) | func (p Parser) Parse(raw string) (messages.Message, error) {
    method Version (line 34) | func (p Parser) Version() string {
    method Source (line 38) | func (p Parser) Source() string {
    method DetailType (line 42) | func (p Parser) DetailType() string {

FILE: pkg/controllers/interruption/messages/scheduledchange/model.go
  type Message (line 23) | type Message struct
    method EC2InstanceIDs (line 29) | func (m Message) EC2InstanceIDs() []string {
    method Kind (line 37) | func (Message) Kind() messages.Kind {
  type Detail (line 41) | type Detail struct
  type EventDescription (line 52) | type EventDescription struct
  type AffectedEntity (line 57) | type AffectedEntity struct

FILE: pkg/controllers/interruption/messages/scheduledchange/parser.go
  constant acceptedService (line 25) | acceptedService           = "EC2"
  constant acceptedEventTypeCategory (line 26) | acceptedEventTypeCategory = "scheduledChange"
  type Parser (line 29) | type Parser struct
    method Parse (line 31) | func (p Parser) Parse(raw string) (messages.Message, error) {
    method Version (line 45) | func (p Parser) Version() string {
    method Source (line 49) | func (p Parser) Source() string {
    method DetailType (line 53) | func (p Parser) DetailType() string {

FILE: pkg/controllers/interruption/messages/spotinterruption/model.go
  type Message (line 23) | type Message struct
    method EC2InstanceIDs (line 34) | func (m Message) EC2InstanceIDs() []string {
    method Kind (line 38) | func (Message) Kind() messages.Kind {
  type Detail (line 29) | type Detail struct

FILE: pkg/controllers/interruption/messages/spotinterruption/parser.go
  type Parser (line 24) | type Parser struct
    method Parse (line 26) | func (p Parser) Parse(raw string) (messages.Message, error) {
    method Version (line 34) | func (p Parser) Version() string {
    method Source (line 38) | func (p Parser) Source() string {
    method DetailType (line 42) | func (p Parser) DetailType() string {

FILE: pkg/controllers/interruption/messages/statechange/model.go
  type Message (line 25) | type Message struct
    method EC2InstanceIDs (line 36) | func (m Message) EC2InstanceIDs() []string {
    method Kind (line 40) | func (m Message) Kind() messages.Kind {
  type Detail (line 31) | type Detail struct

FILE: pkg/controllers/interruption/messages/statechange/parser.go
  type Parser (line 29) | type Parser struct
    method Parse (line 31) | func (p Parser) Parse(raw string) (messages.Message, error) {
    method Version (line 44) | func (p Parser) Version() string {
    method Source (line 48) | func (p Parser) Source() string {
    method DetailType (line 52) | func (p Parser) DetailType() string {

FILE: pkg/controllers/interruption/messages/types.go
  type Parser (line 21) | type Parser interface
  type Message (line 29) | type Message interface
  type Kind (line 35) | type Kind
  constant RebalanceRecommendationKind (line 38) | RebalanceRecommendationKind         Kind = "rebalance_recommendation"
  constant ScheduledChangeKind (line 39) | ScheduledChangeKind                 Kind = "scheduled_change"
  constant SpotInterruptionKind (line 40) | SpotInterruptionKind                Kind = "spot_interrupted"
  constant InstanceStoppedKind (line 41) | InstanceStoppedKind                 Kind = "instance_stopped"
  constant InstanceTerminatedKind (line 42) | InstanceTerminatedKind              Kind = "instance_terminated"
  constant CapacityReservationInterruptionKind (line 43) | CapacityReservationInterruptionKind Kind = "capacity_reservation_interru...
  constant NoOpKind (line 44) | NoOpKind                            Kind = "no_op"
  type Metadata (line 47) | type Metadata struct
    method StartTime (line 58) | func (m Metadata) StartTime() time.Time {

FILE: pkg/controllers/interruption/metrics.go
  constant interruptionSubsystem (line 26) | interruptionSubsystem = "interruption"
  constant messageTypeLabel (line 27) | messageTypeLabel      = "message_type"

FILE: pkg/controllers/interruption/parser.go
  type parserKey (line 32) | type parserKey struct
  function newParserKey (line 38) | func newParserKey(metadata messages.Metadata) parserKey {
  function newParserKeyFromParser (line 46) | func newParserKeyFromParser(p messages.Parser) parserKey {
  type EventParser (line 64) | type EventParser struct
    method Parse (line 76) | func (p EventParser) Parse(msg string) (messages.Message, error) {
  function NewEventParser (line 68) | func NewEventParser(parsers ...messages.Parser) *EventParser {

FILE: pkg/controllers/interruption/suite_test.go
  constant defaultAccountID (line 67) | defaultAccountID = "000000000000"
  constant ec2Source (line 68) | ec2Source        = "aws.ec2"
  constant healthSource (line 69) | healthSource     = "aws.health"
  function TestAPIs (line 81) | func TestAPIs(t *testing.T) {
  function ExpectMessagesCreated (line 336) | func ExpectMessagesCreated(messages ...any) {
  function smithyErrWithCode (line 350) | func smithyErrWithCode(code string) smithy.APIError {
  function spotInterruptionMessage (line 357) | func spotInterruptionMessage(involvedInstanceID string) spotinterruption...
  function capacityReservationInterruptionMessage (line 378) | func capacityReservationInterruptionMessage(involvedInstanceID string) c...
  function stateChangeMessage (line 399) | func stateChangeMessage(involvedInstanceID, state string) statechange.Me...
  function scheduledChangeMessage (line 420) | func scheduledChangeMessage(involvedInstanceID string) scheduledchange.M...

FILE: pkg/controllers/metrics/controller.go
  type metricDimensions (line 33) | type metricDimensions struct
  type Controller (line 39) | type Controller struct
    method Reconcile (line 52) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 101) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 44) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...

FILE: pkg/controllers/metrics/metrics.go
  constant cloudProviderSubsystem (line 25) | cloudProviderSubsystem = "cloudprovider"
  constant instanceTypeLabel (line 26) | instanceTypeLabel      = "instance_type"
  constant capacityTypeLabel (line 27) | capacityTypeLabel      = "capacity_type"
  constant zoneLabel (line 28) | zoneLabel              = "zone"

FILE: pkg/controllers/metrics/suite_test.go
  function TestAWS (line 60) | func TestAWS(t *testing.T) {

FILE: pkg/controllers/nodeclaim/garbagecollection/controller.go
  type Controller (line 41) | type Controller struct
    method Reconcile (line 55) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method garbageCollect (line 93) | func (c *Controller) garbageCollect(ctx context.Context, nodeClaim *ka...
    method Register (line 112) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 47) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...

FILE: pkg/controllers/nodeclaim/garbagecollection/suite_test.go
  function TestAPIs (line 59) | func TestAPIs(t *testing.T) {

FILE: pkg/controllers/nodeclaim/tagging/controller.go
  type Controller (line 48) | type Controller struct
    method Reconcile (line 62) | func (c *Controller) Reconcile(ctx context.Context, nodeClaim *karpv1....
    method Register (line 91) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
    method tagInstance (line 105) | func (c *Controller) tagInstance(ctx context.Context, nc *karpv1.NodeC...
  function NewController (line 54) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...
  function isTaggable (line 131) | func isTaggable(nc *karpv1.NodeClaim) bool {

FILE: pkg/controllers/nodeclaim/tagging/suite_test.go
  function TestAPIs (line 55) | func TestAPIs(t *testing.T) {

FILE: pkg/controllers/nodeclass/ami.go
  type AMI (line 35) | type AMI struct
    method Reconcile (line 47) | func (a *AMI) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClas...
  function NewAMIReconciler (line 40) | func NewAMIReconciler(provider amifamily.Provider) *AMI {

FILE: pkg/controllers/nodeclass/capacityreservation.go
  constant capacityReservationPollPeriod (line 36) | capacityReservationPollPeriod = time.Minute
  type CapacityReservation (line 38) | type CapacityReservation struct
    method Reconcile (line 52) | func (c *CapacityReservation) Reconcile(ctx context.Context, nc *v1.EC...
    method requeueAfter (line 94) | func (c *CapacityReservation) requeueAfter(reservations ...*ec2types.C...
  function NewCapacityReservationReconciler (line 44) | func NewCapacityReservationReconciler(clk clock.Clock, provider capacity...

FILE: pkg/controllers/nodeclass/capacityreservation_test.go
  constant selfOwnerID (line 33) | selfOwnerID = "012345678901"
  constant altOwnerID (line 34) | altOwnerID = "123456789012"

FILE: pkg/controllers/nodeclass/controller.go
  type Controller (line 64) | type Controller struct
    method Name (line 112) | func (c *Controller) Name() string {
    method Reconcile (line 117) | func (c *Controller) Reconcile(ctx context.Context, nodeClass *v1.EC2N...
    method cleanupInstanceProfiles (line 168) | func (c *Controller) cleanupInstanceProfiles(ctx context.Context, node...
    method finalize (line 183) | func (c *Controller) finalize(ctx context.Context, nodeClass *v1.EC2No...
    method Register (line 229) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 74) | func NewController(

FILE: pkg/controllers/nodeclass/events.go
  function WaitingOnNodeClaimTerminationEvent (line 28) | func WaitingOnNodeClaimTerminationEvent(nodeClass *v1.EC2NodeClass, name...

FILE: pkg/controllers/nodeclass/garbagecollection/controller.go
  type Controller (line 38) | type Controller struct
    method getActiveProfiles (line 54) | func (c *Controller) getActiveProfiles(ctx context.Context) (sets.Set[...
    method getCurrentProfiles (line 71) | func (c *Controller) getCurrentProfiles(ctx context.Context) (sets.Set...
    method shouldDeleteProfile (line 87) | func (c *Controller) shouldDeleteProfile(profileName string, currentPr...
    method cleanupInactiveProfiles (line 103) | func (c *Controller) cleanupInactiveProfiles(ctx context.Context) error {
    method Reconcile (line 134) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 143) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 45) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...

FILE: pkg/controllers/nodeclass/garbagecollection/suite_test.go
  function TestAPIs (line 60) | func TestAPIs(t *testing.T) {

FILE: pkg/controllers/nodeclass/hash/controller.go
  type Controller (line 37) | type Controller struct
    method Reconcile (line 47) | func (c *Controller) Reconcile(ctx context.Context, nodeClass *v1.EC2N...
    method Register (line 71) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
    method updateNodeClaimHash (line 86) | func (c *Controller) updateNodeClaimHash(ctx context.Context, nodeClas...
  function NewController (line 41) | func NewController(kubeClient client.Client) *Controller {

FILE: pkg/controllers/nodeclass/hash/suite_test.go
  function TestAPIs (line 51) | func TestAPIs(t *testing.T) {

FILE: pkg/controllers/nodeclass/instanceprofile.go
  type InstanceProfile (line 31) | type InstanceProfile struct
    method protectProfile (line 49) | func (ip *InstanceProfile) protectProfile(profile string) {
    method Reconcile (line 55) | func (ip *InstanceProfile) Reconcile(ctx context.Context, nodeClass *v...
  function NewInstanceProfileReconciler (line 37) | func NewInstanceProfileReconciler(instanceProfileProvider instanceprofil...
  function generateCacheKey (line 45) | func generateCacheKey(nodeClass *v1.EC2NodeClass) string {

FILE: pkg/controllers/nodeclass/securitygroup.go
  type SecurityGroup (line 31) | type SecurityGroup struct
    method Reconcile (line 41) | func (sg *SecurityGroup) Reconcile(ctx context.Context, nodeClass *v1....
  function NewSecurityGroupReconciler (line 35) | func NewSecurityGroupReconciler(securityGroupProvider securitygroup.Prov...

FILE: pkg/controllers/nodeclass/subnet.go
  type Subnet (line 31) | type Subnet struct
    method Reconcile (line 41) | func (s *Subnet) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeC...
  function NewSubnetReconciler (line 35) | func NewSubnetReconciler(subnetProvider subnet.Provider) *Subnet {

FILE: pkg/controllers/nodeclass/suite_test.go
  function TestAPIs (line 59) | func TestAPIs(t *testing.T) {

FILE: pkg/controllers/nodeclass/validation.go
  constant requeueAfterTime (line 52) | requeueAfterTime                              = 10 * time.Minute
  constant ConditionReasonCreateFleetAuthFailed (line 53) | ConditionReasonCreateFleetAuthFailed          = "CreateFleetAuthCheckFai...
  constant ConditionReasonCreateLaunchTemplateAuthFailed (line 54) | ConditionReasonCreateLaunchTemplateAuthFailed = "CreateLaunchTemplateAut...
  constant ConditionReasonRunInstancesAuthFailed (line 55) | ConditionReasonRunInstancesAuthFailed         = "RunInstancesAuthCheckFa...
  constant ConditionReasonDependenciesNotReady (line 56) | ConditionReasonDependenciesNotReady           = "DependenciesNotReady"
  constant ConditionReasonTagValidationFailed (line 57) | ConditionReasonTagValidationFailed            = "TagValidationFailed"
  constant ConditionReasonDryRunDisabled (line 58) | ConditionReasonDryRunDisabled                 = "DryRunDisabled"
  type Validation (line 67) | type Validation struct
    method Reconcile (line 101) | func (v *Validation) Reconcile(ctx context.Context, nodeClass *v1.EC2N...
    method updateCacheOnFailure (line 196) | func (v *Validation) updateCacheOnFailure(nodeClass *v1.EC2NodeClass, ...
    method validateCreateLaunchTemplateAuthorization (line 205) | func (v *Validation) validateCreateLaunchTemplateAuthorization(
    method validateCreateFleetAuthorization (line 240) | func (v *Validation) validateCreateFleetAuthorization(
    method validateRunInstancesAuthorization (line 268) | func (v *Validation) validateRunInstancesAuthorization(
    method requiredConditions (line 296) | func (*Validation) requiredConditions() []string {
    method cacheKey (line 305) | func (*Validation) cacheKey(nodeClass *v1.EC2NodeClass, tags map[strin...
    method clearCacheEntries (line 319) | func (v *Validation) clearCacheEntries(nodeClass *v1.EC2NodeClass) {
    method getPrioritizedInstanceTypes (line 399) | func (v *Validation) getPrioritizedInstanceTypes(ctx context.Context, ...
    method getInstanceTypesForNodeClass (line 453) | func (v *Validation) getInstanceTypesForNodeClass(ctx context.Context,...
    method getTenancyType (line 483) | func (v *Validation) getTenancyType(ctx context.Context, nodeClass *v1...
  function NewValidationReconciler (line 78) | func NewValidationReconciler(
  function getRunInstancesInput (line 336) | func getRunInstancesInput(
  function getFleetLaunchTemplateConfig (line 373) | func getFleetLaunchTemplateConfig(
  function getAMICompatibleInstanceTypes (line 498) | func getAMICompatibleInstanceTypes(instanceTypes []*cloudprovider.Instan...

FILE: pkg/controllers/providers/instancetype/capacity/controller.go
  type ControllerOpts (line 41) | type ControllerOpts struct
  type Controller (line 45) | type Controller struct
    method Reconcile (line 70) | func (c *Controller) Reconcile(ctx context.Context, node *corev1.Node)...
    method Register (line 90) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 52) | func NewController(
  type EC2NodeClassProvider (line 115) | type EC2NodeClassProvider interface
  type defaultNodeClassProvider (line 119) | type defaultNodeClassProvider struct
    method GetEC2NodeClass (line 123) | func (p *defaultNodeClassProvider) GetEC2NodeClass(ctx context.Context...
  function WithEC2NodeClassProvider (line 129) | func WithEC2NodeClassProvider(provider EC2NodeClassProvider) option.Func...

FILE: pkg/controllers/providers/instancetype/capacity/suite_test.go
  function TestAWS (line 68) | func TestAWS(t *testing.T) {

FILE: pkg/controllers/providers/instancetype/controller.go
  type Controller (line 33) | type Controller struct
    method Reconcile (line 43) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 62) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 37) | func NewController(instanceTypeProvider *instancetype.DefaultProvider) *...

FILE: pkg/controllers/providers/instancetype/suite_test.go
  function TestAWS (line 50) | func TestAWS(t *testing.T) {

FILE: pkg/controllers/providers/pricing/controller.go
  type Controller (line 33) | type Controller struct
    method Reconcile (line 43) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 62) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 37) | func NewController(pricingProvider pricing.Provider) *Controller {

FILE: pkg/controllers/providers/pricing/suite_test.go
  function TestAWS (line 52) | func TestAWS(t *testing.T) {

FILE: pkg/controllers/providers/ssm/invalidation/controller.go
  type Controller (line 42) | type Controller struct
    method Name (line 54) | func (c *Controller) Name() string {
    method Reconcile (line 58) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 96) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 47) | func NewController(ssmCache *cache.Cache, amiProvider amifamily.Provider...

FILE: pkg/controllers/providers/ssm/invalidation/suite_test.go
  function TestAWS (line 48) | func TestAWS(t *testing.T) {
  function getSSMCacheEntries (line 143) | func getSSMCacheEntries() map[string]string {
  function deprecateAMIs (line 152) | func deprecateAMIs(amiIDs ...string) {

FILE: pkg/controllers/providers/version/controller.go
  type UpdateVersion (line 31) | type UpdateVersion
  type Controller (line 33) | type Controller struct
    method Reconcile (line 45) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
    method Register (line 54) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
  function NewController (line 38) | func NewController(versionProvider version.Provider, updateVersion Updat...

FILE: pkg/controllers/providers/version/suite_test.go
  function TestAWS (line 47) | func TestAWS(t *testing.T) {

FILE: pkg/errors/errors.go
  constant launchTemplateNameNotFoundCode (line 27) | launchTemplateNameNotFoundCode                 = "InvalidLaunchTemplateN...
  constant RunInstancesInvalidParameterValueCode (line 28) | RunInstancesInvalidParameterValueCode          = "InvalidParameterValue"
  constant DryRunOperationErrorCode (line 29) | DryRunOperationErrorCode                       = "DryRunOperation"
  constant UnauthorizedOperationErrorCode (line 30) | UnauthorizedOperationErrorCode                 = "UnauthorizedOperation"
  constant RateLimitingErrorCode (line 31) | RateLimitingErrorCode                          = "RequestLimitExceeded"
  constant ServiceLinkedRoleCreationNotPermittedErrorCode (line 32) | ServiceLinkedRoleCreationNotPermittedErrorCode = "AuthFailure.ServiceLin...
  constant InsufficientFreeAddressesInSubnetErrorCode (line 33) | InsufficientFreeAddressesInSubnetErrorCode     = "InsufficientFreeAddres...
  constant MaxFleetCountExceededErrorCode (line 34) | MaxFleetCountExceededErrorCode                 = "MaxFleetCountExceeded"
  function IsNotFound (line 70) | func IsNotFound(err error) bool {
  function IgnoreNotFound (line 80) | func IgnoreNotFound(err error) error {
  function IsAlreadyExists (line 87) | func IsAlreadyExists(err error) bool {
  function IgnoreAlreadyExists (line 97) | func IgnoreAlreadyExists(err error) error {
  function IsDryRunError (line 104) | func IsDryRunError(err error) bool {
  function IgnoreDryRunError (line 114) | func IgnoreDryRunError(err error) error {
  function IsUnauthorizedOperationError (line 121) | func IsUnauthorizedOperationError(err error) bool {
  function IgnoreUnauthorizedOperationError (line 131) | func IgnoreUnauthorizedOperationError(err error) error {
  function IsRateLimitedError (line 138) | func IsRateLimitedError(err error) bool {
  function IgnoreRateLimitedError (line 148) | func IgnoreRateLimitedError(err error) error {
  function IsServerError (line 155) | func IsServerError(err error) bool {
  function IgnoreServerError (line 165) | func IgnoreServerError(err error) error {
  function IsUnfulfillableCapacity (line 174) | func IsUnfulfillableCapacity(err ec2types.CreateFleetError) bool {
  function IsServiceLinkedRoleCreationNotPermitted (line 178) | func IsServiceLinkedRoleCreationNotPermitted(err ec2types.CreateFleetErr...
  function IsInsufficientFreeAddressesInSubnet (line 182) | func IsInsufficientFreeAddressesInSubnet(err ec2types.CreateFleetError) ...
  function IsReservationCapacityExceeded (line 188) | func IsReservationCapacityExceeded(err ec2types.CreateFleetError) bool {
  function IsLaunchTemplateNotFound (line 192) | func IsLaunchTemplateNotFound(err error) bool {
  function IsInstanceProfileNotFound (line 202) | func IsInstanceProfileNotFound(err error) bool {
  function ToReasonMessage (line 215) | func ToReasonMessage(err error) (string, string) {

FILE: pkg/fake/atomic.go
  type AtomicPtr (line 29) | type AtomicPtr struct
  method Set (line 34) | func (a *AtomicPtr[T]) Set(v *T) {
  method IsNil (line 40) | func (a *AtomicPtr[T]) IsNil() bool {
  method Clone (line 46) | func (a *AtomicPtr[T]) Clone() *T {
  function clone (line 52) | func clone[T any](v *T) *T {
  method Reset (line 66) | func (a *AtomicPtr[T]) Reset() {
  type AtomicError (line 72) | type AtomicError struct
    method Reset (line 80) | func (e *AtomicError) Reset() {
    method IsNil (line 88) | func (e *AtomicError) IsNil() bool {
    method Get (line 96) | func (e *AtomicError) Get() error {
    method Set (line 106) | func (e *AtomicError) Set(err error, opts ...AtomicErrorOption) {
  type AtomicErrorOption (line 118) | type AtomicErrorOption
  function MaxCalls (line 120) | func MaxCalls(maxCalls int) AtomicErrorOption {
  type AtomicPtrSlice (line 132) | type AtomicPtrSlice struct
  method Reset (line 137) | func (a *AtomicPtrSlice[T]) Reset() {
  method Add (line 143) | func (a *AtomicPtrSlice[T]) Add(input *T) {
  method Len (line 149) | func (a *AtomicPtrSlice[T]) Len() int {
  method Pop (line 155) | func (a *AtomicPtrSlice[T]) Pop() *T {
  method At (line 164) | func (a *AtomicPtrSlice[T]) At(index int) *T {
  method ForEach (line 171) | func (a *AtomicPtrSlice[T]) ForEach(fn func(*T)) {

FILE: pkg/fake/cloudprovider.go
  constant DefaultRegion (line 37) | DefaultRegion  = "us-west-2"
  constant DefaultAccount (line 38) | DefaultAccount = "123456789"
  type CloudProvider (line 43) | type CloudProvider struct
    method Create (line 48) | func (c *CloudProvider) Create(_ context.Context, _ *karpv1.NodeClaim)...
    method GetInstanceTypes (line 60) | func (c *CloudProvider) GetInstanceTypes(_ context.Context, _ *karpv1....
    method IsDrifted (line 69) | func (c *CloudProvider) IsDrifted(_ context.Context, nodeClaim *karpv1...
    method Get (line 73) | func (c *CloudProvider) Get(context.Context, string) (*karpv1.NodeClai...
    method List (line 77) | func (c *CloudProvider) List(context.Context) ([]*karpv1.NodeClaim, er...
    method Delete (line 81) | func (c *CloudProvider) Delete(context.Context, *karpv1.NodeClaim) err...
    method DisruptionReasons (line 85) | func (c *CloudProvider) DisruptionReasons() []karpv1.DisruptionReason {
    method Name (line 90) | func (c *CloudProvider) Name() string {
    method GetSupportedNodeClasses (line 94) | func (c *CloudProvider) GetSupportedNodeClasses() []status.Object {
    method RepairPolicies (line 98) | func (c *CloudProvider) RepairPolicies() []corecloudprovider.RepairPol...
  function GenerateDefaultPriceOutput (line 104) | func GenerateDefaultPriceOutput() (*ec2.DescribeSpotPriceHistoryOutput, ...

FILE: pkg/fake/ec2api.go
  type CapacityPool (line 41) | type CapacityPool struct
  type EC2Behavior (line 50) | type EC2Behavior struct
  type EC2API (line 76) | type EC2API struct
    method Reset (line 90) | func (e *EC2API) Reset() {
    method CreateFleet (line 127) | func (e *EC2API) CreateFleet(_ context.Context, input *ec2.CreateFleet...
    method TerminateInstances (line 251) | func (e *EC2API) TerminateInstances(_ context.Context, input *ec2.Term...
    method CreateLaunchTemplate (line 268) | func (e *EC2API) CreateLaunchTemplate(ctx context.Context, input *ec2....
    method CreateTags (line 293) | func (e *EC2API) CreateTags(_ context.Context, input *ec2.CreateTagsIn...
    method DescribeInstances (line 317) | func (e *EC2API) DescribeInstances(_ context.Context, input *ec2.Descr...
    method DescribeCapacityReservations (line 387) | func (e *EC2API) DescribeCapacityReservations(ctx context.Context, inp...
    method DescribeImages (line 400) | func (e *EC2API) DescribeImages(ctx context.Context, input *ec2.Descri...
    method DescribeLaunchTemplates (line 428) | func (e *EC2API) DescribeLaunchTemplates(_ context.Context, input *ec2...
    method DeleteLaunchTemplate (line 456) | func (e *EC2API) DeleteLaunchTemplate(_ context.Context, input *ec2.De...
    method DescribeSubnets (line 465) | func (e *EC2API) DescribeSubnets(_ context.Context, input *ec2.Describ...
    method DescribeSecurityGroups (line 535) | func (e *EC2API) DescribeSecurityGroups(_ context.Context, input *ec2....
    method DescribeAvailabilityZones (line 571) | func (e *EC2API) DescribeAvailabilityZones(context.Context, *ec2.Descr...
    method DescribeInstanceTypes (line 587) | func (e *EC2API) DescribeInstanceTypes(_ context.Context, _ *ec2.Descr...
    method DescribeInstanceTypeOfferings (line 598) | func (e *EC2API) DescribeInstanceTypeOfferings(_ context.Context, _ *e...
    method DescribeSpotPriceHistory (line 609) | func (e *EC2API) DescribeSpotPriceHistory(_ context.Context, input *ec...
    method RunInstances (line 616) | func (e *EC2API) RunInstances(ctx context.Context, input *ec2.RunInsta...
  function NewEC2API (line 81) | func NewEC2API() *EC2API {
  function filterInstances (line 342) | func filterInstances(instances []ec2types.Instance, filters []ec2types.F...

FILE: pkg/fake/eksapi.go
  type EKSAPIBehavior (line 31) | type EKSAPIBehavior struct
  type EKSAPI (line 35) | type EKSAPI struct
    method Reset (line 46) | func (s *EKSAPI) Reset() {
    method DescribeCluster (line 50) | func (s *EKSAPI) DescribeCluster(_ context.Context, input *eks.Describ...
  function NewEKSAPI (line 40) | func NewEKSAPI() *EKSAPI {

FILE: pkg/fake/iamapi.go
  type IAMAPIBehavior (line 37) | type IAMAPIBehavior struct
  type IAMAPI (line 48) | type IAMAPI struct
    method Reset (line 68) | func (s *IAMAPI) Reset() {
    method GetInstanceProfile (line 81) | func (s *IAMAPI) GetInstanceProfile(_ context.Context, input *iam.GetI...
    method CreateInstanceProfile (line 97) | func (s *IAMAPI) CreateInstanceProfile(_ context.Context, input *iam.C...
    method DeleteInstanceProfile (line 121) | func (s *IAMAPI) DeleteInstanceProfile(_ context.Context, input *iam.D...
    method TagInstanceProfile (line 145) | func (s *IAMAPI) TagInstanceProfile(_ context.Context, input *iam.TagI...
    method AddRoleToInstanceProfile (line 164) | func (s *IAMAPI) AddRoleToInstanceProfile(_ context.Context, input *ia...
    method RemoveRoleFromInstanceProfile (line 193) | func (s *IAMAPI) RemoveRoleFromInstanceProfile(_ context.Context, inpu...
    method ListInstanceProfiles (line 220) | func (s *IAMAPI) ListInstanceProfiles(_ context.Context, input *iam.Li...
    method GetRole (line 237) | func (s *IAMAPI) GetRole(_ context.Context, input *iam.GetRoleInput, _...
  function NewIAMAPI (line 61) | func NewIAMAPI() *IAMAPI {

FILE: pkg/fake/pricingapi.go
  type PricingAPI (line 28) | type PricingAPI struct
    method Reset (line 33) | func (p *PricingAPI) Reset() {
    method GetProducts (line 37) | func (p *PricingAPI) GetProducts(_ context.Context, input *pricing.Get...
  function NewOnDemandPrice (line 45) | func NewOnDemandPrice(instanceType string, price float64) string {
  function NewOnDemandPriceWithCurrency (line 50) | func NewOnDemandPriceWithCurrency(instanceType string, price float64, cu...

FILE: pkg/fake/sqsapi.go
  constant dummyQueueURL (line 27) | dummyQueueURL = "https://sqs.us-west-2.amazonaws.com/000000000000/Karpen...
  type SQSBehavior (line 32) | type SQSBehavior struct
  type SQSAPI (line 38) | type SQSAPI struct
    method Reset (line 45) | func (s *SQSAPI) Reset() {
    method GetQueueUrl (line 52) | func (s *SQSAPI) GetQueueUrl(_ context.Context, input *sqs.GetQueueUrl...
    method ReceiveMessage (line 60) | func (s *SQSAPI) ReceiveMessage(_ context.Context, input *sqs.ReceiveM...
    method DeleteMessage (line 66) | func (s *SQSAPI) DeleteMessage(_ context.Context, input *sqs.DeleteMes...

FILE: pkg/fake/ssmapi.go
  type SSMAPI (line 31) | type SSMAPI struct
    method GetParameter (line 46) | func (a SSMAPI) GetParameter(_ context.Context, input *ssm.GetParamete...
    method Reset (line 81) | func (a *SSMAPI) Reset() {
  function NewSSMAPI (line 40) | func NewSSMAPI() *SSMAPI {

FILE: pkg/fake/types.go
  type MockedFunction (line 26) | type MockedFunction struct
  method Reset (line 40) | func (m *MockedFunction[I, O]) Reset() {
  method Invoke (line 52) | func (m *MockedFunction[I, O]) Invoke(input *I, defaultTransformer func(...
  method Calls (line 97) | func (m *MockedFunction[I, O]) Calls() int {
  method SuccessfulCalls (line 101) | func (m *MockedFunction[I, O]) SuccessfulCalls() int {
  method FailedCalls (line 105) | func (m *MockedFunction[I, O]) FailedCalls() int {

FILE: pkg/fake/utils.go
  function InstanceID (line 32) | func InstanceID() string {
  function RandomProviderID (line 36) | func RandomProviderID() string {
  function ProviderID (line 40) | func ProviderID(id string) string {
  function ImageID (line 44) | func ImageID() string {
  function SecurityGroupID (line 47) | func SecurityGroupID() string {
  function SubnetID (line 51) | func SubnetID() string {
  function InstanceProfileID (line 55) | func InstanceProfileID() string {
  function RoleID (line 59) | func RoleID() string {
  function LaunchTemplateName (line 63) | func LaunchTemplateName() string {
  function LaunchTemplateID (line 67) | func LaunchTemplateID() string {
  function PrivateDNSName (line 71) | func PrivateDNSName() string {
  function SubnetsFromFleetRequest (line 76) | func SubnetsFromFleetRequest(createFleetInput *ec2.CreateFleetInput) []s...
  function FilterDescribeSecurtyGroups (line 90) | func FilterDescribeSecurtyGroups(sgs []ec2types.SecurityGroup, filters [...
  function FilterDescribeSubnets (line 98) | func FilterDescribeSubnets(subnets []ec2types.Subnet, filters []ec2types...
  function FilterDescribeCapacityReservations (line 104) | func FilterDescribeCapacityReservations(crs []ec2types.CapacityReservati...
  function FilterDescribeImages (line 114) | func FilterDescribeImages(images []ec2types.Image, filters []ec2types.Fi...
  function Filter (line 121) | func Filter(filters []ec2types.Filter, id, name, owner, state string, ta...
  function FilterCapacityReservation (line 143) | func FilterCapacityReservation(filters []ec2types.Filter, id, name, owne...
  function matchTags (line 154) | func matchTags(tags []ec2types.Tag, filter ec2types.Filter) bool {
  function MakeInstances (line 179) | func MakeInstances() []ec2types.InstanceTypeInfo {
  function MakeUniqueInstancesAndFamilies (line 210) | func MakeUniqueInstancesAndFamilies(instances []ec2types.InstanceTypeInf...
  function MakeInstanceOfferings (line 232) | func MakeInstanceOfferings(instanceTypes []ec2types.InstanceTypeInfo) []...

FILE: pkg/operator/operator.go
  function init (line 70) | func init() {
  type Operator (line 75) | type Operator struct
  function NewOperator (line 97) | func NewOperator(ctx context.Context, operator *operator.Operator) (cont...
  function WithUserAgent (line 232) | func WithUserAgent(cfg aws.Config) aws.Config {
  function CheckEC2Connectivity (line 242) | func CheckEC2Connectivity(ctx context.Context, api sdk.EC2API) error {
  function ResolveClusterEndpoint (line 253) | func ResolveClusterEndpoint(ctx context.Context, eksAPI sdk.EKSAPI) (str...
  function GetCABundle (line 267) | func GetCABundle(ctx context.Context, restConfig *rest.Config) (*string,...
  function KubeDNSIP (line 286) | func KubeDNSIP(ctx context.Context, kubernetesInterface kubernetes.Inter...
  function SetupIndexers (line 301) | func SetupIndexers(ctx context.Context, mgr manager.Manager) {

FILE: pkg/operator/options/options.go
  function init (line 30) | func init() {
  type optionsKey (line 34) | type optionsKey struct
  type Options (line 36) | type Options struct
    method AddFlags (line 48) | func (o *Options) AddFlags(fs *coreoptions.FlagSet) {
    method Parse (line 60) | func (o *Options) Parse(fs *coreoptions.FlagSet, args ...string) error {
    method ToContext (line 73) | func (o *Options) ToContext(ctx context.Context) context.Context {
  function ToContext (line 77) | func ToContext(ctx context.Context, opts *Options) context.Context {
  function FromContext (line 81) | func FromContext(ctx context.Context) *Options {

FILE: pkg/operator/options/options_validation.go
  method Validate (line 25) | func (o *Options) Validate() error {
  method validateEndpoint (line 34) | func (o *Options) validateEndpoint() error {
  method validateVMMemoryOverheadPercent (line 47) | func (o *Options) validateVMMemoryOverheadPercent() error {
  method validateReservedENIs (line 54) | func (o *Options) validateReservedENIs() error {
  method validateRequiredFields (line 61) | func (o *Options) validateRequiredFields() error {

FILE: pkg/operator/options/suite_test.go
  function TestAPIs (line 36) | func TestAPIs(t *testing.T) {
  function expectOptionsEqual (line 129) | func expectOptionsEqual(optsA *options.Options, optsB *options.Options) {

FILE: pkg/operator/suite_test.go
  function TestAWS (line 47) | func TestAWS(t *testing.T) {

FILE: pkg/providers/amifamily/al2.go
  type AL2 (line 38) | type AL2 struct
    method DescribeImageQuery (line 43) | func (a AL2) DescribeImageQuery(ctx context.Context, ssmProvider ssm.P...
    method UserData (line 91) | func (a AL2) UserData(kubeletConfig *v1.KubeletConfiguration, taints [...
    method DefaultBlockDeviceMappings (line 107) | func (a AL2) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
    method EphemeralBlockDevice (line 114) | func (a AL2) EphemeralBlockDevice() *string {

FILE: pkg/providers/amifamily/al2023.go
  type AL2023 (line 34) | type AL2023 struct
    method DescribeImageQuery (line 39) | func (a AL2023) DescribeImageQuery(ctx context.Context, ssmProvider ss...
    method resolvePath (line 73) | func (a AL2023) resolvePath(architecture, variant, k8sVersion, amiVers...
    method UserData (line 82) | func (a AL2023) UserData(kubeletConfig *v1.KubeletConfiguration, taint...
    method DefaultBlockDeviceMappings (line 99) | func (a AL2023) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
    method EphemeralBlockDevice (line 106) | func (a AL2023) EphemeralBlockDevice() *string {

FILE: pkg/providers/amifamily/ami.go
  type Provider (line 46) | type Provider interface
  type DefaultProvider (line 50) | type DefaultProvider struct
    method List (line 71) | func (p *DefaultProvider) List(ctx context.Context, nodeClass *v1.EC2N...
    method DescribeImageQueries (line 83) | func (p *DefaultProvider) DescribeImageQueries(ctx context.Context, no...
    method amis (line 173) | func (p *DefaultProvider) amis(ctx context.Context, nodeClass *v1.EC2N...
  function NewDefaultProvider (line 60) | func NewDefaultProvider(clk clock.Clock, versionProvider version.Provide...
  function MapToInstanceTypes (line 228) | func MapToInstanceTypes(instanceTypes []*cloudprovider.InstanceType, ami...
  function compareAMI (line 251) | func compareAMI(i, j AMI) int {

FILE: pkg/providers/amifamily/bootstrap/bootstrap.go
  type Options (line 31) | type Options struct
    method kubeletExtraArgs (line 45) | func (o Options) kubeletExtraArgs() (args []string) {
    method nodeTaintArg (line 79) | func (o Options) nodeTaintArg() string {
    method nodeLabelArg (line 87) | func (o Options) nodeLabelArg() string {
  function joinParameterArgs (line 102) | func joinParameterArgs[K comparable, V any](name string, m map[K]V, sepa...
  type Bootstrapper (line 118) | type Bootstrapper interface

FILE: pkg/providers/amifamily/bootstrap/bottlerocket.go
  type Bottlerocket (line 31) | type Bottlerocket struct
    method Script (line 37) | func (b Bottlerocket) Script(ctx context.Context) (string, error) {

FILE: pkg/providers/amifamily/bootstrap/bottlerocket_test.go
  function TestBootstrap (line 24) | func TestBootstrap(t *testing.T) {

FILE: pkg/providers/amifamily/bootstrap/bottlerocketsettings.go
  function NewBottlerocketConfig (line 26) | func NewBottlerocketConfig(ctx context.Context, userdata *string) (*Bott...
  type BottlerocketConfig (line 38) | type BottlerocketConfig struct
    method UnmarshalTOML (line 130) | func (c *BottlerocketConfig) UnmarshalTOML(ctx context.Context, data [...
    method MarshalTOML (line 169) | func (c *BottlerocketConfig) MarshalTOML() ([]byte, error) {
  type BottlerocketSettings (line 45) | type BottlerocketSettings struct
  type BottlerocketKubernetes (line 51) | type BottlerocketKubernetes struct
  type BottlerocketStaticPod (line 100) | type BottlerocketStaticPod struct
  type BottlerocketCredentialProvider (line 107) | type BottlerocketCredentialProvider struct
  type BootstrapCommandMode (line 114) | type BootstrapCommandMode
  constant BootstrapCommandModeAlways (line 117) | BootstrapCommandModeAlways BootstrapCommandMode = "always"
  constant BootstrapCommandModeOnce (line 118) | BootstrapCommandModeOnce   BootstrapCommandMode = "once"
  constant BootstrapCommandModeOff (line 119) | BootstrapCommandModeOff    BootstrapCommandMode = "off"
  type BootstrapCommand (line 124) | type BootstrapCommand struct

FILE: pkg/providers/amifamily/bootstrap/custom.go
  type Custom (line 24) | type Custom struct
    method Script (line 28) | func (e Custom) Script(_ context.Context) (string, error) {

FILE: pkg/providers/amifamily/bootstrap/eksbootstrap.go
  type EKS (line 36) | type EKS struct
    method Script (line 47) | func (e EKS) Script(_ context.Context) (string, error) {
    method eksBootstrapScript (line 58) | func (e EKS) eksBootstrapScript() string {
    method mergeCustomUserData (line 87) | func (e EKS) mergeCustomUserData(userDatas ...string) (string, error) {
    method isIPv6 (line 108) | func (e EKS) isIPv6() bool {
    method mimeify (line 117) | func (e EKS) mimeify(customUserData string) (string, error) {
  constant Boundary (line 42) | Boundary                      = "//"
  constant MIMEVersionHeader (line 43) | MIMEVersionHeader             = "MIME-Version: 1.0"
  constant MIMEContentTypeHeaderTemplate (line 44) | MIMEContentTypeHeaderTemplate = "Content-Type: multipart/mixed; boundary...
  function copyCustomUserDataParts (line 142) | func copyCustomUserDataParts(writer *multipart.Writer, customUserData st...
  function getMultiPartReader (line 175) | func getMultiPartReader(userData string) (*multipart.Reader, error) {

FILE: pkg/providers/amifamily/bootstrap/mime/mime.go
  type ContentType (line 32) | type ContentType
  constant boundary (line 35) | boundary      = "//"
  constant versionHeader (line 36) | versionHeader = "MIME-Version: 1.0"
  constant ContentTypeShellScript (line 38) | ContentTypeShellScript ContentType = `text/x-shellscript; charset="us-as...
  constant ContentTypeNodeConfig (line 39) | ContentTypeNodeConfig  ContentType = "application/" + admapi.GroupName
  constant ContentTypeMultipart (line 40) | ContentTypeMultipart   ContentType = `multipart/mixed; boundary="` + bou...
  type Entry (line 43) | type Entry struct
  type Archive (line 48) | type Archive
    method Serialize (line 80) | func (ma Archive) Serialize() (string, error) {
    method getReader (line 108) | func (Archive) getReader(content string) (*multipart.Reader, error) {
  function NewArchive (line 50) | func NewArchive(content string) (Archive, error) {

FILE: pkg/providers/amifamily/bootstrap/mime/suite_test.go
  function TestAWS (line 35) | func TestAWS(t *testing.T) {

FILE: pkg/providers/amifamily/bootstrap/nodeadm.go
  type Nodeadm (line 36) | type Nodeadm struct
    method Script (line 40) | func (n Nodeadm) Script(_ context.Context) (string, error) {
    method getNodeConfigYAML (line 61) | func (n Nodeadm) getNodeConfigYAML() (string, error) {
    method generateInlineKubeletConfiguration (line 109) | func (n Nodeadm) generateInlineKubeletConfiguration() (map[string]runt...
    method parseUserData (line 128) | func (n Nodeadm) parseUserData() ([]mime.Entry, error) {

FILE: pkg/providers/amifamily/bootstrap/windows.go
  type Windows (line 27) | type Windows struct
    method Script (line 32) | func (w Windows) Script(_ context.Context) (string, error) {

FILE: pkg/providers/amifamily/bottlerocket.go
  type Bottlerocket (line 39) | type Bottlerocket struct
    method DescribeImageQuery (line 44) | func (b Bottlerocket) DescribeImageQuery(ctx context.Context, ssmProvi...
    method UserData (line 80) | func (b Bottlerocket) UserData(kubeletConfig *v1.KubeletConfiguration,...
    method resolveAMIVersion (line 97) | func (b Bottlerocket) resolveAMIVersion() string {
    method getVersionFromAlias (line 113) | func (b Bottlerocket) getVersionFromAlias() string {
    method getVersionFromName (line 126) | func (b Bottlerocket) getVersionFromName() string {
    method getVersionFromID (line 138) | func (b Bottlerocket) getVersionFromID() string {
    method findVersionByID (line 150) | func (b Bottlerocket) findVersionByID(id string) string {
    method getVersionFromResolvedAMIs (line 159) | func (b Bottlerocket) getVersionFromResolvedAMIs() string {
    method extractVersionFromName (line 171) | func (b Bottlerocket) extractVersionFromName(name string) string {
    method DefaultBlockDeviceMappings (line 183) | func (b Bottlerocket) DefaultBlockDeviceMappings() []*v1.BlockDeviceMa...
    method EphemeralBlockDevice (line 198) | func (b Bottlerocket) EphemeralBlockDevice() *string {
    method FeatureFlags (line 214) | func (b Bottlerocket) FeatureFlags() FeatureFlags {

FILE: pkg/providers/amifamily/custom.go
  type Custom (line 30) | type Custom struct
    method UserData (line 36) | func (c Custom) UserData(_ *v1.KubeletConfiguration, _ []corev1.Taint,...
    method DescribeImageQuery (line 44) | func (c Custom) DescribeImageQuery(_ context.Context, _ ssm.Provider, ...
    method DefaultBlockDeviceMappings (line 48) | func (c Custom) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
    method EphemeralBlockDevice (line 56) | func (c Custom) EphemeralBlockDevice() *string {

FILE: pkg/providers/amifamily/resolver.go
  type Resolver (line 46) | type Resolver interface
  type DefaultResolver (line 51) | type DefaultResolver struct
    method Resolve (line 136) | func (r DefaultResolver) Resolve(nodeClass *v1.EC2NodeClass, nodeClaim...
    method defaultClusterDNS (line 232) | func (r DefaultResolver) defaultClusterDNS(opts *Options, kubeletConfi...
    method resolveLaunchTemplates (line 249) | func (r DefaultResolver) resolveLaunchTemplates(
  type Options (line 56) | type Options struct
    method DefaultMetadataOptions (line 223) | func (o Options) DefaultMetadataOptions() *v1.MetadataOptions {
  type LaunchTemplate (line 76) | type LaunchTemplate struct
  type AMIFamily (line 93) | type AMIFamily interface
  type DefaultAMIOutput (line 102) | type DefaultAMIOutput struct
  type FeatureFlags (line 108) | type FeatureFlags struct
  type DefaultFamily (line 116) | type DefaultFamily struct
    method FeatureFlags (line 118) | func (d DefaultFamily) FeatureFlags() FeatureFlags {
  function NewDefaultResolver (line 128) | func NewDefaultResolver(region string) *DefaultResolver {
  function GetAMIFamily (line 204) | func GetAMIFamily(amiFamily string, options *Options) AMIFamily {
  function RejectForbiddenLabels (line 338) | func RejectForbiddenLabels(labels map[string]string) map[string]string {
  function isRestrictedLabel (line 349) | func isRestrictedLabel(label string) bool {

FILE: pkg/providers/amifamily/suite_test.go
  function TestAWS (line 69) | func TestAWS(t *testing.T) {
  constant amd64AMI (line 76) | amd64AMI       = "ami-id-amd64"
  constant arm64AMI (line 77) | arm64AMI       = "ami-id-arm64"
  constant amd64NvidiaAMI (line 78) | amd64NvidiaAMI = "ami-id-amd64-nvidia"
  constant arm64NvidiaAMI (line 79) | arm64NvidiaAMI = "ami-id-arm64-nvidia"
  type MockVersionProvider (line 149) | type MockVersionProvider struct
    method Get (line 153) | func (m *MockVersionProvider) Get(ctx context.Context) string {
  function amiProviderWithEKSVersionOverride (line 157) | func amiProviderWithEKSVersionOverride(version string) *amifamily.Defaul...
  function ExpectConsistsOfAMIQueries (line 1241) | func ExpectConsistsOfAMIQueries(expected, actual []amifamily.DescribeIma...

FILE: pkg/providers/amifamily/types.go
  type AMI (line 36) | type AMI struct
  type AMIs (line 44) | type AMIs
    method Sort (line 48) | func (a AMIs) Sort() {
  function parseTimeWithDefault (line 60) | func parseTimeWithDefault(dateStr string, defaultTime time.Time) time.Ti...
  type Variant (line 67) | type Variant
    method Requirements (line 86) | func (v Variant) Requirements() scheduling.Requirements {
  function NewVariant (line 77) | func NewVariant(v string) (Variant, error) {
  type DescribeImageQuery (line 101) | type DescribeImageQuery struct
    method DescribeImagesInput (line 111) | func (q DescribeImageQuery) DescribeImagesInput() *ec2.DescribeImagesI...
    method RequirementsForImageWithArchitecture (line 123) | func (q DescribeImageQuery) RequirementsForImageWithArchitecture(image...
  type AL2DeprecationError (line 133) | type AL2DeprecationError struct
  function IsAl2DeprecationError (line 137) | func IsAl2DeprecationError(err error) bool {
  type WS2025UnsupportedVersionError (line 145) | type WS2025UnsupportedVersionError struct
  function IsWS2025UnsupportedVersionError (line 149) | func IsWS2025UnsupportedVersionError(err error) bool {

FILE: pkg/providers/amifamily/windows.go
  type Windows (line 40) | type Windows struct
    method DescribeImageQuery (line 50) | func (w Windows) DescribeImageQuery(ctx context.Context, ssmProvider s...
    method UserData (line 73) | func (w Windows) UserData(kubeletConfig *v1.KubeletConfiguration, tain...
    method DefaultBlockDeviceMappings (line 88) | func (w Windows) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
    method EphemeralBlockDevice (line 97) | func (w Windows) EphemeralBlockDevice() *string {
    method FeatureFlags (line 101) | func (w Windows) FeatureFlags() FeatureFlags {

FILE: pkg/providers/capacityreservation/provider.go
  type Provider (line 34) | type Provider interface
  type DefaultProvider (line 42) | type DefaultProvider struct
    method List (line 69) | func (p *DefaultProvider) List(ctx context.Context, selectorTerms ...v...
    method resolveCachedQueries (line 104) | func (p *DefaultProvider) resolveCachedQueries(queries ...*Query) (res...
    method filterReservations (line 116) | func (p *DefaultProvider) filterReservations(reservations []*ec2types....
  function NewProvider (line 52) | func NewProvider(

FILE: pkg/providers/capacityreservation/suite_test.go
  function TestAPIs (line 43) | func TestAPIs(t *testing.T) {

FILE: pkg/providers/capacityreservation/types.go
  type Query (line 32) | type Query struct
    method CacheKey (line 56) | func (q *Query) CacheKey() string {
    method DescribeCapacityReservationsInput (line 62) | func (q *Query) DescribeCapacityReservationsInput() *ec2.DescribeCapac...
  function QueriesFromSelectorTerms (line 39) | func QueriesFromSelectorTerms(terms ...v1.CapacityReservationSelectorTer...
  type availabilityCache (line 107) | type availabilityCache struct
    method syncAvailability (line 118) | func (c *availabilityCache) syncAvailability(availability map[string]i...
    method MarkLaunched (line 130) | func (c *availabilityCache) MarkLaunched(reservationID string) {
    method MarkTerminated (line 150) | func (c *availabilityCache) MarkTerminated(reservationID string) {
    method GetAvailableInstanceCount (line 164) | func (c *availabilityCache) GetAvailableInstanceCount(reservationID st...
    method SetAvailableInstanceCount (line 175) | func (c *availabilityCache) SetAvailableInstanceCount(reservationID st...
    method MarkUnavailable (line 184) | func (c *availabilityCache) MarkUnavailable(reservationIDs ...string) {
  type availabilityCacheEntry (line 113) | type availabilityCacheEntry struct

FILE: pkg/providers/instance/events.go
  function SpotServiceLinkedRoleCreationFailure (line 27) | func SpotServiceLinkedRoleCreationFailure(nodeClaim *v1.NodeClaim) event...

FILE: pkg/providers/instance/filter/filter.go
  type Filter (line 35) | type Filter interface
  function CompatibleAvailableFilter (line 42) | func CompatibleAvailableFilter(requirements scheduling.Requirements, req...
  type compatibleAvailableFilter (line 49) | type compatibleAvailableFilter struct
    method FilterReject (line 54) | func (f compatibleAvailableFilter) FilterReject(instanceTypes []*cloud...
    method Name (line 69) | func (compatibleAvailableFilter) Name() string {
  function CapacityReservationTypeFilter (line 76) | func CapacityReservationTypeFilter(requirements scheduling.Requirements)...
  type capacityReservationTypeFilter (line 82) | type capacityReservationTypeFilter struct
    method FilterReject (line 86) | func (f capacityReservationTypeFilter) FilterReject(instanceTypes []*c...
    method Name (line 129) | func (f capacityReservationTypeFilter) Name() string {
    method Partition (line 146) | func (f capacityReservationTypeFilter) Partition(instanceTypes []*clou...
  type capacityReservationTypePartition (line 133) | type capacityReservationTypePartition struct
  type capacityReservation (line 140) | type capacityReservation struct
  function CapacityBlockFilter (line 202) | func CapacityBlockFilter(requirements scheduling.Requirements) Filter {
  type capacityBlockFilter (line 208) | type capacityBlockFilter struct
    method FilterReject (line 213) | func (f capacityBlockFilter) FilterReject(instanceTypes []*cloudprovid...
    method shouldFilter (line 247) | func (f capacityBlockFilter) shouldFilter(instanceTypes []*cloudprovid...
    method Name (line 266) | func (f capacityBlockFilter) Name() string {
  function ReservedOfferingFilter (line 273) | func ReservedOfferingFilter(requirements scheduling.Requirements) Filter {
  type reservedOfferingFilter (line 279) | type reservedOfferingFilter struct
    method FilterReject (line 283) | func (f reservedOfferingFilter) FilterReject(instanceTypes []*cloudpro...
    method Name (line 315) | func (reservedOfferingFilter) Name() string {
  function ExoticInstanceTypeFilter (line 322) | func ExoticInstanceTypeFilter(requirements scheduling.Requirements) Filt...
  type exoticInstanceFilter (line 328) | type exoticInstanceFilter struct
    method FilterReject (line 332) | func (f exoticInstanceFilter) FilterReject(instanceTypes []*cloudprovi...
    method Name (line 363) | func (exoticInstanceFilter) Name() string {
  function SpotOfferingFilter (line 370) | func SpotOfferingFilter(requirements scheduling.Requirements) Filter {
  type spotOfferingFilter (line 376) | type spotOfferingFilter struct
    method FilterReject (line 381) | func (f spotOfferingFilter) FilterReject(instanceTypes []*cloudprovide...
    method Name (line 429) | func (spotOfferingFilter) Name() string {

FILE: pkg/providers/instance/filter/filter_test.go
  function TestAWS (line 43) | func TestAWS(t *testing.T) {
  function expectInstanceTypes (line 683) | func expectInstanceTypes(instanceTypes []*cloudprovider.InstanceType, na...
  function withRequirements (line 693) | func withRequirements(reqs ...*scheduling.Requirement) mockInstanceTypeO...
  function withResource (line 702) | func withResource(name corev1.ResourceName, quantity resource.Quantity) ...
  function withOfferings (line 711) | func withOfferings(offerings ...*cloudprovider.Offering) mockInstanceTyp...
  function makeInstanceType (line 717) | func makeInstanceType(name string, opts ...mockInstanceTypeOptions) *clo...
  function withReservationCapacity (line 733) | func withReservationCapacity(capacity int) mockOfferingOptions {
  function withReservationID (line 739) | func withReservationID(id string) mockOfferingOptions {
  function withCapacityReservationType (line 752) | func withCapacityReservationType(crt v1.CapacityReservationType) mockOff...
  function withZone (line 765) | func withZone(zone string) mockOfferingOptions {
  function withPrice (line 778) | func withPrice(price float64) mockOfferingOptions {
  function withTag (line 784) | func withTag(tag string) mockOfferingOptions {
  function makeOffering (line 797) | func makeOffering(capacityType string, available bool, opts ...mockOffer...
  function withInterruptible (line 811) | func withInterruptible(interruptible bool) mockOfferingOptions {

FILE: pkg/providers/instance/instance.go
  constant instanceTypeFlexibilityThreshold (line 61) | instanceTypeFlexibilityThreshold = 5
  constant maxInstanceTypes (line 63) | maxInstanceTypes = 60
  type Provider (line 79) | type Provider interface
  type options (line 87) | type options struct
  type DefaultProvider (line 97) | type DefaultProvider struct
    method Create (line 133) | func (p *DefaultProvider) Create(ctx context.Context, nodeClass *v1.EC...
    method Get (line 171) | func (p *DefaultProvider) Get(ctx context.Context, id string, opts ......
    method List (line 200) | func (p *DefaultProvider) List(ctx context.Context) ([]*Instance, erro...
    method Delete (line 237) | func (p *DefaultProvider) Delete(ctx context.Context, id string) error {
    method CreateTags (line 257) | func (p *DefaultProvider) CreateTags(ctx context.Context, id string, t...
    method filterInstanceTypes (line 273) | func (p *DefaultProvider) filterInstanceTypes(ctx context.Context, ins...
    method launchInstance (line 304) | func (p *DefaultProvider) launchInstance(
    method checkODFallback (line 371) | func (p *DefaultProvider) checkODFallback(nodeClaim *karpv1.NodeClaim,...
    method getLaunchTemplateConfigs (line 391) | func (p *DefaultProvider) getLaunchTemplateConfigs(
    method getOverrides (line 428) | func (p *DefaultProvider) getOverrides(
    method updateUnavailableOfferingsCache (line 483) | func (p *DefaultProvider) updateUnavailableOfferingsCache(
    method getCapacityReservationDetailsForInstance (line 542) | func (p *DefaultProvider) getCapacityReservationDetailsForInstance(ins...
  function NewDefaultProvider (line 109) | func NewDefaultProvider(
  function getTenancyType (line 565) | func getTenancyType(nodeClaim *karpv1.NodeClaim) string {
  function getCapacityType (line 585) | func getCapacityType(nodeClaim *karpv1.NodeClaim, instanceTypes []*cloud...
  function getCapacityReservationType (line 601) | func getCapacityReservationType(instanceTypes []*cloudprovider.InstanceT...
  function getCapacityReservationInterruptible (line 612) | func getCapacityReservationInterruptible(instanceTypes []*cloudprovider....
  function instancesFromOutput (line 623) | func instancesFromOutput(ctx context.Context, out *ec2.DescribeInstances...
  function combineFleetErrors (line 640) | func combineFleetErrors(fleetErrs []ec2types.CreateFleetError) (errs err...

FILE: pkg/providers/instance/suite_test.go
  function TestAWS (line 60) | func TestAWS(t *testing.T) {

FILE: pkg/providers/instance/types.go
  type Instance (line 37) | type Instance struct
  type CapacityReservationDetails (line 53) | type CapacityReservationDetails struct
  function NewInstance (line 59) | func NewInstance(ctx context.Context, instance ec2types.Instance) *Insta...
  function tenancyFromInstance (line 95) | func tenancyFromInstance(instance ec2types.Instance) string {
  function capacityTypeFromInstance (line 100) | func capacityTypeFromInstance(ctx context.Context, instance ec2types.Ins...
  function WithCapacityReservationDetails (line 114) | func WithCapacityReservationDetails(capacityReservationDetails *Capacity...
  function WithEFAEnabled (line 120) | func WithEFAEnabled() NewInstanceFromFleetOpts {
  function NewInstanceFromFleet (line 124) | func NewInstanceFromFleet(
  type CreateFleetInputBuilder (line 147) | type CreateFleetInputBuilder struct
    method WithContextID (line 174) | func (b *CreateFleetInputBuilder) WithContextID(contextID string) *Cre...
    method WithOverlay (line 179) | func (b *CreateFleetInputBuilder) WithOverlay() *CreateFleetInputBuild...
    method WithCapacityReservationType (line 184) | func (b *CreateFleetInputBuilder) WithCapacityReservationType(crt v1.C...
    method defaultTargetCapacityType (line 193) | func (b *CreateFleetInputBuilder) defaultTargetCapacityType() ec2types...
    method Build (line 209) | func (b *CreateFleetInputBuilder) Build() *ec2.CreateFleetInput {
  function NewCreateFleetInputBuilder (line 158) | func NewCreateFleetInputBuilder(capacityType string, tags map[string]str...

FILE: pkg/providers/instanceprofile/instanceprofile.go
  type Provider (line 37) | type Provider interface
  type DefaultProvider (line 47) | type DefaultProvider struct
    method Get (line 75) | func (p *DefaultProvider) Get(ctx context.Context, instanceProfileName...
    method Create (line 90) | func (p *DefaultProvider) Create(
    method ensureRole (line 143) | func (p *DefaultProvider) ensureRole(ctx context.Context, instanceProf...
    method Delete (line 184) | func (p *DefaultProvider) Delete(ctx context.Context, instanceProfileN...
    method ListClusterProfiles (line 212) | func (p *DefaultProvider) ListClusterProfiles(ctx context.Context) ([]...
    method ListNodeClassProfiles (line 230) | func (p *DefaultProvider) ListNodeClassProfiles(ctx context.Context, n...
    method IsProtected (line 248) | func (p *DefaultProvider) IsProtected(profileName string) bool {
    method SetProtectedState (line 253) | func (p *DefaultProvider) SetProtectedState(profileName string, protec...
  function NewDefaultProvider (line 55) | func NewDefaultProvider(
  function GetProfileCacheKey (line 71) | func GetProfileCacheKey(profileName string) string {
  function IsRoleNotFoundError (line 262) | func IsRoleNotFoundError(err error) bool {
  type RoleNotFoundErrorCache (line 281) | type RoleNotFoundErrorCache struct
    method HasError (line 286) | func (rc RoleNotFoundErrorCache) HasError(roleName string) (error, boo...
    method SetError (line 293) | func (rc RoleNotFoundErrorCache) SetError(roleName string, err error) {

FILE: pkg/providers/instanceprofile/suite_test.go
  constant nodeRole (line 51) | nodeRole = "NodeRole"
  function TestAWS (line 59) | func TestAWS(t *testing.T) {

FILE: pkg/providers/instancetype/instancetype.go
  type NodeClass (line 53) | type NodeClass interface
  type Provider (line 64) | type Provider interface
  type DefaultProvider (line 69) | type DefaultProvider struct
    method List (line 123) | func (p *DefaultProvider) List(ctx context.Context, nodeClass NodeClas...
    method Get (line 167) | func (p *DefaultProvider) Get(ctx context.Context, nodeClass NodeClass...
    method get (line 198) | func (p *DefaultProvider) get(ctx context.Context, nodeClass NodeClass...
    method cacheKey (line 219) | func (p *DefaultProvider) cacheKey(nodeClass NodeClass) string {
    method UpdateInstanceTypes (line 231) | func (p *DefaultProvider) UpdateInstanceTypes(ctx context.Context) err...
    method UpdateInstanceTypeOfferings (line 273) | func (p *DefaultProvider) UpdateInstanceTypeOfferings(ctx context.Cont...
    method UpdateInstanceTypeCapacityFromNode (line 326) | func (p *DefaultProvider) UpdateInstanceTypeCapacityFromNode(ctx conte...
    method Reset (line 353) | func (p *DefaultProvider) Reset() {
  function NewDefaultProvider (line 93) | func NewDefaultProvider(
  function discoveredCapacityCacheKey (line 360) | func discoveredCapacityCacheKey(instanceType string, nodeClass NodeClass...

FILE: pkg/providers/instancetype/metrics.go
  constant cloudProviderSubsystem (line 26) | cloudProviderSubsystem = "cloudprovider"
  constant instanceTypeLabel (line 27) | instanceTypeLabel      = "instance_type"

FILE: pkg/providers/instancetype/offering/offering.go
  type Provider (line 39) | type Provider interface
  type NodeClass (line 43) | type NodeClass interface
  type DefaultProvider (line 48) | type DefaultProvider struct
    method InjectOfferings (line 70) | func (p *DefaultProvider) InjectOfferings(
    method createOfferings (line 103) | func (p *DefaultProvider) createOfferings(
    method cacheKeyFromInstanceType (line 200) | func (p *DefaultProvider) cacheKeyFromInstanceType(it *cloudprovider.I...
  function NewDefaultProvider (line 56) | func NewDefaultProvider(

FILE: pkg/providers/instancetype/suite_test.go
  function TestAWS (line 77) | func TestAWS(t *testing.T) {
  function ExpectSameInstanceTypeLists (line 3002) | func ExpectSameInstanceTypeLists(instanceTypesLists ...[]*corecloudprovi...
  function ExpectUniqueInstanceTypeLists (line 3023) | func ExpectUniqueInstanceTypeLists(instanceTypesLists ...[]*corecloudpro...
  function ExpectIdenticalInstanceTypes (line 3041) | func ExpectIdenticalInstanceTypes(instanceTypes ...*corecloudprovider.In...
  function generateSpotPricing (line 3060) | func generateSpotPricing(cp *cloudprovider.CloudProvider, nodePool *karp...

FILE: pkg/providers/instancetype/types.go
  constant MemoryAvailable (line 44) | MemoryAvailable = "memory.available"
  constant NodeFSAvailable (line 45) | NodeFSAvailable = "nodefs.available"
  type ZoneData (line 52) | type ZoneData struct
  type Resolver (line 58) | type Resolver interface
  type DefaultResolver (line 65) | type DefaultResolver struct
    method CacheKey (line 75) | func (d *DefaultResolver) CacheKey(nodeClass NodeClass) string {
    method Resolve (line 93) | func (d *DefaultResolver) Resolve(ctx context.Context, info ec2types.I...
  function NewDefaultResolver (line 69) | func NewDefaultResolver(region string) *DefaultResolver {
  function NewInstanceType (line 123) | func NewInstanceType(
  function computeRequirements (line 158) | func computeRequirements(
  function getOS (line 306) | func getOS(info ec2types.InstanceTypeInfo, amiFamily amifamily.AMIFamily...
  function getArchitecture (line 316) | func getArchitecture(info ec2types.InstanceTypeInfo) string {
  function computeCapacity (line 325) | func computeCapacity(ctx context.Context, info ec2types.InstanceTypeInfo...
  function cpu (line 345) | func cpu(info ec2types.InstanceTypeInfo) *resource.Quantity {
  function memory (line 349) | func memory(ctx context.Context, info ec2types.InstanceTypeInfo) *resour...
  function ephemeralStorage (line 362) | func ephemeralStorage(info ec2types.InstanceTypeInfo, amiFamily amifamil...
  function awsPodENI (line 400) | func awsPodENI(instanceTypeName string) *resource.Quantity {
  function nvidiaGPUs (line 409) | func nvidiaGPUs(info ec2types.InstanceTypeInfo) *resource.Quantity {
  function amdGPUs (line 421) | func amdGPUs(info ec2types.InstanceTypeInfo) *resource.Quantity {
  function awsNeuronCores (line 433) | func awsNeuronCores(info ec2types.InstanceTypeInfo) *resource.Quantity {
  function awsNeuronDevices (line 443) | func awsNeuronDevices(info ec2types.InstanceTypeInfo) *resource.Quantity {
  function habanaGaudis (line 453) | func habanaGaudis(info ec2types.InstanceTypeInfo) *resource.Quantity {
  function efas (line 465) | func efas(info ec2types.InstanceTypeInfo) *resource.Quantity {
  function ENILimitedPods (line 473) | func ENILimitedPods(ctx context.Context, info ec2types.InstanceTypeInfo,...
  function privateIPv4Address (line 489) | func privateIPv4Address(instanceTypeName string) *resource.Quantity {
  function systemReservedResources (line 498) | func systemReservedResources(systemReserved map[string]string) corev1.Re...
  function kubeReservedResources (line 504) | func kubeReservedResources(cpus, pods *resource.Quantity, kubeReserved m...
  function evictionThreshold (line 536) | func evictionThreshold(memory *resource.Quantity, storage *resource.Quan...
  function pods (line 558) | func pods(ctx context.Context, info ec2types.InstanceTypeInfo, amiFamily...
  function lowerKabobCase (line 575) | func lowerKabobCase(s string) string {
  function computeEvictionSignal (line 581) | func computeEvictionSignal(capacity resource.Quantity, signalValue strin...
  function mustParsePercentage (line 592) | func mustParsePercentage(v string) float64 {

FILE: pkg/providers/instancetype/zz_generated.vpclimits.go
  type NetworkCard (line 27) | type NetworkCard struct
  type VPCLimits (line 35) | type VPCLimits struct

FILE: pkg/providers/launchtemplate/launchtemplate.go
  type defaultProviderOpts (line 58) | type defaultProviderOpts struct
  function WithLaunchModeProvider (line 62) | func WithLaunchModeProvider(provider LaunchModeProvider) DefaultProvider...
  type DefaultProvider (line 68) | type DefaultProvider struct
    method EnsureAll (line 130) | func (p *DefaultProvider) EnsureAll(
    method InvalidateCache (line 171) | func (p *DefaultProvider) InvalidateCache(ctx context.Context, ltName ...
    method CreateAMIOptions (line 185) | func (p *DefaultProvider) CreateAMIOptions(ctx context.Context, nodeCl...
    method ensureLaunchTemplate (line 216) | func (p *DefaultProvider) ensureLaunchTemplate(ctx context.Context, op...
    method createLaunchTemplate (line 249) | func (p *DefaultProvider) createLaunchTemplate(ctx context.Context, op...
    method hydrateCache (line 339) | func (p *DefaultProvider) hydrateCache(ctx context.Context) {
    method cachedEvictedFunc (line 369) | func (p *DefaultProvider) cachedEvictedFunc(ctx context.Context) func(...
    method DeleteAll (line 388) | func (p *DefaultProvider) DeleteAll(ctx context.Context, nodeClass *v1...
    method ResolveClusterCIDR (line 431) | func (p *DefaultProvider) ResolveClusterCIDR(ctx context.Context) error {
  function NewDefaultProvider (line 85) | func NewDefaultProvider(
  function LaunchTemplateName (line 181) | func LaunchTemplateName(options *amifamily.LaunchTemplate) string {
  function generateNetworkInterfaces (line 264) | func generateNetworkInterfaces(options *amifamily.LaunchTemplate, cluste...
  function blockDeviceMappings (line 300) | func blockDeviceMappings(blockDeviceMappings []*v1.BlockDeviceMapping) [...
  function volumeSize (line 329) | func volumeSize(quantity *resource.Quantity) *int32 {
  function InjectDoNotSyncTaintsLabel (line 460) | func InjectDoNotSyncTaintsLabel(amiFamilyName string, labels map[string]...

FILE: pkg/providers/launchtemplate/suite_test.go
  function TestAWS (line 86) | func TestAWS(t *testing.T) {
  function ExpectTags (line 2714) | func ExpectTags(tags []ec2types.Tag, expected map[string]string) {
  function ExpectLaunchTemplatesCreatedWithUserDataContaining (line 2724) | func ExpectLaunchTemplatesCreatedWithUserDataContaining(substrings ...st...
  function ExpectLaunchTemplatesCreatedWithUserDataNotContaining (line 2736) | func ExpectLaunchTemplatesCreatedWithUserDataNotContaining(substrings .....
  function ExpectLaunchTemplatesCreatedWithUserData (line 2748) | func ExpectLaunchTemplatesCreatedWithUserData(expected string) {
  function ExpectUserDataExistsFromCreatedLaunchTemplates (line 2761) | func ExpectUserDataExistsFromCreatedLaunchTemplates() []string {
  function ExpectParseNodeConfigs (line 2773) | func ExpectParseNodeConfigs(userData string) []admv1alpha1.NodeConfig {
  function ExpectParseNodeConfigKubeletField (line 2790) | func ExpectParseNodeConfigKubeletField[T any](userData, fieldName string...

FILE: pkg/providers/launchtemplate/types.go
  type Provider (line 33) | type Provider interface
  type LaunchTemplate (line 42) | type LaunchTemplate struct
  type LaunchMode (line 49) | type LaunchMode
  constant LaunchModeOpen (line 52) | LaunchModeOpen LaunchMode = iota
  constant LaunchModeTargeted (line 53) | LaunchModeTargeted
  type LaunchModeProvider (line 56) | type LaunchModeProvider interface
  type defaultLaunchModeProvider (line 60) | type defaultLaunchModeProvider struct
    method LaunchMode (line 62) | func (defaultLaunchModeProvider) LaunchMode(ctx context.Context) Launc...
  type CreateLaunchTemplateInputBuilder (line 69) | type CreateLaunchTemplateInputBuilder struct
    method WithLaunchModeProvider (line 89) | func (b *CreateLaunchTemplateInputBuilder) WithLaunchModeProvider(prov...
    method Build (line 94) | func (b *CreateLaunchTemplateInputBuilder) Build(ctx context.Context) ...
  function NewCreateLaunchTemplateInputBuilder (line 76) | func NewCreateLaunchTemplateInputBuilder(

FILE: pkg/providers/pricing/pricing.go
  type Provider (line 43) | type Provider interface
  type DefaultProvider (line 58) | type DefaultProvider struct
    method InstanceTypes (line 135) | func (p *DefaultProvider) InstanceTypes() []ec2types.InstanceType {
    method OnDemandPrice (line 145) | func (p *DefaultProvider) OnDemandPrice(instanceType ec2types.Instance...
    method SpotPrice (line 157) | func (p *DefaultProvider) SpotPrice(instanceType ec2types.InstanceType...
    method UpdateOnDemandPricing (line 172) | func (p *DefaultProvider) UpdateOnDemandPricing(ctx context.Context) e...
    method fetchOnDemandPricing (line 245) | func (p *DefaultProvider) fetchOnDemandPricing(ctx context.Context, ad...
    method spotPage (line 300) | func (p *DefaultProvider) spotPage(ctx context.Context, output *ec2.De...
    method onDemandPage (line 330) | func (p *DefaultProvider) onDemandPage(ctx context.Context, output *pr...
    method UpdateSpotPricing (line 375) | func (p *DefaultProvider) UpdateSpotPricing(ctx context.Context) error {
    method LivenessProbe (line 421) | func (p *DefaultProvider) LivenessProbe(_ *http.Request) error {
    method Reset (line 439) | func (p *DefaultProvider) Reset() {
  type zonal (line 77) | type zonal struct
  function combineZonalPricing (line 82) | func combineZonalPricing(pricingData ...zonal) zonal {
  function newZonalPricing (line 95) | func newZonalPricing(defaultPrice float64) zonal {
  function NewAPI (line 104) | func NewAPI(cfg aws.Config) *pricing.Client {
  function NewDefaultProvider (line 120) | func NewDefaultProvider(pricing sdk.PricingAPI, ec2Api sdk.EC2API, regio...
  function populateInitialSpotPricing (line 431) | func populateInitialSpotPricing(pricing map[ec2types.InstanceType]float6...

FILE: pkg/providers/securitygroup/securitygroup.go
  type Provider (line 36) | type Provider interface
  type DefaultProvider (line 40) | type DefaultProvider struct
    method List (line 56) | func (p *DefaultProvider) List(ctx context.Context, nodeClass *v1.EC2N...
    method getSecurityGroups (line 73) | func (p *DefaultProvider) getSecurityGroups(ctx context.Context, nodeC...
  function NewDefaultProvider (line 47) | func NewDefaultProvider(ec2api sdk.EC2API, cache *cache.Cache) *DefaultP...
  function getFilterSets (line 101) | func getFilterSets(terms []v1.SecurityGroupSelectorTerm) (res [][]ec2typ...

FILE: pkg/providers/securitygroup/suite_test.go
  function TestAWS (line 50) | func TestAWS(t *testing.T) {
  function ExpectConsistsOfSecurityGroups (line 589) | func ExpectConsistsOfSecurityGroups(expected, actual []ec2types.Security...

FILE: pkg/providers/sqs/sqs.go
  type Provider (line 32) | type Provider interface
  type DefaultProvider (line 39) | type DefaultProvider struct
    method Name (line 52) | func (p *DefaultProvider) Name() string {
    method GetSQSMessages (line 57) | func (p *DefaultProvider) GetSQSMessages(ctx context.Context) ([]*sqst...
    method SendMessage (line 79) | func (p *DefaultProvider) SendMessage(ctx context.Context, body any) (...
    method DeleteSQSMessage (line 95) | func (p *DefaultProvider) DeleteSQSMessage(ctx context.Context, msg *s...
  function NewDefaultProvider (line 45) | func NewDefaultProvider(client sdk.SQSAPI, queueURL string) (*DefaultPro...
  function NewSQSProvider (line 107) | func NewSQSProvider(ctx context.Context, sqsapi *sqs.Client) (Provider, ...

FILE: pkg/providers/ssm/provider.go
  type Provider (line 30) | type Provider interface
  type DefaultProvider (line 34) | type DefaultProvider struct
    method Get (line 47) | func (p *DefaultProvider) Get(ctx context.Context, parameter Parameter...
  function NewDefaultProvider (line 40) | func NewDefaultProvider(ssmapi sdk.SSMAPI, cache *cache.Cache) *DefaultP...

FILE: pkg/providers/ssm/types.go
  constant CustomParameterType (line 25) | CustomParameterType = "custom"
  type Parameter (line 28) | type Parameter struct
    method GetParameterInput (line 37) | func (p *Parameter) GetParameterInput() *ssm.GetParameterInput {
    method CacheKey (line 43) | func (p *Parameter) CacheKey() string {
    method GetCacheDuration (line 48) | func (p Parameter) GetCacheDuration() time.Duration {
  type CacheEntry (line 55) | type CacheEntry struct

FILE: pkg/providers/subnet/subnet.go
  type Provider (line 44) | type Provider interface
  type DefaultProvider (line 51) | type DefaultProvider struct
    method List (line 82) | func (p *DefaultProvider) List(ctx context.Context, nodeClass *v1.EC2N...
    method ZonalSubnetsForLaunch (line 132) | func (p *DefaultProvider) ZonalSubnetsForLaunch(ctx context.Context, n...
    method UpdateInflightIPs (line 181) | func (p *DefaultProvider) UpdateInflightIPs(createFleetInput *ec2.Crea...
    method LivenessProbe (line 239) | func (p *DefaultProvider) LivenessProbe(_ *http.Request) error {
    method minPods (line 246) | func (p *DefaultProvider) minPods(instanceTypes []*cloudprovider.Insta...
  type Subnet (line 61) | type Subnet struct
  function NewDefaultProvider (line 68) | func NewDefaultProvider(ec2api sdk.EC2API, cache *cache.Cache, available...
  function getFilterSets (line 262) | func getFilterSets(terms []v1.SubnetSelectorTerm) (res [][]ec2types.Filt...

FILE: pkg/providers/subnet/suite_test.go
  function TestAWS (line 50) | func TestAWS(t *testing.T) {
  function ExpectConsistsOfSubnets (line 552) | func ExpectConsistsOfSubnets(expected, actual []ec2types.Subnet) {

FILE: pkg/providers/version/suite_test.go
  function TestAWS (line 49) | func TestAWS(t *testing.T) {

FILE: pkg/providers/version/version.go
  constant MinK8sVersion (line 43) | MinK8sVersion = "1.26"
  constant MaxK8sVersion (line 44) | MaxK8sVersion = "1.35"
  type Provider (line 47) | type Provider interface
  type DefaultProvider (line 53) | type DefaultProvider struct
    method Get (line 68) | func (p *DefaultProvider) Get(ctx context.Context) string {
    method UpdateVersion (line 72) | func (p *DefaultProvider) UpdateVersion(ctx context.Context) error {
    method UpdateVersionWithValidation (line 90) | func (p *DefaultProvider) UpdateVersionWithValidation(ctx context.Cont...
    method getEKSVersion (line 131) | func (p *DefaultProvider) getEKSVersion(ctx context.Context) (string, ...
    method getK8sVersion (line 141) | func (p *DefaultProvider) getK8sVersion() (string, error) {
  function NewDefaultProvider (line 60) | func NewDefaultProvider(kubernetesInterface kubernetes.Interface, eksapi...
  function SupportedK8sVersions (line 108) | func SupportedK8sVersions() []string {
  function validateK8sVersion (line 118) | func validateK8sVersion(v string) error {
  function SupportsDefaultBind (line 152) | func SupportsDefaultBind(amiVersion string) bool {

FILE: pkg/test/environment.go
  function init (line 52) | func init() {
  type Environment (line 57) | type Environment struct
    method Reset (line 241) | func (env *Environment) Reset() {
  function NewEnvironment (line 108) | func NewEnvironment(ctx context.Context, env *coretest.Environment) *Env...
  function NodeInstanceIDFieldIndexer (line 284) | func NodeInstanceIDFieldIndexer(ctx context.Context) func(ctrlcache.Cach...
  function NodeClaimInstanceIDFieldIndexer (line 299) | func NodeClaimInstanceIDFieldIndexer(ctx context.Context) func(ctrlcache...

FILE: pkg/test/nodeclass.go
  function EC2NodeClass (line 29) | func EC2NodeClass(overrides ...v1.EC2NodeClass) *v1.EC2NodeClass {
  type TestNodeClass (line 128) | type TestNodeClass struct
    method InstanceProfileTags (line 132) | func (t *TestNodeClass) InstanceProfileTags(clusterName string) map[st...

FILE: pkg/test/options.go
  type OptionsFields (line 26) | type OptionsFields struct
  function Options (line 38) | func Options(overrides ...OptionsFields) *options.Options {

FILE: pkg/test/utils.go
  function RemoveNodeClassTagValidation (line 23) | func RemoveNodeClassTagValidation(crds []*apiextensionsv1.CustomResource...
  function DisableCapacityReservationIDValidation (line 38) | func DisableCapacityReservationIDValidation(crds []*apiextensionsv1.Cust...

FILE: pkg/utils/suite_test.go
  function TestUtils (line 28) | func TestUtils(t *testing.T) {

FILE: pkg/utils/utils.go
  function ParseInstanceID (line 41) | func ParseInstanceID(providerID string) (string, error) {
  function EC2MergeTags (line 56) | func EC2MergeTags(tags ...map[string]string) []ec2types.Tag {
  function IAMMergeTags (line 64) | func IAMMergeTags(tags ...map[string]string) []iamtypes.Tag {
  function PrettySlice (line 72) | func PrettySlice[T any](s []T, maxItems int) string {
  function WithDefaultFloat64 (line 88) | func WithDefaultFloat64(key string, def float64) float64 {
  function GetTags (line 100) | func GetTags(nodeClass *v1.EC2NodeClass, nodeClaim *karpv1.NodeClaim, cl...
  function GetNodeClassHash (line 125) | func GetNodeClassHash(nodeClass *v1.EC2NodeClass) string {

FILE: test/hack/resource/clean/main.go
  constant sweeperCleanedResourcesTableName (line 35) | sweeperCleanedResourcesTableName = "sweeperCleanedResources"
  function main (line 39) | func main() {

FILE: test/hack/resource/count/main.go
  constant resourceCountTableName (line 31) | resourceCountTableName = "resourceCount"
  function main (line 33) | func main() {

FILE: test/hack/resource/pkg/metrics/metrics.go
  constant karpenterMetricRegion (line 28) | karpenterMetricRegion   = "us-east-2"
  constant karpenterMetricDatabase (line 29) | karpenterMetricDatabase = "karpenterTesting"
  type Client (line 32) | type Client interface
  type TimeStream (line 36) | type TimeStream struct
    method FireMetric (line 44) | func (t *TimeStream) FireMetric(ctx context.Context, tableName string,...
  function NewTimeStream (line 40) | func NewTimeStream(cfg aws.Config) *TimeStream {
  function WithRegion (line 65) | func WithRegion(region string) func(*timestreamwrite.Options) {

FILE: test/hack/resource/pkg/resourcetypes/eni.go
  type ENI (line 29) | type ENI struct
    method String (line 37) | func (e *ENI) String() string {
    method Global (line 41) | func (e *ENI) Global() bool {
    method GetExpired (line 45) | func (e *ENI) GetExpired(ctx context.Context, expirationTime time.Time...
    method CountAll (line 83) | func (e *ENI) CountAll(ctx context.Context) (count int, err error) {
    method Get (line 92) | func (e *ENI) Get(ctx context.Context, clusterName string) (ids []stri...
    method Cleanup (line 113) | func (e *ENI) Cleanup(ctx context.Context, ids []string) ([]string, er...
    method getAllENIs (line 130) | func (e *ENI) getAllENIs(ctx context.Context, params *ec2.DescribeNetw...
  function NewENI (line 33) | func NewENI(ec2Client *ec2.Client) *ENI {

FILE: test/hack/resource/pkg/resourcetypes/instance.go
  type Instance (line 28) | type Instance struct
    method String (line 36) | func (i *Instance) String() string {
    method Global (line 40) | func (i *Instance) Global() bool {
    method GetExpired (line 44) | func (i *Instance) GetExpired(ctx context.Context, expirationTime time...
    method CountAll (line 76) | func (i *Instance) CountAll(ctx context.Context) (count int, err error) {
    method Get (line 98) | func (i *Instance) Get(ctx context.Context, clusterName string) (ids [...
    method Cleanup (line 123) | func (i *Instance) Cleanup(ctx context.Context, ids []string) ([]strin...
    method getAllInstances (line 141) | func (i *Instance) getAllInstances(ctx context.Context, params *ec2.De...
  function NewInstance (line 32) | func NewInstance(ec2Client *ec2.Client) *Instance {

FILE: test/hack/resource/pkg/resourcetypes/instanceprofile.go
  type InstanceProfile (line 30) | type InstanceProfile struct
    method String (line 38) | func (ip *InstanceProfile) String() string {
    method Global (line 42) | func (ip *InstanceProfile) Global() bool {
    method GetExpired (line 46) | func (ip *InstanceProfile) GetExpired(ctx context.Context, expirationT...
    method CountAll (line 83) | func (ip *InstanceProfile) CountAll(ctx context.Context) (count int, e...
    method Get (line 91) | func (ip *InstanceProfile) Get(ctx context.Context, clusterName string...
    method Cleanup (line 119) | func (ip *InstanceProfile) Cleanup(ctx context.Context, names []string...
    method getAllInstanceProfiles (line 141) | func (ip *InstanceProfile) getAllInstanceProfiles(ctx context.Context)...
  function NewInstanceProfile (line 34) | func NewInstanceProfile(iamClient *iam.Client) *InstanceProfile {

FILE: test/hack/resource/pkg/resourcetypes/launchtemplate.go
  type LaunchTemplate (line 28) | type LaunchTemplate struct
    method String (line 36) | func (lt *LaunchTemplate) String() string {
    method Global (line 40) | func (lt *LaunchTemplate) Global() bool {
    method GetExpired (line 44) | func (lt *LaunchTemplate) GetExpired(ctx context.Context, expirationTi...
    method CountAll (line 72) | func (lt *LaunchTemplate) CountAll(ctx context.Context) (count int, er...
    method Get (line 81) | func (lt *LaunchTemplate) Get(ctx context.Context, clusterName string)...
    method Cleanup (line 103) | func (lt *LaunchTemplate) Cleanup(ctx context.Context, names []string)...
    method getAllLaunchTemplates (line 119) | func (lt *LaunchTemplate) getAllLaunchTemplates(ctx context.Context, p...
  function NewLaunchTemplate (line 32) | func NewLaunchTemplate(ec2Client *ec2.Client) *LaunchTemplate {

FILE: test/hack/resource/pkg/resourcetypes/oidc.go
  type OIDC (line 30) | type OIDC struct
    method String (line 38) | func (o *OIDC) String() string {
    method Global (line 42) | func (o *OIDC) Global() bool {
    method GetExpired (line 46) | func (o *OIDC) GetExpired(ctx context.Context, expirationTime time.Tim...
    method CountAll (line 83) | func (o *OIDC) CountAll(ctx context.Context) (count int, err error) {
    method Get (line 92) | func (o *OIDC) Get(ctx context.Context, clusterName string) (names []s...
    method Cleanup (line 98) | func (o *OIDC) Cleanup(ctx context.Context, arns []string) ([]string, ...
  function NewOIDC (line 34) | func NewOIDC(iamClient *iam.Client) *OIDC {

FILE: test/hack/resource/pkg/resourcetypes/resourcetypes.go
  constant karpenterClusterNameTag (line 23) | karpenterClusterNameTag    = "eks:eks-cluster-name"
  constant karpenterNodePoolTag (line 24) | karpenterNodePoolTag       = "karpenter.sh/nodepool"
  constant karpenterLaunchTemplateTag (line 25) | karpenterLaunchTemplateTag = "karpenter.k8s.aws/cluster"
  constant karpenterSecurityGroupTag (line 26) | karpenterSecurityGroupTag  = "karpenter.sh/discovery"
  constant karpenterTestingTag (line 27) | karpenterTestingTag        = "testing/cluster"
  constant k8sClusterTag (line 28) | k8sClusterTag              = "cluster.k8s.amazonaws.com/name"
  constant githubRunURLTag (line 29) | githubRunURLTag            = "github.com/run-url"
  type Type (line 34) | type Type interface

FILE: test/hack/resource/pkg/resourcetypes/securitygroup.go
  type SecurityGroup (line 29) | type SecurityGroup struct
    method String (line 37) | func (sg *SecurityGroup) String() string {
    method Global (line 41) | func (sg *SecurityGroup) Global() bool {
    method GetExpired (line 45) | func (sg *SecurityGroup) GetExpired(ctx context.Context, expirationTim...
    method CountAll (line 83) | func (sg *SecurityGroup) CountAll(ctx context.Context) (count int, err...
    method Get (line 92) | func (sg *SecurityGroup) Get(ctx context.Context, clusterName string) ...
    method Cleanup (line 114) | func (sg *SecurityGroup) Cleanup(ctx context.Context, ids []string) ([...
    method getAllSecurityGroups (line 131) | func (sg *SecurityGroup) getAllSecurityGroups(ctx context.Context, par...
  function NewSecurityGroup (line 33) | func NewSecurityGroup(ec2Client *ec2.Client) *SecurityGroup {

FILE: test/hack/resource/pkg/resourcetypes/stack.go
  type Stack (line 28) | type Stack struct
    method String (line 36) | func (s *Stack) String() string {
    method Global (line 40) | func (s *Stack) Global() bool {
    method GetExpired (line 44) | func (s *Stack) GetExpired(ctx context.Context, expirationTime time.Ti...
    method CountAll (line 70) | func (s *Stack) CountAll(ctx context.Context) (count int, err error) {
    method Get (line 79) | func (s *Stack) Get(ctx context.Context, clusterName string) (names []...
    method Cleanup (line 97) | func (s *Stack) Cleanup(ctx context.Context, names []string) ([]string...
    method getAllStacks (line 113) | func (s *Stack) getAllStacks(ctx context.Context) (stacks []cloudforma...
  function NewStack (line 32) | func NewStack(cloudFormationClient *cloudformation.Client) *Stack {

FILE: test/hack/resource/pkg/resourcetypes/vpc_endpoint.go
  type VPCEndpoint (line 27) | type VPCEndpoint struct
    method String (line 35) | func (v *VPCEndpoint) String() string {
    method Global (line 39) | func (v *VPCEndpoint) Global() bool {
    method GetExpired (line 43) | func (v *VPCEndpoint) GetExpired(ctx context.Context, expirationTime t...
    method CountAll (line 71) | func (v *VPCEndpoint) CountAll(ctx context.Context) (count int, err er...
    method Get (line 80) | func (v *VPCEndpoint) Get(ctx context.Context, clusterName string) (id...
    method Cleanup (line 101) | func (v *VPCEndpoint) Cleanup(ctx context.Context, ids []string) ([]st...
    method getAllVpcEndpoints (line 110) | func (v *VPCEndpoint) getAllVpcEndpoints(ctx context.Context, params *...
  function NewVPCEndpoint (line 31) | func NewVPCEndpoint(ec2Client *ec2.Client) *VPCEndpoint {

FILE: test/hack/resource/pkg/resourcetypes/vpc_peering_connection.go
  type VPCPeeringConnection (line 27) | type VPCPeeringConnection struct
    method String (line 35) | func (v *VPCPeeringConnection) String() string {
    method Global (line 39) | func (v *VPCPeeringConnection) Global() bool {
    method GetExpired (line 43) | func (v *VPCPeeringConnection) GetExpired(ctx context.Context, expirat...
    method CountAll (line 74) | func (v *VPCPeeringConnection) CountAll(ctx context.Context) (count in...
    method Get (line 83) | func (v *VPCPeeringConnection) Get(ctx context.Context, clusterName st...
    method Cleanup (line 104) | func (v *VPCPeeringConnection) Cleanup(ctx context.Context, ids []stri...
    method getAllVpcPeeringConnections (line 115) | func (v *VPCPeeringConnection) getAllVpcPeeringConnections(ctx context...
  function NewVPCPeeringConnection (line 31) | func NewVPCPeeringConnection(ec2Client *ec2.Client) *VPCPeeringConnection {

FILE: test/hack/soak/get_clusters.go
  type cluster (line 32) | type cluster struct
  constant expirationTTL (line 38) | expirationTTL = time.Hour * 168
  function main (line 42) | func main() {

FILE: test/pkg/debug/events.go
  type EventClient (line 31) | type EventClient struct
    method DumpEvents (line 43) | func (c *EventClient) DumpEvents(ctx context.Context) error {
    method dumpPodEvents (line 50) | func (c *EventClient) dumpPodEvents(ctx context.Context) error {
    method dumpNodeEvents (line 61) | func (c *EventClient) dumpNodeEvents(ctx context.Context) error {
    method GetEvents (line 72) | func (c *EventClient) GetEvents(ctx context.Context, kind string, excl...
  function NewEventClient (line 36) | func NewEventClient(kubeClient client.Client) *EventClient {
  function filterTestEvents (line 85) | func filterTestEvents(events []corev1.Event, startTime time.Time) []core...
  function coallateEvents (line 98) | func coallateEvents(events []corev1.Event) map[corev1.ObjectReference]*c...
  function getEventInformation (line 113) | func getEventInformation(o corev1.ObjectReference, el *corev1.EventList)...

FILE: test/pkg/debug/monitor.go
  type Monitor (line 31) | type Monitor struct
    method MustStart (line 57) | func (m *Monitor) MustStart() {
    method Stop (line 64) | func (m *Monitor) Stop() {
  function New (line 38) | func New(ctx context.Context, config *rest.Config, kubeClient client.Cli...
  function newControllers (line 69) | func newControllers(kubeClient client.Client) []controller.Controller {

FILE: test/pkg/debug/node.go
  type NodeController (line 38) | type NodeController struct
    method Reconcile (line 48) | func (c *NodeController) Reconcile(ctx context.Context, req reconcile....
    method GetInfo (line 60) | func (c *NodeController) GetInfo(ctx context.Context, n *corev1.Node) ...
    method Register (line 65) | func (c *NodeController) Register(ctx context.Context, m manager.Manag...
  function NewNodeController (line 42) | func NewNodeController(kubeClient client.Client) *NodeController {

FILE: test/pkg/debug/nodeclaim.go
  type NodeClaimController (line 35) | type NodeClaimController struct
    method Reconcile (line 45) | func (c *NodeClaimController) Reconcile(ctx context.Context, req recon...
    method GetInfo (line 57) | func (c *NodeClaimController) GetInfo(nc *karpv1.NodeClaim) string {
    method Register (line 66) | func (c *NodeClaimController) Register(_ context.Context, m manager.Ma...
  function NewNodeClaimController (line 39) | func NewNodeClaimController(kubeClient client.Client) *NodeClaimControll...

FILE: test/pkg/debug/pod.go
  type PodController (line 37) | type PodController struct
    method Reconcile (line 47) | func (c *PodController) Reconcile(ctx context.Context, req reconcile.R...
    method GetInfo (line 59) | func (c *PodController) GetInfo(p *corev1.Pod) string {
    method Register (line 71) | func (c *PodController) Register(_ context.Context, m manager.Manager)...
  function NewPodController (line 41) | func NewPodController(kubeClient client.Client) *PodController {

FILE: test/pkg/debug/setup.go
  constant NoWatch (line 29) | NoWatch  = "NoWatch"
  constant NoEvents (line 30) | NoEvents = "NoEvents"
  function BeforeEach (line 36) | func BeforeEach(ctx context.Context, config *rest.Config, kubeClient cli...
  function AfterEach (line 48) | func AfterEach(ctx context.Context) {

FILE: test/pkg/environment/aws/environment.go
  function init (line 53) | func init() {
  type Environment (line 62) | type Environment struct
    method DefaultEC2NodeClass (line 141) | func (env *Environment) DefaultEC2NodeClass() *v1.EC2NodeClass {
  type ZoneInfo (line 83) | type ZoneInfo struct
  function NewEnvironment (line 89) | func NewEnvironment(t *testing.T) *Environment {
  function GetTimeStreamAPI (line 131) | func GetTimeStreamAPI(ctx context.Context, cfg aws.Config) sdk.Timestrea...

FILE: test/pkg/environment/aws/expectations.go
  constant fisRoleName (line 55) | fisRoleName    = "FISInterruptionRole"
  constant fisTargetLimit (line 56) | fisTargetLimit = 5
  constant spotITNAction (line 57) | spotITNAction  = "aws:ec2:send-spot-instance-interruptions"
  method ExpectWindowsIPAMEnabled (line 60) | func (env *Environment) ExpectWindowsIPAMEnabled() {
  method ExpectWindowsIPAMDisabled (line 67) | func (env *Environment) ExpectWindowsIPAMDisabled() {
  method ExpectInstance (line 74) | func (env *Environment) ExpectInstance(nodeName string) Assertion {
  method ExpectIPv6ClusterDNS (line 78) | func (env *Environment) ExpectIPv6ClusterDNS() string {
  method ExpectSpotInterruptionExperiment (line 86) | func (env *Environment) ExpectSpotInterruptionExperiment(instanceIDs ......
  method ExpectExperimentTemplateDeleted (line 120) | func (env *Environment) ExpectExperimentTemplateDeleted(id string) {
  method EventuallyExpectInstanceProfileExists (line 128) | func (env *Environment) EventuallyExpectInstanceProfileExists(profileNam...
  method EventuallyExpectInstanceProfilesNotFound (line 144) | func (env *Environment) EventuallyExpectInstanceProfilesNotFound(profile...
  method GetInstance (line 157) | func (env *Environment) GetInstance(nodeName string) ec2types.Instance {
  method ExpectInstanceStopped (line 162) | func (env *Environment) ExpectInstanceStopped(nodeName string) {
  method ExpectInstanceTerminated (line 172) | func (env *Environment) ExpectInstanceTerminated(nodeName string) {
  method GetInstanceByID (line 181) | func (env *Environment) GetInstanceByID(instanceID string) ec2types.Inst...
  method GetVolume (line 192) | func (env *Environment) GetVolume(id string) ec2types.Volume {
  method GetVolumes (line 198) | func (env *Environment) GetVolumes(ids ...string) []ec2types.Volume {
  method GetNetworkInterface (line 206) | func (env *Environment) GetNetworkInterface(id string) ec2types.NetworkI...
  method GetNetworkInterfaces (line 212) | func (env *Environment) GetNetworkInterfaces(ids ...string) []ec2types.N...
  method GetSpotInstance (line 219) | func (env *Environment) GetSpotInstance(id string) ec2types.SpotInstance...
  method GetSubnets (line 231) | func (env *Environment) GetSubnets(tags map[string]string) map[string][]...
  type SubnetInfo (line 260) | type SubnetInfo struct
  method GetSubnetInfo (line 267) | func (env *Environment) GetSubnetInfo(tags map[string]string) []SubnetIn...
  type SecurityGroup (line 304) | type SecurityGroup struct
  method GetSecurityGroups (line 310) | func (env *Environment) GetSecurityGroups(tags map[string]string) []Secu...
  method ExpectMessagesCreated (line 341) | func (env *Environment) ExpectMessagesCreated(msgs ...any) {
  method ExpectParsedProviderID (line 362) | func (env *Environment) ExpectParsedProviderID(providerID string) string {
  method K8sVersion (line 369) | func (env *Environment) K8sVersion() string {
  method K8sVersionWithOffset (line 375) | func (env *Environment) K8sVersionWithOffset(offset int) string {
  method K8sMinorVersion (line 388) | func (env *Environment) K8sMinorVersion() int {
  method GetAMIBySSMPath (line 396) | func (env *Environment) GetAMIBySSMPath(ssmPath string) string {
  method GetDeprecatedAMI (line 406) | func (env *Environment) GetDeprecatedAMI(amiID string, amifamily string)...
  method EventuallyExpectRunInstances (line 455) | func (env *Environment) EventuallyExpectRunInstances(instanceInput *ec2....
  method ExpectSpotInterruptionRole (line 474) | func (env *Environment) ExpectSpotInterruptionRole() *iamtypes.Role {
  method ExpectAccountID (line 483) | func (env *Environment) ExpectAccountID() string {
  method ExpectInstanceProfileCreated (line 490) | func (env *Environment) ExpectInstanceProfileCreated(instanceProfileName...
  method ExpectInstanceProfileDeleted (line 512) | func (env *Environment) ExpectInstanceProfileDeleted(instanceProfileName...
  function ignoreAlreadyContainsRole (line 528) | func ignoreAlreadyContainsRole(err error) error {
  function ExpectInterruptibleCapacityReservationCreated (line 537) | func ExpectInterruptibleCapacityReservationCreated(
  function ExpectModifyInterruptibleCapacity (line 574) | func ExpectModifyInterruptibleCapacity(
  function ExpectInterruptibleAndSourceCapacityCanceled (line 588) | func ExpectInterruptibleAndSourceCapacityCanceled(
  function ExpectCapacityReservationCreated (line 625) | func ExpectCapacityReservationCreated(
  function ExpectCapacityReservationsCanceled (line 651) | func ExpectCapacityReservationsCanceled(ctx context.Context, ec2api *ec2...
  method EventuallyExpectNodeRoleCreated (line 664) | func (env *Environment) EventuallyExpectNodeRoleCreated(roleName string) {
  method ExpectNodeRoleDeleted (line 738) | func (env *Environment) ExpectNodeRoleDeleted(roleName string) {

FILE: test/pkg/environment/aws/metrics.go
  constant metricsDefaultRegion (line 36) | metricsDefaultRegion = "us-east-2"
  constant databaseName (line 37) | databaseName         = "karpenterTesting"
  constant tableName (line 38) | tableName            = "scaleTestDurations"
  type NoOpTimeStreamAPI (line 41) | type NoOpTimeStreamAPI struct
    method WriteRecords (line 45) | func (o NoOpTimeStreamAPI) WriteRecords(_ context.Context, _ *timestre...
  type EventType (line 49) | type EventType
  constant ProvisioningEventType (line 52) | ProvisioningEventType   EventType = "provisioning"
  constant DeprovisioningEventType (line 53) | DeprovisioningEventType EventType = "deprovisioning"
  constant TestCategoryDimension (line 57) | TestCategoryDimension           = "category"
  constant TestNameDimension (line 58) | TestNameDimension               = "name"
  constant GitRefDimension (line 59) | GitRefDimension                 = "gitRef"
  constant ProvisionedNodeCountDimension (line 60) | ProvisionedNodeCountDimension   = "provisionedNodeCount"
  constant DeprovisionedNodeCountDimension (line 61) | DeprovisionedNodeCountDimension = "deprovisionedNodeCount"
  constant PodDensityDimension (line 62) | PodDensityDimension             = "podDensity"
  method MeasureProvisioningDurationFor (line 65) | func (env *Environment) MeasureProvisioningDurationFor(f func(), dimensi...
  method MeasureDeprovisioningDurationFor (line 71) | func (env *Environment) MeasureDeprovisioningDurationFor(f func(), dimen...
  method MeasureDurationFor (line 78) | func (env *Environment) MeasureDurationFor(f func(), eventType EventType...
  method ExpectMetric (line 98) | func (env *Environment) ExpectMetric(name string, value float64, labels ...

FILE: test/pkg/environment/aws/setup.go
  method BeforeEach (line 32) | func (env *Environment) BeforeEach() {
  method Cleanup (line 37) | func (env *Environment) Cleanup() {
  method AfterEach (line 42) | func (env *Environment) AfterEach() {

FILE: test/pkg/environment/common/environment.go
  type ContextKey (line 48) | type ContextKey
  constant GitRefContextKey (line 51) | GitRefContextKey = ContextKey("gitRef")
  type Environment (line 54) | type Environment struct
    method Stop (line 88) | func (env *Environment) Stop() {
    method DefaultNodePool (line 133) | func (env *Environment) DefaultNodePool(nodeClass *v1.EC2NodeClass) *k...
  function NewEnvironment (line 66) | func NewEnvironment(t *testing.T) *Environment {
  function NewConfig (line 92) | func NewConfig() *rest.Config {
  function NewClient (line 100) | func NewClient(ctx context.Context, config *rest.Config) client.Client {

FILE: test/pkg/environment/common/expectations.go
  method ExpectCreated (line 63) | func (env *Environment) ExpectCreated(objects ...client.Object) {
  method ExpectDeleted (line 75) | func (env *Environment) ExpectDeleted(objects ...client.Object) {
  method ExpectUpdated (line 90) | func (env *Environment) ExpectUpdated(objects ...client.Object) {
  method ExpectStatusUpdated (line 111) | func (env *Environment) ExpectStatusUpdated(objects ...client.Object) {
  function ReplaceNodeConditions (line 126) | func ReplaceNodeConditions(node *corev1.Node, conds ...corev1.NodeCondit...
  method ExpectCreatedOrUpdated (line 141) | func (env *Environment) ExpectCreatedOrUpdated(objects ...client.Object) {
  method ExpectSettings (line 158) | func (env *Environment) ExpectSettings() (res []corev1.EnvVar) {
  method ExpectSettingsReplaced (line 169) | func (env *Environment) ExpectSettingsReplaced(vars ...corev1.EnvVar) {
  method ExpectSettingsOverridden (line 186) | func (env *Environment) ExpectSettingsOverridden(vars ...corev1.EnvVar) {
  method ExpectSettingsRemoved (line 210) | func (env *Environment) ExpectSettingsRemoved(vars ...corev1.EnvVar) {
  method ExpectConfigMapExists (line 230) | func (env *Environment) ExpectConfigMapExists(key types.NamespacedName) ...
  method ExpectConfigMapDataReplaced (line 237) | func (env *Environment) ExpectConfigMapDataReplaced(key types.Namespaced...
  method ExpectConfigMapDataOverridden (line 260) | func (env *Environment) ExpectConfigMapDataOverridden(key types.Namespac...
  method ExpectPodENIEnabled (line 278) | func (env *Environment) ExpectPodENIEnabled() {
  method ExpectPodENIDisabled (line 284) | func (env *Environment) ExpectPodENIDisabled() {
  method ExpectPrefixDelegationEnabled (line 290) | func (env *Environment) ExpectPrefixDelegationEnabled() {
  method ExpectPrefixDelegationDisabled (line 296) | func (env *Environment) ExpectPrefixDelegationDisabled() {
  method ExpectExists (line 302) | func (env *Environment) ExpectExists(obj client.Object) client.Object {
  method EventuallyExpectBound (line 310) | func (env *Environment) EventuallyExpectBound(pods ...*corev1.Pod) {
  method EventuallyExpectHealthy (line 320) | func (env *Environment) EventuallyExpectHealthy(pods ...*corev1.Pod) {
  method EventuallyExpectTerminating (line 325) | func (env *Environment) EventuallyExpectTerminating(pods ...*corev1.Pod) {
  method EventuallyExpectTerminatingWithTimeout (line 330) | func (env *Environment) EventuallyExpectTerminatingWithTimeout(timeout t...
  method EventuallyExpectNoLeakedKubeNodeLease (line 340) | func (env *Environment) EventuallyExpectNoLeakedKubeNodeLease() {
  method EventuallyExpectHealthyWithTimeout (line 351) | func (env *Environment) EventuallyExpectHealthyWithTimeout(timeout time....
  method ConsistentlyExpectTerminatingPods (line 364) | func (env *Environment) ConsistentlyExpectTerminatingPods(duration time....
  method ConsistentlyExpectActivePods (line 375) | func (env *Environment) ConsistentlyExpectActivePods(duration time.Durat...
  method ConsistentlyExpectHealthyPods (line 386) | func (env *Environment) ConsistentlyExpectHealthyPods(duration time.Dura...
  method ConsistentlyExpectPendingPods (line 400) | func (env *Environment) ConsistentlyExpectPendingPods(duration time.Dura...
  method EventuallyExpectKarpenterRestarted (line 411) | func (env *Environment) EventuallyExpectKarpenterRestarted() {
  method ExpectKarpenterLeaseOwnerChanged (line 418) | func (env *Environment) ExpectKarpenterLeaseOwnerChanged() {
  method ExpectPodPortForwarded (line 431) | func (env *Environment) ExpectPodPortForwarded(ctx context.Context, pod ...
  type PrometheusMetric (line 460) | type PrometheusMetric struct
  method ExpectPodMetrics (line 466) | func (env *Environment) ExpectPodMetrics() (res []PrometheusMetric) {
  function parseMetricsLine (line 497) | func parseMetricsLine(line string) (metric PrometheusMetric, err error) {
  method EventuallyExpectRollout (line 516) | func (env *Environment) EventuallyExpectRollout(name, namespace string) {
  method ExpectKarpenterPods (line 547) | func (env *Environment) ExpectKarpenterPods() []*corev1.Pod {
  method ExpectActiveKarpenterPodName (line 556) | func (env *Environment) ExpectActiveKarpenterPodName() string {
  method ExpectActiveKarpenterPod (line 568) | func (env *Environment) ExpectActiveKarpenterPod() *corev1.Pod {
  method EventuallyExpectPendingPodCount (line 577) | func (env *Environment) EventuallyExpectPendingPodCount(selector labels....
  method EventuallyExpectBoundPodCount (line 584) | func (env *Environment) EventuallyExpectBoundPodCount(selector labels.Se...
  method EventuallyExpectHealthyPodCount (line 601) | func (env *Environment) EventuallyExpectHealthyPodCount(selector labels....
  method EventuallyExpectHealthyPodCountWithTimeout (line 607) | func (env *Environment) EventuallyExpectHealthyPodCountWithTimeout(timeo...
  method ExpectPodsMatchingSelector (line 617) | func (env *Environment) ExpectPodsMatchingSelector(selector labels.Selec...
  method EventuallyExpectUniqueNodeNames (line 625) | func (env *Environment) EventuallyExpectUniqueNodeNames(selector labels....
  method eventuallyExpectScaleDown (line 638) | func (env *Environment) eventuallyExpectScaleDown() {
  method EventuallyExpectNotFound (line 647) | func (env *Environment) EventuallyExpectNotFound(objects ...client.Objec...
  method ExpectCreatedNodeCount (line 658) | func (env *Environment) ExpectCreatedNodeCount(comparator string, count ...
  method ExpectNodeCount (line 666) | func (env *Environment) ExpectNodeCount(comparator string, count int) []...
  method ExpectNodeClaimCount (line 675) | func (env *Environment) ExpectNodeClaimCount(comparator string, count in...
  function NodeClaimNames (line 684) | func NodeClaimNames(nodeClaims []*karpv1.NodeClaim) []string {
  function NodeNames (line 690) | func NodeNames(nodes []*corev1.Node) []string {
  method ConsistentlyExpectNodeCount (line 696) | func (env *Environment) ConsistentlyExpectNodeCount(comparator string, c...
  method ConsistentlyExpectNoDisruptions (line 710) | func (env *Environment) ConsistentlyExpectNoDisruptions(nodeCount int, d...
  method ConsistentlyExpectDisruptionsUntilNoneLeft (line 734) | func (env *Environment) ConsistentlyExpectDisruptionsUntilNoneLeft(nodes...
  method EventuallyExpectTaintedNodeCount (line 781) | func (env *Environment) EventuallyExpectTaintedNodeCount(comparator stri...
  method EventuallyExpectNodesUntaintedWithTimeout (line 793) | func (env *Environment) EventuallyExpectNodesUntaintedWithTimeout(timeou...
  method EventuallyExpectLaunchedNodeClaimCount (line 804) | func (env *Environment) EventuallyExpectLaunchedNodeClaimCount(comparato...
  method EventuallyExpectNodeCount (line 816) | func (env *Environment) EventuallyExpectNodeCount(comparator string, cou...
  method EventuallyExpectNodeCountWithSelector (line 828) | func (env *Environment) EventuallyExpectNodeCountWithSelector(comparator...
  method EventuallyExpectCreatedNodeCount (line 840) | func (env *Environment) EventuallyExpectCreatedNodeCount(comparator stri...
  method EventuallyExpectDeletedNodeCount (line 852) | func (env *Environment) EventuallyExpectDeletedNodeCount(comparator stri...
  method EventuallyExpectDeletedNodeCountWithSelector (line 864) | func (env *Environment) EventuallyExpectDeletedNodeCountWithSelector(com...
  method EventuallyExpectInitializedNodeCount (line 879) | func (env *Environment) EventuallyExpectInitializedNodeCount(comparator ...
  method EventuallyExpectCreatedNodeClaimCount (line 893) | func (env *Environment) EventuallyExpectCreatedNodeClaimCount(comparator...
  method EventuallyExpectNodeClaimsReady (line 906) | func (env *Environment) EventuallyExpectNodeClaimsReady(nodeClaims ...*k...
  method EventuallyExpectDrifted (line 917) | func (env *Environment) EventuallyExpectDrifted(nodeClaims ...*karpv1.No...
  method ConsistentlyExpectNodeClaimsNotDrifted (line 927) | func (env *Environment) ConsistentlyExpectNodeClaimsNotDrifted(duration ...
  method EventuallyExpectConsolidatable (line 939) | func (env *Environment) EventuallyExpectConsolidatable(nodeClaims ...*ka...
  method GetNode (line 949) | func (env *Environment) GetNode(nodeName string) corev1.Node {
  method ExpectNoCrashes (line 956) | func (env *Environment) ExpectNoCrashes() {
  method printControllerLogs (line 969) | func (env *Environment) printControllerLogs(options *corev1.PodLogOption...
  method EventuallyExpectMinUtilization (line 998) | func (env *Environment) EventuallyExpectMinUtilization(resource corev1.R...
  method EventuallyExpectAvgUtilization (line 1005) | func (env *Environment) EventuallyExpectAvgUtilization(resource corev1.R...
  method ExpectDaemonSetEnvironmentVariableUpdated (line 1012) | func (env *Environment) ExpectDaemonSetEnvironmentVariableUpdated(obj cl...
  method ForcePodsToSpread (line 1042) | func (env *Environment) ForcePodsToSpread(nodes ...*corev1.Node) {
  method ExpectActivePodsForNode (line 1089) | func (env *Environment) ExpectActivePodsForNode(nodeName string) []*core...
  method ExpectCABundle (line 1099) | func (env *Environment) ExpectCABundle() string {
  method GetDaemonSetCount (line 1113) | func (env *Environment) GetDaemonSetCount(np *karpv1.NodePool) int {
  method GetDaemonSetOverhead (line 1134) | func (env *Environment) GetDaemonSetOverhead(np *karpv1.NodePool) corev1...

FILE: test/pkg/environment/common/monitor.go
  type Monitor (line 36) | type Monitor struct
    method Reset (line 63) | func (m *Monitor) Reset() {
    method RestartCount (line 73) | func (m *Monitor) RestartCount(namespace string) map[string]int {
    method NodeCount (line 92) | func (m *Monitor) NodeCount() int {
    method NodeCountAtReset (line 98) | func (m *Monitor) NodeCountAtReset() int {
    method CreatedNodeCount (line 103) | func (m *Monitor) CreatedNodeCount() int {
    method NodesAtReset (line 108) | func (m *Monitor) NodesAtReset() []*corev1.Node {
    method Nodes (line 115) | func (m *Monitor) Nodes() []*corev1.Node {
    method CreatedNodes (line 121) | func (m *Monitor) CreatedNodes() []*corev1.Node {
    method DeletedNodes (line 127) | func (m *Monitor) DeletedNodes() []*corev1.Node {
    method PendingPods (line 133) | func (m *Monitor) PendingPods(selector labels.Selector) []*corev1.Pod {
    method PendingPodsCount (line 146) | func (m *Monitor) PendingPodsCount(selector labels.Selector) int {
    method RunningPods (line 151) | func (m *Monitor) RunningPods(selector labels.Selector) []*corev1.Pod {
    method RunningPodsCount (line 164) | func (m *Monitor) RunningPodsCount(selector labels.Selector) int {
    method poll (line 168) | func (m *Monitor) poll() state {
    method AvgUtilization (line 201) | func (m *Monitor) AvgUtilization(resource corev1.ResourceName) float64 {
    method MinUtilization (line 210) | func (m *Monitor) MinUtilization(resource corev1.ResourceName) float64 {
    method nodeUtilization (line 218) | func (m *Monitor) nodeUtilization(resource corev1.ResourceName) []floa...
  type state (line 45) | type state struct
  function NewMonitor (line 52) | func NewMonitor(ctx context.Context, kubeClient client.Client) *Monitor {
  type copyable (line 236) | type copyable interface
  function deepCopyMap (line 240) | func deepCopyMap[K comparable, V copyable[V]](m map[K]V) map[K]V {
  function deepCopySlice (line 248) | func deepCopySlice[T copyable[T]](s []T) []T {

FILE: test/pkg/environment/common/setup.go
  constant TestingFinalizer (line 48) | TestingFinalizer = "testing/finalizer"
  method BeforeEach (line 72) | func (env *Environment) BeforeEach() {
  method ExpectCleanCluster (line 82) | func (env *Environment) ExpectCleanCluster() {
  method Cleanup (line 107) | func (env *Environment) Cleanup() {
  method AfterEach (line 114) | func (env *Environment) AfterEach() {
  method CleanupObjects (line 119) | func (env *Environment) CleanupObjects(cleanableObjects ...client.Object) {
  method ExpectTestingFinalizerRemoved (line 148) | func (env *Environment) ExpectTestingFinalizerRemoved(obj client.Object)...

FILE: test/suites/ami/suite_test.go
  function TestAMI (line 54) | func TestAMI(t *testing.T) {
  function getInstanceAttribute (line 421) | func getInstanceAttribute(nodeName string, attribute string) *ec2.Descri...
  function EventuallyExpectAMIsToExist (line 434) | func EventuallyExpectAMIsToExist(nodeClass *v1.EC2NodeClass) *v1.EC2Node...

FILE: test/suites/consolidation/suite_test.go
  function TestConsolidation (line 53) | func TestConsolidation(t *testing.T) {

FILE: test/suites/drift/suite_test.go
  function TestDrift (line 50) | func TestDrift(t *testing.T) {

FILE: test/suites/integration/cni_test.go
  function eniLimitedPodsFor (line 69) | func eniLimitedPodsFor(instanceType string) int64 {
  function reservedENIsFor (line 78) | func reservedENIsFor(instanceType string) int64 {

FILE: test/suites/integration/extended_resources_test.go
  function ExpectNvidiaDevicePluginCreated (line 353) | func ExpectNvidiaDevicePluginCreated() {
  function ExpectNeuronDevicePluginCreated (line 425) | func ExpectNeuronDevicePluginCreated() {
  function ExpectK8sNeuronSchedulerCreated (line 592) | func ExpectK8sNeuronSchedulerCreated() {
  function ExpectNeuronSchedulerExtensionCreated (line 736) | func ExpectNeuronSchedulerExtensionCreated() {
  function ExpectAMDDevicePluginCreated (line 938) | func ExpectAMDDevicePluginCreated() {
  function ExpectHabanaDevicePluginCreated (line 1012) | func ExpectHabanaDevicePluginCreated() {
  function ExpectEFADevicePluginCreated (line 1082) | func ExpectEFADevicePluginCreated() {

FILE: test/suites/integration/nodeclass_test.go
  function EventuallyExpectWithDryRunCacheInvalidation (line 169) | func EventuallyExpectWithDryRunCacheInvalidation(f func(g Gomega, curren...

FILE: test/suites/integration/security_group_test.go
  function EventuallyExpectSecurityGroups (line 97) | func EventuallyExpectSecurityGroups(env *aws.Environment, nodeClass *v1....

FILE: test/suites/integration/subnet_test.go
  function ExpectResourceBasedNamingEnabled (line 147) | func ExpectResourceBasedNamingEnabled(subnetIDs ...string) {
  function ExpectResourceBasedNamingDisabled (line 164) | func ExpectResourceBasedNamingDisabled(subnetIDs ...string) {
  function ExceptNodeNameToContainInstanceID (line 181) | func ExceptNodeNameToContainInstanceID(nodeName string) {
  type SubnetInfo (line 188) | type SubnetInfo struct
  function EventuallyExpectSubnets (line 193) | func EventuallyExpectSubnets(env *aws.Environment, nodeClass *v1.EC2Node...

FILE: test/suites/integration/suite_test.go
  function TestIntegration (line 33) | func TestIntegration(t *testing.T) {

FILE: test/suites/integration/tags_test.go
  constant createdAtTag (line 40) | createdAtTag = "node.k8s.amazonaws.com/createdAt"

FILE: test/suites/interruption/suite_test.go
  function TestInterruption (line 50) | func TestInterruption(t *testing.T) {
  function scheduledChangeMessage (line 272) | func scheduledChangeMessage(region, accountID, involvedInstanceID string...

FILE: test/suites/ipv6/suite_test.go
  function TestIPv6 (line 40) | func TestIPv6(t *testing.T) {

FILE: test/suites/localzone/suite_test.go
  function TestLocalZone (line 40) | func TestLocalZone(t *testing.T) {

FILE: test/suites/nodeclaim/suite_test.go
  function TestNodeClaim (line 39) | func TestNodeClaim(t *testing.T) {

FILE: test/suites/scale/deprovisioning_test.go
  constant deprovisioningTypeKey (line 49) | deprovisioningTypeKey = "testing/deprovisioning-type"
  constant consolidationValue (line 50) | consolidationValue    = "consolidation"
  constant emptinessValue (line 51) | emptinessValue        = "emptiness"
  constant expirationValue (line 52) | expirationValue       = "expiration"
  constant noExpirationValue (line 53) | noExpirationValue     = "noExpiration"
  constant driftValue (line 54) | driftValue            = "drift"
  constant multipleDeprovisionersTestGroup (line 58) | multipleDeprovisionersTestGroup = "multipleDeprovisioners"
  constant consolidationTestGroup (line 59) | consolidationTestGroup          = "consolidation"
  constant emptinessTestGroup (line 60) | emptinessTestGroup              = "emptiness"
  constant expirationTestGroup (line 61) | expirationTestGroup             = "expiration"
  constant driftTestGroup (line 62) | driftTestGroup                  = "drift"
  constant interruptionTestGroup (line 63) | interruptionTestGroup           = "interruption"
  constant defaultTestName (line 65) | defaultTestName = "default"
  function scheduledChangeMessage (line 745) | func scheduledChangeMessage(region, accountID, involvedInstanceID string...

FILE: test/suites/scale/provisioning_test.go
  constant testGroup (line 38) | testGroup = "provisioning"

FILE: test/suites/scale/suite_test.go
  function TestScale (line 29) | func TestScale(t *testing.T) {

FILE: test/suites/scheduling/suite_test.go
  function TestScheduling (line 51) | func TestScheduling(t *testing.T) {
  function ephemeralInitContainer (line 1133) | func ephemeralInitContainer(requirements corev1.ResourceRequirements) co...

FILE: test/suites/storage/suite_test.go
  function TestStorage (line 53) | func TestStorage(t *testing.T) {
  function ExpectSetEBSDriverLimit (line 403) | func ExpectSetEBSDriverLimit(limit int) {
  function ExpectRemoveEBSDriverLimit (line 420) | func ExpectRemoveEBSDriverLimit() {

FILE: tools/kompat/cmd/kompat/main.go
  constant OutputJSON (line 34) | OutputJSON     = "json"
  constant OutputYAML (line 35) | OutputYAML     = "yaml"
  constant OutputTable (line 36) | OutputTable    = "table"
  constant OutputMarkdown (line 37) | OutputMarkdown = "md"
  type GlobalOptions (line 44) | type GlobalOptions struct
  type RootOptions (line 50) | type RootOptions struct
  function main (line 92) | func main() {
  function PrettyEncode (line 108) | func PrettyEncode(data any) string {
  function PrettyTable (line 118) | func PrettyTable[T any](data []T, wide bool) string {

FILE: tools/kompat/pkg/kompat/kompat.go
  type List (line 42) | type List
    method JSON (line 165) | func (k List) JSON() string {
    method YAML (line 179) | func (k List) YAML() string {
    method Markdown (line 210) | func (k List) Markdown(opts ...Options) string {
    method k8sVersions (line 263) | func (k List) k8sVersions() []string {
  type Kompat (line 44) | type Kompat struct
    method Validate (line 141) | func (k Kompat) Validate() error {
    method JSON (line 161) | func (k Kompat) JSON() string {
    method YAML (line 175) | func (k Kompat) YAML() string {
    method Markdown (line 188) | func (k Kompat) Markdown(_ ...Options) string {
    method expand (line 277) | func (k Kompat) expand() map[string][]string {
  type Compatibility (line 49) | type Compatibility struct
  type Options (line 55) | type Options struct
  function IsCompatible (line 60) | func IsCompatible(filePath string, appVersion string, k8sVersion string)...
  function Parse (line 92) | func Parse(filePaths ...string) (List, error) {
  function toKompats (line 121) | func toKompats(contents []byte) (List, error) {
  function mergeOptions (line 256) | func mergeOptions(opts ...Options) Options {
  function k8sVersions (line 289) | func k8sVersions(min string, max string) []string {
  function toURL (line 300) | func toURL(str string) (string, bool) {
  function readFromURL (line 321) | func readFromURL(url string) ([]byte, error) {
  function readFromFile (line 340) | func readFromFile(file string) ([]byte, error) {
  function semverRange (line 356) | func semverRange(semvers []string, allSemvers ...string) string {
  function sortSemvers (line 374) | func sortSemvers(semvers []string) {
Copy disabled (too large) Download .json
Condensed preview — 982 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (15,553K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yaml",
    "chars": 1053,
    "preview": "name: Bug\ndescription: Report a bug\nlabels:\n- bug\n- needs-triage\nbody:\n- type: markdown\n  attributes:\n    value: |\n     "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation.yaml",
    "chars": 695,
    "preview": "name: Documentation\ndescription: How the docs be improved?\nlabels:\n- documentation\n- needs-triage\nbody:\n- type: textarea"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.yaml",
    "chars": 975,
    "preview": "name: Feature\ndescription: Suggest an idea for a new feature\nlabels:\n- feature\n- needs-triage\nbody:\n- type: markdown\n  a"
  },
  {
    "path": ".github/actionlint-matcher.json",
    "chars": 434,
    "preview": "{\n  \"problemMatcher\": [\n    {\n      \"owner\": \"actionlint\",\n      \"pattern\": [\n        {\n          \"regexp\": \"^(?:\\\\x1b\\\\"
  },
  {
    "path": ".github/actions/commit-status/end/action.yaml",
    "chars": 1700,
    "preview": "name: CommitStatusEnd\ndescription: 'Adds a commit status at the end of the test run based on success, failure, or cancel"
  },
  {
    "path": ".github/actions/commit-status/start/action.yaml",
    "chars": 1003,
    "preview": "name: CommitStatusStart\ndescription: 'Adds a commit status at the start of the test run to set the status to pending'\nin"
  },
  {
    "path": ".github/actions/deploy-website/action.yml",
    "chars": 3461,
    "preview": "name: 'Deploy Website to Amplify'\ndescription: 'Build Hugo site and deploy to AWS Amplify'\ninputs:\n  role:\n    descripti"
  },
  {
    "path": ".github/actions/download-artifact/action.yaml",
    "chars": 1235,
    "preview": "name: DownloadArtifacts\ndescription: 'Downloads and unarchives artifacts for a workflow that runs on workflow_run so tha"
  },
  {
    "path": ".github/actions/e2e/cleanup/action.yaml",
    "chars": 1783,
    "preview": "name: Cleanup\ndescription: 'Runs all the cleanup tasks to cleanup resources deployed during E2E'\ninputs:\n  account_id:\n "
  },
  {
    "path": ".github/actions/e2e/dump-logs/action.yaml",
    "chars": 1348,
    "preview": "name: DumpLogs\ndescription: 'Dump logs and debug information from the cluster after a test run'\ninputs:\n  account_id:\n  "
  },
  {
    "path": ".github/actions/e2e/install-eksctl/action.yaml",
    "chars": 806,
    "preview": "name: InstallEKSCTL\ndescription: 'Installs eksctl'\ninputs:\n  version:\n    description: \"Version of EKSCTL to use for the"
  },
  {
    "path": ".github/actions/e2e/install-helm/action.yaml",
    "chars": 461,
    "preview": "name: InstallHelm\ndescription: 'Installs helm'\ninputs:\n  version:\n    description: \"Version of Helm to install\"\n    requ"
  },
  {
    "path": ".github/actions/e2e/install-karpenter/action.yaml",
    "chars": 2546,
    "preview": "name: InstallKarpenter\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n  account_id:\n  "
  },
  {
    "path": ".github/actions/e2e/install-prometheus/action.yaml",
    "chars": 1820,
    "preview": "name: InstallPrometheus\ndescription: 'Installs prometheus'\ninputs:\n  account_id:\n    description: \"Account ID to access "
  },
  {
    "path": ".github/actions/e2e/install-prometheus/values.yaml",
    "chars": 1838,
    "preview": "prometheusOperator:\n  tolerations:\n    - key: CriticalAddonsOnly\n      operator: Exists\n  admissionWebhooks:\n    patch:\n"
  },
  {
    "path": ".github/actions/e2e/run-tests-private-cluster/action.yaml",
    "chars": 6492,
    "preview": "name: RunTestsPrivateCluster\ndescription: 'Installs Karpenter, Prometheus, runs tests on private cluster and performs cl"
  },
  {
    "path": ".github/actions/e2e/setup-cluster/action.yaml",
    "chars": 12924,
    "preview": "name: SetupCluster\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n  account_id:\n    de"
  },
  {
    "path": ".github/actions/e2e/slack/notify/action.yaml",
    "chars": 1957,
    "preview": "name: SlackNotify\ndescription: 'Notifies slack of the success or failure of the suite'\ninputs:\n  cluster_name:\n    descr"
  },
  {
    "path": ".github/actions/e2e/slack/send-message/action.yaml",
    "chars": 590,
    "preview": "name: SlackSendMessage\ndescription: 'Notifies slack of the success or failure of the suite'\ninputs:\n  message:\n    descr"
  },
  {
    "path": ".github/actions/e2e/upgrade-crds/action.yaml",
    "chars": 1230,
    "preview": "name: UpgradeCRDs\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n  account_id:\n    des"
  },
  {
    "path": ".github/actions/install-deps/action.yaml",
    "chars": 1570,
    "preview": "name: InstallDependencies\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n  k8sVersion:"
  },
  {
    "path": ".github/dependabot.yaml",
    "chars": 5539,
    "preview": "# See https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-"
  },
  {
    "path": ".github/pull-request-template.md",
    "chars": 1275,
    "preview": "<!-- Please follow the guidelines at https://www.conventionalcommits.org/en/v1.0.0/ and use one of the following in your"
  },
  {
    "path": ".github/security-notice.md",
    "chars": 1777,
    "preview": "# Github Workflows Security Notice\n\nWriting security workflows that can be accessed by third parties outside of your rep"
  },
  {
    "path": ".github/workflows/approval-comment.yaml",
    "chars": 1146,
    "preview": "name: ApprovalComment\non:\n  pull_request_review:\n    types: [submitted]\njobs:\n  approval-comment:\n    if: startsWith(git"
  },
  {
    "path": ".github/workflows/ci-test.yaml",
    "chars": 910,
    "preview": "name: CI-TEST\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-v*'\n      - 'staging/*'\n  pull_request:\n  workfl"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "chars": 511,
    "preview": "name: CI\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-v*'\n      - 'staging/*'\n  pull_request:\n  workflow_di"
  },
  {
    "path": ".github/workflows/codegen.yaml",
    "chars": 2741,
    "preview": "name: \"CodeGenCI\"\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 13 * * MON'\njobs:\n  codegen:\n    permissions:\n    "
  },
  {
    "path": ".github/workflows/codeql-analysis.yaml",
    "chars": 1687,
    "preview": "name: \"CodeQL\"\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-v*'\n      - 'staging/*'\n  pull_request:\n  sched"
  },
  {
    "path": ".github/workflows/dryrun-gen-pr.yaml",
    "chars": 379,
    "preview": "name: DryRunGenPR\non:\n  pull_request:\n  workflow_dispatch:\njobs:\n  dryrun-gen:\n    if: github.repository == 'aws/karpent"
  },
  {
    "path": ".github/workflows/dryrun-gen.yaml",
    "chars": 962,
    "preview": "name: DryRunGen\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-v*'\n      - 'staging/*'\njobs:\n  dryrun-gen:\n  "
  },
  {
    "path": ".github/workflows/e2e-cleanup.yaml",
    "chars": 1349,
    "preview": "name: E2ECleanup\non:\n  workflow_dispatch:\n    inputs:\n      cluster_name:\n        type: string\n        required: true\n  "
  },
  {
    "path": ".github/workflows/e2e-matrix-trigger.yaml",
    "chars": 1443,
    "preview": "name: E2EMatrixTrigger\non:\n  schedule:\n    - cron: '7 */8 * * *'\n  push:\n    branches:\n      - 'main'\n      - 'release-v"
  },
  {
    "path": ".github/workflows/e2e-matrix.yaml",
    "chars": 3882,
    "preview": "name: E2EMatrix\non:\n  workflow_call:\n    inputs:\n      region:\n        type: string\n        default: \"us-east-2\"\n      k"
  },
  {
    "path": ".github/workflows/e2e-private-cluster-trigger.yaml",
    "chars": 593,
    "preview": "name: E2EPrivateClusterTrigger\non:\n  schedule:\n    - cron: '7 0 * * 4'\njobs:\n  private-cluster-trigger:\n    if: github.r"
  },
  {
    "path": ".github/workflows/e2e-scale-trigger.yaml",
    "chars": 1521,
    "preview": "name: E2EScaleTrigger\non:\n  schedule:\n    - cron: '7 18 * * *'\n  workflow_run:\n    workflows: [ApprovalComment]\n    type"
  },
  {
    "path": ".github/workflows/e2e-soak-trigger.yaml",
    "chars": 2046,
    "preview": "name: E2ESoakTrigger\non:\n  schedule:\n    - cron: '0 */3 * * *'\njobs:\n  resolve_cluster:\n    permissions:\n      id-token:"
  },
  {
    "path": ".github/workflows/e2e-upgrade.yaml",
    "chars": 7532,
    "preview": "name: E2EUpgrade\non:\n  workflow_dispatch:\n    inputs:\n      from_git_ref:\n        type: string\n        required: true\n  "
  },
  {
    "path": ".github/workflows/e2e-version-compatibility-trigger.yaml",
    "chars": 1661,
    "preview": "name: E2EVersionCompatibilityTrigger\non:\n  schedule:\n    # The test will run every Monday, Thursday at 12:07 AM UTC\n    "
  },
  {
    "path": ".github/workflows/e2e.yaml",
    "chars": 9959,
    "preview": "name: E2E\non:\n  workflow_dispatch:\n    inputs:\n      git_ref:\n        type: string\n      region:\n        type: choice\n  "
  },
  {
    "path": ".github/workflows/image-canary.yaml",
    "chars": 1402,
    "preview": "name: ImageCanary\non:\n  workflow_dispatch:\n  schedule:\n  - cron: '0 */1 * * *'\njobs:\n  image-canary:\n    runs-on: ubuntu"
  },
  {
    "path": ".github/workflows/postsubmit.yaml",
    "chars": 530,
    "preview": "name: PostSubmit\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\njobs:\n  postsubmit:\n    if: github.reposito"
  },
  {
    "path": ".github/workflows/release.yaml",
    "chars": 3102,
    "preview": "name: Release\non:\n  push:\n    # Only release on supported semantic version tagging e.g. v0.0.1-rc.0\n    tags:\n      - 'v"
  },
  {
    "path": ".github/workflows/resolve-args.yaml",
    "chars": 1438,
    "preview": "name: ResolveArgs\non:\n  workflow_call:\n    inputs:\n      allowed_comment:\n        type: string\n        required: true\n  "
  },
  {
    "path": ".github/workflows/resource-count.yaml",
    "chars": 1167,
    "preview": "name: ResourceCount\non:\n  schedule:\n    - cron: '3 */1 * * *' # every hour\n  workflow_dispatch:\npermissions:\n  id-token:"
  },
  {
    "path": ".github/workflows/snapshot-pr.yaml",
    "chars": 3250,
    "preview": "name: SnapshotPR\non:\n  workflow_run:\n    workflows:\n      - ApprovalComment\n    types:\n      - completed\njobs:\n  snapsho"
  },
  {
    "path": ".github/workflows/snapshot.yaml",
    "chars": 805,
    "preview": "name: Snapshot\non:\n  push:\n    branches:\n      - 'main'\n      - 'release-v*'\n      - 'staging/*'\njobs:\n  snapshot:\n    p"
  },
  {
    "path": ".github/workflows/stale.yaml",
    "chars": 1644,
    "preview": "name: StaleBot\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 12 * * *'\njobs:\n  StaleBot:\n    runs-on: ubuntu-lates"
  },
  {
    "path": ".github/workflows/sweeper.yaml",
    "chars": 1443,
    "preview": "name: Sweeper\non:\n  schedule:\n    - cron: '0 */12 * * *'\n  workflow_dispatch:\njobs:\n  sweeper:\n    permissions:\n      id"
  },
  {
    "path": ".github/workflows/website-cleanup-preview.yaml",
    "chars": 1119,
    "preview": "name: Cleanup Website PR Preview\non:\n  pull_request_target:\n    types: [ closed ]\njobs:\n  cleanup:\n    runs-on: ubuntu-l"
  },
  {
    "path": ".github/workflows/website-deploy.yaml",
    "chars": 735,
    "preview": "name: Deploy Website to Amplify\non:\n  push:\n    branches: [ main ]\n    paths: [ website/** ]\njobs:\n  deploy:\n    runs-on"
  },
  {
    "path": ".github/workflows/website-preview-trigger.yaml",
    "chars": 954,
    "preview": "name: WebsitePreviewTrigger\non:\n  pull_request:\n    types: [ opened, synchronize, reopened ]\njobs:\n  preview-trigger:\n  "
  },
  {
    "path": ".github/workflows/website-preview.yaml",
    "chars": 3822,
    "preview": "name: Deploy Website Preview to Amplify\non:\n  workflow_run:\n    workflows: [ WebsitePreviewTrigger ]\n    types: [ comple"
  },
  {
    "path": ".gitignore",
    "chars": 202,
    "preview": "# Go toolchain\ncoverage.out\ncoverage.html\n*.test\n*.cpuprofile\n*.heapprofile\ngo.work\ngo.work.sum\n\n# Environment\n.idea\n.vs"
  },
  {
    "path": ".gitmodules",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".golangci.yaml",
    "chars": 2047,
    "preview": "version: \"2\"\nrun:\n  tests: true\n  timeout: 5m\nlinters:\n  enable:\n    - asciicheck\n    - bidichk\n    - copyloopvar\n    - "
  },
  {
    "path": ".ko.yaml",
    "chars": 132,
    "preview": "defaultBaseImage: public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base\ndefaultPlatforms:\n  - linux/arm64\n  - "
  },
  {
    "path": "ADOPTERS.md",
    "chars": 9760,
    "preview": "# Who is using Karpenter?\nKarpenter has a variety of users and use cases for scaling Kubernetes.\nMany customers want to "
  },
  {
    "path": "CODEOWNERS",
    "chars": 243,
    "preview": "# Require approvals from someone in the owner team before merging\n# More information here: https://docs.github.com/en/re"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 153,
    "preview": "# Code of Conduct\nThe Karpenter project follows the [CNCF Community Code of Conduct](https://github.com/cncf/foundation/"
  },
  {
    "path": "LICENSE",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "Makefile",
    "chars": 9707,
    "preview": "CLUSTER_NAME ?= $(shell kubectl config view --minify -o jsonpath='{.clusters[].name}' | rev | cut -d\"/\" -f1 | rev | cut "
  },
  {
    "path": "NOTICE",
    "chars": 77,
    "preview": "Karpenter\nCopyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n"
  },
  {
    "path": "README.md",
    "chars": 2973,
    "preview": "[![CI](https://github.com/aws/karpenter-provider-aws/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.co"
  },
  {
    "path": "THIRD_PARTY_LICENSES",
    "chars": 241924,
    "preview": "** go.uber.org/zap; v1.24.0 ---\n\n\nCopyright (c) 2016-2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of"
  },
  {
    "path": "charts/index.yaml",
    "chars": 31091,
    "preview": "apiVersion: v1\nentries:\n  karpenter:\n  - apiVersion: v2\n    appVersion: 0.16.3\n    created: \"2022-09-27T14:35:08.091269-"
  },
  {
    "path": "charts/karpenter/.helmignore",
    "chars": 349,
    "preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
  },
  {
    "path": "charts/karpenter/Chart.yaml",
    "chars": 1093,
    "preview": "apiVersion: v2\nname: karpenter\ndescription: A Helm chart for Karpenter, an open-source node provisioning project built f"
  },
  {
    "path": "charts/karpenter/README.md",
    "chars": 13693,
    "preview": "# karpenter\n\nA Helm chart for Karpenter, an open-source node provisioning project built for Kubernetes.\n\n![Version: 1.10"
  },
  {
    "path": "charts/karpenter/README.md.gotmpl",
    "chars": 2025,
    "preview": "{{ template \"chart.header\" . }}\n{{ template \"chart.description\" . }}\n\n{{ template \"chart.versionBadge\" . }}{{ template \""
  },
  {
    "path": "charts/karpenter/artifacthub-repo.yaml",
    "chars": 197,
    "preview": "repositoryID: 356cb63f-9ee3-4956-9c20-003e416715c7\nowners: []\n#   - name: awsadmin1\n#     email: artifacthub1@aws.com\nig"
  },
  {
    "path": "charts/karpenter/templates/_helpers.tpl",
    "chars": 5443,
    "preview": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"karpenter.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | t"
  },
  {
    "path": "charts/karpenter/templates/aggregate-clusterrole.yaml",
    "chars": 667,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: {{ include \"karpenter.fullname\" . }}-admin\n"
  },
  {
    "path": "charts/karpenter/templates/clusterrole-core.yaml",
    "chars": 2338,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: {{ include \"karpenter.fullname\" . }}"
  },
  {
    "path": "charts/karpenter/templates/clusterrole.yaml",
    "chars": 1075,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: {{ include \"karpenter.fullname\" . }}"
  },
  {
    "path": "charts/karpenter/templates/deployment.yaml",
    "chars": 9888,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ include \"karpenter.fullname\" . }}\n  namespace: {{ .Release.Nam"
  },
  {
    "path": "charts/karpenter/templates/poddisruptionbudget.yaml",
    "chars": 504,
    "preview": "apiVersion: {{ include \"karpenter.pdb.apiVersion\" . }}\nkind: PodDisruptionBudget\nmetadata:\n  name: {{ .Values.podDisrupt"
  },
  {
    "path": "charts/karpenter/templates/role.yaml",
    "chars": 1221,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: {{ include \"karpenter.fullname\" . }}\n  namespace: "
  },
  {
    "path": "charts/karpenter/templates/rolebinding.yaml",
    "chars": 1110,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: {{ include \"karpenter.fullname\" . }}\n  name"
  },
  {
    "path": "charts/karpenter/templates/service.yaml",
    "chars": 692,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"karpenter.fullname\" . }}\n  namespace: {{ .Release.Namespace }"
  },
  {
    "path": "charts/karpenter/templates/serviceaccount.yaml",
    "chars": 581,
    "preview": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"karpenter.ser"
  },
  {
    "path": "charts/karpenter/templates/servicemonitor.yaml",
    "chars": 1253,
    "preview": "{{- if and .Values.serviceMonitor.enabled (.Capabilities.APIVersions.Has \"monitoring.coreos.com/v1\") -}}\napiVersion: mon"
  },
  {
    "path": "charts/karpenter/values.yaml",
    "chars": 10768,
    "preview": "# -- Overrides the chart's name.\nnameOverride: \"\"\n# -- Overrides the chart's computed fullname.\nfullnameOverride: \"\"\n# -"
  },
  {
    "path": "charts/karpenter-crd/.helmignore",
    "chars": 349,
    "preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
  },
  {
    "path": "charts/karpenter-crd/Chart.yaml",
    "chars": 415,
    "preview": "apiVersion: v2\nname: karpenter-crd\ndescription: A Helm chart for Karpenter Custom Resource Definitions (CRDs).\ntype: app"
  },
  {
    "path": "charts/karpenter-crd/README.md",
    "chars": 805,
    "preview": "# karpenter-crd\n\n![Version: 1.3.2](https://img.shields.io/badge/Version-1.3.2-informational?style=flat-square) ![Type: a"
  },
  {
    "path": "charts/karpenter-crd/README.md.gotmpl",
    "chars": 507,
    "preview": "{{ template \"chart.header\" . }}\n{{ template \"chart.deprecationWarning\" . }}\n\n{{ template \"chart.badgesSection\" . }}\n\n{{ "
  },
  {
    "path": "charts/karpenter-crd/artifacthub-repo.yaml",
    "chars": 201,
    "preview": "repositoryID: 2cfb6f76-afe1-447f-b036-cd2e230d07d7\nowners: []\n#   - name: awsadmin1\n#     email: artifacthub1@aws.com\nig"
  },
  {
    "path": "charts/karpenter-crd/templates/karpenter.k8s.aws_ec2nodeclasses.yaml",
    "chars": 51341,
    "preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    {{- with .Values.add"
  },
  {
    "path": "charts/karpenter-crd/templates/karpenter.sh_nodeclaims.yaml",
    "chars": 21818,
    "preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    {{- with .Values.add"
  },
  {
    "path": "charts/karpenter-crd/templates/karpenter.sh_nodeoverlays.yaml",
    "chars": 12807,
    "preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    {{- with .Values.add"
  },
  {
    "path": "charts/karpenter-crd/templates/karpenter.sh_nodepools.yaml",
    "chars": 34831,
    "preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    {{- with .Values.add"
  },
  {
    "path": "charts/karpenter-crd/values.yaml",
    "chars": 91,
    "preview": "# -- Additional annotations for the custom resource definitions.\nadditionalAnnotations: {}\n"
  },
  {
    "path": "cmd/controller/main.go",
    "chars": 2590,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "designs/README.md",
    "chars": 587,
    "preview": "## Designs\n\nThe designs in this folder are merged RFCs. They are historical artifacts that demonstrate the designs of fe"
  },
  {
    "path": "designs/ami-selector.md",
    "chars": 2904,
    "preview": "# Background\n\nThe `AMISelector` field of the [`v1alpha1` `AWSNodeTemplate` resource](/pkg/apis/v1alpha1/awsnodetemplate."
  },
  {
    "path": "designs/aws-launch-templates-options.md",
    "chars": 11509,
    "preview": "# AWS Launch Template Options\n*Authors: JacobGabrielson@*\n## Intro\n\nThis document presents some options for how the AWS-"
  },
  {
    "path": "designs/aws-launch-templates-v2.md",
    "chars": 12768,
    "preview": "## Karpenter and AWS LaunchTemplates\n\n\nThis document focuses on how to evolve Karpenter’s support for AWS LaunchTemplate"
  },
  {
    "path": "designs/bin-packing.md",
    "chars": 2191,
    "preview": "# Bin Packing Design Considerations\n*Authors: prateekgogia@*\n\n> Note: this is not a final design; this is still in POC s"
  },
  {
    "path": "designs/capacity-block-support.md",
    "chars": 5601,
    "preview": "# Capacity Block Support\n\n## Overview\n\nIn v1.3.0 Karpenter introduced formal support for on-demand capacity reservations"
  },
  {
    "path": "designs/consolidation.md",
    "chars": 9012,
    "preview": "# Cluster Consolidation\n\n## Consolidation Mechanisms\n\nKarpenter will implement two consolidation mechanisms for the firs"
  },
  {
    "path": "designs/custom-user-data-and-amis.md",
    "chars": 18348,
    "preview": "The goal of this document is to describe how custom user data and AMIs will be supported within Karpenter.\n\n### Current "
  },
  {
    "path": "designs/deprecated-ami-observability.md",
    "chars": 6334,
    "preview": "# Observability for Deprecated AMIs\n\n## Background\n\nWith the recent introduction of a significant feature through [PR #6"
  },
  {
    "path": "designs/deprovisioning.md",
    "chars": 3204,
    "preview": "# Karpenter - Deprovisioning Controller\n\nKarpenter will implement a mechanism to detect and reconcile nodes that drift f"
  },
  {
    "path": "designs/integration-testing.md",
    "chars": 3581,
    "preview": "# Integration Testing\nauthor: @njtran\n\nCurrently, users can only test Karpenter by adding to a list of integration tests"
  },
  {
    "path": "designs/interruption-handling.md",
    "chars": 14167,
    "preview": "# Spot Interruption Handling in Karpenter\n\n**Author: Brandon Wagner (wagnerbm@)**\n\n## Goals\n\n* Gracefully drain EC2 inst"
  },
  {
    "path": "designs/limits.md",
    "chars": 7453,
    "preview": "# Karpenter Limits\n\nThis document proposes an approach to limit the scaling that Karpenter will perform in order to cont"
  },
  {
    "path": "designs/metrics.md",
    "chars": 25197,
    "preview": "# Karpenter Metrics / Dashboard Design\n\n## Motivation\n\nWhile Karpenter already instruments several Prometheus metrics (["
  },
  {
    "path": "designs/node-ownership.md",
    "chars": 27273,
    "preview": "# Karpenter Node Ownership\n\n_Provisioning is used throughout this doc to reference Karpenter scheduling and spinning up "
  },
  {
    "path": "designs/node-upgrades.md",
    "chars": 19335,
    "preview": "# Karpenter Node Upgrades - AMI Upgrades\n\n## Overview\n\nKarpenter users are requesting for Node Upgrades, generally askin"
  },
  {
    "path": "designs/odcr.md",
    "chars": 35146,
    "preview": "# On-Demand Capacity Reservations\n\nThis document proposes supporting ODCR in Karpenter\n\n- [On-Demand Capacity Reservatio"
  },
  {
    "path": "designs/provisioner-priority.md",
    "chars": 14267,
    "preview": "# Prioritizing Provisioners\n\n## Goals\n\n- Allowing a user to describe a logical ordering to their provisioners\n- Allowing"
  },
  {
    "path": "designs/runtime-defaulting.md",
    "chars": 15522,
    "preview": "# Parameter Defaulting  \n(IP Family, Bare Metal, and Instance Types)\n\n## Goals\n\n* A consistent or understood approach to"
  },
  {
    "path": "designs/termination.md",
    "chars": 13917,
    "preview": "# Karpenter Graceful Node Termination\n*Authors: njtran@*\n## Overview\nKarpenter's scale down implementation is currently "
  },
  {
    "path": "designs/unmanaged-launch-template-removal.md",
    "chars": 6353,
    "preview": "# RFC: Unmanaged LaunchTemplate Removal\n\n## Overview\n\nEC2 fleet requires a launch template to be created and referenced "
  },
  {
    "path": "designs/v1-api.md",
    "chars": 10445,
    "preview": "# Karpenter v1 API\n\n_This RFC is an extension of the [v1 API RFC](https://github.com/kubernetes-sigs/karpenter/blob/main"
  },
  {
    "path": "designs/v1-roadmap.md",
    "chars": 6297,
    "preview": "# Karpenter v1 Roadmap\n\n_This RFC is an extension of the [v1 Roadmap RFC](https://github.com/kubernetes-sigs/karpenter/b"
  },
  {
    "path": "designs/v1alpha4-api.md",
    "chars": 6651,
    "preview": "# v1alpha4 API Proposal\nThis document proposes comprehensive Provisioner API improvements prior to the v0.4 release. Due"
  },
  {
    "path": "designs/v1beta1-api.md",
    "chars": 13005,
    "preview": "# Karpenter v1beta1 APIs\n\nThis document formalizes the [v1beta1 laundry list](https://github.com/aws/karpenter/issues/13"
  },
  {
    "path": "designs/v1beta1-full-changelist.md",
    "chars": 15070,
    "preview": "# Karpenter v1beta1 Full Change List\n\nThis document formalizes the [v1beta1 laundry list](https://github.com/aws/karpent"
  },
  {
    "path": "examples/README.md",
    "chars": 396,
    "preview": "## Examples\n\nCheckout example Provisioner and workload specs to demo with Karpenter.\n\n## Usage:\n\nProvisioner specs expec"
  },
  {
    "path": "examples/v1/100-cpu-limit.yaml",
    "chars": 1621,
    "preview": "# This example NodePool limits the amount of compute managed by\n# Karpenter for this NodePool. Karpenter will not provis"
  },
  {
    "path": "examples/v1/al2-custom-ami.yaml",
    "chars": 1918,
    "preview": "# This example NodePool will provision instances using a custom EKS-Optimized AMI that belongs to the\n# AL2 AMIFamily. I"
  },
  {
    "path": "examples/v1/al2-custom-userdata.yaml",
    "chars": 1870,
    "preview": "# This example NodePool will provision instances using the AL2 EKS-Optimized AMI.\n# The UserData defined in spec.UserDat"
  },
  {
    "path": "examples/v1/al2-kubelet-log-query.yaml",
    "chars": 2430,
    "preview": "# This example NodePool will provision instances using the AL2 EKS-Optimized AMI\n# and will be prepended to a Karpenter "
  },
  {
    "path": "examples/v1/al2023-custom-userdata.yaml",
    "chars": 1937,
    "preview": "# This example NodePool will provision instances using the AL2023 EKS-Optimized AMI.\n---\napiVersion: karpenter.sh/v1\nkin"
  },
  {
    "path": "examples/v1/bottlerocket.yaml",
    "chars": 1780,
    "preview": "# This example NodePool will provision instances\n# running Bottlerocket OS\n---\napiVersion: karpenter.sh/v1\nkind: NodePoo"
  },
  {
    "path": "examples/v1/br-custom-userdata.yaml",
    "chars": 1629,
    "preview": "# This example NodePool will provision instances\n# running Bottlerocket OS and the user data settings specified in\n# thi"
  },
  {
    "path": "examples/v1/custom-family-with-alias.yaml",
    "chars": 1981,
    "preview": "# This example NodePool provisions instances using an AMI that belongs to a custom AMIFamily with an Alisa\n# Keep in min"
  },
  {
    "path": "examples/v1/custom-family.yaml",
    "chars": 1970,
    "preview": "# This example NodePool provisions instances using an AMI that belongs to a custom AMIFamily\n# Keep in mind, that you're"
  },
  {
    "path": "examples/v1/general-purpose.yaml",
    "chars": 1449,
    "preview": "# This example NodePool will provision general purpose instances\n---\napiVersion: karpenter.sh/v1\nkind: NodePool\nmetadata"
  },
  {
    "path": "examples/v1/instance-store-ephemeral-storage.yaml",
    "chars": 1693,
    "preview": "# This example NodePool will provision AL2 instances with\n# local NVMe instance-store disks used for node ephemeral stor"
  },
  {
    "path": "examples/v1/large-instances.yaml",
    "chars": 1280,
    "preview": "# This example NodePool will avoid small instance types in the cluster\n---\napiVersion: karpenter.sh/v1\nkind: NodePool\nme"
  },
  {
    "path": "examples/v1/max-node-lifetime.yaml",
    "chars": 1820,
    "preview": "# This example NodePool will provision instances\n# that are replaced every 7 days and drain after 1 minute\n# with no wor"
  },
  {
    "path": "examples/v1/min-values-family.yaml",
    "chars": 1701,
    "preview": "# This example will use spot instance type for all provisioned instances\n# and enforces minValues to instance families w"
  },
  {
    "path": "examples/v1/min-values-multiple-keys.yaml",
    "chars": 2038,
    "preview": "# This example will use spot instance type for all provisioned instances and enforces minValues to various keys where it"
  },
  {
    "path": "examples/v1/multiple-arch.yaml",
    "chars": 2332,
    "preview": "# This example allows you to create arm64 AND amd64 workloads\n# Karpenter will choose the NodePool that suits the worklo"
  },
  {
    "path": "examples/v1/multiple-ebs.yaml",
    "chars": 1872,
    "preview": "# This example NodePool will provision instances\n# with multiple EBS volumes attached\n---\napiVersion: karpenter.sh/v1\nki"
  },
  {
    "path": "examples/v1/spot.yaml",
    "chars": 1436,
    "preview": "# This example will use spot instance type for all\n# provisioned instances\n---\napiVersion: karpenter.sh/v1\nkind: NodePoo"
  },
  {
    "path": "examples/v1/windows-2019.yaml",
    "chars": 1532,
    "preview": "# This example NodePool will provision instances running Windows Server 2019\n---\napiVersion: karpenter.sh/v1\nkind: NodeP"
  },
  {
    "path": "examples/v1/windows-2022.yaml",
    "chars": 1533,
    "preview": "# This example NodePool will provision instances running Windows Server 2022\n---\napiVersion: karpenter.sh/v1\nkind: NodeP"
  },
  {
    "path": "examples/v1/windows-2025.yaml",
    "chars": 1533,
    "preview": "# This example NodePool will provision instances running Windows Server 2025\n---\napiVersion: karpenter.sh/v1\nkind: NodeP"
  },
  {
    "path": "examples/v1/windows-custom-userdata.yaml",
    "chars": 1920,
    "preview": "# This example NodePool provisions instances using the Windows 2022 EKS-Optimized AMI.\n# The UserData defined in spec.Us"
  },
  {
    "path": "examples/workloads/arm64.yaml",
    "chars": 596,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: arm64\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app:"
  },
  {
    "path": "examples/workloads/disruption-budget.yaml",
    "chars": 735,
    "preview": "apiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: pdb\nspec:\n  minAvailable: \"80%\"\n  selector:\n    matchL"
  },
  {
    "path": "examples/workloads/gpu-amd.yaml",
    "chars": 597,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: gpu-amd\nspec:\n  replicas: 0\n  selector:\n    matchLabels:\n      ap"
  },
  {
    "path": "examples/workloads/gpu-nvidia.yaml",
    "chars": 612,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: gpu-nvidia\nspec:\n  replicas: 0\n  selector:\n    matchLabels:\n     "
  },
  {
    "path": "examples/workloads/inflate.yaml",
    "chars": 536,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: inflate\nspec:\n  selector:\n    matchLabels:\n      app: inflate\n  t"
  },
  {
    "path": "examples/workloads/neuron.yaml",
    "chars": 603,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: neuron\nspec:\n  replicas: 0\n  selector:\n    matchLabels:\n      app"
  },
  {
    "path": "examples/workloads/prefer-arm.yaml",
    "chars": 1049,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: prefer-arm\nspec:\n  replicas: 0\n  selector:\n    matchLabels:\n     "
  },
  {
    "path": "examples/workloads/spot.yaml",
    "chars": 598,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: spot\nspec:\n  replicas: 0\n  selector:\n    matchLabels:\n      app: "
  },
  {
    "path": "examples/workloads/spread-hostname-zone.yaml",
    "chars": 993,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: host-zone-spread\nspec:\n  replicas: 50\n  selector:\n    matchLabels"
  },
  {
    "path": "examples/workloads/spread-hostname.yaml",
    "chars": 778,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: host-spread\nspec:\n  replicas: 10\n  selector:\n    matchLabels:\n   "
  },
  {
    "path": "examples/workloads/spread-zone.yaml",
    "chars": 783,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: zone-spread\nspec:\n  replicas: 0\n  selector:\n    matchLabels:\n    "
  },
  {
    "path": "go.mod",
    "chars": 6900,
    "preview": "module github.com/aws/karpenter-provider-aws\n\ngo 1.26.1\n\n// TODO: migrate tablewriter to v1.0.8\n// https://github.com/ol"
  },
  {
    "path": "go.sum",
    "chars": 35563,
    "preview": "github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=\ngithub.com/Masterminds/semver/v3"
  },
  {
    "path": "hack/boilerplate.go.txt",
    "chars": 531,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/boilerplate.sh",
    "chars": 215,
    "preview": "#!/bin/bash\nset -eu -o pipefail\n\nfor i in $(\n  find ./tools ./cmd ./pkg ./test ./hack -name \"*.go\"\n); do\n  if ! grep -q "
  },
  {
    "path": "hack/code/bandwidth_gen/example/gp.html",
    "chars": 350546,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en-US\"><head><meta http-equiv=\"Content-Type\" content=\"t"
  },
  {
    "path": "hack/code/bandwidth_gen/main.go",
    "chars": 6220,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/code/instancetype_testdata_gen/main.go",
    "chars": 12099,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/code/prices_gen/main.go",
    "chars": 5900,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/code/vpc_limits_gen/main.go",
    "chars": 1788,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/codegen.sh",
    "chars": 3320,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nif [ -z ${ENABLE_GIT_PUSH+x} ]; then\n  ENABLE_GIT_PUSH=false\nfi\n\necho \"codegen ru"
  },
  {
    "path": "hack/docgen.sh",
    "chars": 1222,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\ncompatibilitymatrix() {\n    # versionCount is the number of K8s versions to displ"
  },
  {
    "path": "hack/docs/compatibilitymatrix_gen/compatibility.yaml",
    "chars": 2081,
    "preview": "name: \"karpenter\"\ncompatibility:\n  - appVersion: 0.21.x\n    minK8sVersion: 1.21\n    maxK8sVersion: 1.24\n  - appVersion: "
  },
  {
    "path": "hack/docs/compatibilitymatrix_gen/main.go",
    "chars": 2016,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/docs/configuration_gen/main.go",
    "chars": 2573,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/docs/instancetypes_gen/main.go",
    "chars": 8900,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/docs/metrics_gen/main.go",
    "chars": 12453,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/docs/parse-redirects/go.mod",
    "chars": 82,
    "preview": "module github.com/aws/karpenter-provider-aws/hack/docs/parse-redirects\n\ngo 1.24.4\n"
  },
  {
    "path": "hack/docs/parse-redirects/main.go",
    "chars": 2844,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/docs/version_compatibility_gen/main.go",
    "chars": 1411,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/github/community-contributors.sh",
    "chars": 3023,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nUSAGE='Usage: '.$0.' [<previous release> <latest release>]'\nTOKEN=$(gh auth token"
  },
  {
    "path": "hack/github/count-flakes.sh",
    "chars": 3293,
    "preview": "#!/usr/bin/env bash\n# Count test flakes in karpenter PRs using GraphQL for efficiency\n# Flake = matrix run with at least"
  },
  {
    "path": "hack/github/dependabot.sh",
    "chars": 981,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\n# This script ensures that we get all the directories that contain an \"action.yam"
  },
  {
    "path": "hack/github/feature_request_reactions.py",
    "chars": 1734,
    "preview": "#!/usr/bin/env python3\n\nimport csv\nimport os\nimport sys\nfrom operator import itemgetter\nfrom typing import Union\n\n# This"
  },
  {
    "path": "hack/github/label_issue_count.py",
    "chars": 1320,
    "preview": "#!/usr/bin/env python3\n\nimport csv\nimport os\nimport sys\n\n# This script requires the python GitHub client:\n# pip install "
  },
  {
    "path": "hack/github/requirements.txt",
    "chars": 15,
    "preview": "PyGithub==1.55\n"
  },
  {
    "path": "hack/image_canary.sh",
    "chars": 1433,
    "preview": "#!/usr/bin/env bash\n\nGH_REPO=\"${GH_REPO:-aws/karpenter-provider-aws}\"\nRELEASE_COUNT=\"${RELEASE_COUNT:-10}\"\n\n# Translates"
  },
  {
    "path": "hack/mutation/crd_annotations.sh",
    "chars": 337,
    "preview": "#!/usr/bin/env bash\n\n# Add additional annotations variable to the CRDS\n\nCRDS=\"charts/karpenter-crd/templates/*.yaml\"\nfor"
  },
  {
    "path": "hack/release/common.sh",
    "chars": 8079,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nECR_GALLERY_NAME=\"karpenter\"\nRELEASE_REPO_ECR=\"public.ecr.aws/${ECR_GALLERY_NAME}"
  },
  {
    "path": "hack/release/prepare-website.sh",
    "chars": 451,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
  },
  {
    "path": "hack/release/release.sh",
    "chars": 530,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
  },
  {
    "path": "hack/release/snapshot.sh",
    "chars": 353,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
  },
  {
    "path": "hack/release/stable-pr.sh",
    "chars": 1003,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
  },
  {
    "path": "hack/toolchain.sh",
    "chars": 2027,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nK8S_VERSION=\"${K8S_VERSION:=\"1.34.x\"}\"\nKUBEBUILDER_ASSETS=\"${KUBEBUILDER_ASSETS:-"
  },
  {
    "path": "hack/tools/allocatable_diff/README.md",
    "chars": 541,
    "preview": "# Allocatable Diff Tool\n\nThe allocatable diff tool iterates through your list of currently deployed nodes and compares t"
  },
  {
    "path": "hack/tools/allocatable_diff/main.go",
    "chars": 4750,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/tools/launchtemplate_counter/main.go",
    "chars": 5350,
    "preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
  },
  {
    "path": "hack/validation/kubelet.sh",
    "chars": 1945,
    "preview": "# Kubelet Validation \n\n# The regular expression adds validation for kubelet.kubeReserved and kubelet.systemReserved valu"
  },
  {
    "path": "hack/validation/labels.sh",
    "chars": 1487,
    "preview": "# Labels Validation\n\nfunction injectDomainLabelRestrictions() {\n    domain=$1\n\trule=\"self.all(x, x in [\\\"${domain}/insta"
  },
  {
    "path": "hack/validation/requirements.sh",
    "chars": 3057,
    "preview": "# Requirements Validation\n\nfunction injectDomainRequirementRestrictions() {\n    domain=$1\n    rule=\"self in [\\\"${domain}"
  },
  {
    "path": "kwok/Makefile",
    "chars": 2837,
    "preview": "KARPENTER_NAMESPACE ?= kube-system\nKO_DOCKER_REPO ?= ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/kwok-"
  },
  {
    "path": "kwok/README.md",
    "chars": 2718,
    "preview": "# AWS KWOK Provider\n\nBefore using the aws kwok provider, make sure that you don't have an installed version of Karpenter"
  },
  {
    "path": "kwok/cloudprovider/cloudprovider.go",
    "chars": 2748,
    "preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
  },
  {
    "path": "kwok/ec2/ec2.go",
    "chars": 35447,
    "preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
  },
  {
    "path": "kwok/ec2/ratelimiting.go",
    "chars": 4061,
    "preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
  },
  {
    "path": "kwok/main.go",
    "chars": 2883,
    "preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
  },
  {
    "path": "kwok/manifests/clusterrole.yaml",
    "chars": 529,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: kwok-karpenter-extra\nrules:\n  - apiGroups: "
  }
]

// ... and 782 more files (download for full content)

About this extraction

This page contains the full source code of the aws/karpenter-provider-aws GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 982 files (14.1 MB), approximately 3.8M tokens, and a symbol index with 1596 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.

Copied to clipboard!