---
path: /tmp/miq-template-out
data:
  apiVersion: v1
  kind: Template
  labels:
    template: manageiq
  metadata:
    name: manageiq
    annotations:
      description: "ManageIQ appliance with persistent storage"
      tags: "instant-app,manageiq,miq"
      iconClass: "icon-rails"
  objects:
  - apiVersion: v1
    kind: Secret
    metadata:
      name: "${NAME}-secrets"
    stringData:
      pg-password: "${DATABASE_PASSWORD}"
  - apiVersion: v1
    kind: Service
    metadata:
      annotations:
        description: "Exposes and load balances ManageIQ pods"
        service.alpha.openshift.io/dependencies: '[{"name":"${DATABASE_SERVICE_NAME}","namespace":"","kind":"Service"},{"name":"${MEMCACHED_SERVICE_NAME}","namespace":"","kind":"Service"}]'
      name: ${NAME}
    spec:
      clusterIP: None
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      - name: https
        port: 443
        protocol: TCP
        targetPort: 443
      selector:
        name: ${NAME}
  - apiVersion: v1
    kind: Route
    metadata:
      name: ${NAME}
    spec:
      host: ${APPLICATION_DOMAIN}
      port:
        targetPort: https
      tls:
        termination: passthrough
      to:
        kind: Service
        name: ${NAME}
  - apiVersion: v1
    kind: ImageStream
    metadata:
      name: miq-app
      annotations:
        description: "Keeps track of the ManageIQ image changes"
    spec:
      dockerImageRepository: "${APPLICATION_IMG_NAME}"
  - apiVersion: v1
    kind: ImageStream
    metadata:
      name: miq-postgresql
      annotations:
        description: "Keeps track of the PostgreSQL image changes"
    spec:
      dockerImageRepository: "${POSTGRESQL_IMG_NAME}"
  - apiVersion: v1
    kind: ImageStream
    metadata:
      name: miq-memcached
      annotations:
        description: "Keeps track of the Memcached image changes"
    spec:
      dockerImageRepository: "${MEMCACHED_IMG_NAME}"
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: "${NAME}-${DATABASE_SERVICE_NAME}"
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: ${DATABASE_VOLUME_CAPACITY}
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: "${NAME}-region"
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: ${APPLICATION_REGION_VOLUME_CAPACITY}
  - apiVersion: apps/v1beta1
    kind: "StatefulSet"
    metadata:
      name: ${NAME}
      annotations:
        description: "Defines how to deploy the ManageIQ appliance"
    spec:
      serviceName: "${NAME}"
      replicas: "${APPLICATION_REPLICA_COUNT}"
      template:
        metadata:
          labels:
            name: ${NAME}
          name: ${NAME}
        spec:
          containers:
          - name: manageiq
            image: "${APPLICATION_IMG_NAME}:${APPLICATION_IMG_TAG}"
            livenessProbe:
              tcpSocket:
                port: 443
              initialDelaySeconds: 480
              timeoutSeconds: 3
            readinessProbe:
              httpGet:
                path: /
                port: 443
                scheme: HTTPS
              initialDelaySeconds: 200
              timeoutSeconds: 3
            ports:
            - containerPort: 80
              protocol: TCP
            - containerPort: 443
              protocol: TCP
            securityContext:
              privileged: true
            volumeMounts:
                -
                  name: "${NAME}-server"
                  mountPath: "/persistent"
                -
                  name: "${NAME}-region"
                  mountPath: "/persistent-region"
            env:
              -
                name: "APPLICATION_INIT_DELAY"
                value: "${APPLICATION_INIT_DELAY}"
              -
                name: "DATABASE_SERVICE_NAME"
                value: "${DATABASE_SERVICE_NAME}"
              -
                name: "DATABASE_REGION"
                value: "${DATABASE_REGION}"
              -
                name: "MEMCACHED_SERVICE_NAME"
                value: "${MEMCACHED_SERVICE_NAME}"
              -
                name: "POSTGRESQL_USER"
                value: "${DATABASE_USER}"
              -
                name: "POSTGRESQL_PASSWORD"
                valueFrom:
                  secretKeyRef:
                    name: "${NAME}-secrets"
                    key: "pg-password"
              -
                name: "POSTGRESQL_DATABASE"
                value: "${DATABASE_NAME}"
              -
                name: "POSTGRESQL_MAX_CONNECTIONS"
                value: "${POSTGRESQL_MAX_CONNECTIONS}"
              -
                name: "POSTGRESQL_SHARED_BUFFERS"
                value: "${POSTGRESQL_SHARED_BUFFERS}"
            resources:
              requests:
                memory: "${APPLICATION_MEM_REQ}"
                cpu: "${APPLICATION_CPU_REQ}"
              limits:
                memory: "${APPLICATION_MEM_LIMIT}"
            lifecycle:
              preStop:
                exec:
                  command:
                    - /opt/manageiq/container-scripts/sync-pv-data
          volumes:
           -
             name: "${NAME}-region"
             persistentVolumeClaim:
               claimName: ${NAME}-region
      volumeClaimTemplates:
        - metadata:
            name: "${NAME}-server"
            annotations:
              # Uncomment this if using dynamic volume provisioning.
              # https://docs.openshift.org/latest/install_config/persistent_storage/dynamically_provisioning_pvs.html
              # volume.alpha.kubernetes.io/storage-class: anything
          spec:
            accessModes: [ ReadWriteOnce ]
            resources:
              requests:
                storage: "${APPLICATION_VOLUME_CAPACITY}"
  - apiVersion: v1
    kind: "Service"
    metadata:
      name: "${MEMCACHED_SERVICE_NAME}"
      annotations:
        description: "Exposes the memcached server"
    spec:
      ports:
        -
          name: "memcached"
          port: 11211
          targetPort: 11211
      selector:
        name: "${MEMCACHED_SERVICE_NAME}"
  - apiVersion: v1
    kind: "DeploymentConfig"
    metadata:
      name: "${MEMCACHED_SERVICE_NAME}"
      annotations:
        description: "Defines how to deploy memcached"
    spec:
      strategy:
        type: "Recreate"
      triggers:
        -
          type: "ImageChange"
          imageChangeParams:
            automatic: true
            containerNames:
              - "memcached"
            from:
              kind: "ImageStreamTag"
              name: "miq-memcached:${MEMCACHED_IMG_TAG}"
        -
          type: "ConfigChange"
      replicas: 1
      selector:
        name: "${MEMCACHED_SERVICE_NAME}"
      template:
        metadata:
          name: "${MEMCACHED_SERVICE_NAME}"
          labels:
            name: "${MEMCACHED_SERVICE_NAME}"
        spec:
          volumes: []
          containers:
            -
              name: "memcached"
              image: "${MEMCACHED_IMG_NAME}:${MEMCACHED_IMG_TAG}"
              ports:
                -
                  containerPort: 11211
              readinessProbe:
                timeoutSeconds: 1
                initialDelaySeconds: 5
                tcpSocket:
                  port: 11211
              livenessProbe:
                timeoutSeconds: 1
                initialDelaySeconds: 30
                tcpSocket:
                  port: 11211
              volumeMounts: []
              env:
                -
                  name: "MEMCACHED_MAX_MEMORY"
                  value: "${MEMCACHED_MAX_MEMORY}"
                -
                  name: "MEMCACHED_MAX_CONNECTIONS"
                  value: "${MEMCACHED_MAX_CONNECTIONS}"
                -
                  name: "MEMCACHED_SLAB_PAGE_SIZE"
                  value: "${MEMCACHED_SLAB_PAGE_SIZE}"
              resources:
                requests:
                  memory: "${MEMCACHED_MEM_REQ}"
                  cpu: "${MEMCACHED_CPU_REQ}"
                limits:
                  memory: "${MEMCACHED_MEM_LIMIT}"
  - apiVersion: v1
    kind: "Service"
    metadata:
      name: "${DATABASE_SERVICE_NAME}"
      annotations:
        description: "Exposes the database server"
    spec:
      ports:
        -
          name: "postgresql"
          port: 5432
          targetPort: 5432
      selector:
        name: "${DATABASE_SERVICE_NAME}"
  - apiVersion: v1
    kind: "DeploymentConfig"
    metadata:
      name: "${DATABASE_SERVICE_NAME}"
      annotations:
        description: "Defines how to deploy the database"
    spec:
      strategy:
        type: "Recreate"
      triggers:
        -
          type: "ImageChange"
          imageChangeParams:
            automatic: true
            containerNames:
              - "postgresql"
            from:
              kind: "ImageStreamTag"
              name: "miq-postgresql:${POSTGRESQL_IMG_TAG}"
        -
          type: "ConfigChange"
      replicas: 1
      selector:
        name: "${DATABASE_SERVICE_NAME}"
      template:
        metadata:
          name: "${DATABASE_SERVICE_NAME}"
          labels:
            name: "${DATABASE_SERVICE_NAME}"
        spec:
          volumes:
            -
              name: "miq-pgdb-volume"
              persistentVolumeClaim:
                claimName: "${NAME}-${DATABASE_SERVICE_NAME}"
          containers:
            -
              name: "postgresql"
              image: "${POSTGRESQL_IMG_NAME}:${POSTGRESQL_IMG_TAG}"
              ports:
                -
                  containerPort: 5432
              readinessProbe:
                timeoutSeconds: 1
                initialDelaySeconds: 15
                exec:
                  command:
                    - "/bin/sh"
                    - "-i"
                    - "-c"
                    - "psql -h 127.0.0.1 -U ${POSTGRESQL_USER} -q -d ${POSTGRESQL_DATABASE} -c 'SELECT 1'"
              livenessProbe:
                timeoutSeconds: 1
                initialDelaySeconds: 60
                tcpSocket:
                  port: 5432
              volumeMounts:
                -
                  name: "miq-pgdb-volume"
                  mountPath: "/var/lib/pgsql/data"
              env:
                -
                  name: "POSTGRESQL_USER"
                  value: "${DATABASE_USER}"
                -
                  name: "POSTGRESQL_PASSWORD"
                  valueFrom:
                    secretKeyRef:
                      name: "${NAME}-secrets"
                      key: "pg-password"
                -
                  name: "POSTGRESQL_DATABASE"
                  value: "${DATABASE_NAME}"
                -
                  name: "POSTGRESQL_MAX_CONNECTIONS"
                  value: "${POSTGRESQL_MAX_CONNECTIONS}"
                -
                  name: "POSTGRESQL_SHARED_BUFFERS"
                  value: "${POSTGRESQL_SHARED_BUFFERS}"
              resources:
                requests:
                  memory: "${POSTGRESQL_MEM_REQ}"
                  cpu: "${POSTGRESQL_CPU_REQ}"
                limits:
                  memory: "${POSTGRESQL_MEM_LIMIT}"

  parameters:
    -
      name: "NAME"
      displayName: Name
      required: true
      description: "The name assigned to all of the frontend objects defined in this template."
      value: manageiq
    -
      name: "DATABASE_SERVICE_NAME"
      displayName: "PostgreSQL Service Name"
      required: true
      description: "The name of the OpenShift Service exposed for the PostgreSQL container."
      value: "postgresql"
    -
      name: "DATABASE_USER"
      displayName: "PostgreSQL User"
      required: true
      description: "PostgreSQL user that will access the database."
      value: "root"
    -
      name: "DATABASE_PASSWORD"
      displayName: "PostgreSQL Password"
      required: true
      description: "Password for the PostgreSQL user."
      from: "[a-zA-Z0-9]{8}"
      generate: expression
    -
      name: "DATABASE_NAME"
      required: true
      displayName: "PostgreSQL Database Name"
      description: "Name of the PostgreSQL database accessed."
      value: "vmdb_production"
    -
      name: "DATABASE_REGION"
      required: true
      displayName: "Application Database Region"
      description: "Database region that will be used for application."
      value: "0"
    -
      name: "MEMCACHED_SERVICE_NAME"
      required: true
      displayName: "Memcached Service Name"
      description: "The name of the OpenShift Service exposed for the Memcached container."
      value: "memcached"
    -
      name: "MEMCACHED_MAX_MEMORY"
      displayName: "Memcached Max Memory"
      description: "Memcached maximum memory for memcached object storage in MB."
      value: "64"
    -
      name: "MEMCACHED_MAX_CONNECTIONS"
      displayName: "Memcached Max Connections"
      description: "Memcached maximum number of connections allowed."
      value: "1024"
    -
      name: "MEMCACHED_SLAB_PAGE_SIZE"
      displayName: "Memcached Slab Page Size"
      description: "Memcached size of each slab page."
      value: "1m"
    -
      name: "POSTGRESQL_MAX_CONNECTIONS"
      displayName: "PostgreSQL Max Connections"
      description: "PostgreSQL maximum number of database connections allowed."
      value: "100"
    -
      name: "POSTGRESQL_SHARED_BUFFERS"
      displayName: "PostgreSQL Shared Buffer Amount"
      description: "Amount of memory dedicated for PostgreSQL shared memory buffers."
      value: "256MB"
    -
      name: "APPLICATION_CPU_REQ"
      displayName: "Application Min CPU Requested"
      required: true
      description: "Minimum amount of CPU time the Application container will need (expressed in millicores)."
      value: "1000m"
    -
      name: "POSTGRESQL_CPU_REQ"
      displayName: "PostgreSQL Min CPU Requested"
      required: true
      description: "Minimum amount of CPU time the PostgreSQL container will need (expressed in millicores)."
      value: "500m"
    -
      name: "MEMCACHED_CPU_REQ"
      displayName: "Memcached Min CPU Requested"
      required: true
      description: "Minimum amount of CPU time the Memcached container will need (expressed in millicores)."
      value: "200m"
    -
      name: "APPLICATION_MEM_REQ"
      displayName: "Application Min RAM Requested"
      required: true
      description: "Minimum amount of memory the Application container will need."
      value: "6144Mi"
    -
      name: "POSTGRESQL_MEM_REQ"
      displayName: "PostgreSQL Min RAM Requested"
      required: true
      description: "Minimum amount of memory the PostgreSQL container will need."
      value: "1024Mi"
    -
      name: "MEMCACHED_MEM_REQ"
      displayName: "Memcached Min RAM Requested"
      required: true
      description: "Minimum amount of memory the Memcached container will need."
      value: "64Mi"
    -
      name: "APPLICATION_MEM_LIMIT"
      displayName: "Application Max RAM Limit"
      required: true
      description: "Maximum amount of memory the Application container can consume."
      value: "16384Mi"
    -
      name: "POSTGRESQL_MEM_LIMIT"
      displayName: "PostgreSQL Max RAM Limit"
      required: true
      description: "Maximum amount of memory the PostgreSQL container can consume."
      value: "8192Mi"
    -
      name: "MEMCACHED_MEM_LIMIT"
      displayName: "Memcached Max RAM Limit"
      required: true
      description: "Maximum amount of memory the Memcached container can consume."
      value: "256Mi"
    -
      name: "POSTGRESQL_IMG_NAME"
      displayName: "PostgreSQL Image Name"
      description: "This is the PostgreSQL image name requested to deploy."
      value: "docker.io/manageiq/manageiq-pods"
    -
      name: "POSTGRESQL_IMG_TAG"
      displayName: "PostgreSQL Image Tag"
      description: "This is the PostgreSQL image tag/version requested to deploy."
      value: "postgresql-latest-fine"
    -
      name: "MEMCACHED_IMG_NAME"
      displayName: "Memcached Image Name"
      description: "This is the Memcached image name requested to deploy."
      value: "docker.io/manageiq/manageiq-pods"
    -
      name: "MEMCACHED_IMG_TAG"
      displayName: "Memcached Image Tag"
      description: "This is the Memcached image tag/version requested to deploy."
      value: "memcached-latest-fine"
    -
      name: "APPLICATION_IMG_NAME"
      displayName: "Application Image Name"
      description: "This is the Application image name requested to deploy."
      value: "docker.io/manageiq/manageiq-pods"
    -
      name: "APPLICATION_IMG_TAG"
      displayName: "Application Image Tag"
      description: "This is the Application image tag/version requested to deploy."
      value: "app-latest-fine"
    -
      name: "APPLICATION_DOMAIN"
      displayName: "Application Hostname"
      description: "The exposed hostname that will route to the application service, if left blank a value will be defaulted."
      value: ""
    -
      name: "APPLICATION_REPLICA_COUNT"
      displayName: "Application Replica Count"
      description: "This is the number of Application replicas requested to deploy."
      value: "1"
    -
      name: "APPLICATION_INIT_DELAY"
      displayName: "Application Init Delay"
      required: true
      description: "Delay in seconds before we attempt to initialize the application."
      value: "15"
    -
      name: "APPLICATION_VOLUME_CAPACITY"
      displayName: "Application Volume Capacity"
      required: true
      description: "Volume space available for application data."
      value: "5Gi"
    -
      name: "APPLICATION_REGION_VOLUME_CAPACITY"
      displayName: "Application Region Volume Capacity"
      required: true
      description: "Volume space available for region application data."
      value: "5Gi"
    -
      name: "DATABASE_VOLUME_CAPACITY"
      displayName: "Database Volume Capacity"
      required: true
      description: "Volume space available for database."
      value: "15Gi"
