apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: manifestworks.work.open-cluster-management.io
spec:
  conversion:
    strategy: None
  group: work.open-cluster-management.io
  names:
    kind: ManifestWork
    listKind: ManifestWorkList
    plural: manifestworks
    singular: manifestwork
  scope: Namespaced
  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.
          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.
              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.
                  properties:
                    propagationPolicy:
                      default: ForeGround
                      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
                    selectivelyOrphans:
                      description: selectivelyOrphan represents a list of resources
                        following orphan deletion stratecy
                      properties:
                        orphaningRules:
                          description: orphaningRules defines a slice of orphaningrule.
                            Each orphaningrule identifies a single resource included
                            in this manifestwork
                          items:
                            description: OrphaningRule identifies a single resource
                              included in this manifestwork
                            properties:
                              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
                              group:
                                description: Group is the api group 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
                            type: object
                          type: array
                      type: object
                  type: object
                workload:
                  description: Workload represents the manifest workload to be deployed
                    on a managed cluster.
                  properties:
                    manifests:
                      description: Manifests represents a list of kuberenetes resources
                        to be deployed on a managed cluster.
                      items:
                        description: Manifest represents a resource to be deployed on
                          managed cluster.
                        type: object
                        x-kubernetes-embedded-resource: true
                        x-kubernetes-preserve-unknown-fields: true
                      type: array
                  type: object
              type: object
            status:
              description: Status represents the current status of work.
              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.'
                  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 }"
                    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.
                          --- 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)
                        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
                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.
                  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.'
                      items:
                        description: ManifestCondition represents the conditions of
                          the resources deployed on a managed cluster.
                        properties:
                          conditions:
                            description: Conditions represents the conditions of this
                              resource on a managed cluster.
                            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 }"
                              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. --- 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)
                                  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
                          resourceMeta:
                            description: ResourceMeta represents the group, version,
                              kind, name and namespace of a resoure.
                            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.
                                format: int32
                                type: integer
                              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
                            type: object
                        type: object
                      type: array
                  type: object
              type: object
          type: object
      served: true
      storage: true
      subresources:
        status: {}
status:
  acceptedNames:
    kind: ManifestWork
    listKind: ManifestWorkList
    plural: manifestworks
    singular: manifestwork
  conditions:
    - lastTransitionTime: "2021-08-12T08:23:40Z"
      message: no conflicts found
      reason: NoConflicts
      status: "True"
      type: NamesAccepted
    - lastTransitionTime: "2021-08-12T08:23:40Z"
      message: the initial names have been accepted
      reason: InitialNamesAccepted
      status: "True"
      type: Established
  storedVersions:
    - v1