apiVersion: v1
kind: ServiceAccount
metadata:
  name: fts-server
  namespace: tidb-admin
---
apiVersion: v1
kind: Secret
metadata:
  name: starter-ai-search-fixture
  namespace: tidb-admin
type: Opaque
data:
  ai-gateway-username: __CP9_AI_GATEWAY_USERNAME_B64__
  ai-gateway-password: __CP9_AI_GATEWAY_PASSWORD_B64__
  fts-jwt-host: __CP9_FTS_JWT_HOST_B64__
  fts-jwt-auth-token: __CP9_FTS_JWT_AUTH_TOKEN_B64__
  fts-jwt-org-id: __CP9_FTS_JWT_ORG_ID_B64__
  fts-jwt-cluster-id: __CP9_FTS_JWT_CLUSTER_ID_B64__
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    control-plane: ai-gateway
  name: ai-gateway
  namespace: tidb-admin
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: ai-gateway
  strategy:
    rollingUpdate:
      maxSurge: 100%
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app.kubernetes.io/component: ai-gateway
        app.kubernetes.io/name: gateway
      annotations:
        prometheus.io/path: /metrics
        prometheus.io/port: "10080"
        prometheus.io/scrape: "true"
    spec:
      containers:
        - name: qdrant-api
          command:
            - /qdrant-on-tidb/qdrant-api
          args:
            - --cert=/qdrant-gateway-tls/tls.crt
            - --key=/qdrant-gateway-tls/tls.key
            - --database=ai
            - --host=tidb-gateway-new.tidb-admin.svc.cluster.local
            - --user=$(AI_GATEWAY_USERNAME)
            - --password=$(AI_GATEWAY_PASSWORD)
            - --search-service=https://fts-server.tidb-admin.svc.cluster.local:8443
            - --qdrant-service=http://qdrant4snapshot.tidb-admin.svc.cluster.local:6333
          env:
            - name: AI_GATEWAY_USERNAME
              valueFrom:
                secretKeyRef:
                  name: starter-ai-search-fixture
                  key: ai-gateway-username
            - name: AI_GATEWAY_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: starter-ai-search-fixture
                  key: ai-gateway-password
            - name: MAX_LIFETIME
              value: "300"
            - name: IDLE_TIMEOUT
              value: "60"
            - name: MIN_CONNECTIONS
              value: "0"
            - name: TENANTS_DB_CACHE_SIZE
              value: "100"
            - name: RUST_LOG
              value: debug
            - name: S3_REGION
              value: __CP9_TARGET_REGION__
            - name: S3_FTS_BUCKET
              value: __CP9_SERVERLESS_STORAGE_BUCKET__
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/qdrant-on-tidb:25441d2619a24e2a11d69dcb70a088c87d094eb4
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 3
            successThreshold: 1
            httpGet:
              path: /healthz
              port: 6333
              scheme: HTTPS
            initialDelaySeconds: 5
          readinessProbe:
            httpGet:
              path: /healthz
              port: 6333
              scheme: HTTPS
            initialDelaySeconds: 5
          resources:
            limits:
              cpu: "2"
              memory: 8Gi
            requests:
              cpu: "1"
              memory: 8Gi
          volumeMounts:
            - mountPath: /qdrant-gateway-tls
              name: tls-certs
      nodeSelector:
        cp9.tidbcloud.com/starter-role: regional-control-plane
      serviceAccountName: fts-server
      tolerations:
        - key: cp9.tidbcloud.com/starter-role
          operator: Equal
          value: regional-control-plane
          effect: NoSchedule
      volumes:
        - name: tls-certs
          secret:
            defaultMode: 288
            secretName: ai-gateway-cluster-secret
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: __CP9_LB_TAGS__
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: ssl
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: /healthz
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: https
    service.beta.kubernetes.io/aws-load-balancer-name: __CP9_AI_GATEWAY_LB_NAME__
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: __CP9_AI_GATEWAY_CERTIFICATE_ARN__
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443,6333"
    service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true,stickiness.enabled=false,stickiness.type=source_ip
    service.beta.kubernetes.io/aws-load-balancer-type: external
  labels:
    control-plane: ai-gateway
  name: ai-gateway
  namespace: tidb-admin
spec:
  ports:
    - name: ai-gateway-qdrant
      port: 6333
      protocol: TCP
      targetPort: 6333
    - name: ai-gateway-https
      port: 443
      protocol: TCP
      targetPort: 6333
  selector:
    app.kubernetes.io/component: ai-gateway
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    control-plane: qdrant4snapshot
  name: qdrant4snapshot
  namespace: tidb-admin
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: qdrant4snapshot
  strategy:
    rollingUpdate:
      maxSurge: 100%
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        control-plane: qdrant4snapshot
        app.kubernetes.io/component: qdrant4snapshot
        app.kubernetes.io/name: qdrant4snapshot
    spec:
      containers:
        - name: qdrant
          command:
            - /qdrant/entrypoint.sh
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/qdrant-staging-us-east-1:1.13.3
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 3
            successThreshold: 1
            httpGet:
              path: /
              port: 6333
            initialDelaySeconds: 5
          readinessProbe:
            httpGet:
              path: /
              port: 6333
            initialDelaySeconds: 5
          resources:
            requests:
              cpu: 1800m
              memory: 1024Mi
      nodeSelector:
        cp9.tidbcloud.com/starter-role: regional-control-plane
      serviceAccountName: fts-server
      tolerations:
        - key: cp9.tidbcloud.com/starter-role
          operator: Equal
          value: regional-control-plane
          effect: NoSchedule
---
apiVersion: v1
kind: Service
metadata:
  labels:
    control-plane: qdrant4snapshot
  name: qdrant4snapshot
  namespace: tidb-admin
