--- 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}" - name: PROXY_NETWORK value: "${PROXY_NETWORK}" 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 namespace: aquavitae name: '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 value: gunicorn_config.py 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 - name: PROXY_NETWORK displayName: Network of upstream proxy value: 0.0.0.0/0 required: true