apiVersion: apps/v1
kind: StatefulSet
metadata:
  annotations:
    percona.com/last-config-hash: eyJyZXBsaWNhcyI6MSwic2VsZWN0b3IiOnsibWF0Y2hMYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50IjoiaGFwcm94eSIsImFwcC5rdWJlcm5ldGVzLmlvL2luc3RhbmNlIjoicGVyY29uYS14dHJhZGIiLCJhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5IjoicGVyY29uYS14dHJhZGItY2x1c3Rlci1vcGVyYXRvciIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJwZXJjb25hLXh0cmFkYi1jbHVzdGVyIiwiYXBwLmt1YmVybmV0ZXMuaW8vcGFydC1vZiI6InBlcmNvbmEteHRyYWRiLWNsdXN0ZXIifX0sInRlbXBsYXRlIjp7Im1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50IjoiaGFwcm94eSIsImFwcC5rdWJlcm5ldGVzLmlvL2luc3RhbmNlIjoicGVyY29uYS14dHJhZGIiLCJhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5IjoicGVyY29uYS14dHJhZGItY2x1c3Rlci1vcGVyYXRvciIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJwZXJjb25hLXh0cmFkYi1jbHVzdGVyIiwiYXBwLmt1YmVybmV0ZXMuaW8vcGFydC1vZiI6InBlcmNvbmEteHRyYWRiLWNsdXN0ZXIifSwiYW5ub3RhdGlvbnMiOnsia3ViZWN0bC5rdWJlcm5ldGVzLmlvL2RlZmF1bHQtY29udGFpbmVyIjoiaGFwcm94eSIsInBlcmNvbmEuY29tL2NvbmZpZ3VyYXRpb24taGFzaCI6Ijk2ZDQ4ZjkwMDUyZjQ1OWU1MWE3ZDljNWVhMmQyMDI0In19LCJzcGVjIjp7InZvbHVtZXMiOlt7Im5hbWUiOiJoYXByb3h5LWN1c3RvbSIsImNvbmZpZ01hcCI6eyJuYW1lIjoicGVyY29uYS14dHJhZGItaGFwcm94eSIsIm9wdGlvbmFsIjp0cnVlfX0seyJuYW1lIjoiaGFwcm94eS1hdXRvIiwiZW1wdHlEaXIiOnt9fSx7Im5hbWUiOiJteXNxbC11c2Vycy1zZWNyZXQtZmlsZSIsInNlY3JldCI6eyJzZWNyZXROYW1lIjoiaW50ZXJuYWwtcGVyY29uYS14dHJhZGIiLCJvcHRpb25hbCI6ZmFsc2V9fSx7Im5hbWUiOiJwZXJjb25hLXh0cmFkYi1lbnYtdmFycy1oYXByb3h5Iiwic2VjcmV0Ijp7InNlY3JldE5hbWUiOiJwZXJjb25hLXh0cmFkYi1lbnYtdmFycy1oYXByb3h5Iiwib3B0aW9uYWwiOnRydWV9fSx7Im5hbWUiOiJiaW4iLCJlbXB0eURpciI6e319XSwiaW5pdENvbnRhaW5lcnMiOlt7Im5hbWUiOiJweGMtaW5pdCIsImltYWdlIjoiaGFyYm9yLmF0bW9zcGhlcmUuZGV2L2RvY2tlci5pby9wZXJjb25hL3BlcmNvbmEteHRyYWRiLWNsdXN0ZXItb3BlcmF0b3I6MS4xNy4wIiwiY29tbWFuZCI6WyIvcHhjLWluaXQtZW50cnlwb2ludC5zaCJdLCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjUwbSIsIm1lbW9yeSI6IjUwTSJ9fSwidm9sdW1lTW91bnRzIjpbeyJuYW1lIjoiYmluIiwibW91bnRQYXRoIjoiL3Zhci9saWIvbXlzcWwifV0sImltYWdlUHVsbFBvbGljeSI6IkFsd2F5cyJ9LHsibmFtZSI6ImhhcHJveHktaW5pdCIsImltYWdlIjoiaGFyYm9yLmF0bW9zcGhlcmUuZGV2L2RvY2tlci5pby9wZXJjb25hL3BlcmNvbmEteHRyYWRiLWNsdXN0ZXItb3BlcmF0b3I6MS4xNy4wIiwiY29tbWFuZCI6WyIvaGFwcm94eS1pbml0LWVudHJ5cG9pbnQuc2giXSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MG0iLCJtZW1vcnkiOiI1ME0ifX0sInZvbHVtZU1vdW50cyI6W3sibmFtZSI6ImJpbiIsIm1vdW50UGF0aCI6Ii9vcHQvcGVyY29uYSJ9XSwiaW1hZ2VQdWxsUG9saWN5IjoiQWx3YXlzIn1dLCJjb250YWluZXJzIjpbeyJuYW1lIjoiaGFwcm94eSIsImltYWdlIjoiaGFyYm9yLmF0bW9zcGhlcmUuZGV2L2RvY2tlci5pby9wZXJjb25hL2hhcHJveHk6Mi44LjE0IiwiY29tbWFuZCI6WyIvb3B0L3BlcmNvbmEvaGFwcm94eS1lbnRyeXBvaW50LnNoIl0sImFyZ3MiOlsiaGFwcm94eSJdLCJwb3J0cyI6W3sibmFtZSI6Im15c3FsIiwiY29udGFpbmVyUG9ydCI6MzMwNn0seyJuYW1lIjoibXlzcWwtcmVwbGljYXMiLCJjb250YWluZXJQb3J0IjozMzA3fSx7Im5hbWUiOiJwcm94eS1wcm90b2NvbCIsImNvbnRhaW5lclBvcnQiOjMzMDl9LHsibmFtZSI6Im15c3FsLWFkbWluIiwiY29udGFpbmVyUG9ydCI6MzMwNjJ9LHsibmFtZSI6Im15c3FseCIsImNvbnRhaW5lclBvcnQiOjMzMDYwfSx7Im5hbWUiOiJzdGF0cyIsImNvbnRhaW5lclBvcnQiOjg0MDR9XSwiZW52RnJvbSI6W3sic2VjcmV0UmVmIjp7Im5hbWUiOiJwZXJjb25hLXh0cmFkYi1lbnYtdmFycy1oYXByb3h5Iiwib3B0aW9uYWwiOnRydWV9fV0sImVudiI6W3sibmFtZSI6IlBYQ19TRVJWSUNFIiwidmFsdWUiOiJwZXJjb25hLXh0cmFkYi1weGMifSx7Im5hbWUiOiJMSVZFTkVTU19DSEVDS19USU1FT1VUIiwidmFsdWUiOiI1In0seyJuYW1lIjoiUkVBRElORVNTX0NIRUNLX1RJTUVPVVQiLCJ2YWx1ZSI6IjEifV0sInJlc291cmNlcyI6e30sInZvbHVtZU1vdW50cyI6W3sibmFtZSI6ImhhcHJveHktY3VzdG9tIiwibW91bnRQYXRoIjoiL2V0Yy9oYXByb3h5LWN1c3RvbS8ifSx7Im5hbWUiOiJoYXByb3h5LWF1dG8iLCJtb3VudFBhdGgiOiIvZXRjL2hhcHJveHkvcHhjIn0seyJuYW1lIjoiYmluIiwibW91bnRQYXRoIjoiL29wdC9wZXJjb25hIn0seyJuYW1lIjoibXlzcWwtdXNlcnMtc2VjcmV0LWZpbGUiLCJtb3VudFBhdGgiOiIvZXRjL215c3FsL215c3FsLXVzZXJzLXNlY3JldCJ9LHsibmFtZSI6InBlcmNvbmEteHRyYWRiLWVudi12YXJzLWhhcHJveHkiLCJtb3VudFBhdGgiOiIvZXRjL215c3FsL2hhcHJveHktZW52LXNlY3JldCJ9XSwibGl2ZW5lc3NQcm9iZSI6eyJleGVjIjp7ImNvbW1hbmQiOlsiL29wdC9wZXJjb25hL2hhcHJveHlfbGl2ZW5lc3NfY2hlY2suc2giXX0sImluaXRpYWxEZWxheVNlY29uZHMiOjYwLCJ0aW1lb3V0U2Vjb25kcyI6NSwicGVyaW9kU2Vjb25kcyI6MzAsInN1Y2Nlc3NUaHJlc2hvbGQiOjEsImZhaWx1cmVUaHJlc2hvbGQiOjR9LCJyZWFkaW5lc3NQcm9iZSI6eyJleGVjIjp7ImNvbW1hbmQiOlsiL29wdC9wZXJjb25hL2hhcHJveHlfcmVhZGluZXNzX2NoZWNrLnNoIl19LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxNSwidGltZW91dFNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjUsInN1Y2Nlc3NUaHJlc2hvbGQiOjEsImZhaWx1cmVUaHJlc2hvbGQiOjN9LCJpbWFnZVB1bGxQb2xpY3kiOiJBbHdheXMifSx7Im5hbWUiOiJweGMtbW9uaXQiLCJpbWFnZSI6ImhhcmJvci5hdG1vc3BoZXJlLmRldi9kb2NrZXIuaW8vcGVyY29uYS9oYXByb3h5OjIuOC4xNCIsImNvbW1hbmQiOlsiL29wdC9wZXJjb25hL2hhcHJveHktZW50cnlwb2ludC5zaCJdLCJhcmdzIjpbIi9vcHQvcGVyY29uYS9wZWVyLWxpc3QiLCItb24tY2hhbmdlPS9vcHQvcGVyY29uYS9oYXByb3h5X2FkZF9weGNfbm9kZXMuc2giLCItc2VydmljZT0kKFBYQ19TRVJWSUNFKSJdLCJlbnZGcm9tIjpbeyJzZWNyZXRSZWYiOnsibmFtZSI6InBlcmNvbmEteHRyYWRiLWVudi12YXJzLWhhcHJveHkiLCJvcHRpb25hbCI6dHJ1ZX19XSwiZW52IjpbeyJuYW1lIjoiUFhDX1NFUlZJQ0UiLCJ2YWx1ZSI6InBlcmNvbmEteHRyYWRiLXB4YyJ9LHsibmFtZSI6IlJFUExJQ0FTX1NWQ19PTkxZX1JFQURFUlMiLCJ2YWx1ZSI6ImZhbHNlIn1dLCJyZXNvdXJjZXMiOnt9LCJ2b2x1bWVNb3VudHMiOlt7Im5hbWUiOiJoYXByb3h5LWN1c3RvbSIsIm1vdW50UGF0aCI6Ii9ldGMvaGFwcm94eS1jdXN0b20vIn0seyJuYW1lIjoiaGFwcm94eS1hdXRvIiwibW91bnRQYXRoIjoiL2V0Yy9oYXByb3h5L3B4YyJ9LHsibmFtZSI6Im15c3FsLXVzZXJzLXNlY3JldC1maWxlIiwibW91bnRQYXRoIjoiL2V0Yy9teXNxbC9teXNxbC11c2Vycy1zZWNyZXQifSx7Im5hbWUiOiJwZXJjb25hLXh0cmFkYi1lbnYtdmFycy1oYXByb3h5IiwibW91bnRQYXRoIjoiL2V0Yy9teXNxbC9oYXByb3h5LWVudi1zZWNyZXQifSx7Im5hbWUiOiJiaW4iLCJtb3VudFBhdGgiOiIvb3B0L3BlcmNvbmEifV0sImltYWdlUHVsbFBvbGljeSI6IkFsd2F5cyJ9XSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjMwLCJub2RlU2VsZWN0b3IiOnsib3BlbnN0YWNrLWNvbnRyb2wtcGxhbmUiOiJlbmFibGVkIn0sInNlcnZpY2VBY2NvdW50TmFtZSI6ImRlZmF1bHQiLCJhZmZpbml0eSI6eyJwb2RBbnRpQWZmaW5pdHkiOnsicmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiI6W3sibGFiZWxTZWxlY3RvciI6eyJtYXRjaExhYmVscyI6eyJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnQiOiJoYXByb3h5IiwiYXBwLmt1YmVybmV0ZXMuaW8vaW5zdGFuY2UiOiJwZXJjb25hLXh0cmFkYiIsImFwcC5rdWJlcm5ldGVzLmlvL21hbmFnZWQtYnkiOiJwZXJjb25hLXh0cmFkYi1jbHVzdGVyLW9wZXJhdG9yIiwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSI6InBlcmNvbmEteHRyYWRiLWNsdXN0ZXIiLCJhcHAua3ViZXJuZXRlcy5pby9wYXJ0LW9mIjoicGVyY29uYS14dHJhZGItY2x1c3RlciJ9fSwidG9wb2xvZ3lLZXkiOiJrdWJlcm5ldGVzLmlvL2hvc3RuYW1lIn1dfX19fSwic2VydmljZU5hbWUiOiJwZXJjb25hLXh0cmFkYi1oYXByb3h5IiwidXBkYXRlU3RyYXRlZ3kiOnsidHlwZSI6IlJvbGxpbmdVcGRhdGUiLCJyb2xsaW5nVXBkYXRlIjp7InBhcnRpdGlvbiI6MH19fQ==
  creationTimestamp: "2026-03-13T23:05:23Z"
  generation: 1
  name: percona-xtradb-haproxy
  namespace: openstack
  ownerReferences:
  - apiVersion: pxc.percona.com/v1
    controller: true
    kind: PerconaXtraDBCluster
    name: percona-xtradb
    uid: 28dc5ba2-8869-40b1-9343-da90960f0c78
  resourceVersion: "2013"
  uid: 68da5e95-1e64-481b-a6df-3a7cc203305b
