---
apiVersion: v1
kind: Template
labels:
  template: wekan-mongodb-persistent-template
message: |-
  The following service(s) have been created in your project: ${WEKAN_SERVICE_NAME}.
metadata:
  annotations:
    description: |-
      This template provides a Wekan instance backed by a standalone MongoDB
      server. The database is stored on persistent storage.
    iconClass: pficon-trend-up
    openshift.io/display-name: Wekan backed by MongoDB
    openshift.io/documentation-url: https://wekan.github.io/
    openshift.io/long-description: This template provides a Wekan platform
      with a MongoDB database created. The database is stored on persistent storage. The
      database name, username, and password are chosen via parameters when provisioning
      this service.
    tags: wekan,kanban,mongodb
  name: wekan-mongodb-persistent
objects:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: ${WEKAN_SERVICE_NAME}
    labels:
      app: wekan
      service: ${WEKAN_SERVICE_NAME}
- apiVersion: v1
  kind: Secret
  metadata:
    annotations:
      template.openshift.io/expose-admin_password: "{.data['database-admin-password']}"
      template.openshift.io/expose-database_name: "{.data['database-name']}"
      template.openshift.io/expose-password: "{.data['database-password']}"
      template.openshift.io/expose-username: "{.data['database-user']}"
    name: "${DATABASE_SERVICE_NAME}"
    labels:
      app: wekan
      service: ${WEKAN_SERVICE_NAME}
  stringData:
    database-admin-password: "${MONGODB_ADMIN_PASSWORD}"
    database-name: "${MONGODB_DATABASE}"
    database-password: "${MONGODB_PASSWORD}"
    database-user: "${MONGODB_USER}"
- apiVersion: v1
  kind: Service
  metadata:
    annotations:
      template.openshift.io/expose-uri: http://{.spec.clusterIP}:{.spec.ports[?(.name=="wekan")].port}
    name: "${WEKAN_SERVICE_NAME}"
    labels:
      app: wekan
      service: ${WEKAN_SERVICE_NAME}
  spec:
    ports:
    - name: wekan
      nodePort: 0
      port: 8080
      protocol: TCP
      targetPort: 8080
    selector:
      name: "${WEKAN_SERVICE_NAME}"
    sessionAffinity: ClientIP
    type: ClusterIP
- apiVersion: v1
  kind: Service
  metadata:
    annotations:
      template.openshift.io/expose-uri: mongodb://{.spec.clusterIP}:{.spec.ports[?(.name=="mongo")].port}
    name: "${DATABASE_SERVICE_NAME}"
    labels:
      app: wekan
      service: ${WEKAN_SERVICE_NAME}
  spec:
    ports:
    - name: mongo
      nodePort: 0
      port: 27017
      protocol: TCP
      targetPort: 27017
    selector:
      name: "${DATABASE_SERVICE_NAME}"
    sessionAffinity: None
    type: ClusterIP
- apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: "${DATABASE_SERVICE_NAME}"
    labels:
      app: wekan
      service: ${WEKAN_SERVICE_NAME}
  spec:
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: "${VOLUME_CAPACITY}"
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    labels:
      app: wekan
    name: ${WEKAN_SERVICE_NAME}
  spec:
    tags:
    - from:
        kind: DockerImage
        name: ${WEKAN_IMAGE}
      generation: 2
      name: latest
      referencePolicy:
        type: Source
- apiVersion: v1
  kind: DeploymentConfig
  metadata:
    name: ${WEKAN_SERVICE_NAME}
    labels:
      app: wekan
      service: ${WEKAN_SERVICE_NAME}
  spec:
    replicas: 1
    selector:
      app: wekan
      deploymentconfig: ${WEKAN_SERVICE_NAME}
    strategy:
      type: Recreate
    template:
      metadata:
        labels:
          app: wekan
          service: ${WEKAN_SERVICE_NAME}
          deploymentconfig: ${WEKAN_SERVICE_NAME}
          template: wekan
          name: ${WEKAN_SERVICE_NAME}
      spec:
        containers:
        - name: ${WEKAN_SERVICE_NAME}
          image: ${WEKAN_IMAGE}
          imagePullPolicy: Always
          env:
          - name: MONGO_URL
            value: mongodb://${MONGODB_USER}:${MONGODB_PASSWORD}@${DATABASE_SERVICE_NAME}:27017/${MONGODB_DATABASE}
          - name: ROOT_URL
            value: https://${FQDN}/
          - name: PORT
            value: "8080"
          ports:
          - containerPort: 8080
            name: ${WEKAN_SERVICE_NAME}
            protocol: TCP
          terminationMessagePath: /dev/termination-log
          livenessProbe:
            failureThreshold: 30
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 240
            timeoutSeconds: 3
          readinessProbe:
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 3
            timeoutSeconds: 3
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        serviceAccount: ${WEKAN_SERVICE_NAME}
        serviceAccountName: ${WEKAN_SERVICE_NAME}
        terminationGracePeriodSeconds: 30
    triggers:
    - type: ConfigChange
    - type: ImageChange
      imageChangeParams:
        automatic: true
        containerNames:
        - ${WEKAN_SERVICE_NAME}
        from:
          kind: ImageStreamTag
          name: ${WEKAN_SERVICE_NAME}:latest
        lastTriggeredImage: ""
