| @ -0,0 +1,89 @@ | |||
| # How to configure a CI/CD pipeline for eDivorce on OpenShift | |||
| - Create a project to house the Jenkins instance that will be responsible for promoting application images (via OpenShift ImageStreamTagS) across environment; the exact project name used was "edivorce". | |||
| - Create the BuildConfiguration within this project using the ```oc``` command and "edivorce-build-template.yaml" file in the templates directory: | |||
| ``` | |||
| oc process -f edivorce-build-template.yaml -v NAME=<product-name> -v SOURCE_REPOSITORY_URL=<github url> -v SOURCE_REPOSITORY_REF=<branch or ref> | oc create -f - | |||
| ``` | |||
| For example: | |||
| ``` | |||
| oc process -f edivorce-build-template.yaml -v NAME=edivorce-django -v SOURCE_REPOSITORY_URL=https://github.com/bcgov/eDivorce.git -v SOURCE_REPOSITORY_REF=master | oc create -f - | |||
| ``` | |||
| - Deploy a Jenkins instance with persistent storage into the edivorce project using the web gui | |||
| - Install the Promoted Builds Jenkins plugin | |||
| - Configure a job that has an OpenShift ImageStream Watcher as its SCM source and promotion states for each environment | |||
| - In each promotion configuration, tag the target build's image to the appropriate promotion level; this was done using a shell command because the OpenShift plugins do not appear to handle parameter subsitution inside promotions properly. | |||
| - Create an OpenShift project for each "environment" (e.g. DEV, TEST, PROD); Exact names used were jag-csb-edivorce-dev, jag-csb-edivorce-test, jag-csb-edivorce-prod | |||
| - Configure the access controls to allow the Jenkins instance to tag imagestreams in the environment projects, and to allow the environment projects to pull images from the eDivorce project: | |||
| ``` | |||
| oc policy add-role-to-user system:image-puller system:serviceaccount:jag-csb-edivorce-<env-name>:default -n jag-csb-edivorce-tools | |||
| oc policy add-role-to-user edit system:serviceaccount: jag-csb-edivorce-tools:default -n jag-csb-edivorce-<env-name> | |||
| ``` | |||
| - Use the YAML files in this directory and `oc` tool to create the necessary resources within each project: | |||
| ``` | |||
| oc process -f edivorce-environment-template.yaml -v ENVIRONMENT_TYPE=<env-name> | oc create -f - | |||
| ``` | |||
| For example: | |||
| ``` | |||
| oc process -f edivorce-environment-template.yaml -v ENVIRONMENT_TYPE=dev,VOLUME_CAPACITY=1Gi | oc create -f - | |||
| ``` | |||
| # eDivorce Environments | |||
| There are several environments set up for different purposes within OpenShift. They are available at the URLs below. | |||
| |Environment| URL |Notes| | |||
| |-----------|-----|-----| | |||
| |DEV|edivorce-dev.pathfinder.gov.bc.ca| | | |||
| |TEST|edivorce-test.pathfinder.gov.bc.ca| | | |||
| |PROD|edivorce-prod.pathfinder.gov.bc.ca| | | |||
| # How to access Jenkins for eDivorce | |||
| - Login to https://edivorce-jenkins-edivorce.pathfinder.gov.bc.ca with the username/password that was provided to you. | |||
| # How to access OpenShift for eDivorce | |||
| ## Web UI | |||
| - Login to https://console.pathfinder.gov.bc.ca:8443; you'll be prompted for GitHub authorization. | |||
| ## Command-line (```oc```) tools | |||
| - Download OpenShift [command line tools](https://github.com/openshift/origin/releases/download/v1.2.1/openshift-origin-client-tools-v1.2.1-5e723f6-mac.zip), unzip, and add ```oc``` to your PATH. | |||
| - Copy command line login string from https://console.pathfinder.gov.bc.ca:8443/console/command-line. It will look like ```oc login https://console.pathfinder.gov.bc.ca:8443 --token=xtyz123xtyz123xtyz123xtyz123``` | |||
| - Paste the login string into a terminal session. You are no authenticated against OpenShift and will be able to execute ```oc``` commands. ```oc -h``` provides a summary of available commands. | |||
| # Project contents | |||
| - The "edivorce-tools" project contains the Jenkins instance and the other jsg-csb-edivorce-* projects contain different "environments". The names are self-explanatory. | |||
| # Data management operations | |||
| todo: add instructions on how to 'oc rsh' into the django pod to manage the postgresql pod | |||
| # Background reading/Resources | |||
| [Free OpenShift book](https://www.openshift.com/promotions/for-developers.html) from RedHat – good overview | |||
| [Red Hat Container Development Kit](http://developers.redhat.com/products/cdk/overview/) | |||
| OpenShift CI/CD pieline Demos: | |||
| - https://www.youtube.com/watch?v=65BnTLcDAJI | |||
| - https://www.youtube.com/watch?v=wSFyg6Etwx8 | |||
| @ -0,0 +1,19 @@ | |||
| #!/usr/bin/env bash | |||
| echo -n "Enter the name of the environment (default=dev): " | |||
| read ENVIRONMENT | |||
| ENVIRONMENT=${ENVIRONMENT:-dev} | |||
| OS_PROJECT_NAME=jag-csb-edivorce-$ENVIRONMENT | |||
| echo "Changing project to $OS_PROJECT_NAME..." | |||
| oc project $OS_PROJECT_NAME | |||
| echo -n "Enter the path to the environment creation template (default=templates/edivorce-environment-template.yaml): " | |||
| read CREATE_SCRIPT | |||
| CREATE_SCRIPT=${CREATE_SCRIPT:-templates/edivorce-environment-template.yaml} | |||
| oc create -f $CREATE_SCRIPT | |||
| /bin/bash project_label.sh $OS_PROJECT_NAME team=jag product=edivorce environment=$ENVIRONMENT | |||
| @ -0,0 +1,28 @@ | |||
| #!/usr/bin/env bash | |||
| # this is hard-coded to only destroy the dev environment | |||
| # you can chage it to 'test' or 'prod' if you are sure you want to destroy EVERYTHING, include the database | |||
| oc project jag-csb-edivorce-dev | |||
| # delete all imagestreams | |||
| oc delete is --all | |||
| # delete services by name (we don't want to accidentally delete the gluster service!) | |||
| oc delete svc weasyprint | |||
| oc delete svc postgresql | |||
| oc delete svc edivorce-django | |||
| # delete routes | |||
| oc delete route --all | |||
| # delete persistent volume claims | |||
| oc delete pvc --all | |||
| # delete replication controllers | |||
| oc delete rc --all | |||
| # delete deployment configurations | |||
| oc delete dc --all | |||
| # delete pods | |||
| oc delete po --all | |||
| @ -0,0 +1,14 @@ | |||
| #!/usr/bin/env bash | |||
| # todo: this is an example from https://github.com/bcgov/esm-server/tree/develop/openshift | |||
| # todo: it needs to be completely reconfigured for eDivorce!!!! | |||
| #project_label.sh $OS_PROJECT_NAME category=$CATEGORY team=$TEAM product=$PRODUCT environment=$ENVIRONMENT | |||
| PROJECT_NAME=$1 | |||
| echo "Project name is $1" | |||
| for i in "${@:2}"; do | |||
| oc label --overwrite namespace/$PROJECT_NAME $i | |||
| done | |||
| @ -1,492 +0,0 @@ | |||
| { | |||
| "kind": "Template", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "django-psql-persistent", | |||
| "annotations": { | |||
| "description": "An example Django application with a PostgreSQL database", | |||
| "tags": "quickstart,python,django,postgresql", | |||
| "iconClass": "icon-python" | |||
| } | |||
| }, | |||
| "labels": { | |||
| "template": "django-psql-persistent" | |||
| }, | |||
| "objects": [ | |||
| { | |||
| "kind": "Service", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Exposes and load balances the application pods" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "ports": [ | |||
| { | |||
| "name": "web", | |||
| "port": 8080, | |||
| "targetPort": 8080 | |||
| } | |||
| ], | |||
| "selector": { | |||
| "name": "${NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "Route", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}" | |||
| }, | |||
| "spec": { | |||
| "host": "${APPLICATION_DOMAIN}", | |||
| "to": { | |||
| "kind": "Service", | |||
| "name": "${NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "ImageStream", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Keeps track of changes in the application image" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "BuildConfig", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Defines how to build the application" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "source": { | |||
| "type": "Git", | |||
| "git": { | |||
| "uri": "${SOURCE_REPOSITORY_URL}", | |||
| "ref": "${SOURCE_REPOSITORY_REF}" | |||
| }, | |||
| "contextDir": "${CONTEXT_DIR}" | |||
| }, | |||
| "strategy": { | |||
| "type": "Source", | |||
| "sourceStrategy": { | |||
| "from": { | |||
| "kind": "ImageStreamTag", | |||
| "namespace": "${NAMESPACE}", | |||
| "name": "python:3.5" | |||
| }, | |||
| "env": [ | |||
| { | |||
| "name": "PIP_INDEX_URL", | |||
| "value": "${PIP_INDEX_URL}" | |||
| } | |||
| ] | |||
| } | |||
| }, | |||
| "output": { | |||
| "to": { | |||
| "kind": "ImageStreamTag", | |||
| "name": "${NAME}:latest" | |||
| } | |||
| }, | |||
| "triggers": [ | |||
| { | |||
| "type": "ImageChange" | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| }, | |||
| { | |||
| "type": "GitHub", | |||
| "github": { | |||
| "secret": "${GITHUB_WEBHOOK_SECRET}" | |||
| } | |||
| } | |||
| ], | |||
| "postCommit": { | |||
| "script": "./manage.py test" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "DeploymentConfig", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Defines how to deploy the application server" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "strategy": { | |||
| "type": "Rolling" | |||
| }, | |||
| "triggers": [ | |||
| { | |||
| "type": "ImageChange", | |||
| "imageChangeParams": { | |||
| "automatic": true, | |||
| "containerNames": [ | |||
| "django-psql-persistent" | |||
| ], | |||
| "from": { | |||
| "kind": "ImageStreamTag", | |||
| "name": "${NAME}:latest" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| } | |||
| ], | |||
| "replicas": 1, | |||
| "selector": { | |||
| "name": "${NAME}" | |||
| }, | |||
| "template": { | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "labels": { | |||
| "name": "${NAME}" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "containers": [ | |||
| { | |||
| "name": "django-psql-persistent", | |||
| "image": " ", | |||
| "ports": [ | |||
| { | |||
| "containerPort": 8080 | |||
| } | |||
| ], | |||
| "readinessProbe": { | |||
| "timeoutSeconds": 3, | |||
| "initialDelaySeconds": 3, | |||
| "httpGet": { | |||
| "path": "/health", | |||
| "port": 8080 | |||
| } | |||
| }, | |||
| "livenessProbe": { | |||
| "timeoutSeconds": 3, | |||
| "initialDelaySeconds": 30, | |||
| "httpGet": { | |||
| "path": "/health", | |||
| "port": 8080 | |||
| } | |||
| }, | |||
| "env": [ | |||
| { | |||
| "name": "DATABASE_SERVICE_NAME", | |||
| "value": "${DATABASE_SERVICE_NAME}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_ENGINE", | |||
| "value": "${DATABASE_ENGINE}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_NAME", | |||
| "value": "${DATABASE_NAME}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_USER", | |||
| "value": "${DATABASE_USER}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_PASSWORD", | |||
| "value": "${DATABASE_PASSWORD}" | |||
| }, | |||
| { | |||
| "name": "APP_CONFIG", | |||
| "value": "${APP_CONFIG}" | |||
| }, | |||
| { | |||
| "name": "DJANGO_SECRET_KEY", | |||
| "value": "${DJANGO_SECRET_KEY}" | |||
| } | |||
| ], | |||
| "resources": { | |||
| "limits": { | |||
| "memory": "${MEMORY_LIMIT}" | |||
| } | |||
| } | |||
| } | |||
| ] | |||
| } | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "PersistentVolumeClaim", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${DATABASE_SERVICE_NAME}" | |||
| }, | |||
| "spec": { | |||
| "accessModes": [ | |||
| "ReadWriteOnce" | |||
| ], | |||
| "resources": { | |||
| "requests": { | |||
| "storage": "${VOLUME_CAPACITY}" | |||
| } | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "Service", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${DATABASE_SERVICE_NAME}", | |||
| "annotations": { | |||
| "description": "Exposes the database server" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "ports": [ | |||
| { | |||
| "name": "postgresql", | |||
| "port": 5432, | |||
| "targetPort": 5432 | |||
| } | |||
| ], | |||
| "selector": { | |||
| "name": "${DATABASE_SERVICE_NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "DeploymentConfig", | |||
| "apiVersion": "v1", | |||
| "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", | |||
| "namespace": "${NAMESPACE}", | |||
| "name": "postgresql:9.5" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| } | |||
| ], | |||
| "replicas": 1, | |||
| "selector": { | |||
| "name": "${DATABASE_SERVICE_NAME}" | |||
| }, | |||
| "template": { | |||
| "metadata": { | |||
| "name": "${DATABASE_SERVICE_NAME}", | |||
| "labels": { | |||
| "name": "${DATABASE_SERVICE_NAME}" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "volumes": [ | |||
| { | |||
| "name": "${DATABASE_SERVICE_NAME}-data", | |||
| "persistentVolumeClaim": { | |||
| "claimName": "${DATABASE_SERVICE_NAME}" | |||
| } | |||
| } | |||
| ], | |||
| "containers": [ | |||
| { | |||
| "name": "postgresql", | |||
| "image": " ", | |||
| "ports": [ | |||
| { | |||
| "containerPort": 5432 | |||
| } | |||
| ], | |||
| "env": [ | |||
| { | |||
| "name": "POSTGRESQL_USER", | |||
| "value": "${DATABASE_USER}" | |||
| }, | |||
| { | |||
| "name": "POSTGRESQL_PASSWORD", | |||
| "value": "${DATABASE_PASSWORD}" | |||
| }, | |||
| { | |||
| "name": "POSTGRESQL_DATABASE", | |||
| "value": "${DATABASE_NAME}" | |||
| } | |||
| ], | |||
| "volumeMounts": [ | |||
| { | |||
| "name": "${DATABASE_SERVICE_NAME}-data", | |||
| "mountPath": "/var/lib/pgsql/data" | |||
| } | |||
| ], | |||
| "readinessProbe": { | |||
| "timeoutSeconds": 1, | |||
| "initialDelaySeconds": 5, | |||
| "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": 30, | |||
| "tcpSocket": { | |||
| "port": 5432 | |||
| } | |||
| }, | |||
| "resources": { | |||
| "limits": { | |||
| "memory": "${MEMORY_POSTGRESQL_LIMIT}" | |||
| } | |||
| } | |||
| } | |||
| ] | |||
| } | |||
| } | |||
| } | |||
| } | |||
| ], | |||
| "parameters": [ | |||
| { | |||
| "name": "NAME", | |||
| "displayName": "Name", | |||
| "description": "The name assigned to all of the frontend objects defined in this template.", | |||
| "required": true, | |||
| "value": "django-psql-persistent" | |||
| }, | |||
| { | |||
| "name": "NAMESPACE", | |||
| "displayName": "Namespace", | |||
| "required": true, | |||
| "description": "The OpenShift Namespace where the ImageStream resides.", | |||
| "value": "openshift" | |||
| }, | |||
| { | |||
| "name": "MEMORY_LIMIT", | |||
| "displayName": "Memory Limit", | |||
| "required": true, | |||
| "description": "Maximum amount of memory the Django container can use.", | |||
| "value": "512Mi" | |||
| }, | |||
| { | |||
| "name": "MEMORY_POSTGRESQL_LIMIT", | |||
| "displayName": "Memory Limit (PostgreSQL)", | |||
| "required": true, | |||
| "description": "Maximum amount of memory the PostgreSQL container can use.", | |||
| "value": "512Mi" | |||
| }, | |||
| { | |||
| "name": "VOLUME_CAPACITY", | |||
| "displayName": "Volume Capacity", | |||
| "description": "Volume space available for data, e.g. 512Mi, 2Gi", | |||
| "value": "1Gi", | |||
| "required": true | |||
| }, | |||
| { | |||
| "name": "SOURCE_REPOSITORY_URL", | |||
| "displayName": "Git Repository URL", | |||
| "required": true, | |||
| "description": "The URL of the repository with your application source code.", | |||
| "value": "https://github.com/openshift/django-ex.git" | |||
| }, | |||
| { | |||
| "name": "SOURCE_REPOSITORY_REF", | |||
| "displayName": "Git Reference", | |||
| "description": "Set this to a branch name, tag or other ref of your repository if you are not using the default branch." | |||
| }, | |||
| { | |||
| "name": "CONTEXT_DIR", | |||
| "displayName": "Context Directory", | |||
| "description": "Set this to the relative path to your project if it is not in the root of your repository." | |||
| }, | |||
| { | |||
| "name": "APPLICATION_DOMAIN", | |||
| "displayName": "Application Hostname", | |||
| "description": "The exposed hostname that will route to the Django service, if left blank a value will be defaulted.", | |||
| "value": "" | |||
| }, | |||
| { | |||
| "name": "GITHUB_WEBHOOK_SECRET", | |||
| "displayName": "GitHub Webhook Secret", | |||
| "description": "A secret string used to configure the GitHub webhook.", | |||
| "generate": "expression", | |||
| "from": "[a-zA-Z0-9]{40}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_SERVICE_NAME", | |||
| "displayName": "Database Service Name", | |||
| "required": true, | |||
| "value": "postgresql" | |||
| }, | |||
| { | |||
| "name": "DATABASE_ENGINE", | |||
| "displayName": "Database Engine", | |||
| "required": true, | |||
| "description": "Database engine: postgresql, mysql or sqlite (default).", | |||
| "value": "postgresql" | |||
| }, | |||
| { | |||
| "name": "DATABASE_NAME", | |||
| "displayName": "Database Name", | |||
| "required": true, | |||
| "value": "default" | |||
| }, | |||
| { | |||
| "name": "DATABASE_USER", | |||
| "displayName": "Database Username", | |||
| "required": true, | |||
| "value": "django" | |||
| }, | |||
| { | |||
| "name": "DATABASE_PASSWORD", | |||
| "displayName": "Database User Password", | |||
| "generate": "expression", | |||
| "from": "[a-zA-Z0-9]{16}" | |||
| }, | |||
| { | |||
| "name": "APP_CONFIG", | |||
| "displayName": "Application Configuration File Path", | |||
| "description": "Relative path to Gunicorn configuration file (optional)." | |||
| }, | |||
| { | |||
| "name": "DJANGO_SECRET_KEY", | |||
| "displayName": "Django Secret Key", | |||
| "description": "Set this to a long random string.", | |||
| "generate": "expression", | |||
| "from": "[\\w]{50}" | |||
| }, | |||
| { | |||
| "name": "PIP_INDEX_URL", | |||
| "displayName": "Custom PyPi Index URL", | |||
| "description": "The custom PyPi index URL", | |||
| "value": "" | |||
| } | |||
| ] | |||
| } | |||
| @ -1,466 +0,0 @@ | |||
| { | |||
| "kind": "Template", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "django-psql-example", | |||
| "annotations": { | |||
| "description": "An example Django application with a PostgreSQL database", | |||
| "tags": "quickstart,python,django,postgresql", | |||
| "iconClass": "icon-python" | |||
| } | |||
| }, | |||
| "labels": { | |||
| "template": "django-psql-example" | |||
| }, | |||
| "objects": [ | |||
| { | |||
| "kind": "Service", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Exposes and load balances the application pods" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "ports": [ | |||
| { | |||
| "name": "web", | |||
| "port": 8080, | |||
| "targetPort": 8080 | |||
| } | |||
| ], | |||
| "selector": { | |||
| "name": "${NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "Route", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}" | |||
| }, | |||
| "spec": { | |||
| "host": "${APPLICATION_DOMAIN}", | |||
| "to": { | |||
| "kind": "Service", | |||
| "name": "${NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "ImageStream", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Keeps track of changes in the application image" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "BuildConfig", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Defines how to build the application" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "source": { | |||
| "type": "Git", | |||
| "git": { | |||
| "uri": "${SOURCE_REPOSITORY_URL}", | |||
| "ref": "${SOURCE_REPOSITORY_REF}" | |||
| }, | |||
| "contextDir": "${CONTEXT_DIR}" | |||
| }, | |||
| "strategy": { | |||
| "type": "Source", | |||
| "sourceStrategy": { | |||
| "from": { | |||
| "kind": "ImageStreamTag", | |||
| "namespace": "${NAMESPACE}", | |||
| "name": "python:3.5" | |||
| }, | |||
| "env": [ | |||
| { | |||
| "name": "PIP_INDEX_URL", | |||
| "value": "${PIP_INDEX_URL}" | |||
| } | |||
| ] | |||
| } | |||
| }, | |||
| "output": { | |||
| "to": { | |||
| "kind": "ImageStreamTag", | |||
| "name": "${NAME}:latest" | |||
| } | |||
| }, | |||
| "triggers": [ | |||
| { | |||
| "type": "ImageChange" | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| }, | |||
| { | |||
| "type": "GitHub", | |||
| "github": { | |||
| "secret": "${GITHUB_WEBHOOK_SECRET}" | |||
| } | |||
| } | |||
| ], | |||
| "postCommit": { | |||
| "script": "./manage.py test" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "DeploymentConfig", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Defines how to deploy the application server" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "strategy": { | |||
| "type": "Rolling" | |||
| }, | |||
| "triggers": [ | |||
| { | |||
| "type": "ImageChange", | |||
| "imageChangeParams": { | |||
| "automatic": true, | |||
| "containerNames": [ | |||
| "django-psql-example" | |||
| ], | |||
| "from": { | |||
| "kind": "ImageStreamTag", | |||
| "name": "${NAME}:latest" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| } | |||
| ], | |||
| "replicas": 1, | |||
| "selector": { | |||
| "name": "${NAME}" | |||
| }, | |||
| "template": { | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "labels": { | |||
| "name": "${NAME}" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "containers": [ | |||
| { | |||
| "name": "django-psql-example", | |||
| "image": " ", | |||
| "ports": [ | |||
| { | |||
| "containerPort": 8080 | |||
| } | |||
| ], | |||
| "readinessProbe": { | |||
| "timeoutSeconds": 3, | |||
| "initialDelaySeconds": 3, | |||
| "httpGet": { | |||
| "path": "/health", | |||
| "port": 8080 | |||
| } | |||
| }, | |||
| "livenessProbe": { | |||
| "timeoutSeconds": 3, | |||
| "initialDelaySeconds": 30, | |||
| "httpGet": { | |||
| "path": "/health", | |||
| "port": 8080 | |||
| } | |||
| }, | |||
| "env": [ | |||
| { | |||
| "name": "DATABASE_SERVICE_NAME", | |||
| "value": "${DATABASE_SERVICE_NAME}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_ENGINE", | |||
| "value": "${DATABASE_ENGINE}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_NAME", | |||
| "value": "${DATABASE_NAME}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_USER", | |||
| "value": "${DATABASE_USER}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_PASSWORD", | |||
| "value": "${DATABASE_PASSWORD}" | |||
| }, | |||
| { | |||
| "name": "APP_CONFIG", | |||
| "value": "${APP_CONFIG}" | |||
| }, | |||
| { | |||
| "name": "DJANGO_SECRET_KEY", | |||
| "value": "${DJANGO_SECRET_KEY}" | |||
| } | |||
| ], | |||
| "resources": { | |||
| "limits": { | |||
| "memory": "${MEMORY_LIMIT}" | |||
| } | |||
| } | |||
| } | |||
| ] | |||
| } | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "Service", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${DATABASE_SERVICE_NAME}", | |||
| "annotations": { | |||
| "description": "Exposes the database server" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "ports": [ | |||
| { | |||
| "name": "postgresql", | |||
| "port": 5432, | |||
| "targetPort": 5432 | |||
| } | |||
| ], | |||
| "selector": { | |||
| "name": "${DATABASE_SERVICE_NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "DeploymentConfig", | |||
| "apiVersion": "v1", | |||
| "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", | |||
| "namespace": "${NAMESPACE}", | |||
| "name": "postgresql:9.5" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| } | |||
| ], | |||
| "replicas": 1, | |||
| "selector": { | |||
| "name": "${DATABASE_SERVICE_NAME}" | |||
| }, | |||
| "template": { | |||
| "metadata": { | |||
| "name": "${DATABASE_SERVICE_NAME}", | |||
| "labels": { | |||
| "name": "${DATABASE_SERVICE_NAME}" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "volumes": [ | |||
| { | |||
| "name": "data", | |||
| "emptyDir": {} | |||
| } | |||
| ], | |||
| "containers": [ | |||
| { | |||
| "name": "postgresql", | |||
| "image": " ", | |||
| "ports": [ | |||
| { | |||
| "containerPort": 5432 | |||
| } | |||
| ], | |||
| "env": [ | |||
| { | |||
| "name": "POSTGRESQL_USER", | |||
| "value": "${DATABASE_USER}" | |||
| }, | |||
| { | |||
| "name": "POSTGRESQL_PASSWORD", | |||
| "value": "${DATABASE_PASSWORD}" | |||
| }, | |||
| { | |||
| "name": "POSTGRESQL_DATABASE", | |||
| "value": "${DATABASE_NAME}" | |||
| } | |||
| ], | |||
| "volumeMounts": [ | |||
| { | |||
| "name": "data", | |||
| "mountPath": "/var/lib/pgsql/data" | |||
| } | |||
| ], | |||
| "readinessProbe": { | |||
| "timeoutSeconds": 1, | |||
| "initialDelaySeconds": 5, | |||
| "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": 30, | |||
| "tcpSocket": { | |||
| "port": 5432 | |||
| } | |||
| }, | |||
| "resources": { | |||
| "limits": { | |||
| "memory": "${MEMORY_POSTGRESQL_LIMIT}" | |||
| } | |||
| } | |||
| } | |||
| ] | |||
| } | |||
| } | |||
| } | |||
| } | |||
| ], | |||
| "parameters": [ | |||
| { | |||
| "name": "NAME", | |||
| "displayName": "Name", | |||
| "description": "The name assigned to all of the frontend objects defined in this template.", | |||
| "required": true, | |||
| "value": "django-psql-example" | |||
| }, | |||
| { | |||
| "name": "NAMESPACE", | |||
| "displayName": "Namespace", | |||
| "required": true, | |||
| "description": "The OpenShift Namespace where the ImageStream resides.", | |||
| "value": "openshift" | |||
| }, | |||
| { | |||
| "name": "MEMORY_LIMIT", | |||
| "displayName": "Memory Limit", | |||
| "required": true, | |||
| "description": "Maximum amount of memory the Django container can use.", | |||
| "value": "512Mi" | |||
| }, | |||
| { | |||
| "name": "MEMORY_POSTGRESQL_LIMIT", | |||
| "displayName": "Memory Limit (PostgreSQL)", | |||
| "required": true, | |||
| "description": "Maximum amount of memory the PostgreSQL container can use.", | |||
| "value": "512Mi" | |||
| }, | |||
| { | |||
| "name": "SOURCE_REPOSITORY_URL", | |||
| "displayName": "Git Repository URL", | |||
| "required": true, | |||
| "description": "The URL of the repository with your application source code.", | |||
| "value": "https://github.com/openshift/django-ex.git" | |||
| }, | |||
| { | |||
| "name": "SOURCE_REPOSITORY_REF", | |||
| "displayName": "Git Reference", | |||
| "description": "Set this to a branch name, tag or other ref of your repository if you are not using the default branch." | |||
| }, | |||
| { | |||
| "name": "CONTEXT_DIR", | |||
| "displayName": "Context Directory", | |||
| "description": "Set this to the relative path to your project if it is not in the root of your repository." | |||
| }, | |||
| { | |||
| "name": "APPLICATION_DOMAIN", | |||
| "displayName": "Application Hostname", | |||
| "description": "The exposed hostname that will route to the Django service, if left blank a value will be defaulted.", | |||
| "value": "" | |||
| }, | |||
| { | |||
| "name": "GITHUB_WEBHOOK_SECRET", | |||
| "displayName": "GitHub Webhook Secret", | |||
| "description": "A secret string used to configure the GitHub webhook.", | |||
| "generate": "expression", | |||
| "from": "[a-zA-Z0-9]{40}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_SERVICE_NAME", | |||
| "displayName": "Database Service Name", | |||
| "required": true, | |||
| "value": "postgresql" | |||
| }, | |||
| { | |||
| "name": "DATABASE_ENGINE", | |||
| "displayName": "Database Engine", | |||
| "required": true, | |||
| "description": "Database engine: postgresql, mysql or sqlite (default).", | |||
| "value": "postgresql" | |||
| }, | |||
| { | |||
| "name": "DATABASE_NAME", | |||
| "displayName": "Database Name", | |||
| "required": true, | |||
| "value": "default" | |||
| }, | |||
| { | |||
| "name": "DATABASE_USER", | |||
| "displayName": "Database Username", | |||
| "required": true, | |||
| "value": "django" | |||
| }, | |||
| { | |||
| "name": "DATABASE_PASSWORD", | |||
| "displayName": "Database User Password", | |||
| "generate": "expression", | |||
| "from": "[a-zA-Z0-9]{16}" | |||
| }, | |||
| { | |||
| "name": "APP_CONFIG", | |||
| "displayName": "Application Configuration File Path", | |||
| "description": "Relative path to Gunicorn configuration file (optional)." | |||
| }, | |||
| { | |||
| "name": "DJANGO_SECRET_KEY", | |||
| "displayName": "Django Secret Key", | |||
| "description": "Set this to a long random string.", | |||
| "generate": "expression", | |||
| "from": "[\\w]{50}" | |||
| }, | |||
| { | |||
| "name": "PIP_INDEX_URL", | |||
| "displayName": "Custom PyPi Index URL", | |||
| "description": "The custom PyPi index URL", | |||
| "value": "" | |||
| } | |||
| ] | |||
| } | |||
| @ -1,323 +0,0 @@ | |||
| { | |||
| "kind": "Template", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "django-example", | |||
| "annotations": { | |||
| "description": "An example Django application with no database", | |||
| "tags": "quickstart,python,django", | |||
| "iconClass": "icon-python" | |||
| } | |||
| }, | |||
| "labels": { | |||
| "template": "django-example" | |||
| }, | |||
| "objects": [ | |||
| { | |||
| "kind": "Service", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Exposes and load balances the application pods" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "ports": [ | |||
| { | |||
| "name": "web", | |||
| "port": 8080, | |||
| "targetPort": 8080 | |||
| } | |||
| ], | |||
| "selector": { | |||
| "name": "${NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "Route", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}" | |||
| }, | |||
| "spec": { | |||
| "host": "${APPLICATION_DOMAIN}", | |||
| "to": { | |||
| "kind": "Service", | |||
| "name": "${NAME}" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "ImageStream", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Keeps track of changes in the application image" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "BuildConfig", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Defines how to build the application" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "source": { | |||
| "type": "Git", | |||
| "git": { | |||
| "uri": "${SOURCE_REPOSITORY_URL}", | |||
| "ref": "${SOURCE_REPOSITORY_REF}" | |||
| }, | |||
| "contextDir": "${CONTEXT_DIR}" | |||
| }, | |||
| "strategy": { | |||
| "type": "Source", | |||
| "sourceStrategy": { | |||
| "from": { | |||
| "kind": "ImageStreamTag", | |||
| "namespace": "${NAMESPACE}", | |||
| "name": "python:3.5" | |||
| }, | |||
| "env": [ | |||
| { | |||
| "name": "PIP_INDEX_URL", | |||
| "value": "${PIP_INDEX_URL}" | |||
| } | |||
| ] | |||
| } | |||
| }, | |||
| "output": { | |||
| "to": { | |||
| "kind": "ImageStreamTag", | |||
| "name": "${NAME}:latest" | |||
| } | |||
| }, | |||
| "triggers": [ | |||
| { | |||
| "type": "ImageChange" | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| }, | |||
| { | |||
| "type": "GitHub", | |||
| "github": { | |||
| "secret": "${GITHUB_WEBHOOK_SECRET}" | |||
| } | |||
| } | |||
| ], | |||
| "postCommit": { | |||
| "script": "./manage.py test" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "kind": "DeploymentConfig", | |||
| "apiVersion": "v1", | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "annotations": { | |||
| "description": "Defines how to deploy the application server" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "strategy": { | |||
| "type": "Rolling" | |||
| }, | |||
| "triggers": [ | |||
| { | |||
| "type": "ImageChange", | |||
| "imageChangeParams": { | |||
| "automatic": true, | |||
| "containerNames": [ | |||
| "django-example" | |||
| ], | |||
| "from": { | |||
| "kind": "ImageStreamTag", | |||
| "name": "${NAME}:latest" | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| "type": "ConfigChange" | |||
| } | |||
| ], | |||
| "replicas": 1, | |||
| "selector": { | |||
| "name": "${NAME}" | |||
| }, | |||
| "template": { | |||
| "metadata": { | |||
| "name": "${NAME}", | |||
| "labels": { | |||
| "name": "${NAME}" | |||
| } | |||
| }, | |||
| "spec": { | |||
| "containers": [ | |||
| { | |||
| "name": "django-example", | |||
| "image": " ", | |||
| "ports": [ | |||
| { | |||
| "containerPort": 8080 | |||
| } | |||
| ], | |||
| "readinessProbe": { | |||
| "timeoutSeconds": 3, | |||
| "initialDelaySeconds": 3, | |||
| "httpGet": { | |||
| "path": "/", | |||
| "port": 8080 | |||
| } | |||
| }, | |||
| "livenessProbe": { | |||
| "timeoutSeconds": 3, | |||
| "initialDelaySeconds": 30, | |||
| "httpGet": { | |||
| "path": "/", | |||
| "port": 8080 | |||
| } | |||
| }, | |||
| "env": [ | |||
| { | |||
| "name": "DATABASE_SERVICE_NAME", | |||
| "value": "${DATABASE_SERVICE_NAME}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_ENGINE", | |||
| "value": "${DATABASE_ENGINE}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_NAME", | |||
| "value": "${DATABASE_NAME}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_USER", | |||
| "value": "${DATABASE_USER}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_PASSWORD", | |||
| "value": "${DATABASE_PASSWORD}" | |||
| }, | |||
| { | |||
| "name": "APP_CONFIG", | |||
| "value": "${APP_CONFIG}" | |||
| }, | |||
| { | |||
| "name": "DJANGO_SECRET_KEY", | |||
| "value": "${DJANGO_SECRET_KEY}" | |||
| } | |||
| ], | |||
| "resources": { | |||
| "limits": { | |||
| "memory": "${MEMORY_LIMIT}" | |||
| } | |||
| } | |||
| } | |||
| ] | |||
| } | |||
| } | |||
| } | |||
| } | |||
| ], | |||
| "parameters": [ | |||
| { | |||
| "name": "NAME", | |||
| "displayName": "Name", | |||
| "description": "The name assigned to all of the frontend objects defined in this template.", | |||
| "required": true, | |||
| "value": "django-example" | |||
| }, | |||
| { | |||
| "name": "NAMESPACE", | |||
| "displayName": "Namespace", | |||
| "required": true, | |||
| "description": "The OpenShift Namespace where the ImageStream resides.", | |||
| "value": "openshift" | |||
| }, | |||
| { | |||
| "name": "MEMORY_LIMIT", | |||
| "displayName": "Memory Limit", | |||
| "required": true, | |||
| "description": "Maximum amount of memory the container can use.", | |||
| "value": "512Mi" | |||
| }, | |||
| { | |||
| "name": "SOURCE_REPOSITORY_URL", | |||
| "displayName": "Git Repository URL", | |||
| "required": true, | |||
| "description": "The URL of the repository with your application source code.", | |||
| "value": "https://github.com/openshift/django-ex.git" | |||
| }, | |||
| { | |||
| "name": "SOURCE_REPOSITORY_REF", | |||
| "displayName": "Git Reference", | |||
| "description": "Set this to a branch name, tag or other ref of your repository if you are not using the default branch." | |||
| }, | |||
| { | |||
| "name": "CONTEXT_DIR", | |||
| "displayName": "Context Directory", | |||
| "description": "Set this to the relative path to your project if it is not in the root of your repository." | |||
| }, | |||
| { | |||
| "name": "APPLICATION_DOMAIN", | |||
| "displayName": "Application Hostname", | |||
| "description": "The exposed hostname that will route to the Django service, if left blank a value will be defaulted.", | |||
| "value": "" | |||
| }, | |||
| { | |||
| "name": "GITHUB_WEBHOOK_SECRET", | |||
| "displayName": "GitHub Webhook Secret", | |||
| "description": "A secret string used to configure the GitHub webhook.", | |||
| "generate": "expression", | |||
| "from": "[a-zA-Z0-9]{40}" | |||
| }, | |||
| { | |||
| "name": "DATABASE_SERVICE_NAME", | |||
| "displayName": "Database Service Name" | |||
| }, | |||
| { | |||
| "name": "DATABASE_ENGINE", | |||
| "displayName": "Database Engine", | |||
| "description": "Database engine: postgresql, mysql or sqlite (default)." | |||
| }, | |||
| { | |||
| "name": "DATABASE_NAME", | |||
| "displayName": "Database Name" | |||
| }, | |||
| { | |||
| "name": "DATABASE_USER", | |||
| "displayName": "Database Username" | |||
| }, | |||
| { | |||
| "name": "DATABASE_PASSWORD", | |||
| "displayName": "Database User Password" | |||
| }, | |||
| { | |||
| "name": "APP_CONFIG", | |||
| "displayName": "Application Configuration File Path", | |||
| "description": "Relative path to Gunicorn configuration file (optional)." | |||
| }, | |||
| { | |||
| "name": "DJANGO_SECRET_KEY", | |||
| "displayName": "Django Secret Key", | |||
| "description": "Set this to a long random string.", | |||
| "generate": "expression", | |||
| "from": "[\\w]{50}" | |||
| }, | |||
| { | |||
| "name": "PIP_INDEX_URL", | |||
| "displayName": "Custom PyPi Index URL", | |||
| "description": "The custom PyPi index URL", | |||
| "value": "" | |||
| } | |||
| ] | |||
| } | |||
| @ -0,0 +1,89 @@ | |||
| --- | |||
| kind: Template | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: edivorce-build | |||
| annotations: | |||
| description: An example Django application with a PostgreSQL database | |||
| tags: edivorce,python,django,postgresql | |||
| iconClass: icon-python | |||
| labels: | |||
| template: edivorce-build-template | |||
| objects: | |||
| - kind: ImageStream | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: "${NAME}" | |||
| annotations: | |||
| description: Keeps track of changes in the application image | |||
| - kind: BuildConfig | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: "${NAME}" | |||
| annotations: | |||
| description: Defines how to build the application | |||
| spec: | |||
| source: | |||
| type: Git | |||
| git: | |||
| uri: "${SOURCE_REPOSITORY_URL}" | |||
| ref: "${SOURCE_REPOSITORY_REF}" | |||
| contextDir: "${CONTEXT_DIR}" | |||
| strategy: | |||
| type: Source | |||
| sourceStrategy: | |||
| from: | |||
| kind: ImageStreamTag | |||
| namespace: "${NAMESPACE}" | |||
| name: python:3.5 | |||
| env: | |||
| - name: PIP_INDEX_URL | |||
| value: "${PIP_INDEX_URL}" | |||
| output: | |||
| to: | |||
| kind: ImageStreamTag | |||
| name: "${NAME}:latest" | |||
| triggers: | |||
| - type: ImageChange | |||
| - type: ConfigChange | |||
| - type: GitHub | |||
| github: | |||
| secret: "${GITHUB_WEBHOOK_SECRET}" | |||
| postCommit: | |||
| script: "./manage.py test" | |||
| parameters: | |||
| - name: NAME | |||
| displayName: Name | |||
| description: The name assigned to all of the frontend objects defined in this template. | |||
| required: true | |||
| value: edivorce-django | |||
| - name: NAMESPACE | |||
| displayName: Namespace | |||
| required: true | |||
| description: The OpenShift Namespace where the ImageStream resides. | |||
| value: openshift | |||
| - name: SOURCE_REPOSITORY_URL | |||
| displayName: Git Repository URL | |||
| required: true | |||
| description: The URL of the repository with your application source code. | |||
| value: https://github.com/bcgov/eDivorce.git | |||
| - name: SOURCE_REPOSITORY_REF | |||
| displayName: Git Reference | |||
| description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch. | |||
| - name: CONTEXT_DIR | |||
| displayName: Context Directory | |||
| description: Set this to the relative path to your project if it is not in the root of your repository. | |||
| - name: GITHUB_WEBHOOK_SECRET | |||
| displayName: GitHub Webhook Secret | |||
| description: A secret string used to configure the GitHub webhook. | |||
| generate: expression | |||
| from: "[a-zA-Z0-9]{40}" | |||
| - name: DJANGO_SECRET_KEY | |||
| displayName: Django Secret Key | |||
| description: Set this to a long random string. | |||
| generate: expression | |||
| from: "[\\w]{50}" | |||
| - name: PIP_INDEX_URL | |||
| displayName: Custom PyPi Index URL | |||
| description: The custom PyPi index URL | |||
| value: '' | |||
| @ -0,0 +1,320 @@ | |||
| --- | |||
| kind: Template | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: edivorce | |||
| annotations: | |||
| description: An example Django application with a PostgreSQL database | |||
| tags: edivorce,python,django,postgresql | |||
| iconClass: icon-python | |||
| labels: | |||
| template: edivorce-environment-template | |||
| objects: | |||
| - kind: Service | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: "${NAME}" | |||
| annotations: | |||
| description: Exposes and load balances the application pods | |||
| spec: | |||
| ports: | |||
| - name: web | |||
| port: 8080 | |||
| targetPort: 8080 | |||
| selector: | |||
| name: "${NAME}" | |||
| - kind: DeploymentConfig | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: "${NAME}" | |||
| annotations: | |||
| description: Defines how to deploy the application server | |||
| spec: | |||
| strategy: | |||
| type: Rolling | |||
| triggers: | |||
| - type: ImageChange | |||
| imageChangeParams: | |||
| automatic: true | |||
| containerNames: | |||
| - edivorce-django | |||
| from: | |||
| kind: ImageStreamTag | |||
| namespace: "${APP_IMAGE_NAMESPACE}" | |||
| name: "${APP_IMAGE_NAME}:deploy-to-${ENVIRONMENT_TYPE}" | |||
| - type: ConfigChange | |||
| replicas: 1 | |||
| selector: | |||
| name: "${NAME}" | |||
| template: | |||
| metadata: | |||
| name: "${NAME}" | |||
| labels: | |||
| name: "${NAME}" | |||
| spec: | |||
| containers: | |||
| - name: edivorce-django | |||
| image: " " | |||
| ports: | |||
| - containerPort: 8080 | |||
| readinessProbe: | |||
| timeoutSeconds: 3 | |||
| initialDelaySeconds: 3 | |||
| httpGet: | |||
| path: "/health" | |||
| port: 8080 | |||
| livenessProbe: | |||
| timeoutSeconds: 3 | |||
| initialDelaySeconds: 30 | |||
| httpGet: | |||
| path: "/health" | |||
| port: 8080 | |||
| env: | |||
| - name: DATABASE_SERVICE_NAME | |||
| value: "${DATABASE_SERVICE_NAME}" | |||
| - name: DATABASE_ENGINE | |||
| value: "${DATABASE_ENGINE}" | |||
| - name: DATABASE_NAME | |||
| value: "${DATABASE_NAME}" | |||
| - name: DATABASE_USER | |||
| value: "${DATABASE_USER}" | |||
| - name: DATABASE_PASSWORD | |||
| value: "${DATABASE_PASSWORD}" | |||
| - name: APP_CONFIG | |||
| value: "${APP_CONFIG}" | |||
| - name: DJANGO_SECRET_KEY | |||
| value: "${DJANGO_SECRET_KEY}" | |||
| - name: ENVIRONMENT_TYPE | |||
| value: "${ENVIRONMENT_TYPE}" | |||
| resources: | |||
| limits: | |||
| memory: "${MEMORY_LIMIT}" | |||
| - kind: PersistentVolumeClaim | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: "${DATABASE_SERVICE_NAME}" | |||
| spec: | |||
| accessModes: | |||
| - ReadWriteOnce | |||
| resources: | |||
| requests: | |||
| storage: "${VOLUME_CAPACITY}" | |||
| - kind: Service | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: "${DATABASE_SERVICE_NAME}" | |||
| annotations: | |||
| description: Exposes the database server | |||
| spec: | |||
| ports: | |||
| - name: postgresql | |||
| port: 5432 | |||
| targetPort: 5432 | |||
| selector: | |||
| name: "${DATABASE_SERVICE_NAME}" | |||
| - kind: DeploymentConfig | |||
| apiVersion: v1 | |||
| 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 | |||
| namespace: "${NAMESPACE}" | |||
| name: postgresql:9.5 | |||
| - type: ConfigChange | |||
| replicas: 1 | |||
| selector: | |||
| name: "${DATABASE_SERVICE_NAME}" | |||
| template: | |||
| metadata: | |||
| name: "${DATABASE_SERVICE_NAME}" | |||
| labels: | |||
| name: "${DATABASE_SERVICE_NAME}" | |||
| spec: | |||
| volumes: | |||
| - name: "${DATABASE_SERVICE_NAME}-data" | |||
| persistentVolumeClaim: | |||
| claimName: "${DATABASE_SERVICE_NAME}" | |||
| containers: | |||
| - name: postgresql | |||
| image: " " | |||
| ports: | |||
| - containerPort: 5432 | |||
| env: | |||
| - name: POSTGRESQL_USER | |||
| value: "${DATABASE_USER}" | |||
| - name: POSTGRESQL_PASSWORD | |||
| value: "${DATABASE_PASSWORD}" | |||
| - name: POSTGRESQL_DATABASE | |||
| value: "${DATABASE_NAME}" | |||
| volumeMounts: | |||
| - name: "${DATABASE_SERVICE_NAME}-data" | |||
| mountPath: "/var/lib/pgsql/data" | |||
| readinessProbe: | |||
| timeoutSeconds: 1 | |||
| initialDelaySeconds: 5 | |||
| 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: 30 | |||
| tcpSocket: | |||
| port: 5432 | |||
| resources: | |||
| limits: | |||
| memory: "${MEMORY_POSTGRESQL_LIMIT}" | |||
| - kind: ImageStream | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: weasyprint | |||
| labels: | |||
| name: weasyprint | |||
| spec: | |||
| tags: | |||
| - name: latest | |||
| annotations: | |||
| openshift.io/imported-from: aquavitae/weasyprint | |||
| from: | |||
| kind: DockerImage | |||
| name: aquavitae/weasyprint | |||
| - kind: Service | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: weasyprint | |||
| labels: | |||
| name: weasyprint | |||
| spec: | |||
| ports: | |||
| - name: 5001-tcp | |||
| protocol: TCP | |||
| port: 5001 | |||
| targetPort: 5001 | |||
| selector: | |||
| name: weasyprint | |||
| - kind: DeploymentConfig | |||
| apiVersion: v1 | |||
| metadata: | |||
| name: weasyprint | |||
| labels: | |||
| app: weasyprint | |||
| annotations: | |||
| description: Weasyprint microservice using aquavitae/weasyprint | |||
| spec: | |||
| strategy: | |||
| type: Recreate | |||
| triggers: | |||
| - type: ImageChange | |||
| imageChangeParams: | |||
| automatic: true | |||
| containerNames: | |||
| - weasyprint | |||
| from: | |||
| kind: ImageStreamTag | |||
| name: 'aquavitae/weasyprint:latest' | |||
| replicas: 1 | |||
| selector: | |||
| name: weasyprint | |||
| template: | |||
| metadata: | |||
| name: weasyprint | |||
| labels: | |||
| name: weasyprint | |||
| annotations: | |||
| openshift.io/container.weasyprint.image.entrypoint: '["/bin/sh","-c","gunicorn --bind 0.0.0.0:5001 wsgi:app"]' | |||
| spec: | |||
| containers: | |||
| - name: weasyprint | |||
| image: 'aquavitae/weasyprint' | |||
| ports: | |||
| - containerPort: 5001 | |||
| protocol: TCP | |||
| livenessProbe: | |||
| httpGet: | |||
| path: /health | |||
| port: 5001 | |||
| scheme: HTTP | |||
| initialDelaySeconds: 120 | |||
| timeoutSeconds: 30 | |||
| periodSeconds: 60 | |||
| successThreshold: 1 | |||
| failureThreshold: 5 | |||
| parameters: | |||
| - name: NAME | |||
| displayName: Name | |||
| description: The name assigned to all of the frontend objects defined in this template. | |||
| required: true | |||
| value: edivorce-django | |||
| - name: NAMESPACE | |||
| displayName: Namespace | |||
| required: true | |||
| description: The OpenShift Namespace where the ImageStream resides. | |||
| value: openshift | |||
| - name: MEMORY_LIMIT | |||
| displayName: Memory Limit | |||
| required: true | |||
| description: Maximum amount of memory the Django container can use. | |||
| value: 512Mi | |||
| - name: MEMORY_POSTGRESQL_LIMIT | |||
| displayName: Memory Limit (PostgreSQL) | |||
| required: true | |||
| description: Maximum amount of memory the PostgreSQL container can use. | |||
| value: 512Mi | |||
| - name: VOLUME_CAPACITY | |||
| displayName: Volume Capacity | |||
| description: Volume space available for data, e.g. 512Mi, 2Gi | |||
| value: 1Gi | |||
| required: true | |||
| - name: DATABASE_SERVICE_NAME | |||
| displayName: Database Service Name | |||
| required: true | |||
| value: postgresql | |||
| - name: DATABASE_ENGINE | |||
| displayName: Database Engine | |||
| required: true | |||
| description: 'Database engine: postgresql, mysql or sqlite (default).' | |||
| value: postgresql | |||
| - name: DATABASE_NAME | |||
| displayName: Database Name | |||
| required: true | |||
| value: default | |||
| - name: DATABASE_USER | |||
| displayName: Database Username | |||
| required: true | |||
| value: django | |||
| - name: DATABASE_PASSWORD | |||
| displayName: Database User Password | |||
| generate: expression | |||
| from: "[a-zA-Z0-9]{16}" | |||
| - name: APP_CONFIG | |||
| displayName: Application Configuration File Path | |||
| description: Relative path to Gunicorn configuration file (optional). | |||
| - name: DJANGO_SECRET_KEY | |||
| displayName: Django Secret Key | |||
| description: Set this to a long random string. | |||
| generate: expression | |||
| from: "[\\w]{50}" | |||
| - name: APP_IMAGE_NAME | |||
| displayName: Application image name. | |||
| value: edivorce-django | |||
| required": true | |||
| - name: APP_IMAGE_NAMESPACE | |||
| displayName: Namespace containing application images. | |||
| value: jag-csb-edivorce-tools | |||
| required: true | |||
| - name: ENVIRONMENT_TYPE | |||
| displayName: Type of environnment (dev,test or prod). | |||
| required: true | |||