kind: Namespace
apiVersion: v1
metadata:
  name: pingcap
---
kind: ServiceAccount
apiVersion: v1
metadata:
  namespace: pingcap
  name: tidb-controller-manager
---
kind: ServiceAccount
apiVersion: v1
metadata:
  namespace: pingcap
  name: tidb-scheduler
---
kind: ServiceAccount
apiVersion: v1
metadata:
  namespace: pingcap
  name: tidb-volume-manager
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pingcap:tidb-controller-manager
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get"]
- apiGroups: [""]
  resources:
    - pods
    - services
    - configmaps
    - persistentvolumeclaims
    - persistentvolumes
  verbs: ["*"]
- apiGroups: ["apiextensions.k8s.io"]
  resources: ["customresourcedefinitions"]
  verbs: ["create", "get", "delete"]
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["create", "get", "update"]
- apiGroups: ["pingcap.com"]
  resources: ["tidbclusters", "tidbsets"]
  verbs: ["*"]
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pingcap:tidb-scheduler
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["get"]
- apiGroups: [""]
  resources: ["persistentvolumeclaims"]
  verbs: ["get", "list", "update"]
- apiGroups: ["pingcap.com"]
  resources: ["tidbclusters"]
  verbs: ["*"]
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pingcap:tidb-volume-manager
rules:
- apiGroups: [""]
  resources:
    - events
    - persistentvolumes
    - persistentvolumeclaims
    - pods
  verbs: ["*"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list", "watch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pingcap:tidb-controller-manager
subjects:
- kind: ServiceAccount
  name: tidb-controller-manager
  namespace: pingcap
- kind: ServiceAccount
  name: tidb-scheduler
  namespace: pingcap
roleRef:
  kind: ClusterRole
  name: pingcap:tidb-controller-manager
  apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pingcap:tidb-scheduler
subjects:
- kind: ServiceAccount
  name: tidb-scheduler
  namespace: pingcap
roleRef:
  kind: ClusterRole
  name: pingcap:tidb-scheduler
  apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pingcap:kube-scheduler
subjects:
- kind: ServiceAccount
  name: tidb-scheduler
  namespace: pingcap
roleRef:
  kind: ClusterRole
  name: system:kube-scheduler
  apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pingcap:tidb-volume-manager
subjects:
- kind: ServiceAccount
  name: tidb-volume-manager
  namespace: pingcap
roleRef:
  kind: ClusterRole
  name: pingcap:tidb-volume-manager
  apiGroup: rbac.authorization.k8s.io
---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: pingcap-volume-provisioner
provisioner: pingcap.com/volume-provisioner
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: pingcap
  name: tidb-controller-manager
  labels:
    app: tidb-operator
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tidb-operator
      name: tidb-controller-manager
  template:
    metadata:
      labels:
        app: tidb-operator
        name: tidb-controller-manager
    spec:
      serviceAccount: tidb-controller-manager
      containers:
      - name: tidb-operator
        image: pingcap/tidb-operator:latest
        args:
          - /usr/local/bin/tidb-controller-manager
          - -L=debug
        env:
          - name: MY_POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        volumeMounts:
          - name: timezone
            mountPath: /etc/localtime
      volumes:
      - name: timezone
        hostPath:
          path: /etc/localtime
---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: pingcap
  name: tidb-scheduler-policy
  labels:
    app: tidb-operator
data:
  policy.cfg: |-
    {
            "kind" : "Policy",
            "apiVersion" : "v1",
            "predicates": [
                    {"name": "MatchNodeSelector"},
                    {"name": "PodFitsResources"},
                    {"name": "PodFitsHostPorts"},
                    {"name": "HostName"},
                    {"name": "NoDiskConflict"},
                    {"name": "PodToleratesNodeTaints"},
                    {"name": "CheckNodeMemoryPressure"},
                    {"name": "CheckNodeDiskPressure"},
                    {"name": "MatchInterPodAffinity"},
                    {"name": "GeneralPredicates"}
            ],
            "priorities": [
                    {"name": "EqualPriority", "weight": 1},
                    {"name": "ImageLocalityPriority", "weight": 1},
                    {"name": "LeastRequestedPriority", "weight": 1},
                    {"name": "BalancedResourceAllocation", "weight": 1},
                    {"name": "SelectorSpreadPriority", "weight": 1},
                    {"name": "NodePreferAvoidPodsPriority", "weight": 1},
                    {"name": "NodeAffinityPriority", "weight": 1},
                    {"name": "TaintTolerationPriority", "weight": 1},
                    {"name": "InterPodAffinityPriority", "weight": 1},
                    {"name": "MostRequestedPriority", "weight": 1}
            ],
            "extenders": [
                    {
                            "urlPrefix": "http://127.0.0.1:10262/scheduler",
                            "filterVerb": "filter",
                            "weight": 1,
                            "httpTimeout": 30000000000,
                            "enableHttps": false
                    }
            ]
    }
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: pingcap
  name: tidb-scheduler
  labels:
    app: tidb-operator
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tidb-operator
      name: tidb-scheduler
  template:
    metadata:
      labels:
        app: tidb-operator
        name: tidb-scheduler
    spec:
      serviceAccount: tidb-scheduler
      containers:
      - name: tidb-scheduler
        image: pingcap/tidb-operator:latest
        args:
          - /usr/local/bin/tidb-scheduler
          - -L=debug
          - --port=10262
        env:
          - name: MY_POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
      - name: kube-scheduler
        image: mirantis/hypokube:final
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 250m
            memory: 512M
          requests:
            cpu: 80m
            memory: 170M
        command:
        - /hyperkube
        - scheduler
        - --port=10261
        - --leader-elect=true
        - --lock-object-name=tidb-scheduler
        - --lock-object-namespace=pingcap
        - --scheduler-name=tidb-scheduler
        - --v=2
        - --policy-configmap=tidb-scheduler-policy
        - --policy-configmap-namespace=pingcap
        # TODO: find the reason why health-check failed and uncomment following lines
        # livenessProbe:
        #   httpGet:
        #     host: 127.0.0.1
        #     path: /healthz
        #     port: 10261
        #   initialDelaySeconds: 30
        #   timeoutSeconds: 10
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  namespace: pingcap
  name: tidb-volume-manager
  labels:
    app: tidb-operator
spec:
  selector:
    matchLabels:
      app: tidb-operator
      name: tidb-volume-manager
  template:
    metadata:
      labels:
        app: tidb-operator
        name: tidb-volume-manager
    spec:
      serviceAccount: tidb-volume-manager
      containers:
      - name: tidb-volume-manager
        image: pingcap/tidb-operator:latest
        command:
          - /usr/local/bin/tidb-volume-manager
          - --pvdir=/tidb
          - --v=2
        volumeMounts:
          - name: tidb
            mountPath: /tidb
        env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
      volumes:
      - name: tidb
        hostPath:
          path: /tidb