- apiVersion: v1
  kind: DeploymentConfig
  metadata:
    annotations:
      template.alpha.openshift.io/wait-for-ready: 'true'
    name: "${DATABASE_SERVICE_NAME}"
    labels:
      app: wekan
      service: ${WEKAN_SERVICE_NAME}
  spec:
    replicas: 1
    selector:
      name: "${DATABASE_SERVICE_NAME}"
    strategy:
      type: Recreate
    template:
      metadata:
        labels:
          name: "${DATABASE_SERVICE_NAME}"
      spec:
        containers:
        - capabilities: {}
          env:
          - name: MONGODB_USER
            valueFrom:
              secretKeyRef:
                key: database-user
                name: "${DATABASE_SERVICE_NAME}"
          - name: MONGODB_PASSWORD
            valueFrom:
              secretKeyRef:
                key: database-password
                name: "${DATABASE_SERVICE_NAME}"
          - name: MONGODB_ADMIN_PASSWORD
            valueFrom:
              secretKeyRef:
                key: database-admin-password
                name: "${DATABASE_SERVICE_NAME}"
          - name: MONGODB_DATABASE
            valueFrom:
              secretKeyRef:
                key: database-name
                name: "${DATABASE_SERVICE_NAME}"
          image: " "
          imagePullPolicy: IfNotPresent
          livenessProbe:
            initialDelaySeconds: 30
            tcpSocket:
              port: 27017
            timeoutSeconds: 1
          name: mongodb
          ports:
          - containerPort: 27017
            protocol: TCP
          readinessProbe:
            exec:
              command:
              - "/bin/sh"
              - "-i"
              - "-c"
              - mongo 127.0.0.1:27017/$MONGODB_DATABASE -u $MONGODB_USER -p $MONGODB_PASSWORD
                --eval="quit()"
            initialDelaySeconds: 3
            timeoutSeconds: 1
          resources:
            limits:
              memory: "${MEMORY_LIMIT}"
          securityContext:
            capabilities: {}
            privileged: false
          terminationMessagePath: "/dev/termination-log"
          volumeMounts:
          - mountPath: "/var/lib/mongodb/data"
            name: "${DATABASE_SERVICE_NAME}-data"
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        volumes:
        - name: "${DATABASE_SERVICE_NAME}-data"
          persistentVolumeClaim:
            claimName: "${DATABASE_SERVICE_NAME}"
    triggers:
    - imageChangeParams:
        automatic: true
        containerNames:
        - mongodb
        from:
          kind: ImageStreamTag
          name: mongodb:${MONGODB_VERSION}
          namespace: "openshift"
        lastTriggeredImage: ''
      type: ImageChange
    - type: ConfigChange
- apiVersion: route.openshift.io/v1
  kind: Route
  metadata:
    labels:
      app: wekan
      service: wekan
      template: wekan-mongodb-persistent-template
    name: wekan
    namespace: ${NAMESPACE}
  spec:
    host: ${FQDN}
    port:
      targetPort: wekan
    tls:
      termination: edge
    to:
      kind: Service
      name: wekan
      weight: 100
    wildcardPolicy: None
parameters:
- description: The Fully Qualified Hostname (FQDN) of the application
  displayName: FQDN
  name: FQDN
  required: true
- description: Maximum amount of memory the container can use.
  displayName: Memory Limit
  name: MEMORY_LIMIT
  required: true
  value: 512Mi
- description: The OpenShift Namespace where the ImageStream resides.
  displayName: Namespace
  name: NAMESPACE
- description: The name of the OpenShift Service exposed for the database.
  displayName: Database Service Name
  name: DATABASE_SERVICE_NAME
  required: true
  value: wekan-mongodb
- description: Username for MongoDB user that will be used for accessing the database.
  displayName: MongoDB Connection Username
  from: user[A-Z0-9]{3}
  generate: expression
  name: MONGODB_USER
  required: true
- description: Password for the MongoDB connection user.
  displayName: MongoDB Connection Password
  from: "[a-zA-Z0-9]{16}"
  generate: expression
  name: MONGODB_PASSWORD
  required: true
- description: Name of the MongoDB database accessed.
  displayName: MongoDB Database Name
  name: MONGODB_DATABASE
  required: true
  value: wekan
- description: Password for the database admin user.
  displayName: MongoDB Admin Password
  from: "[a-zA-Z0-9]{16}"
  generate: expression
  name: MONGODB_ADMIN_PASSWORD
  required: true
- description: Volume space available for data, e.g. 512Mi, 2Gi.
  displayName: Volume Capacity
  name: VOLUME_CAPACITY
  required: true
  value: 1Gi
- description: Version of MongoDB image to be used (3.6, 4.0.10).
  displayName: Version of MongoDB Image
  name: MONGODB_VERSION
  required: true
  value: '3.6'
- name: WEKAN_SERVICE_NAME
  displayName: Wekan Service Name
  value: wekan
  required: true
- name: WEKAN_IMAGE
  displayName: Wekan Docker Image
  value: quay.io/wekan/wekan
  description: The metabase docker image to use
  required: true