spec:
  ports:
    - name: qdrant-server
      port: 6333
      protocol: TCP
      targetPort: 6333
  selector:
    control-plane: qdrant4snapshot
  type: ClusterIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    control-plane: fts-server
  name: fts-server
  namespace: tidb-admin
spec:
  minReadySeconds: 5
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Delete
    whenScaled: Delete
  podManagementPolicy: Parallel
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      control-plane: fts-server
  serviceName: fts-server
  template:
    metadata:
      labels:
        control-plane: fts-server
        app.kubernetes.io/component: fts-server
        app.kubernetes.io/name: fts-server
      annotations:
        prometheus.io/path: /metrics
        prometheus.io/port: "8443"
        prometheus.io/scrape: "true"
    spec:
      containers:
        - args:
            - --storage-path=/mnt/data0
          command:
            - /qdrant-on-tidb/serving-service
            - --cacert
            - /server-cert/ca.crt
            - --cert
            - /server-cert/tls.crt
            - --key
            - /server-cert/tls.key
          env:
            - name: RUST_LOG
              value: debug
            - name: S3_REGION
              value: __CP9_TARGET_REGION__
            - name: S3_FTS_BUCKET
              value: __CP9_SERVERLESS_STORAGE_BUCKET__
            - name: FEISHU_NOTICE
              value: "false"
            - name: AUTO_RELOAD_INDEX_INTERVAL
              value: "600"
            - name: CA_PATH
              value: /server-cert/ca.crt
            - name: CERT_PATH
              value: /server-cert/tls.crt
            - name: KEY_PATH
              value: /server-cert/tls.key
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/qdrant-on-tidb:2ee48129c34611c6fbbfa4ea9462cbbe8fc624d5
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 30
            httpGet:
              path: /healthz
              port: 8443
              scheme: HTTPS
            initialDelaySeconds: 5
            periodSeconds: 20
            successThreshold: 1
            timeoutSeconds: 1
          name: serving-server
          ports:
            - containerPort: 8443
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 8443
              scheme: HTTPS
            initialDelaySeconds: 5
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          resources:
            requests:
              cpu: 800m
              memory: 1Gi
          volumeMounts:
            - mountPath: /mnt/data0
              name: data0
            - mountPath: /server-cert
              name: server-cert
      nodeSelector:
        cp9.tidbcloud.com/starter-role: regional-control-plane
      serviceAccountName: fts-server
      tolerations:
        - key: cp9.tidbcloud.com/starter-role
          operator: Equal
          value: regional-control-plane
          effect: NoSchedule
      volumes:
        - name: server-cert
          secret:
            secretName: fts-server-cluster-secret
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
    - apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: data0
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 200Gi
        storageClassName: ebs-sc
        volumeMode: Filesystem
---
apiVersion: v1
kind: Service
metadata:
  labels:
    control-plane: fts-server
  name: fts-server
  namespace: tidb-admin
spec:
  ports:
    - name: fts-serving-server
      port: 8443
      protocol: TCP
      targetPort: 8443
  selector:
    control-plane: fts-server
  type: ClusterIP
---
apiVersion: batch/v1
kind: CronJob
metadata:
  name: fts-update-index
  namespace: tidb-admin
spec:
  schedule: "*/5 * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: update-index
              image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/qdrant-on-tidb:2ee48129c34611c6fbbfa4ea9462cbbe8fc624d5
              imagePullPolicy: IfNotPresent
              command:
                - /bin/sh
                - -c
              args:
                - /qdrant-on-tidb/ctl create-index shard0 || /qdrant-on-tidb/ctl index-updated-collections /mnt/data0/tmp shard0
              env:
                - name: RUST_LOG
                  value: debug
                - name: S3_REGION
                  value: __CP9_TARGET_REGION__
                - name: S3_FTS_BUCKET
                  value: __CP9_SERVERLESS_STORAGE_BUCKET__
                - name: AI_GATEWAY_USERNAME
                  valueFrom:
                    secretKeyRef:
                      name: starter-ai-search-fixture
                      key: ai-gateway-username
                - name: AI_GATEWAY_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: starter-ai-search-fixture
                      key: ai-gateway-password
                - name: JWT_HOST
                  valueFrom:
                    secretKeyRef:
                      name: starter-ai-search-fixture
                      key: fts-jwt-host
                - name: JWT_AUTH_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: starter-ai-search-fixture
                      key: fts-jwt-auth-token
                - name: JWT_ORG_ID
                  valueFrom:
                    secretKeyRef:
                      name: starter-ai-search-fixture
                      key: fts-jwt-org-id
                - name: JWT_CLUSTER_ID
                  valueFrom:
                    secretKeyRef:
                      name: starter-ai-search-fixture
                      key: fts-jwt-cluster-id
                - name: DSN
                  value: mysql://$(AI_GATEWAY_USERNAME):$(AI_GATEWAY_PASSWORD)@tidb-gateway-inner.tidb-admin.svc.cluster.local:4000/ai
                - name: FEISHU_NOTICE
                  value: "false"
                - name: MAX_LIFETIME
                  value: "5"
                - name: IDLE_TIMEOUT
                  value: "1"
              volumeMounts:
                - mountPath: /mnt/data0
                  name: data0
          nodeSelector:
            cp9.tidbcloud.com/starter-role: regional-control-plane
          restartPolicy: OnFailure
          serviceAccountName: fts-server
          tolerations:
            - key: cp9.tidbcloud.com/starter-role
              operator: Equal
              value: regional-control-plane
              effect: NoSchedule
          volumes:
            - name: data0
              ephemeral:
                volumeClaimTemplate:
                  spec:
                    accessModes:
                      - ReadWriteOnce
                    storageClassName: ebs-sc
                    resources:
                      requests:
                        storage: 200Gi
