---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.16.0
  name: clusterresourceplacementevictions.placement.kubernetes-fleet.io
spec:
  group: placement.kubernetes-fleet.io
  names:
    categories:
    - fleet
    - fleet-placement
    kind: ClusterResourcePlacementEviction
    listKind: ClusterResourcePlacementEvictionList
    plural: clusterresourceplacementevictions
    shortNames:
    - crpe
    singular: clusterresourceplacementeviction
  scope: Cluster
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        description: |-
          ClusterResourcePlacementEviction is an eviction attempt on a specific placement from
          a ClusterResourcePlacement object; one may use this API to force the removal of specific
          resources from a cluster.

          An eviction is a voluntary disruption; its execution is subject to the disruption budget
          linked with the target ClusterResourcePlacement object (if present).

          Beware that an eviction alone does not guarantee that a placement will not re-appear; i.e.,
          after an eviction, the Fleet scheduler might still pick the previous target cluster for
          placement. To prevent this, considering adding proper taints to the target cluster before running
          an eviction that will exclude it from future placements; this is especially true in scenarios
          where one would like to perform a cluster replacement.

          For safety reasons, Fleet will only execute an eviction once; the spec in this object is immutable,
          and once executed, the object will be ignored after. To trigger another eviction attempt on the
          same placement from the same ClusterResourcePlacement object, one must re-create (delete and
          create) the same Eviction object. Note also that an Eviction object will be
          ignored once it is deemed invalid (e.g., such an object might be targeting a CRP object or
          a placement that does not exist yet), even if it does become valid later
          (e.g., the CRP object or the placement appears later). To fix the situation, re-create the
          Eviction object.

          Note: Eviction of resources from a cluster propagated by a PickFixed CRP is not allowed.
          If the user wants to remove resources from a cluster propagated by a PickFixed CRP simply
          remove the cluster name from cluster names field from the CRP spec.

          Executed evictions might be kept around for a while for auditing purposes; the Fleet controllers might
          have a TTL set up for such objects and will garbage collect them automatically. For further
          information, see the Fleet documentation.
        properties:
          apiVersion:
            description: |-
              APIVersion defines the versioned schema of this representation of an object.
              Servers should convert recognized schemas to the latest internal value, and
              may reject unrecognized values.
              More 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.
              Servers may infer this from the endpoint the client submits requests to.
              Cannot be updated.
              In CamelCase.
              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
            type: string
          metadata:
            type: object
          spec:
            description: |-
              Spec is the desired state of the ClusterResourcePlacementEviction.

              Note that all fields in the spec are immutable.
            properties:
              clusterName:
                description: ClusterName is the name of the cluster that the Eviction
                  object targets.
                maxLength: 255
                type: string
                x-kubernetes-validations:
                - message: The ClusterName field is immutable
                  rule: self == oldSelf
              placementName:
                description: |-
                  PlacementName is the name of the Placement object which
                  the Eviction object targets.
                maxLength: 255
                type: string
                x-kubernetes-validations:
                - message: The PlacementName field is immutable
                  rule: self == oldSelf
            required:
            - clusterName
            - placementName
            type: object
          status:
            description: Status is the observed state of the ClusterResourcePlacementEviction.
            properties:
              conditions:
                description: |-
                  Conditions is the list of currently observed conditions for the
                  PlacementEviction object.

                  Available condition types include:
                  * Valid: whether the Eviction object is valid, i.e., it targets at a valid placement.
                  * Executed: whether the Eviction object has been executed.
                items:
                  description: Condition contains details for one aspect of the current
                    state of this API Resource.
                  properties:
                    lastTransitionTime:
                      description: |-
                        lastTransitionTime is the last time the condition transitioned from one status to another.
                        This 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.
                        This may be an empty string.
                      maxLength: 32768
                      type: string
                    observedGeneration:
                      description: |-
                        observedGeneration represents the .metadata.generation that the condition was set based upon.
                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
                        with 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.
                        Producers of specific condition types may define expected values and meanings for this field,
                        and whether the values are considered a guaranteed API.
                        The value should be a CamelCase string.
                        This 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
                type: array
            type: object
        required:
        - spec
        type: object
    served: true
    storage: false
    subresources:
      status: {}
  - additionalPrinterColumns:
    - jsonPath: .status.conditions[?(@.type=="Valid")].status
      name: Valid
      type: string
    - jsonPath: .status.conditions[?(@.type=="Executed")].status
      name: Executed
      type: string
    name: v1beta1
    schema:
      openAPIV3Schema:
        description: |-
          ClusterResourcePlacementEviction is an eviction attempt on a specific placement from
          a ClusterResourcePlacement object; one may use this API to force the removal of specific
          resources from a cluster.

          An eviction is a voluntary disruption; its execution is subject to the disruption budget
          linked with the target ClusterResourcePlacement object (if present).

          Beware that an eviction alone does not guarantee that a placement will not re-appear; i.e.,
          after an eviction, the Fleet scheduler might still pick the previous target cluster for
          placement. To prevent this, considering adding proper taints to the target cluster before running
          an eviction that will exclude it from future placements; this is especially true in scenarios
          where one would like to perform a cluster replacement.

          For safety reasons, Fleet will only execute an eviction once; the spec in this object is immutable,
          and once executed, the object will be ignored after. To trigger another eviction attempt on the
          same placement from the same ClusterResourcePlacement object, one must re-create (delete and
          create) the same Eviction object. Note also that an Eviction object will be
          ignored once it is deemed invalid (e.g., such an object might be targeting a CRP object or
          a placement that does not exist yet), even if it does become valid later
          (e.g., the CRP object or the placement appears later). To fix the situation, re-create the
          Eviction object.

          Note: Eviction of resources from a cluster propagated by a PickFixed CRP is not allowed.
          If the user wants to remove resources from a cluster propagated by a PickFixed CRP simply
          remove the cluster name from cluster names field from the CRP spec.

          Executed evictions might be kept around for a while for auditing purposes; the Fleet controllers might
          have a TTL set up for such objects and will garbage collect them automatically. For further
          information, see the Fleet documentation.
        properties:
          apiVersion:
            description: |-
              APIVersion defines the versioned schema of this representation of an object.
              Servers should convert recognized schemas to the latest internal value, and
              may reject unrecognized values.
              More 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.
              Servers may infer this from the endpoint the client submits requests to.
              Cannot be updated.
              In CamelCase.
              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
            type: string
          metadata:
            type: object
          spec:
            description: |-
              Spec is the desired state of the ClusterResourcePlacementEviction.

              Note that all fields in the spec are immutable.
            properties:
              clusterName:
                description: ClusterName is the name of the cluster that the Eviction
                  object targets.
                maxLength: 255
                type: string
                x-kubernetes-validations:
                - message: The ClusterName field is immutable
                  rule: self == oldSelf
              placementName:
                description: |-
                  PlacementName is the name of the Placement object which
                  the Eviction object targets.
                maxLength: 255
                type: string
                x-kubernetes-validations:
                - message: The PlacementName field is immutable
                  rule: self == oldSelf
            required:
            - clusterName
            - placementName
            type: object
          status:
            description: Status is the observed state of the ClusterResourcePlacementEviction.
            properties:
              conditions:
                description: |-
                  Conditions is the list of currently observed conditions for the
                  PlacementEviction object.

                  Available condition types include:
                  * Valid: whether the Eviction object is valid, i.e., it targets at a valid placement.
                  * Executed: whether the Eviction object has been executed.
                items:
                  description: Condition contains details for one aspect of the current
                    state of this API Resource.
                  properties:
                    lastTransitionTime:
                      description: |-
                        lastTransitionTime is the last time the condition transitioned from one status to another.
                        This 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.
                        This may be an empty string.
                      maxLength: 32768
                      type: string
                    observedGeneration:
                      description: |-
                        observedGeneration represents the .metadata.generation that the condition was set based upon.
                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
                        with 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.
                        Producers of specific condition types may define expected values and meanings for this field,
                        and whether the values are considered a guaranteed API.
                        The value should be a CamelCase string.
                        This 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
                type: array
            type: object
        required:
        - spec
        type: object
    served: true
    storage: true
    subresources:
      status: {}
