apiVersion: v1
kind: Template
labels:
  template: cloudforms
metadata:
  name: cloudforms
  annotations:
    description: "CloudForms appliance with persistent storage"
    tags: "instant-app,cloudforms,cfme"
    iconClass: "icon-rails"
objects:
- apiVersion: v1
  kind: Service
  metadata:
    annotations:
      description: "Exposes and load balances CloudForms pods"
      service.alpha.openshift.io/dependencies: '[{"name":"${DATABASE_SERVICE_NAME}","namespace":"","kind":"Service"},{"name":"${MEMCACHED_SERVICE_NAME}","namespace":"","kind":"Service"}]'
    name: ${NAME}
  spec:
    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: cfme-openshift-app
    annotations:
      description: "Keeps track of changes in the CloudForms app image"
  spec:
    dockerImageRepository: registry.access.redhat.com/cloudforms42/cfme-openshift-app
- apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: ${DATABASE_SERVICE_NAME}
  spec:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: ${DATABASE_VOLUME_CAPACITY}
- apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: ${NAME}
  spec:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: ${APPLICATION_VOLUME_CAPACITY}
- apiVersion: v1
  kind: "DeploymentConfig"
  metadata:
    name: ${NAME}
    annotations:
      description: "Defines how to deploy the CloudForms appliance"
  spec:
    template:
      metadata:
        labels:
          name: ${NAME}
        name: ${NAME}
      spec:
        volumes:
          -
            name: "cfme-app-volume"
            persistentVolumeClaim:
              claimName: ${NAME}
        containers:
        - image: cloudforms/cfme-openshift-app:${APPLICATION_IMG_TAG}
          imagePullPolicy: IfNotPresent
          name: cloudforms
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 480
            timeoutSeconds: 3
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 200
            timeoutSeconds: 3
          ports:
          - containerPort: 80
            protocol: TCP
          - containerPort: 443
            protocol: TCP
          securityContext:
            privileged: true
          volumeMounts:
              -
                name: "cfme-app-volume"
                mountPath: "/persistent"
          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"
              value: "${DATABASE_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: "${MEMORY_APPLICATION_MIN}"
          lifecycle:
            preStop:
              exec:
                command:
                  - /opt/rh/cfme-container-scripts/sync-pv-data
    replicas: 1
    selector:
      name: ${NAME}
    triggers:
      - type: "ConfigChange"
      - type: "ImageChange"
        imageChangeParams:
          automatic: true
          containerNames:
            - "cloudforms"
          from:
            kind: "ImageStreamTag"
            name: "cfme-openshift-app:${APPLICATION_IMG_TAG}"
    strategy:
      type: "Recreate"
      recreateParams:
        timeoutSeconds: 1200
- 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: ImageStream
  metadata:
    name: cfme-openshift-memcached
    annotations:
      description: "Keeps track of changes in the CloudForms memcached image"
  spec:
    dockerImageRepository: registry.access.redhat.com/cloudforms42/cfme-openshift-memcached
- 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: "cfme-openshift-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: "cloudforms/cfme-openshift-memcached:${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:
              limits:
                memory: "${MEMORY_MEMCACHED_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: ImageStream
  metadata:
    name: cfme-openshift-postgresql
    annotations:
      description: "Keeps track of changes in the CloudForms postgresql image"
  spec:
    dockerImageRepository: registry.access.redhat.com/cloudforms42/cfme-openshift-postgresql
- 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: "cfme-openshift-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: "cfme-pgdb-volume"
            persistentVolumeClaim:
              claimName: ${DATABASE_SERVICE_NAME}
        containers:
          -
            name: "postgresql"
            image: "cloudforms/cfme-openshift-postgresql:${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: "cfme-pgdb-volume"
                mountPath: "/var/lib/pgsql/data"
            env:
              -
                name: "POSTGRESQL_USER"
                value: "${DATABASE_USER}"
              -
                name: "POSTGRESQL_PASSWORD"
                value: "${DATABASE_PASSWORD}"
              -
                name: "POSTGRESQL_DATABASE"
                value: "${DATABASE_NAME}"
              -
                name: "POSTGRESQL_MAX_CONNECTIONS"
                value: "${POSTGRESQL_MAX_CONNECTIONS}"
              -
                name: "POSTGRESQL_SHARED_BUFFERS"
                value: "${POSTGRESQL_SHARED_BUFFERS}"
            resources:
              limits:
                memory: "${MEMORY_POSTGRESQL_LIMIT}"

parameters:
  -
    name: "NAME"
    displayName: Name
    required: true
    description: "The name assigned to all of the frontend objects defined in this template."
    value: cloudforms
  -
    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."
    value: "smartvm"
  -
    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: "64MB"
  -
    name: "MEMORY_APPLICATION_MIN"
    displayName: "Application Memory Minimum"
    required: true
    description: "Minimum amount of memory the Application container will need."
    value: "4096Mi"
  -
    name: "MEMORY_POSTGRESQL_LIMIT"
    displayName: "PostgreSQL Memory Limit"
    required: true
    description: "Maximum amount of memory the PostgreSQL container can use."
    value: "2048Mi"
  -
    name: "MEMORY_MEMCACHED_LIMIT"
    displayName: "Memcached Memory Limit"
    required: true
    description: "Maximum amount of memory the Memcached container can use."
    value: "256Mi"
  -
    name: "POSTGRESQL_IMG_TAG"
    displayName: "PostgreSQL Image Tag"
    description: "This is the PostgreSQL image tag/version requested to deploy."
    value: "latest"
  -
    name: "MEMCACHED_IMG_TAG"
    displayName: "Memcached Image Tag"
    description: "This is the Memcached image tag/version requested to deploy."
    value: "latest"
  -
    name: "APPLICATION_IMG_TAG"
    displayName: "Application Image Tag"
    description: "This is the Application image tag/version requested to deploy."
    value: "latest"
  -
    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_INIT_DELAY"
    displayName: "Application Init Delay"
    required: true
    description: "Delay in seconds before we attempt to initialize the application."
    value: "30"
  -
    name: "APPLICATION_VOLUME_CAPACITY"
    displayName: "Application Volume Capacity"
    required: true
    description: "Volume space available for application data."
    value: "1Gi"
  -
    name: "DATABASE_VOLUME_CAPACITY"
    displayName: "Database Volume Capacity"
    required: true
    description: "Volume space available for database."
    value: "1Gi"
