apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  annotations:
    addons.oam.dev/description: ocm-cluster-manager can deploy an OCM hub cluster
      environment.
  name: ocm-cluster-manager
  namespace: vela-system
spec:
  components:
  - name: ns-open-cluster-management
    properties:
      apiVersion: v1
      kind: Namespace
      metadata:
        name: open-cluster-management
    type: raw
  - name: cluster-manager-role-binding
    properties:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: cluster-manager-role-binding
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: cluster-manager-cluster-role
      subjects:
      - kind: ServiceAccount
        name: cluster-manager-service-account
        namespace: open-cluster-management
    type: raw
  - name: cluster-manager-cluster-role
    properties:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: cluster-manager-cluster-role
      rules:
      - apiGroups:
        - ""
        resources:
        - configmaps
        - namespaces
        - serviceaccounts
        - services
        - secrets
        verbs:
        - create
        - get
        - list
        - update
        - watch
        - patch
        - delete
      - apiGroups:
        - ""
        resources:
        - nodes
        verbs:
        - get
        - list
        - watch
      - apiGroups:
        - authorization.k8s.io
        resources:
        - subjectaccessreviews
        verbs:
        - create
      - apiGroups:
        - ""
        - events.k8s.io
        resources:
        - events
        verbs:
        - create
        - patch
        - update
      - apiGroups:
        - apps
        resources:
        - deployments
        verbs:
        - create
        - get
        - list
        - update
        - watch
        - patch
        - delete
      - apiGroups:
        - rbac.authorization.k8s.io
        resources:
        - clusterrolebindings
        - rolebindings
        verbs:
        - create
        - get
        - list
        - update
        - watch
        - patch
        - delete
      - apiGroups:
        - rbac.authorization.k8s.io
        resources:
        - clusterroles
        - roles
        verbs:
        - create
        - get
        - list
        - update
        - watch
        - patch
        - delete
        - escalate
        - bind
      - apiGroups:
        - apiextensions.k8s.io
        resources:
        - customresourcedefinitions
        verbs:
        - create
        - get
        - list
        - update
        - watch
        - patch
        - delete
      - apiGroups:
        - apiregistration.k8s.io
        resources:
        - apiservices
        verbs:
        - create
        - get
        - list
        - update
        - watch
        - patch
        - delete
      - apiGroups:
        - admissionregistration.k8s.io
        resources:
        - validatingwebhookconfigurations
        - mutatingwebhookconfigurations
        verbs:
        - create
        - get
        - list
        - update
        - watch
        - patch
        - delete
      - apiGroups:
        - operator.open-cluster-management.io
        resources:
        - clustermanagers
        verbs:
        - get
        - list
        - watch
        - update
        - delete
      - apiGroups:
        - operator.open-cluster-management.io
        resources:
        - clustermanagers/status
        verbs:
        - update
        - patch
    type: raw
  - name: cluster-manager-service-account
    properties:
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: cluster-manager-service-account
        namespace: open-cluster-management
    type: raw
  - name: clustermanagers.operator.open-cluster-management.io
    properties:
      apiVersion: apiextensions.k8s.io/v1
      kind: CustomResourceDefinition
      metadata:
        name: clustermanagers.operator.open-cluster-management.io
      spec:
        group: operator.open-cluster-management.io
        names:
          kind: ClusterManager
          listKind: ClusterManagerList
          plural: clustermanagers
          singular: clustermanager
        preserveUnknownFields: false
        scope: Cluster
        versions:
        - name: v1
          schema:
            openAPIV3Schema:
              description: ClusterManager configures the controllers on the hub that
                govern registration and work distribution for attached Klusterlets.
                ClusterManager will only be deployed in open-cluster-management-hub
                namespace.
              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 deployment configuration
                    of controllers that govern registration and work distribution
                    for attached Klusterlets.
                  properties:
                    placementImagePullSpec:
                      default: quay.io/open-cluster-management/placement
                      description: PlacementImagePullSpec represents the desired image
                        configuration of placement controller/webhook installed on
                        hub.
                      type: string
                    registrationImagePullSpec:
                      default: quay.io/open-cluster-management/registration
                      description: RegistrationImagePullSpec represents the desired
                        image of registration controller/webhook installed on hub.
                      type: string
                    workImagePullSpec:
                      default: quay.io/open-cluster-management/work
                      description: WorkImagePullSpec represents the desired image
                        configuration of work controller/webhook installed on hub.
                      type: string
                  type: object
                status:
                  description: Status represents the current status of controllers
                    that govern the lifecycle of managed clusters.
                  properties:
                    conditions:
                      description: 'Conditions contain the different condition statuses
                        for this ClusterManager. Valid condition types are: Applied:
                        Components in hub are applied. Available: Components in hub
                        are available and ready to serve. Progressing: Components
                        in hub are in a transitioning state. Degraded: Components
                        in hub do not match the desired configuration and only provide
                        degraded service.'
                      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
                    generations:
                      description: Generations are used to determine when an item
                        needs to be reconciled or has changed in a way that needs
                        a reaction.
                      items:
                        description: GenerationStatus keeps track of the generation
                          for a given resource so that decisions about forced updates
                          can be made. The definition matches the GenerationStatus
                          defined in github.com/openshift/api/v1
                        properties:
                          group:
                            description: group is the group of the resource that you're
                              tracking
                            type: string
                          lastGeneration:
                            description: lastGeneration is the last generation of
                              the resource that controller applies
                            format: int64
                            type: integer
                          name:
                            description: name is the name of the resource that you're
                              tracking
                            type: string
                          namespace:
                            description: namespace is where the resource that you're
                              tracking is
                            type: string
                          resource:
                            description: resource is the resource type of the resource
                              that you're tracking
                            type: string
                          version:
                            description: version is the version of the resource that
                              you're tracking
                            type: string
                        type: object
                      type: array
                    observedGeneration:
                      description: ObservedGeneration is the last generation change
                        you've dealt with
                      format: int64
                      type: integer
                    relatedResources:
                      description: RelatedResources are used to track the resources
                        that are related to this ClusterManager.
                      items:
                        description: RelatedResourceMeta represents the resource that
                          is managed by an operator
                        properties:
                          group:
                            description: group is the group of the resource that you're
                              tracking
                            type: string
                          name:
                            description: name is the name of the resource that you're
                              tracking
                            type: string
                          namespace:
                            description: namespace is where the thing you're tracking
                              is
                            type: string
                          resource:
                            description: resource is the resource type of the resource
                              that you're tracking
                            type: string
                          version:
                            description: version is the version of the thing you're
                              tracking
                            type: string
                        type: object
                      type: array
                  type: object
              type: object
          served: true
          storage: true
          subresources:
            status: {}
      status:
        acceptedNames:
          kind: ""
          plural: ""
        conditions: []
        storedVersions: []
    type: raw
  - name: cluster-manager-hub
    properties:
      apiVersion: operator.open-cluster-management.io/v1
      kind: ClusterManager
      metadata:
        name: cluster-manager-hub
      spec:
        placementImagePullSpec: quay.io/open-cluster-management/placement
        registrationImagePullSpec: quay.io/open-cluster-management/registration
        workImagePullSpec: quay.io/open-cluster-management/work
    type: raw
  - name: cluster-manager-controller
    properties:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: cluster-manager
        name: cluster-manager-controller
        namespace: open-cluster-management
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: cluster-manager
        template:
          metadata:
            labels:
              app: cluster-manager
          spec:
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    labelSelector:
                      matchExpressions:
                      - key: app
                        operator: In
                        values:
                        - cluster-manager
                    topologyKey: failure-domain.beta.kubernetes.io/zone
                  weight: 70
                - podAffinityTerm:
                    labelSelector:
                      matchExpressions:
                      - key: app
                        operator: In
                        values:
                        - cluster-manager
                    topologyKey: kubernetes.io/hostname
                  weight: 30
            containers:
            - args:
              - /registration-operator
              - hub
              image: quay.io/open-cluster-management/registration-operator:latest
              imagePullPolicy: IfNotPresent
              livenessProbe:
                httpGet:
                  path: /healthz
                  port: 8443
                  scheme: HTTPS
                initialDelaySeconds: 2
                periodSeconds: 10
              name: registration-operator
              readinessProbe:
                httpGet:
                  path: /healthz
                  port: 8443
                  scheme: HTTPS
                initialDelaySeconds: 2
              resources:
                requests:
                  cpu: 10m
                  memory: 128Mi
              securityContext:
                allowPrivilegeEscalation: false
                capabilities:
                  drop:
                  - ALL
                privileged: false
                runAsNonRoot: true
            serviceAccountName: cluster-manager-service-account
    type: raw
  workflow:
    steps:
    - name: apply-ns
      properties:
        component: ns-open-cluster-management
      type: apply-component
    - name: apply-resources
      type: apply-remaining
status:
  rollout:
    batchRollingState: ""
    currentBatch: 0
    lastTargetAppRevision: ""
    rollingState: ""
    upgradedReadyReplicas: 0
    upgradedReplicas: 0
