{{ if .Values.spec.karpenterInstanceProfile }}
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
  name: karpenter-bottlerocket
  labels:
    {{- toYaml .Values.labels | nindent 4 }}
spec:
  amiFamily: Bottlerocket
  instanceProfile: '{{ .Values.spec.karpenterInstanceProfile }}'
  #instanceProfile: {{ .Values.spec.clusterName }}-managed-ondemand
  subnetSelector:
    kubernetes.io/cluster/{{ .Values.spec.clusterName }}: '*'
    #aws:cloudformation:stack-name: '{{ .Values.spec.clusterName }}'
    kubernetes.io/role/internal-elb: '1' # to select only private subnets
  securityGroupSelector:
    aws:eks:cluster-name: '{{ .Values.spec.clusterName }}' # Choose only security groups of nodes
    #kubernetes.io/cluster/{{ .Values.spec.clusterName }}: '*'
    #aws:eks:cluster-name: '{{ .Values.spec.clusterName }}'
  userData: |
    [settings.kubernetes]
    kube-api-qps = 30
    [settings.kubernetes.eviction-hard]
    "memory.available" = "20%"
  # amiSelector:
  #   karpenter.sh/discovery: my-cluster
  tags:
    karpenter.sh/cluster_name: {{.Values.spec.clusterName}}
    karpenter.sh/provisioner: burnham
  metadataOptions:
    httpEndpoint: enabled
    httpProtocolIPv6: disabled
    httpPutResponseHopLimit: 2
    httpTokens: required
---
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
  name: karpenter-default
  labels:
    {{- toYaml .Values.labels | nindent 4 }}  
spec:
  #amiFamily: Bottlerocket
  #instanceProfile: '{{ .Values.spec.karpenterInstanceProfile }}'
  instanceProfile: {{ .Values.spec.clusterName }}-managed-ondemand
  subnetSelector:
    kubernetes.io/cluster/{{ .Values.spec.clusterName }}: '*'
    kubernetes.io/role/internal-elb: '1' # to select only private subnets
  securityGroupSelector:
    aws:eks:cluster-name: '{{ .Values.spec.clusterName }}' # Choose only security groups of nodes
  tags:
    karpenter.sh/cluster_name: {{.Values.spec.clusterName}}
    karpenter.sh/provisioner: default
  metadataOptions:
    httpEndpoint: enabled
    httpProtocolIPv6: disabled
    httpPutResponseHopLimit: 2
    httpTokens: required
---
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
  name: burnham
  labels:
    {{- toYaml .Values.labels | nindent 4 }}     
spec:
  requirements:
    # - key: 'node.kubernetes.io/instance-type'
    #   operator: In
    #   values: ['m5.xlarge', 'm5a.xlarge', 'm5ad.xlarge', 'm5d.xlarge', 't2.xlarge', 't3.xlarge', 't3a.xlarge']
    - key: 'kubernetes.io/arch'
      operator: In
      values: ['amd64']
    - key: karpenter.sh/capacity-type
      operator: In
      values: ['on-demand', 'spot']
  providerRef:
    #name: karpenter-bottlerocket
    name: karpenter-default
  ttlSecondsAfterEmpty: 0
  ttlSecondsUntilExpired: 2592000 # 30 Days = 60 * 60 * 24 * 30 Seconds;
  # Priority given to the provisioner when the scheduler considers which provisioner
  # to select. Higher weights indicate higher priority when comparing provisioners.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 10
  limits:
    resources:
      cpu: '200'
  labels:
    billing-team: burnham
    team: burnham
    type: karpenter
  taints:
    - key: burnham
      value: 'true'
      effect: NoSchedule
---
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
  name: default
  labels:
    {{- toYaml .Values.labels | nindent 4 }}
spec:
  consolidation:
    enabled: true
  #ttlSecondsAfterEmpty: 60 # mutual exclusive with consolitation
  requirements:
    - key: karpenter.k8s.aws/instance-family
      operator: NotIn
      values:
        - a1
        - c1
        - c3
        - inf1
        - t3
        - t2
    - key: karpenter.k8s.aws/instance-cpu
      operator: Lt
      values:
        - '33'    
    - key: 'kubernetes.io/arch'
      operator: In
      values: ['amd64']
    - key: karpenter.sh/capacity-type
      operator: In
      values: ['on-demand']
  providerRef:
    name: karpenter-default

  ttlSecondsUntilExpired: 2592000 # 30 Days = 60 * 60 * 24 * 30 Seconds;
  # Priority given to the provisioner when the scheduler considers which provisioner
  # to select. Higher weights indicate higher priority when comparing provisioners.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 1
  limits:
    resources:
      cpu: '2k'
  labels:
    billing-team: default
    team: default
    type: karpenter
  # taints:
  #   - key: karpenter
  #     value: 'true'
  #     effect: NoSchedule

  # Karpenter provides the ability to specify a few additional Kubelet args.
  # These are all optional and provide support for additional customization and use cases.
  kubeletConfiguration:
    #clusterDNS: ["10.0.1.100"]
    containerRuntime: containerd
    systemReserved:
      cpu: '1'
      memory: 5Gi
      ephemeral-storage: 2Gi
    #maxPods: 20
{{ end }}