apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: managedclusteraddons.addon.open-cluster-management.io
spec:
  group: addon.open-cluster-management.io
  names:
    kind: ManagedClusterAddOn
    listKind: ManagedClusterAddOnList
    plural: managedclusteraddons
    singular: managedclusteraddon
  scope: Namespaced
  preserveUnknownFields: false
  versions:
    - additionalPrinterColumns:
        - jsonPath: .status.conditions[?(@.type=="Available")].status
          name: Available
          type: string
        - jsonPath: .status.conditions[?(@.type=="Degraded")].status
          name: Degraded
          type: string
        - jsonPath: .status.conditions[?(@.type=="Progressing")].status
          name: Progressing
          type: string
      name: v1alpha1
      schema:
        openAPIV3Schema:
          description: ManagedClusterAddOn is the Custom Resource object which holds the current state of an add-on. This object is used by add-on operators to convey their state. This resource should be created in the ManagedCluster namespace.
          type: object
          required:
            - spec
          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 holds configuration that could apply to any operator.
              type: object
              properties:
                installNamespace:
                  description: installNamespace is the namespace on the managed cluster to install the addon agent. If it is not set, open-cluster-management-agent-addon namespace is used to install the addon agent.
                  type: string
                  maxLength: 63
                  pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
            status:
              description: status holds the information about the state of an operator.  It is consistent with status information across the Kubernetes ecosystem.
              type: object
              properties:
                addOnConfiguration:
                  description: addOnConfiguration is a reference to configuration information for the add-on. This resource is use to locate the configuration resource for the add-on.
                  type: object
                  properties:
                    crName:
                      description: crName is the name of the CR used to configure instances of the managed add-on. This field should be configured if add-on CR have a consistent name across the all of the ManagedCluster instaces.
                      type: string
                    crdName:
                      description: crdName is the name of the CRD used to configure instances of the managed add-on. This field should be configured if the add-on have a CRD that controls the configuration of the add-on.
                      type: string
                    lastObservedGeneration:
                      description: lastObservedGeneration is the observed generation of the custom resource for the configuration of the addon.
                      type: integer
                      format: int64
                addOnMeta:
                  description: addOnMeta is a reference to the metadata information for the add-on. This should be same as the addOnMeta for the corresponding ClusterManagementAddOn resource.
                  type: object
                  properties:
                    description:
                      description: description represents the detailed description of the add-on.
                      type: string
                    displayName:
                      description: displayName represents the name of add-on that will be displayed.
                      type: string
                conditions:
                  description: conditions describe the state of the managed and monitored components for the operator.
                  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])$
                healthCheck:
                  description: healthCheck indicates how to check the healthiness status of the current addon. It should be set by each addon implementation, by default, the lease mode will be used.
                  type: object
                  properties:
                    mode:
                      description: mode indicates which mode will be used to check the healthiness status of the addon.
                      type: string
                      default: Lease
                      enum:
                        - Lease
                        - Customized
                registrations:
                  description: registrations is the conifigurations for the addon agent to register to hub. It should be set by each addon controller on hub to define how the addon agent on managedcluster is registered. With the registration defined, The addon agent can access to kube apiserver with kube style API or other endpoints on hub cluster with client certificate authentication. A csr will be created per registration configuration. If more than one registrationConfig is defined, a csr will be created for each registration configuration. It is not allowed that multiple registrationConfigs have the same signer name. After the csr is approved on the hub cluster, the klusterlet agent will create a secret in the installNamespace for the registrationConfig. If the signerName is "kubernetes.io/kube-apiserver-client", the secret name will be "{addon name}-hub-kubeconfig" whose contents includes key/cert and kubeconfig. Otherwise, the secret name will be "{addon name}-{signer name}-client-cert" whose contents includes key/cert.
                  type: array
                  items:
                    description: RegistrationConfig defines the configuration of the addon agent to register to hub. The Klusterlet agent will create a csr for the addon agent with the registrationConfig.
                    type: object
                    properties:
                      signerName:
                        description: signerName is the name of signer that addon agent will use to create csr.
                        type: string
                        maxLength: 571
                        minLength: 5
                      subject:
                        description: "subject is the user subject of the addon agent to be registered to the hub. If it is not set, the addon agent will have the default subject \"subject\": { \t\"user\": \"system:open-cluster-management:addon:{addonName}:{clusterName}:{agentName}\", \t\"groups: [\"system:open-cluster-management:addon\", \"system:open-cluster-management:addon:{addonName}\", \"system:authenticated\"] }"
                        type: object
                        properties:
                          groups:
                            description: groups is the user group of the addon agent.
                            type: array
                            items:
                              type: string
                          organizationUnit:
                            description: organizationUnit is the ou of the addon agent
                            type: array
                            items:
                              type: string
                          user:
                            description: user is the user name of the addon agent.
                            type: string
                relatedObjects:
                  description: 'relatedObjects is a list of objects that are "interesting" or related to this operator. Common uses are: 1. the detailed resource driving the operator 2. operator namespaces 3. operand namespaces 4. related ClusterManagementAddon resource'
                  type: array
                  items:
                    description: ObjectReference contains enough information to let you inspect or modify the referred object.
                    type: object
                    required:
                      - group
                      - name
                      - resource
                    properties:
                      group:
                        description: group of the referent.
                        type: string
                      name:
                        description: name of the referent.
                        type: string
                      namespace:
                        description: namespace of the referent.
                        type: string
                      resource:
                        description: resource of the referent.
                        type: string
      served: true
      storage: true
      subresources:
        status: {}
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