spec:
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain
  podManagementPolicy: OrderedReady
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/component: haproxy
      app.kubernetes.io/instance: percona-xtradb
      app.kubernetes.io/managed-by: percona-xtradb-cluster-operator
      app.kubernetes.io/name: percona-xtradb-cluster
      app.kubernetes.io/part-of: percona-xtradb-cluster
  serviceName: percona-xtradb-haproxy
  template:
    metadata:
      annotations:
        kubectl.kubernetes.io/default-container: haproxy
        percona.com/configuration-hash: 96d48f90052f459e51a7d9c5ea2d2024
      creationTimestamp: null
      labels:
        app.kubernetes.io/component: haproxy
        app.kubernetes.io/instance: percona-xtradb
        app.kubernetes.io/managed-by: percona-xtradb-cluster-operator
        app.kubernetes.io/name: percona-xtradb-cluster
        app.kubernetes.io/part-of: percona-xtradb-cluster
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app.kubernetes.io/component: haproxy
                app.kubernetes.io/instance: percona-xtradb
                app.kubernetes.io/managed-by: percona-xtradb-cluster-operator
                app.kubernetes.io/name: percona-xtradb-cluster
                app.kubernetes.io/part-of: percona-xtradb-cluster
            topologyKey: kubernetes.io/hostname
      containers:
      - args:
        - haproxy
        command:
        - /opt/percona/haproxy-entrypoint.sh
        env:
        - name: PXC_SERVICE
          value: percona-xtradb-pxc
        - name: LIVENESS_CHECK_TIMEOUT
          value: "5"
        - name: READINESS_CHECK_TIMEOUT
          value: "1"
        envFrom:
        - secretRef:
            name: percona-xtradb-env-vars-haproxy
            optional: true
        image: harbor.atmosphere.dev/docker.io/percona/haproxy:2.8.14
        imagePullPolicy: Always
        livenessProbe:
          exec:
            command:
            - /opt/percona/haproxy_liveness_check.sh
          failureThreshold: 4
          initialDelaySeconds: 60
          periodSeconds: 30
          successThreshold: 1
          timeoutSeconds: 5
        name: haproxy
        ports:
        - containerPort: 3306
          name: mysql
          protocol: TCP
        - containerPort: 3307
          name: mysql-replicas
          protocol: TCP
        - containerPort: 3309
          name: proxy-protocol
          protocol: TCP
        - containerPort: 33062
          name: mysql-admin
          protocol: TCP
        - containerPort: 33060
          name: mysqlx
          protocol: TCP
        - containerPort: 8404
          name: stats
          protocol: TCP
        readinessProbe:
          exec:
            command:
            - /opt/percona/haproxy_readiness_check.sh
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 5
          successThreshold: 1
          timeoutSeconds: 1
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /etc/haproxy-custom/
          name: haproxy-custom
        - mountPath: /etc/haproxy/pxc
          name: haproxy-auto
        - mountPath: /opt/percona
          name: bin
        - mountPath: /etc/mysql/mysql-users-secret
          name: mysql-users-secret-file
        - mountPath: /etc/mysql/haproxy-env-secret
          name: percona-xtradb-env-vars-haproxy
      - args:
        - /opt/percona/peer-list
        - -on-change=/opt/percona/haproxy_add_pxc_nodes.sh
        - -service=$(PXC_SERVICE)
        command:
        - /opt/percona/haproxy-entrypoint.sh
        env:
        - name: PXC_SERVICE
          value: percona-xtradb-pxc
        - name: REPLICAS_SVC_ONLY_READERS
          value: "false"
        envFrom:
        - secretRef:
            name: percona-xtradb-env-vars-haproxy
            optional: true
        image: harbor.atmosphere.dev/docker.io/percona/haproxy:2.8.14
        imagePullPolicy: Always
        name: pxc-monit
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /etc/haproxy-custom/
          name: haproxy-custom
        - mountPath: /etc/haproxy/pxc
          name: haproxy-auto
        - mountPath: /etc/mysql/mysql-users-secret
          name: mysql-users-secret-file
        - mountPath: /etc/mysql/haproxy-env-secret
          name: percona-xtradb-env-vars-haproxy
        - mountPath: /opt/percona
          name: bin
      dnsPolicy: ClusterFirst
      initContainers:
      - command:
        - /pxc-init-entrypoint.sh
        image: harbor.atmosphere.dev/docker.io/percona/percona-xtradb-cluster-operator:1.17.0
        imagePullPolicy: Always
        name: pxc-init
        resources:
          limits:
            cpu: 50m
            memory: 50M
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: bin
      - command:
        - /haproxy-init-entrypoint.sh
        image: harbor.atmosphere.dev/docker.io/percona/percona-xtradb-cluster-operator:1.17.0
        imagePullPolicy: Always
        name: haproxy-init
        resources:
          limits:
            cpu: 50m
            memory: 50M
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /opt/percona
          name: bin
      nodeSelector:
        openstack-control-plane: enabled
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: default
      serviceAccountName: default
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 420
          name: percona-xtradb-haproxy
          optional: true
        name: haproxy-custom
      - emptyDir: {}
        name: haproxy-auto
      - name: mysql-users-secret-file
        secret:
          defaultMode: 420
          optional: false
          secretName: internal-percona-xtradb
      - name: percona-xtradb-env-vars-haproxy
        secret:
          defaultMode: 420
          optional: true
          secretName: percona-xtradb-env-vars-haproxy
      - emptyDir: {}
        name: bin
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
status:
  availableReplicas: 1
  collisionCount: 0
  currentReplicas: 1
  currentRevision: percona-xtradb-haproxy-bb6c9dfff
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updateRevision: percona-xtradb-haproxy-bb6c9dfff
  updatedReplicas: 1
