---
# Prerequisite: create the S3 credentials secret first — see
# https://docs.huddo.com/boards/kubernetes/s3/ (the same generated values are
# set as global.env.S3_ACCESS_KEY / S3_SECRET_KEY in boards.yaml):
#
#   kubectl create secret generic huddo-s3-credentials -n boards \
#     --from-literal=access-key="$(openssl rand -hex 12)" \
#     --from-literal=secret-key="$(openssl rand -base64 32)"

# https://kubernetes.io/docs/concepts/storage/persistent-volumes/
apiVersion: v1
kind: PersistentVolume
metadata:
  name: huddo-s3
  labels:
    app: huddo-s3
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  # storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /pv-kudos/seaweedfs
    server: [STORAGE_SERVER_IP]

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: huddo-s3-claim
  namespace: boards
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      app: "huddo-s3"

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: huddo-s3
  namespace: boards
spec:
  revisionHistoryLimit: 1
  replicas: 1
  selector:
    matchLabels:
      app: huddo-s3
  template:
    metadata:
      labels:
        app: huddo-s3
    spec:
      initContainers:
        # Writes the SeaweedFS S3 identity (credentials) file from the env values below
        - name: config-gen
          image: busybox
          command:
            - sh
            - -c
            - |
              printf '{"identities":[{"name":"admin","credentials":[{"accessKey":"%s","secretKey":"%s"}],"actions":["Admin","Read","Write"]}]}\n' \
                "$ACCESS_KEY" "$SECRET_KEY" > /s3-config/s3-identity.json
          env:
            - name: ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: huddo-s3-credentials
                  key: access-key
            - name: SECRET_KEY
              valueFrom:
                secretKeyRef:
                  name: huddo-s3-credentials
                  key: secret-key
          volumeMounts:
            - name: s3-config
              mountPath: /s3-config
      containers:
        - name: seaweedfs
          image: chrislusf/seaweedfs:4.17
          imagePullPolicy: IfNotPresent
          command:
            - weed
            - server
            - -dir=/data
            - -s3
            - -s3.config=/s3-config/s3-identity.json
          ports:
            - name: s3
              containerPort: 8333
          resources:
            limits:
              memory: 512M
          readinessProbe:
            tcpSocket:
              port: s3
            initialDelaySeconds: 5
            periodSeconds: 5
          volumeMounts:
            - name: s3-config
              mountPath: /s3-config
            - name: data
              mountPath: /data
      volumes:
        - name: s3-config
          emptyDir: {}
        - name: data
          persistentVolumeClaim:
            claimName: huddo-s3-claim

---
kind: Service
apiVersion: v1
metadata:
  name: huddo-s3
  namespace: boards
spec:
  ports:
    - port: 8333
      targetPort: s3
      name: s3
  selector:
    app: huddo-s3

---
# One-off Job to create the default bucket once SeaweedFS is up
apiVersion: batch/v1
kind: Job
metadata:
  name: huddo-s3-bucket-setup
  namespace: boards
spec:
  backoffLimit: 3
  activeDeadlineSeconds: 300
  ttlSecondsAfterFinished: 3600
  template:
    spec:
      restartPolicy: OnFailure
      containers:
        - name: create-bucket
          image: amazon/aws-cli:2.34.29
          command:
            - sh
            - -c
            - |
              S3_URL="http://huddo-s3:8333"
              echo "Waiting for S3 to be ready at $S3_URL..."
              until aws s3 ls --endpoint-url "$S3_URL" --no-cli-pager 2>/dev/null; do
                sleep 3
              done
              echo "Creating bucket huddo-boards..."
              aws s3 mb "s3://huddo-boards" --endpoint-url "$S3_URL" --no-cli-pager || true
              echo "Done."
          env:
            - name: AWS_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  name: huddo-s3-credentials
                  key: access-key
            - name: AWS_SECRET_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: huddo-s3-credentials
                  key: secret-key
            - name: AWS_DEFAULT_REGION
              value: us-east-1
