apiVersion: apps/v1
kind: Deployment
metadata:
  name: agent-monitor
  namespace: agent-monitor
  labels:
    app.kubernetes.io/name: agent-monitor
    app.kubernetes.io/instance: agent-monitor
    app.kubernetes.io/version: "1.0.0"
    app.kubernetes.io/component: server
    app.kubernetes.io/managed-by: kustomize
spec:
  replicas: 2
  revisionHistoryLimit: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: agent-monitor
      app.kubernetes.io/instance: agent-monitor
  template:
    metadata:
      labels:
        app.kubernetes.io/name: agent-monitor
        app.kubernetes.io/instance: agent-monitor
        app.kubernetes.io/version: "1.0.0"
        app.kubernetes.io/component: server
        app.kubernetes.io/managed-by: kustomize
      annotations:
        # Force rollout on configmap changes via kustomize hash
        checksum/config: "placeholder"
    spec:
      serviceAccountName: agent-monitor
      automountServiceAccountToken: false
      terminationGracePeriodSeconds: 30

      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        runAsGroup: 1000
        fsGroup: 1000
        fsGroupChangePolicy: OnRootMismatch
        seccompProfile:
          type: RuntimeDefault

      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app.kubernetes.io/name
                      operator: In
                      values:
                        - agent-monitor
                topologyKey: kubernetes.io/hostname

      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: kubernetes.io/hostname
          whenUnsatisfiable: ScheduleAnyway
          labelSelector:
            matchLabels:
              app.kubernetes.io/name: agent-monitor

      containers:
        - name: agent-monitor
          image: ${IMAGE_REGISTRY}/agent-monitor:${IMAGE_TAG}
          imagePullPolicy: IfNotPresent

          ports:
            - name: http
              containerPort: 4820
              protocol: TCP

          envFrom:
            - configMapRef:
                name: agent-monitor-config

          resources:
            requests:
              memory: "128Mi"
              cpu: "100m"
            limits:
              memory: "512Mi"
              cpu: "500m"

          startupProbe:
            httpGet:
              path: /api/health
              port: http
            failureThreshold: 30
            periodSeconds: 2

          readinessProbe:
            httpGet:
              path: /api/health
              port: http
            initialDelaySeconds: 5
            periodSeconds: 5
            timeoutSeconds: 3
            successThreshold: 1
            failureThreshold: 3

          livenessProbe:
            httpGet:
              path: /api/health
              port: http
            initialDelaySeconds: 15
            periodSeconds: 15
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3

          securityContext:
            runAsNonRoot: true
            runAsUser: 1000
            runAsGroup: 1000
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - ALL

          volumeMounts:
            - name: data
              mountPath: /app/data
            - name: tmp
              mountPath: /tmp

          lifecycle:
            preStop:
              exec:
                # Allow in-flight requests to drain before SIGTERM
                command: ["sh", "-c", "sleep 5"]

      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: agent-monitor-data
        - name: tmp
          emptyDir:
            sizeLimit: 100Mi
