apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: puppetdb
    app.kubernetes.io/instance: puppetserver
    app.kubernetes.io/name: puppetserver
    app.kubernetes.io/version: 8.8.0
  name: puppetdb
  namespace: puppet
spec:
  selector:
    matchLabels:
      app.kubernetes.io/component: puppetdb
      app.kubernetes.io/name: puppetserver
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      annotations:
        configmap.reloader.stakater.com/auto: "true"
      labels:
        app.kubernetes.io/component: puppetdb
        app.kubernetes.io/instance: puppetserver
        app.kubernetes.io/name: puppetserver
        app.kubernetes.io/version: 8.8.0
    spec:
      hostname: puppetdb
      imagePullSecrets: null
      containers:
        - name: puppetdb
          image: ghcr.io/openvoxproject/openvoxdb:8.9.0-main
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              cpu: 1
              memory: 1536Mi
            requests:
              cpu: 50m
              memory: 768Mi
          ports:
            - containerPort: 8080
              name: pdb-http
            - containerPort: 8081
              name: pdb-https
          envFrom:
            - configMapRef:
                name: puppetdb-config
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: OPENVOXDB_POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: password
                  name: postgres-credentials
            - name: OPENVOXDB_POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  key: username
                  name: postgres-credentials
            - name: OPENVOXDB_READ_POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: password
                  name: postgres-read-credentials
            - name: OPENVOXDB_READ_POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  key: username
                  name: postgres-read-credentials
          securityContext:
            allowPrivilegeEscalation: false
            # Root entrypoint drops to the puppetdb user via `runuser` (needs
            # SETUID/SETGID) after chowning SSL/data dirs (CHOWN). Cannot run
            # non-root: the image entrypoint requires a root start.
            capabilities:
              add:
                - CHOWN
                - DAC_OVERRIDE
                - FOWNER
                - SETGID
                - SETUID
              drop:
                - all
          volumeMounts:
            - mountPath: /opt/puppetlabs/server/data/puppetdb
              name: puppetdb-storage
            - mountPath: /opt/puppetlabs/server/data/puppetdb/stockpile
              name: puppetdb-storage
              subPathExpr: stockpile/$(POD_NAME)
            - mountPath: /etc/puppetlabs/puppetdb/conf.d/read-database.conf
              name: puppetdb-read-database-conf
              subPath: read-database.conf
      initContainers:
        - name: create-log-dir
          image: docker.io/busybox:1.37
          command:
            - sh
            - -c
          args:
            - mkdir -p /opt/puppetlabs/server/data/puppetdb/logs /opt/puppetlabs/server/data/puppetdb/stockpile
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          resources:
            limits:
              cpu: 20m
              memory: 32Mi
            requests:
              cpu: 20m
              memory: 32Mi
          securityContext:
            runAsUser: 999
            runAsGroup: 999
            runAsNonRoot: true
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - all
          volumeMounts:
            - mountPath: /opt/puppetlabs/server/data/puppetdb
              name: puppetdb-storage
            - mountPath: /opt/puppetlabs/server/data/puppetdb/stockpile
              name: puppetdb-storage
              subPathExpr: stockpile/$(POD_NAME)

        - name: pgchecker
          image: docker.io/busybox:1.37
          imagePullPolicy: IfNotPresent
          command:
            - sh
            - -c
          args:
            - |
              echo 'Waiting for PostgreSQL to become ready...'
              until printf "." && nc -z -w 2 puppet-postgres-pooler 5432; do
                  sleep 2;
              done;
              echo 'PostgreSQL OK ✓'
          resources:
            limits:
              cpu: 20m
              memory: 32Mi
            requests:
              cpu: 20m
              memory: 32Mi
          securityContext:
            runAsUser: 1000
            runAsGroup: 1000
            runAsNonRoot: true
            allowPrivilegeEscalation: false

        - name: wait-puppetserver
          image: curlimages/curl:8.11.1
          imagePullPolicy: IfNotPresent
          command:
            - sh
            - -c
          args:
            - |
              echo 'Waiting for puppetserver to become ready...'
              until printf "." && curl --silent --fail --insecure 'https://puppetca:8140/status/v1/simple' | grep -q '^running$'; do
                sleep 2;
              done;
              echo 'Puppetserver OK ✓'
          resources:
            limits:
              cpu: 20m
              memory: 32Mi
            requests:
              cpu: 20m
              memory: 32Mi
          securityContext:
            runAsUser: 1000
            runAsGroup: 1000
            runAsNonRoot: true
            allowPrivilegeEscalation: false
      securityContext:
        fsGroup: 999
        fsGroupChangePolicy: OnRootMismatch
        seccompProfile:
          type: RuntimeDefault
      volumes:
        - name: puppetdb-storage
          persistentVolumeClaim:
            claimName: puppetserver-puppetdb-claim
        - name: puppetdb-read-database-conf
          configMap:
            name: puppetdb-read-database-conf
