{
	"kind": "Template",
	"apiVersion": "template.openshift.io/v1",
	"metadata": {
		"name": "rails-pgsql-persistent",
		"creationTimestamp": null,
		"annotations": {
			"description": "An example Rails application with a PostgreSQL database. For more information about using this template, including OpenShift considerations, see https://github.com/sclorg/rails-ex/blob/master/README.md.",
			"iconClass": "icon-ruby",
			"openshift.io/display-name": "Rails + PostgreSQL (Persistent)",
			"tags": "quickstart,ruby,rails",
			"template.openshift.io/documentation-url": "https://github.com/sclorg/rails-ex",
			"template.openshift.io/long-description": "This template defines resources needed to develop a Rails application, including a build configuration, application deployment configuration, and database deployment configuration.",
			"template.openshift.io/provider-display-name": "Red Hat, Inc.",
			"template.openshift.io/support-url": "https://access.redhat.com"
		}
	},
	"message": "The following service(s) have been created in your project: ${NAME}, ${DATABASE_SERVICE_NAME}.\n\nFor more information about using this template, including OpenShift considerations, see https://github.com/sclorg/rails-ex/blob/master/README.md.",
	"objects": [
		{
			"apiVersion": "v1",
			"kind": "Secret",
			"metadata": {
				"annotations": {
					"template.openshift.io/expose-password": "{.data['application-password']}",
					"template.openshift.io/expose-username": "{.data['application-user']}"
				},
				"name": "${NAME}"
			},
			"stringData": {
				"application-password": "${APPLICATION_PASSWORD}",
				"application-user": "${APPLICATION_USER}",
				"database-password": "${DATABASE_PASSWORD}",
				"database-user": "${DATABASE_USER}",
				"keybase": "${SECRET_KEY_BASE}"
			}
		},
		{
			"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": "route.openshift.io/v1",
			"kind": "Route",
			"metadata": {
				"annotations": {
					"template.openshift.io/expose-uri": "http://{.spec.host}{.spec.path}"
				},
				"name": "${NAME}"
			},
			"spec": {
				"host": "${APPLICATION_DOMAIN}",
				"to": {
					"kind": "Service",
					"name": "${NAME}"
				}
			}
		},
		{
			"apiVersion": "image.openshift.io/v1",
			"kind": "ImageStream",
			"metadata": {
				"annotations": {
					"description": "Keeps track of changes in the application image"
				},
				"name": "${NAME}"
			}
		},
		{
			"apiVersion": "build.openshift.io/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"
					}
				},
				"source": {
					"contextDir": "${CONTEXT_DIR}",
					"git": {
						"ref": "${SOURCE_REPOSITORY_REF}",
						"uri": "${SOURCE_REPOSITORY_URL}"
					},
					"type": "Git"
				},
				"strategy": {
					"sourceStrategy": {
						"env": [
							{
								"name": "RUBYGEM_MIRROR",
								"value": "${RUBYGEM_MIRROR}"
							}
						],
						"from": {
							"kind": "ImageStreamTag",
							"name": "ruby:${RUBY_VERSION}",
							"namespace": "${NAMESPACE}"
						}
					},
					"type": "Source"
				},
				"triggers": [
					{
						"type": "ImageChange"
					},
					{
						"type": "ConfigChange"
					},
					{
						"github": {
							"secret": "${GITHUB_WEBHOOK_SECRET}"
						},
						"type": "GitHub"
					}
				]
			}
		},
		{
			"apiVersion": "apps/v1",
			"kind": "Deployment",
			"metadata": {
				"annotations": {
					"description": "Defines how to deploy the application server",
					"image.openshift.io/triggers": "[{\"from\":{\"kind\":\"ImageStreamTag\",\"name\":\"${NAME}:latest\"},\"fieldPath\": \"spec.template.spec.containers[0].image\"},{\"from\":{\"kind\":\"ImageStreamTag\",\"name\":\"${NAME}:latest\"},\"fieldPath\": \"spec.template.spec.initContainers[0].image\"}]",
					"template.alpha.openshift.io/wait-for-ready": "true"
				},
				"name": "${NAME}"
			},
			"spec": {
				"replicas": 1,
				"selector": {
					"matchLabels": {
						"name": "${NAME}"
					}
				},
				"strategy": {
					"type": "Recreate"
				},
				"template": {
					"metadata": {
						"labels": {
							"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": "SECRET_KEY_BASE",
										"valueFrom": {
											"secretKeyRef": {
												"key": "keybase",
												"name": "${NAME}"
											}
										}
									},
									{
										"name": "POSTGRESQL_DATABASE",
										"value": "${DATABASE_NAME}"
									},
									{
										"name": "POSTGRESQL_MAX_CONNECTIONS",
										"value": "${POSTGRESQL_MAX_CONNECTIONS}"
									},
									{
										"name": "POSTGRESQL_SHARED_BUFFERS",
										"value": "${POSTGRESQL_SHARED_BUFFERS}"
									},
									{
										"name": "APPLICATION_DOMAIN",
										"value": "${APPLICATION_DOMAIN}"
									},
									{
										"name": "APPLICATION_USER",
										"valueFrom": {
											"secretKeyRef": {
												"key": "application-user",
												"name": "${NAME}"
											}
										}
									},
									{
										"name": "APPLICATION_PASSWORD",
										"valueFrom": {
											"secretKeyRef": {
												"key": "application-password",
												"name": "${NAME}"
											}
										}
									},
									{
										"name": "RAILS_ENV",
										"value": "${RAILS_ENV}"
									}
								],
								"image": " ",
								"livenessProbe": {
									"httpGet": {
										"path": "/articles",
										"port": 8080
									},
									"initialDelaySeconds": 10,
									"timeoutSeconds": 3
								},
								"name": "${NAME}",
								"ports": [
									{
										"containerPort": 8080
									}
								],
								"readinessProbe": {
									"httpGet": {
										"path": "/articles",
										"port": 8080
									},
									"initialDelaySeconds": 5,
									"timeoutSeconds": 3
								},
								"resources": {
									"limits": {
										"memory": "${MEMORY_LIMIT}"
									}
								}
							}
						],
						"initContainers": [
							{
								"command": [
									"./migrate-database.sh"
								],
								"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": "SECRET_KEY_BASE",
										"valueFrom": {
											"secretKeyRef": {
												"key": "keybase",
												"name": "${NAME}"
											}
										}
									},
									{
										"name": "POSTGRESQL_DATABASE",
										"value": "${DATABASE_NAME}"
									},
									{
										"name": "POSTGRESQL_MAX_CONNECTIONS",
										"value": "${POSTGRESQL_MAX_CONNECTIONS}"
									},
									{
										"name": "POSTGRESQL_SHARED_BUFFERS",
										"value": "${POSTGRESQL_SHARED_BUFFERS}"
									},
									{
										"name": "APPLICATION_DOMAIN",
										"value": "${APPLICATION_DOMAIN}"
									},
									{
										"name": "APPLICATION_USER",
										"valueFrom": {
											"secretKeyRef": {
												"key": "application-user",
												"name": "${NAME}"
											}
										}
									},
									{
										"name": "APPLICATION_PASSWORD",
										"valueFrom": {
											"secretKeyRef": {
												"key": "application-password",
												"name": "${NAME}"
											}
										}
									},
									{
										"name": "RAILS_ENV",
										"value": "${RAILS_ENV}"
									}
								],
								"image": " ",
								"name": "ruby-init-container"
							}
						]
					}
				}
			}
		},
		{
			"apiVersion": "v1",
			"kind": "PersistentVolumeClaim",
			"metadata": {
				"name": "${DATABASE_SERVICE_NAME}"
			},
			"spec": {
				"accessModes": [
					"ReadWriteOnce"
				],
				"resources": {
					"requests": {
						"storage": "${VOLUME_CAPACITY}"
					}
				}
			}
		},
		{
			"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": "apps/v1",
			"kind": "Deployment",
			"metadata": {
				"annotations": {
					"description": "Defines how to deploy the database",
					"image.openshift.io/triggers": "[{\"from\":{\"kind\":\"ImageStreamTag\",\"name\":\"postgresql:${POSTGRESQL_VERSION}\", \"namespace\": \"${NAMESPACE}\"},\"fieldPath\": \"spec.template.spec.containers[0].image\"}]",
					"template.alpha.openshift.io/wait-for-ready": "true"
				},
				"name": "${DATABASE_SERVICE_NAME}"
			},
			"spec": {
				"replicas": 1,
				"selector": {
					"matchLabels": {
						"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_MAX_CONNECTIONS",
										"value": "${POSTGRESQL_MAX_CONNECTIONS}"
									},
									{
										"name": "POSTGRESQL_SHARED_BUFFERS",
										"value": "${POSTGRESQL_SHARED_BUFFERS}"
									}
								],
								"image": " ",
								"livenessProbe": {
									"exec": {
										"command": [
											"/usr/libexec/check-container",
											"--live"
										]
									},
									"initialDelaySeconds": 120,
									"timeoutSeconds": 10
								},
								"name": "postgresql",
								"ports": [
									{
										"containerPort": 5432
									}
								],
								"readinessProbe": {
									"exec": {
										"command": [
											"/usr/libexec/check-container"
										]
									},
									"initialDelaySeconds": 5,
									"timeoutSeconds": 1
								},
								"resources": {
									"limits": {
										"memory": "${MEMORY_POSTGRESQL_LIMIT}"
									}
								},
								"volumeMounts": [
									{
										"mountPath": "/var/lib/pgsql/data",
										"name": "${DATABASE_SERVICE_NAME}-data"
									}
								]
							}
						],
						"volumes": [
							{
								"name": "${DATABASE_SERVICE_NAME}-data",
								"persistentVolumeClaim": {
									"claimName": "${DATABASE_SERVICE_NAME}"
								}
							}
						]
					}
				}
			}
		}
	],
	"parameters": [
		{
			"name": "NAME",
			"displayName": "Name",
			"description": "The name assigned to all of the frontend objects defined in this template.",
			"value": "rails-pgsql-persistent",
			"required": true
		},
		{
			"name": "NAMESPACE",
			"displayName": "Namespace",
			"description": "The OpenShift Namespace where the ImageStream resides.",
			"value": "openshift",
			"required": true
		},
		{
			"name": "RUBY_VERSION",
			"displayName": "Ruby Version",
			"description": "Version of Ruby image to be used (3.1-ubi8 by default).",
			"value": "3.1-ubi8",
			"required": true
		},
		{
			"name": "POSTGRESQL_VERSION",
			"displayName": "Postgresql Version",
			"description": "Version of Postgresql image to be used (12-el8 by default).",
			"value": "12-el8",
			"required": true
		},
		{
			"name": "MEMORY_LIMIT",
			"displayName": "Memory Limit",
			"description": "Maximum amount of memory the Rails container can use.",
			"value": "512Mi",
			"required": true
		},
		{
			"name": "MEMORY_POSTGRESQL_LIMIT",
			"displayName": "Memory Limit (PostgreSQL)",
			"description": "Maximum amount of memory the PostgreSQL container can use.",
			"value": "512Mi",
			"required": true
		},
		{
			"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",
			"description": "The URL of the repository with your application source code.",
			"value": "https://github.com/sclorg/rails-ex.git",
			"required": true
		},
		{
			"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 Rails service, if left blank a value will be defaulted."
		},
		{
			"name": "GITHUB_WEBHOOK_SECRET",
			"displayName": "GitHub Webhook Secret",
			"description": "Github trigger secret.  A difficult to guess string encoded as part of the webhook URL.  Not encrypted.",
			"generate": "expression",
			"from": "[a-zA-Z0-9]{40}"
		},
		{
			"name": "SECRET_KEY_BASE",
			"displayName": "Secret Key",
			"description": "Your secret key for verifying the integrity of signed cookies.",
			"generate": "expression",
			"from": "[a-z0-9]{127}"
		},
		{
			"name": "APPLICATION_USER",
			"displayName": "Application Username",
			"description": "The application user that is used within the sample application to authorize access on pages.",
			"value": "openshift",
			"required": true
		},
		{
			"name": "APPLICATION_PASSWORD",
			"displayName": "Application Password",
			"description": "The application password that is used within the sample application to authorize access on pages.",
			"value": "secret",
			"required": true
		},
		{
			"name": "RAILS_ENV",
			"displayName": "Rails Environment",
			"description": "Environment under which the sample application will run. Could be set to production, development or test.",
			"value": "production",
			"required": true
		},
		{
			"name": "DATABASE_SERVICE_NAME",
			"displayName": "Database Service Name",
			"value": "postgresql",
			"required": true
		},
		{
			"name": "DATABASE_USER",
			"displayName": "Database Username",
			"generate": "expression",
			"from": "user[A-Z0-9]{3}"
		},
		{
			"name": "DATABASE_PASSWORD",
			"displayName": "Database Password",
			"generate": "expression",
			"from": "[a-zA-Z0-9]{8}"
		},
		{
			"name": "DATABASE_NAME",
			"displayName": "Database Name",
			"value": "root",
			"required": true
		},
		{
			"name": "POSTGRESQL_MAX_CONNECTIONS",
			"displayName": "Maximum Database Connections",
			"value": "100"
		},
		{
			"name": "POSTGRESQL_SHARED_BUFFERS",
			"displayName": "Shared Buffer Amount",
			"value": "12MB"
		},
		{
			"name": "RUBYGEM_MIRROR",
			"displayName": "Custom RubyGems Mirror URL",
			"description": "The custom RubyGems mirror URL"
		}
	],
	"labels": {
		"app": "rails-pgsql-persistent",
		"template": "rails-pgsql-persistent"
	}
}