{
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
      "type": "string"
    },
    "kind": {
      "description": "Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "properties": {
        "capacity": {
          "additionalProperties": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
            "x-kubernetes-int-or-string": true
          },
          "description": "Capacity adds extended resources only, and does not replace any existing resources.\nThese extended resources are appended to the node's existing resource list.\nNote: This field does not modify or override standard resources like cpu, memory, ephemeral-storage, or pods.",
          "type": "object",
          "x-kubernetes-validations": [
            {
              "message": "invalid resource restricted",
              "rule": "self.all(x, !(x in ['cpu', 'memory', 'ephemeral-storage', 'pods']))"
            }
          ]
        },
        "price": {
          "description": "Price specifies amount for an instance types that match the specified labels. Users can override prices using a signed float representing the price override",
          "pattern": "^\\d+(\\.\\d+)?$",
          "type": "string"
        },
        "priceAdjustment": {
          "description": "PriceAdjustment specifies the price change for matching instance types. Accepts either:\n- A fixed price modifier (e.g., -0.5, 1.2)\n- A percentage modifier (e.g., +10% for increase, -15% for decrease)",
          "pattern": "^(([+-]{1}(\\d*\\.?\\d+))|(\\+{1}\\d*\\.?\\d+%)|(^(-\\d{1,2}(\\.\\d+)?%)$)|(-100%))$",
          "type": "string"
        },
        "requirements": {
          "description": "Requirements constrain when this NodeOverlay is applied during scheduling simulations.\nThese requirements can match:\n- Well-known labels (e.g., node.kubernetes.io/instance-type, karpenter.sh/nodepool)\n- Custom labels from NodePool's spec.template.labels",
          "items": {
            "description": "A node selector requirement is a selector that contains values, a key, an operator that relates the key and values\nto have at least that many values.",
            "properties": {
              "key": {
                "description": "The label key that the selector applies to.",
                "maxLength": 316,
                "pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*(\\/))?([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$",
                "type": "string",
                "x-kubernetes-validations": [
                  {
                    "message": "label domain \"karpenter.sh\" is restricted",
                    "rule": "self in [\"karpenter.sh/capacity-type\", \"karpenter.sh/nodepool\"] || !self.find(\"^([^/]+)\").endsWith(\"karpenter.sh\")"
                  },
                  {
                    "message": "label \"kubernetes.io/hostname\" is restricted",
                    "rule": "self != \"kubernetes.io/hostname\""
                  },
                  {
                    "message": "label domain \"karpenter.k8s.aws\" is restricted",
                    "rule": "self in [\"karpenter.k8s.aws/ec2nodeclass\", \"karpenter.k8s.aws/instance-encryption-in-transit-supported\", \"karpenter.k8s.aws/instance-category\", \"karpenter.k8s.aws/instance-hypervisor\", \"karpenter.k8s.aws/instance-family\", \"karpenter.k8s.aws/instance-generation\", \"karpenter.k8s.aws/instance-local-nvme\", \"karpenter.k8s.aws/instance-size\", \"karpenter.k8s.aws/instance-cpu\", \"karpenter.k8s.aws/instance-cpu-manufacturer\", \"karpenter.k8s.aws/instance-cpu-sustained-clock-speed-mhz\", \"karpenter.k8s.aws/instance-memory\", \"karpenter.k8s.aws/instance-ebs-bandwidth\", \"karpenter.k8s.aws/instance-network-bandwidth\", \"karpenter.k8s.aws/instance-gpu-name\", \"karpenter.k8s.aws/instance-gpu-manufacturer\", \"karpenter.k8s.aws/instance-gpu-count\", \"karpenter.k8s.aws/instance-gpu-memory\", \"karpenter.k8s.aws/instance-accelerator-name\", \"karpenter.k8s.aws/instance-accelerator-manufacturer\", \"karpenter.k8s.aws/instance-accelerator-count\", \"karpenter.k8s.aws/instance-capability-flex\"] || !self.find(\"^([^/]+)\").endsWith(\"karpenter.k8s.aws\")"
                  }
                ]
              },
              "operator": {
                "description": "Represents a key's relationship to a set of values.\nValid operators are In, NotIn, Exists, DoesNotExist. Gt, Lt, Gte, and Lte.",
                "enum": [
                  "Gte",
                  "Lte",
                  "In",
                  "NotIn",
                  "Exists",
                  "DoesNotExist",
                  "Gt",
                  "Lt"
                ],
                "type": "string"
              },
              "values": {
                "description": "An array of string values. If the operator is In or NotIn,\nthe values array must be non-empty. If the operator is Exists or DoesNotExist,\nthe values array must be empty. If the operator is Gt, Lt, Gte, or Lte, the values\narray must have a single element, which will be interpreted as an integer.",
                "items": {
                  "type": "string"
                },
                "maxLength": 63,
                "pattern": "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$",
                "type": "array",
                "x-kubernetes-list-type": "atomic"
              }
            },
            "required": [
              "key",
              "operator"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "maxItems": 100,
          "type": "array",
          "x-kubernetes-validations": [
            {
              "message": "requirements with operator 'NotIn' must have a value defined",
              "rule": "self.all(x, x.operator == 'NotIn' ? x.values.size() != 0 : true)"
            },
            {
              "message": "requirements with operator 'In' must have a value defined",
              "rule": "self.all(x, x.operator == 'In' ? x.values.size() != 0 : true)"
            },
            {
              "message": "requirements operator 'Gt', 'Lt', 'Gte' or 'Lte' must have a single positive integer value",
              "rule": "self.all(x, (x.operator == 'Gt' || x.operator == 'Lt' || x.operator == 'Gte' || x.operator == 'Lte') ? (x.values.size() == 1 && int(x.values[0]) >= 0) : true)"
            }
          ]
        },
        "weight": {
          "description": "Weight defines the priority of this NodeOverlay when overriding node attributes.\nNodeOverlays with higher numerical weights take precedence over those with lower weights.\nIf no weight is specified, the NodeOverlay is treated as having a weight of 0.\nWhen multiple NodeOverlays have identical weights, they are merged in alphabetical order.",
          "format": "int32",
          "maximum": 10000,
          "minimum": 1,
          "type": "integer"
        }
      },
      "required": [
        "requirements"
      ],
      "type": "object",
      "x-kubernetes-validations": [
        {
          "message": "cannot set both 'price' and 'priceAdjustment'",
          "rule": "!has(self.price) || !has(self.priceAdjustment)"
        }
      ],
      "additionalProperties": false
    },
    "status": {
      "description": "NodeOverlayStatus defines the observed state of NodeOverlay",
      "properties": {
        "conditions": {
          "description": "Conditions contains signals for health and readiness",
          "items": {
            "description": "Condition aliases the upstream type and adds additional helper methods",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another.\nThis should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.",
                "format": "date-time",
                "type": "string"
              },
              "message": {
                "description": "message is a human readable message indicating details about the transition.\nThis may be an empty string.",
                "maxLength": 32768,
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon.\nFor instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the instance.",
                "format": "int64",
                "minimum": 0,
                "type": "integer"
              },
              "reason": {
                "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition.\nProducers of specific condition types may define expected values and meanings for this field,\nand whether the values are considered a guaranteed API.\nThe value should be a CamelCase string.\nThis field may not be empty.",
                "maxLength": 1024,
                "minLength": 1,
                "pattern": "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$",
                "type": "string"
              },
              "status": {
                "description": "status of the condition, one of True, False, Unknown.",
                "enum": [
                  "True",
                  "False",
                  "Unknown"
                ],
                "type": "string"
              },
              "type": {
                "description": "type of condition in CamelCase or in foo.example.com/CamelCase.",
                "maxLength": 316,
                "pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "required": [
    "spec"
  ],
  "type": "object"
}
