apiVersion: v1
kind: Template
labels:
  template: application-template-sample-pipeline
message: |-
  A Jenkins server must be instantiated in this project to manage
  the Pipeline BuildConfig created by this template.  You will be able to log in to
  it using your OpenShift user credentials.
metadata:
  annotations:
    openshift.io/display-name: Pipeline Build Example
    description: |-
      This example showcases the new Jenkins Pipeline integration in OpenShift,
      which performs continuous integration and deployment right on the platform.
      The template contains a Jenkinsfile - a definition of a multi-stage CI/CD process - that
      leverages the underlying OpenShift platform for dynamic and scalable
      builds. OpenShift integrates the status of your pipeline builds into the web
      console allowing you to see your entire application lifecycle in a single view.
    iconClass: icon-jenkins
    tags: instant-app,jenkins
  name: jenkins-pipeline-example
objects:
- apiVersion: v1
  kind: BuildConfig
  metadata:
    annotations:
      pipeline.alpha.openshift.io/uses: '[{"name": "${NAME}", "namespace": "", "kind": "DeploymentConfig"}]'
    labels:
      name: sample-pipeline
    name: sample-pipeline
  spec:
    strategy:
      jenkinsPipelineStrategy:
        jenkinsfile: |-
          try {
             timeout(time: 20, unit: 'MINUTES') {
                node('nodejs') {
                    stage('build') {
                      openshift.withCluster() {
                         openshift.withProject() {
                            def bld = openshift.startBuild('${NAME}')
                            bld.untilEach {
                              return it.object().status.phase == "Running"
                            }
                            bld.logs('-f')
                         }  
                      }
                    }
                    stage('deploy') {
                      openshift.withCluster() {
                        openshift.withProject() {
                          def dc = openshift.selector('dc', '${NAME}')
                          dc.rollout().latest()
                        }
                      }
                    }
                  }
             }
          } catch (err) {
             echo "in catch block"
             echo "Caught: ${err}"
             currentBuild.result = 'FAILURE'
             throw err
          }          
      type: JenkinsPipeline
    triggers:
    - github:
        secret: secret101
      type: GitHub
    - generic:
        secret: secret101
      type: Generic
- apiVersion: v1
  kind: Secret
  metadata:
    name: ${NAME}
  stringData:
    database-admin-password: ${DATABASE_ADMIN_PASSWORD}
    database-password: ${DATABASE_PASSWORD}
    database-user: ${DATABASE_USER}
- apiVersion: v1
  kind: Service
  metadata:
    annotations:
      description: Exposes and load balances the application pods
      service.alpha.openshift.io/dependencies: '[{"name": "${DATABASE_SERVICE_NAME}", "kind": "Service"}]'
    name: ${NAME}
  spec:
    ports:
      - name: web
        port: 8080
        targetPort: 8080
    selector:
      name: ${NAME}
- apiVersion: v1
  kind: Route
  metadata:
    name: ${NAME}
  spec:
    host: ${APPLICATION_DOMAIN}
    to:
      kind: Service
      name: ${NAME}
- apiVersion: v1
  kind: ImageStream
  metadata:
    annotations:
      description: Keeps track of changes in the application image
    name: ${NAME}
- apiVersion: v1
  kind: BuildConfig
  metadata:
    annotations:
      description: Defines how to build the application
      template.alpha.openshift.io/wait-for-ready: "true"
    name: ${NAME}
  spec:
    output:
      to:
        kind: ImageStreamTag
        name: ${NAME}:latest
    postCommit: {}
    source:
      contextDir: ${CONTEXT_DIR}
      git:
        ref: ${SOURCE_REPOSITORY_REF}
        uri: ${SOURCE_REPOSITORY_URL}
      type: Git
    strategy:
      sourceStrategy:
        env:
          - name: NPM_MIRROR
            value: ${NPM_MIRROR}
        from:
          kind: ImageStreamTag
          name: nodejs:${NODEJS_VERSION}
          namespace: ${NAMESPACE}
      type: Source
    triggers:
      - type: ImageChange
      - type: ConfigChange
      - github:
          secret: ${GITHUB_WEBHOOK_SECRET}
        type: GitHub
      - generic:
          secret: ${GENERIC_WEBHOOK_SECRET}
        type: Generic
- apiVersion: v1
  kind: DeploymentConfig
  metadata:
    annotations:
      description: Defines how to deploy the application server
      template.alpha.openshift.io/wait-for-ready: "true"
    labels:
      app.openshift.io/runtime: nodejs
    name: ${NAME}
  spec:
    replicas: 1
    selector:
      name: ${NAME}
    strategy:
      type: Recreate
    template:
      metadata:
        labels:
          app.openshift.io/runtime: nodejs
          name: ${NAME}
        name: ${NAME}
      spec:
        containers:
          - env:
              - name: DATABASE_SERVICE_NAME
                value: ${DATABASE_SERVICE_NAME}
              - name: POSTGRESQL_USER
                valueFrom:
                  secretKeyRef:
                    key: database-user
                    name: ${NAME}
              - name: POSTGRESQL_PASSWORD
                valueFrom:
                  secretKeyRef:
                    key: database-password
                    name: ${NAME}
              - name: POSTGRESQL_DATABASE
                value: ${DATABASE_NAME}
              - name: POSTGRESQL_ADMIN_PASSWORD
                valueFrom:
                  secretKeyRef:
                    key: database-admin-password
                    name: ${NAME}
            image: ' '
            livenessProbe:
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 30
              timeoutSeconds: 3
            name: nodejs-postgresql-example
            ports:
              - containerPort: 8080
            readinessProbe:
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 3
              timeoutSeconds: 3
            resources:
              limits:
                memory: ${MEMORY_LIMIT}
    triggers:
      - imageChangeParams:
          automatic: true
          containerNames:
            - nodejs-postgresql-example
          from:
            kind: ImageStreamTag
            name: ${NAME}:latest
        type: ImageChange
      - type: ConfigChange
