apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: manifestworks.work.open-cluster-management.io
spec:
  group: work.open-cluster-management.io
  names:
    kind: ManifestWork
    listKind: ManifestWorkList
    plural: manifestworks
    singular: manifestwork
  scope: Namespaced
  preserveUnknownFields: false
  versions:
  - name: v1
    schema:
      openAPIV3Schema:
        description: ManifestWork represents a manifests workload that hub wants to
          deploy on the managed cluster. A manifest workload is defined as a set of
          Kubernetes resources. ManifestWork must be created in the cluster namespace
          on the hub, so that agent on the corresponding managed cluster can access
          this resource and deploy on the managed cluster.
        type: object
        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 represents a desired configuration of work to be deployed
              on the managed cluster.
            type: object
            properties:
              deleteOption:
                description: DeleteOption represents deletion strategy when the manifestwork
                  is deleted. Foreground deletion strategy is applied to all the resource
                  in this manifestwork if it is not set.
                type: object
                properties:
                  propagationPolicy:
                    description: propagationPolicy can be Foreground, Orphan or SelectivelyOrphan
                      SelectivelyOrphan should be rarely used.  It is provided for
                      cases where particular resources is transfering ownership from
                      one ManifestWork to another or another management unit. Setting
                      this value will allow a flow like 1. create manifestwork/2 to
                      manage foo 2. update manifestwork/1 to selectively orphan foo
                      3. remove foo from manifestwork/1 without impacting continuity
                      because manifestwork/2 adopts it.
                    type: string
                    default: ForeGround
                  selectivelyOrphans:
                    description: selectivelyOrphan represents a list of resources
                      following orphan deletion stratecy
                    type: object
                    properties:
                      orphaningRules:
                        description: orphaningRules defines a slice of orphaningrule.
                          Each orphaningrule identifies a single resource included
                          in this manifestwork
                        type: array
                        items:
                          description: OrphaningRule identifies a single resource
                            included in this manifestwork
                          type: object
                          properties:
                            group:
                              description: Group is the api group of the resources
                                in the workload that the strategy is applied
                              type: string
                            name:
                              description: Name is the names of the resources in the
                                workload that the strategy is applied
                              type: string
                            namespace:
                              description: Namespace is the namespaces of the resources
                                in the workload that the strategy is applied
                              type: string
                            resource:
                              description: Resource is the resources in the workload
                                that the strategy is applied
                              type: string
              workload:
                description: Workload represents the manifest workload to be deployed
                  on a managed cluster.
                type: object
                properties:
                  manifests:
                    description: Manifests represents a list of kuberenetes resources
                      to be deployed on a managed cluster.
                    type: array
                    items:
                      description: Manifest represents a resource to be deployed on
                        managed cluster.
                      type: object
                      x-kubernetes-preserve-unknown-fields: true
                      x-kubernetes-embedded-resource: true
          status:
            description: Status represents the current status of work.
            type: object
            properties:
              conditions:
                description: 'Conditions contains the different condition statuses
                  for this work. Valid condition types are: 1. Applied represents
                  workload in ManifestWork is applied successfully on managed cluster.
                  2. Progressing represents workload in ManifestWork is being applied
                  on managed cluster. 3. Available represents workload in ManifestWork
                  exists on the managed cluster. 4. Degraded represents the current
                  state of workload does not match the desired state for a certain
                  period.'
                type: array
                items:
                  description: "Condition contains details for one aspect of the current
                    state of this API Resource. --- This struct is intended for direct
                    use as an array at the field path .status.conditions.  For example,
                    type FooStatus struct{     // Represents the observations of a
                    foo's current state.     // Known .status.conditions.type are:
                    \"Available\", \"Progressing\", and \"Degraded\"     // +patchMergeKey=type
                    \    // +patchStrategy=merge     // +listType=map     // +listMapKey=type
                    \    Conditions []metav1.Condition `json:\"conditions,omitempty\"
                    patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
                    \n     // other fields }"
                  type: object
                  required:
                  - lastTransitionTime
                  - message
                  - reason
                  - status
                  - type
                  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.
                      type: string
                      format: date-time
                    message:
                      description: message is a human readable message indicating
                        details about the transition. This may be an empty string.
                      type: string
                      maxLength: 32768
                    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.
                      type: integer
                      format: int64
                      minimum: 0
                    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.
                      type: string
                      maxLength: 1024
                      minLength: 1
                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
                    status:
                      description: status of the condition, one of True, False, Unknown.
                      type: string
                      enum:
                      - "True"
                      - "False"
                      - Unknown
                    type:
                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
                        --- Many .condition.type values are consistent across resources
                        like Available, but because arbitrary conditions can be useful
                        (see .node.status.conditions), the ability to deconflict is
                        important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
                      type: string
                      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])$
              resourceStatus:
                description: ResourceStatus represents the status of each resource
                  in manifestwork deployed on a managed cluster. The Klusterlet agent
                  on managed cluster syncs the condition from the managed cluster
                  to the hub.
                type: object
                properties:
                  manifests:
                    description: 'Manifests represents the condition of manifests
                      deployed on managed cluster. Valid condition types are: 1. Progressing
                      represents the resource is being applied on managed cluster.
                      2. Applied represents the resource is applied successfully on
                      managed cluster. 3. Available represents the resource exists
                      on the managed cluster. 4. Degraded represents the current state
                      of resource does not match the desired state for a certain period.'
                    type: array
                    items:
                      description: ManifestCondition represents the conditions of
                        the resources deployed on a managed cluster.
                      type: object
                      properties:
                        conditions:
                          description: Conditions represents the conditions of this
                            resource on a managed cluster.
                          type: array
                          items:
                            description: "Condition contains details for one aspect
                              of the current state of this API Resource. --- This
                              struct is intended for direct use as an array at the
                              field path .status.conditions.  For example, type FooStatus
                              struct{     // Represents the observations of a foo's
                              current state.     // Known .status.conditions.type
                              are: \"Available\", \"Progressing\", and \"Degraded\"
                              \    // +patchMergeKey=type     // +patchStrategy=merge
                              \    // +listType=map     // +listMapKey=type     Conditions
                              []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\"
                              patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
                              \n     // other fields }"
                            type: object
                            required:
                            - lastTransitionTime
                            - message
                            - reason
                            - status
                            - type
                            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.
                                type: string
                                format: date-time
                              message:
                                description: message is a human readable message indicating
                                  details about the transition. This may be an empty
                                  string.
                                type: string
                                maxLength: 32768
                              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.
                                type: integer
                                format: int64
                                minimum: 0
                              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.
                                type: string
                                maxLength: 1024
                                minLength: 1
                                pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
                              status:
                                description: status of the condition, one of True,
                                  False, Unknown.
                                type: string
                                enum:
                                - "True"
                                - "False"
                                - Unknown
                              type:
                                description: type of condition in CamelCase or in
                                  foo.example.com/CamelCase. --- Many .condition.type
                                  values are consistent across resources like Available,
                                  but because arbitrary conditions can be useful (see
                                  .node.status.conditions), the ability to deconflict
                                  is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
                                type: string
                                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])$
                        resourceMeta:
                          description: ResourceMeta represents the group, version,
                            kind, name and namespace of a resoure.
                          type: object
                          properties:
                            group:
                              description: Group is the API Group of the Kubernetes
                                resource.
                              type: string
                            kind:
                              description: Kind is the kind of the Kubernetes resource.
                              type: string
                            name:
                              description: Name is the name of the Kubernetes resource.
                              type: string
                            namespace:
                              description: Name is the namespace of the Kubernetes
                                resource.
                              type: string
                            ordinal:
                              description: Ordinal represents the index of the manifest
                                on spec.
                              type: integer
                              format: int32
                            resource:
                              description: Resource is the resource name of the Kubernetes
                                resource.
                              type: string
                            version:
                              description: Version is the version of the Kubernetes
                                resource.
                              type: string
    served: true
    storage: true
    subresources:
      status: {}
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