- apiVersion: v1
  kind: Service
  metadata:
    annotations:
      description: Exposes the database server
    name: ${DATABASE_SERVICE_NAME}
  spec:
    ports:
      - name: postgresql
        port: 5432
        targetPort: 5432
    selector:
      name: ${DATABASE_SERVICE_NAME}
- apiVersion: v1
  kind: DeploymentConfig
  metadata:
    annotations:
      description: Defines how to deploy the database
      template.alpha.openshift.io/wait-for-ready: "true"
    name: ${DATABASE_SERVICE_NAME}
  spec:
    replicas: 1
    selector:
      name: ${DATABASE_SERVICE_NAME}
    strategy:
      type: Recreate
    template:
      metadata:
        labels:
          name: ${DATABASE_SERVICE_NAME}
        name: ${DATABASE_SERVICE_NAME}
      spec:
        containers:
          - env:
              - name: POSTGRESQL_USER
                valueFrom:
                  secretKeyRef:
                    key: database-user
                    name: ${NAME}
              - name: POSTGRESQL_PASSWORD
                valueFrom:
                  secretKeyRef:
                    key: database-password
                    name: ${NAME}
              - name: POSTGRESQL_DATABASE
                value: ${DATABASE_NAME}
              - name: POSTGRESQL_ADMIN_PASSWORD
                valueFrom:
                  secretKeyRef:
                    key: database-admin-password
                    name: ${NAME}
            image: ' '
            livenessProbe:
              initialDelaySeconds: 30
              tcpSocket:
                port: 5432
              timeoutSeconds: 1
            name: postgresql
            ports:
              - containerPort: 5432
            resources:
              limits:
                memory: ${MEMORY_POSTGRESQL_LIMIT}
            volumeMounts:
              - mountPath: /var/lib/postgresql/data
                name: ${DATABASE_SERVICE_NAME}-data
        volumes:
          - emptyDir:
              medium: ""
            name: ${DATABASE_SERVICE_NAME}-data
    triggers:
      - imageChangeParams:
          automatic: true
          containerNames:
            - postgresql
          from:
            kind: ImageStreamTag
            name: postgresql:${POSTGRESQL_VERSION}
            namespace: ${NAMESPACE}
        type: ImageChange
      - type: ConfigChange
parameters:
  - description: The name assigned to all of the frontend objects defined in this template.
    displayName: Name
    name: NAME
    required: true
    value: nodejs-postgresql-example
  - description: The OpenShift Namespace where the ImageStream resides.
    displayName: Namespace
    name: NAMESPACE
    required: true
    value: openshift
  - description: Version of NodeJS image to be used (10-ubi8, 12-ubi8, or latest).
    displayName: Version of NodeJS Image
    name: NODEJS_VERSION
    required: true
    value: 12-ubi8
  - description: Version of PostgreSQL image to be used (12-el8, or latest).
    displayName: Version of PostgreSQL Image
    name: POSTGRESQL_VERSION
    required: true
    value: 12-el8
  - description: Maximum amount of memory the Node.js container can use.
    displayName: Memory Limit
    name: MEMORY_LIMIT
    required: true
    value: 256Mi
  - description: Maximum amount of memory the PostgreSQL container can use.
    displayName: Memory Limit (PostgreSQL)
    name: MEMORY_POSTGRESQL_LIMIT
    required: true
    value: 256Mi
  - description: The URL of the repository with your application source code.
    displayName: Git Repository URL
    name: SOURCE_REPOSITORY_URL
    required: true
    value: https://github.com/nodeshift-starters/nodejs-rest-http-crud.git
  - description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch.
    displayName: Git Reference
    name: SOURCE_REPOSITORY_REF
  - description: Set this to the relative path to your project if it is not in the root of your repository.
    displayName: Context Directory
    name: CONTEXT_DIR
  - description: The exposed hostname that will route to the Node.js service, if left blank a value will be defaulted.
    displayName: Application Hostname
    name: APPLICATION_DOMAIN
  - description: Github trigger secret.  A difficult to guess string encoded as part of the webhook URL.  Not encrypted.
    displayName: GitHub Webhook Secret
    from: '[a-zA-Z0-9]{40}'
    generate: expression
    name: GITHUB_WEBHOOK_SECRET
  - description: A secret string used to configure the Generic webhook.
    displayName: Generic Webhook Secret
    from: '[a-zA-Z0-9]{40}'
    generate: expression
    name: GENERIC_WEBHOOK_SECRET
  - displayName: Database Service Name
    name: DATABASE_SERVICE_NAME
    required: true
    value: postgresql
  - description: Username for PostgreSQL user that will be used for accessing the database.
    displayName: PostgreSQL Username
    from: user[A-Z0-9]{3}
    generate: expression
    name: DATABASE_USER
  - description: Password for the PostgreSQL user.
    displayName: PostgreSQL Password
    from: '[a-zA-Z0-9]{16}'
    generate: expression
    name: DATABASE_PASSWORD
  - displayName: Database Name
    name: DATABASE_NAME
    required: true
    value: my_data
  - description: Password for the database admin user.
    displayName: Database Administrator Password
    from: '[a-zA-Z0-9]{16}'
    generate: expression
    name: DATABASE_ADMIN_PASSWORD
  - description: The custom NPM mirror URL
    displayName: Custom NPM Mirror URL
    name: NPM_MIRROR