From d7a011168f6ad22af42e59787b4937521ca8599b Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Fri, 21 Jul 2023 19:43:28 +0300 Subject: [PATCH] NAS-123129 / 23.10 / add `pgadmin` to `community` train (#1387) * add `pgadmin` to `community` train * add readme's * metadata * add templates and values * update metadat --- library/ix-dev/community/pgadmin/Chart.lock | 6 + library/ix-dev/community/pgadmin/Chart.yaml | 26 ++ library/ix-dev/community/pgadmin/README.md | 8 + .../ix-dev/community/pgadmin/app-readme.md | 8 + .../pgadmin/charts/common-1.0.12.tgz | Bin 0 -> 56722 bytes .../community/pgadmin/ci/basic-values.yaml | 11 + .../community/pgadmin/ci/extra-values.yaml | 18 ++ .../community/pgadmin/ci/hostnet-values.yaml | 12 + .../community/pgadmin/ci/https-values.yaml | 99 ++++++++ library/ix-dev/community/pgadmin/item.yaml | 10 + .../ix-dev/community/pgadmin/metadata.yaml | 10 + .../ix-dev/community/pgadmin/questions.yaml | 231 ++++++++++++++++++ .../community/pgadmin/templates/NOTES.txt | 1 + .../pgadmin/templates/_persistence.tpl | 57 +++++ .../community/pgadmin/templates/_pgadmin.tpl | 64 +++++ .../community/pgadmin/templates/_portal.tpl | 16 ++ .../community/pgadmin/templates/_service.tpl | 15 ++ .../pgadmin/templates/_validation.tpl | 8 + .../community/pgadmin/templates/common.yaml | 13 + .../community/pgadmin/upgrade_info.json | 1 + .../ix-dev/community/pgadmin/upgrade_strategy | 31 +++ library/ix-dev/community/pgadmin/values.yaml | 25 ++ 22 files changed, 670 insertions(+) create mode 100644 library/ix-dev/community/pgadmin/Chart.lock create mode 100644 library/ix-dev/community/pgadmin/Chart.yaml create mode 100644 library/ix-dev/community/pgadmin/README.md create mode 100644 library/ix-dev/community/pgadmin/app-readme.md create mode 100644 library/ix-dev/community/pgadmin/charts/common-1.0.12.tgz create mode 100644 library/ix-dev/community/pgadmin/ci/basic-values.yaml create mode 100644 library/ix-dev/community/pgadmin/ci/extra-values.yaml create mode 100644 library/ix-dev/community/pgadmin/ci/hostnet-values.yaml create mode 100644 library/ix-dev/community/pgadmin/ci/https-values.yaml create mode 100644 library/ix-dev/community/pgadmin/item.yaml create mode 100644 library/ix-dev/community/pgadmin/metadata.yaml create mode 100644 library/ix-dev/community/pgadmin/questions.yaml create mode 100644 library/ix-dev/community/pgadmin/templates/NOTES.txt create mode 100644 library/ix-dev/community/pgadmin/templates/_persistence.tpl create mode 100644 library/ix-dev/community/pgadmin/templates/_pgadmin.tpl create mode 100644 library/ix-dev/community/pgadmin/templates/_portal.tpl create mode 100644 library/ix-dev/community/pgadmin/templates/_service.tpl create mode 100644 library/ix-dev/community/pgadmin/templates/_validation.tpl create mode 100644 library/ix-dev/community/pgadmin/templates/common.yaml create mode 100644 library/ix-dev/community/pgadmin/upgrade_info.json create mode 100755 library/ix-dev/community/pgadmin/upgrade_strategy create mode 100644 library/ix-dev/community/pgadmin/values.yaml diff --git a/library/ix-dev/community/pgadmin/Chart.lock b/library/ix-dev/community/pgadmin/Chart.lock new file mode 100644 index 0000000000..f02d5d8409 --- /dev/null +++ b/library/ix-dev/community/pgadmin/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.12 +digest: sha256:debd30721d09ae8293b1cbdd9d0115981d40b47908be3035fc3cf657c9d5eedb +generated: "2023-07-20T20:39:44.954109757+03:00" diff --git a/library/ix-dev/community/pgadmin/Chart.yaml b/library/ix-dev/community/pgadmin/Chart.yaml new file mode 100644 index 0000000000..7191cc1dc2 --- /dev/null +++ b/library/ix-dev/community/pgadmin/Chart.yaml @@ -0,0 +1,26 @@ +name: pgadmin +description: pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL +annotations: + title: pgAdmin +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '7.4' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.12 +home: https://www.pgadmin.org/ +icon: https://avatars.githubusercontent.com/u/113517144 +sources: + - https://hub.docker.com/r/dpage/pgadmin4 + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/pgadmin + - https://www.pgadmin.org/ +keywords: + - database + - management diff --git a/library/ix-dev/community/pgadmin/README.md b/library/ix-dev/community/pgadmin/README.md new file mode 100644 index 0000000000..b38850bf99 --- /dev/null +++ b/library/ix-dev/community/pgadmin/README.md @@ -0,0 +1,8 @@ +# pgAdmin + +[pgAdmin](https://github.com/pgadmin-org/pgadmin4) is the most popular and feature rich Open Source administration and development platform for PostgreSQL + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `pgAdmin` directories. +> Afterward, the `pgAdmin` container will run as a **non**-root user (`5050`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/pgadmin/app-readme.md b/library/ix-dev/community/pgadmin/app-readme.md new file mode 100644 index 0000000000..b38850bf99 --- /dev/null +++ b/library/ix-dev/community/pgadmin/app-readme.md @@ -0,0 +1,8 @@ +# pgAdmin + +[pgAdmin](https://github.com/pgadmin-org/pgadmin4) is the most popular and feature rich Open Source administration and development platform for PostgreSQL + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `pgAdmin` directories. +> Afterward, the `pgAdmin` container will run as a **non**-root user (`5050`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/pgadmin/charts/common-1.0.12.tgz b/library/ix-dev/community/pgadmin/charts/common-1.0.12.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1e3e57ca4cb1f4be5aa134c5e52b7714129c4517 GIT binary patch literal 56722 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 CxG?|# literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/pgadmin/ci/basic-values.yaml b/library/ix-dev/community/pgadmin/ci/basic-values.yaml new file mode 100644 index 0000000000..63e5e0a201 --- /dev/null +++ b/library/ix-dev/community/pgadmin/ci/basic-values.yaml @@ -0,0 +1,11 @@ +pgadminNetwork: + webPort: 31000 + +pgadminConfig: + adminEmail: some@email.com + adminPassword: somepassword + +pgadminStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config diff --git a/library/ix-dev/community/pgadmin/ci/extra-values.yaml b/library/ix-dev/community/pgadmin/ci/extra-values.yaml new file mode 100644 index 0000000000..d658cfd19e --- /dev/null +++ b/library/ix-dev/community/pgadmin/ci/extra-values.yaml @@ -0,0 +1,18 @@ +pgadminConfig: + adminEmail: some@email.com + adminPassword: somepassword + +pgadminNetwork: + webPort: 31000 + +pgadminStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config + additionalStorages: + - type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/db1 + mountPath: /db1 + - type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/db2 + mountPath: /db2 diff --git a/library/ix-dev/community/pgadmin/ci/hostnet-values.yaml b/library/ix-dev/community/pgadmin/ci/hostnet-values.yaml new file mode 100644 index 0000000000..2cffccf830 --- /dev/null +++ b/library/ix-dev/community/pgadmin/ci/hostnet-values.yaml @@ -0,0 +1,12 @@ +pgadminNetwork: + webPort: 30000 + hostNetwork: true + +pgadminConfig: + adminEmail: some@email.com + adminPassword: somepassword + +pgadminStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config diff --git a/library/ix-dev/community/pgadmin/ci/https-values.yaml b/library/ix-dev/community/pgadmin/ci/https-values.yaml new file mode 100644 index 0000000000..a7e49e0271 --- /dev/null +++ b/library/ix-dev/community/pgadmin/ci/https-values.yaml @@ -0,0 +1,99 @@ +pgadminNetwork: + webPort: 30000 + hostNetwork: true + certificateID: "1" + +pgadminStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config + +pgadminConfig: + adminEmail: some@email.com + adminPassword: somepassword + +ixCertificates: + "1": + certificate: | + -----BEGIN CERTIFICATE----- + MIIEdjCCA16gAwIBAgIDYFMYMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMzU0WhcNMjMxMjAzMjMyMzU0WjBuMQswCQYDVQQDDAJhZDEL + MAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxDTALBgNVBAcMBGFzZGYxDTALBgNV + BAoMBGFkc2YxDTALBgNVBAsMBGFzZGYxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7+1xOHRQyOnQTHFcrdasX + Zl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/AbkH7oVFWC1 + P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI4vQCdYgW + 2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2dNgsxKU0H + PGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB+Zie331t + AzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7A/FuDVg3 + AgMBAAGjggEdMIIBGTAnBgNVHREEIDAehwTAqAADhwTAqAAFhwTAqAC2hwTAqACB + hwTAqACSMB0GA1UdDgQWBBQ4G2ff4tgZl4vmo4xCfqmJhdqShzAMBgNVHRMBAf8E + AjAAMIGYBgNVHSMEgZAwgY2AFLlYf9L99nxJDcpCM/LT3V5hQ/a3oXCkbjBsMQww + CgYDVQQDDANhc2QxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQH + DAJhZjENMAsGA1UECgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkB + FgdhQGEuY29tggNgUxcwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwEwDgYDVR0PAQH/ + BAQDAgWgMA0GCSqGSIb3DQEBCwUAA4IBAQA6FpOInEHB5iVk3FP67GybJ29vHZTD + KQHbQgmg8s4L7qIsA1HQ+DMCbdylpA11x+t/eL/n48BvGw2FNXpN6uykhLHJjbKR + h8yITa2KeD3LjLYhScwIigXmTVYSP3km6s8jRL6UKT9zttnIHyXVpBDya6Q4WTMx + fmfC6O7t1PjQ5ZyVtzizIUP8ah9n4TKdXU4A3QIM6WsJXpHb+vqp1WDWJ7mKFtgj + x5TKv3wcPnktx0zMPfLb5BTSE9rc9djcBG0eIAsPT4FgiatCUChe7VhuMnqskxEz + MymJLoq8+mzucRwFkOkR2EIt1x+Irl2mJVMeBow63rVZfUQBD8h++LqB + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIEhDCCA2ygAwIBAgIDYFMXMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMDQ1WhcNMzEwODI4MjMyMDQ1WjBsMQwwCgYDVQQDDANhc2Qx + CzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQHDAJhZjENMAsGA1UE + CgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkBFgdhQGEuY29tMIIB + IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq//c0hEEr83CS1pMgsHX50jt + 2MqIbcf63UUNJTiYpUUvUQSFJFc7m/dr+RTZvu97eDCnD5K2qkHHvTPaPZwY+Djf + iy7N641Sz6u/y3Yo3xxs1Aermsfedh48vusJpjbkT2XS44VjbkrpKcWDNVpp3Evd + M7oJotXeUsZ+imiyVCfr4YhoY5gbGh/r+KN9Wf9YKoUyfLLZGwdZkhtX2zIbidsL + Thqi9YTaUHttGinjiBBum234u/CfvKXsfG3yP2gvBGnlvZnM9ktv+lVffYNqlf7H + VmB1bKKk84HtzuW5X76SGAgOG8eHX4x5ZLI1WQUuoQOVRl1I0UCjBtbz8XhwvQID + AQABo4IBLTCCASkwLQYDVR0RBCYwJIcEwKgABYcEwKgAA4cEwKgAkocEwKgAtYcE + wKgAgYcEwKgAtjAdBgNVHQ4EFgQUuVh/0v32fEkNykIz8tPdXmFD9rcwDwYDVR0T + AQH/BAUwAwEB/zCBmAYDVR0jBIGQMIGNgBS5WH/S/fZ8SQ3KQjPy091eYUP2t6Fw + pG4wbDEMMAoGA1UEAwwDYXNkMQswCQYDVQQGEwJVUzENMAsGA1UECAwEYXNkZjEL + MAkGA1UEBwwCYWYxDTALBgNVBAoMBGFzZGYxDDAKBgNVBAsMA2FzZDEWMBQGCSqG + SIb3DQEJARYHYUBhLmNvbYIDYFMXMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF + BQcDAjAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKEocOmVuWlr + zegtKYMe8NhHIkFY9oVn5ym6RHNOJpPH4QF8XYC3Z5+iC5yGh4P/jVe/4I4SF6Ql + PtofU0jNq5vzapt/y+m008eXqPQFmoUOvu+JavoRVcRx2LIP5AgBA1mF56CSREsX + TkuJAA9IUQ8EjnmAoAeKINuPaKxGDuU8BGCMqr/qd564MKNf9XYL+Fb2rlkA0O2d + 2No34DQLgqSmST/LAvPM7Cbp6knYgnKmGr1nETCXasg1cueHLnWWTvps2HiPp2D/ + +Fq0uqcZLu4Mdo0CPs4e5sHRyldEnRSKh0DVLprq9zr/GMipmPLJUsT5Jed3sj0w + M7Y3vwxshpo= + -----END CERTIFICATE----- + privatekey: | + -----BEGIN PRIVATE KEY----- + MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC7+1xOHRQyOnQT + HFcrdasXZl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/Abk + H7oVFWC1P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI + 4vQCdYgW2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2d + NgsxKU0HPGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB + +Zie331tAzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7 + A/FuDVg3AgMBAAECggEAapt30rj9DitGTtxAt13pJMEhyYxvvD3WkvmJwguF/Bbu + eW0Ba1c668fMeRCA54FWi1sMqusPS4HUqqUvk+tmyAOsAF4qgD/A4MMSC7uJSVI5 + N/JWhJWyhCY94/FPakiO1nbPbVw41bcqtzU2qvparpME2CtxSCbDiqm7aaag3Kqe + EF0fGSUdZ+TYl9JM05+eIyiX+UY19Fg0OjTHMn8nGpxcNTfDBdQ68TKvdo/dtIKL + PLKzJUNNdM8odC4CvQtfGMqaslwZwXkiOl5VJcW21ncj/Y0ngEMKeD/i65ZoqGdR + 0FKCQYEAGtM2FvJcZQ92Wsw7yj2bK2MSegVUyLK32QKBgQDe8syVCepPzRsfjfxA + 6TZlWcGuTZLhwIx97Ktw3VcQ1f4rLoEYlv0xC2VWBORpzIsJo4I/OLmgp8a+Ga8z + FkVRnq90dV3t4NP9uJlHgcODHnOardC2UUka4olBSCG6zmK4Jxi34lOxhGRkshOo + L4IBeOIB5g+ZrEEXkzfYJHESRQKBgQDX2YhFhGIrT8BAnC5BbXbhm8h6Bhjz8DYL + d+qhVJjef7L/aJxViU0hX9Ba2O8CLK3FZeREFE3hJPiJ4TZSlN4evxs5p+bbNDcA + 0mhRI/o3X4ac6IxdRebyYnCOB/Cu94/MzppcZcotlCekKNike7eorCcX4Qavm7Pu + MUuQ+ifmSwKBgEnchoqZzlbBzMqXb4rRuIO7SL9GU/MWp3TQg7vQmJerTZlgvsQ2 + wYsOC3SECmhCq4117iCj2luvOdihCboTFsQDnn0mpQe6BIF6Ns3J38wAuqv0CcFd + DKsrge1uyD3rQilgSoAhKzkUc24o0PpXQurZ8YZPgbuXpbj5vPaOnCdBAoGACYc7 + wb3XS4wos3FxhUfcwJbM4b4VKeeHqzfu7pI6cU/3ydiHVitKcVe2bdw3qMPqI9Wc + nvi6e17Tbdq4OCsEJx1OiVwFD9YdO3cOTc6lw/3+hjypvZBRYo+/4jUthbu96E+S + dtOzehGZMmDvN0uSzupSi3ZOgkAAUFpyuIKickMCgYAId0PCRjonO2thn/R0rZ7P + //L852uyzYhXKw5/fjFGhQ6LbaLgIRFaCZ0L2809u0HFnNvJjHv4AKP6j+vFQYYY + qQ+66XnfsA9G/bu4MDS9AX83iahD9IdLXQAy8I19prAbpVumKegPbMnNYNB/TYEc + 3G15AKCXo7jjOUtHY01DCQ== + -----END PRIVATE KEY----- diff --git a/library/ix-dev/community/pgadmin/item.yaml b/library/ix-dev/community/pgadmin/item.yaml new file mode 100644 index 0000000000..23b2e6b10b --- /dev/null +++ b/library/ix-dev/community/pgadmin/item.yaml @@ -0,0 +1,10 @@ +icon_url: https://avatars.githubusercontent.com/u/113517144 +categories: + - productivity +screenshots: + - https://www.pgadmin.org/static/COMPILED/assets/img/screenshots/pgadmin4-dashboard.png + - https://www.pgadmin.org/static/COMPILED/assets/img/screenshots/pgadmin4-preferences.png + - https://www.pgadmin.org/static/COMPILED/assets/img/screenshots/pgadmin4-welcome-dark.png +tags: + - database + - management diff --git a/library/ix-dev/community/pgadmin/metadata.yaml b/library/ix-dev/community/pgadmin/metadata.yaml new file mode 100644 index 0000000000..4a34bf0783 --- /dev/null +++ b/library/ix-dev/community/pgadmin/metadata.yaml @@ -0,0 +1,10 @@ +runAsContext: + - userName: pgadmin + groupName: pgadmin + gid: 5050 + uid: 5050 + description: pgAdmin runs as a non-root user. +capabilities: + - name: NET_BIND_SERVICE + description: pgAdmin requires this ability to bind to privileged ports. +hostMounts: [] diff --git a/library/ix-dev/community/pgadmin/questions.yaml b/library/ix-dev/community/pgadmin/questions.yaml new file mode 100644 index 0000000000..7218517b87 --- /dev/null +++ b/library/ix-dev/community/pgadmin/questions.yaml @@ -0,0 +1,231 @@ +groups: + - name: pgAdmin Configuration + description: Configure pgAdmin + - name: Network Configuration + description: Configure Network for pgAdmin + - name: Storage Configuration + description: Configure Storage for pgAdmin + - name: Resources Configuration + description: Configure Resources for pgAdmin + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: pgadminConfig + label: "" + group: pgAdmin Configuration + schema: + type: dict + attrs: + - variable: adminEmail + label: Admin Email + description: The email address for the pgAdmin admin user. + schema: + type: string + required: true + default: "" + - variable: adminPassword + label: Admin Password + description: The password for the pgAdmin admin user. + schema: + type: string + required: true + private: true + default: "" + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for pgAdmin. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: pgadminNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the pgAdmin Web UI. + schema: + type: int + default: 30056 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + - variable: certificateID + label: Certificate + description: The certificate to use for pgAdmin + schema: + type: int + "null": true + $ref: + - "definitions/certificate" + + - variable: pgadminStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: pgAdmin Config Storage + description: The path to store pgAdmin Configuration. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "config" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for pgAdmin. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for pgAdmin. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for pgAdmin. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/library/ix-dev/community/pgadmin/templates/NOTES.txt b/library/ix-dev/community/pgadmin/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/pgadmin/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/pgadmin/templates/_persistence.tpl b/library/ix-dev/community/pgadmin/templates/_persistence.tpl new file mode 100644 index 0000000000..c56ee9f81a --- /dev/null +++ b/library/ix-dev/community/pgadmin/templates/_persistence.tpl @@ -0,0 +1,57 @@ +{{- define "pgadmin.persistence" -}} +persistence: + config: + enabled: true + type: {{ .Values.pgadminStorage.config.type }} + datasetName: {{ .Values.pgadminStorage.config.datasetName | default "" }} + hostPath: {{ .Values.pgadminStorage.config.hostPath | default "" }} + targetSelector: + pgadmin: + pgadmin: + mountPath: /var/lib/pgadmin + 01-permissions: + mountPath: /mnt/directories/pgadmin + tmp: + enabled: true + type: emptyDir + targetSelector: + pgadmin: + pgadmin: + mountPath: /tmp + {{- range $idx, $storage := .Values.pgadminStorage.additionalStorages }} + {{ printf "pgadmin-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + pgadmin: + pgadmin: + mountPath: {{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} + + {{- if .Values.pgadminNetwork.certificateID }} + cert: + enabled: true + type: secret + objectName: pgadmin-cert + defaultMode: "0600" + items: + - key: tls.key + path: server.key + - key: tls.crt + path: server.cert + targetSelector: + pgadmin: + pgadmin: + mountPath: /certs + readOnly: true + +scaleCertificate: + pgadmin-cert: + enabled: true + id: {{ .Values.pgadminNetwork.certificateID }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/pgadmin/templates/_pgadmin.tpl b/library/ix-dev/community/pgadmin/templates/_pgadmin.tpl new file mode 100644 index 0000000000..9126e8d053 --- /dev/null +++ b/library/ix-dev/community/pgadmin/templates/_pgadmin.tpl @@ -0,0 +1,64 @@ +{{- define "pgadmin.workload" -}} +workload: + pgadmin: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.pgadminNetwork.hostNetwork }} + securityContext: + fsGroup: 5050 + containers: + pgadmin: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 5050 + runAsGroup: 5050 + readOnlyRootFilesystem: false + capabilities: + add: + - NET_BIND_SERVICE + env: + PGADMIN_LISTEN_PORT: {{ .Values.pgadminNetwork.webPort }} + PGADMIN_DEFAULT_EMAIL: {{ .Values.pgadminConfig.adminEmail }} + PGADMIN_DEFAULT_PASSWORD: {{ .Values.pgadminConfig.adminPassword }} + PGADMIN_SERVER_JSON_FILE: /var/lib/pgadmin/servers/servers.json + {{ if .Values.pgadminNetwork.certificateID }} + PGADMIN_ENABLE_TLS: true + {{ end }} + {{ with .Values.pgadminConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + {{- $protocol := "http" -}} + {{- if .Values.pgadminNetwork.certificateID -}} + {{- $protocol = "https" -}} + {{- end }} + liveness: + enabled: true + type: {{ $protocol }} + port: "{{ .Values.pgadminNetwork.webPort }}" + path: /misc/ping + readiness: + enabled: true + type: {{ $protocol }} + port: "{{ .Values.pgadminNetwork.webPort }}" + path: /misc/ping + startup: + enabled: true + type: {{ $protocol }} + port: "{{ .Values.pgadminNetwork.webPort }}" + path: /misc/ping + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" 5050 + "GID" 5050 + "mode" "check" + "type" "init") | nindent 8 }} +{{- end -}} diff --git a/library/ix-dev/community/pgadmin/templates/_portal.tpl b/library/ix-dev/community/pgadmin/templates/_portal.tpl new file mode 100644 index 0000000000..db8aa2295f --- /dev/null +++ b/library/ix-dev/community/pgadmin/templates/_portal.tpl @@ -0,0 +1,16 @@ +{{- define "pgadmin.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + {{- $protocol := "http" -}} + {{- if .Values.pgadminNetwork.certificateID -}} + {{- $protocol = "https" -}} + {{- end }} + path: "/" + port: {{ .Values.pgadminNetwork.webPort | quote }} + protocol: {{ $protocol }} + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/pgadmin/templates/_service.tpl b/library/ix-dev/community/pgadmin/templates/_service.tpl new file mode 100644 index 0000000000..fde261daef --- /dev/null +++ b/library/ix-dev/community/pgadmin/templates/_service.tpl @@ -0,0 +1,15 @@ +{{- define "pgadmin.service" -}} +service: + pgadmin: + enabled: true + primary: true + type: NodePort + targetSelector: pgadmin + ports: + webui: + enabled: true + primary: true + port: {{ .Values.pgadminNetwork.webPort }} + nodePort: {{ .Values.pgadminNetwork.webPort }} + targetSelector: pgadmin +{{- end -}} diff --git a/library/ix-dev/community/pgadmin/templates/_validation.tpl b/library/ix-dev/community/pgadmin/templates/_validation.tpl new file mode 100644 index 0000000000..3f9dc46694 --- /dev/null +++ b/library/ix-dev/community/pgadmin/templates/_validation.tpl @@ -0,0 +1,8 @@ +{{- define "pgadmin.validation" -}} + {{- if not .Values.pgadminConfig.adminEmail -}} + {{- fail "pgAdmin - Admin Email is required" -}} + {{- end -}} + {{- if not .Values.pgadminConfig.adminPassword -}} + {{- fail "pgAdmin - Admin Password is required" -}} + {{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/pgadmin/templates/common.yaml b/library/ix-dev/community/pgadmin/templates/common.yaml new file mode 100644 index 0000000000..a7332d7538 --- /dev/null +++ b/library/ix-dev/community/pgadmin/templates/common.yaml @@ -0,0 +1,13 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{- include "pgadmin.validation" $ -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "pgadmin.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "pgadmin.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "pgadmin.persistence" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "pgadmin.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/pgadmin/upgrade_info.json b/library/ix-dev/community/pgadmin/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/pgadmin/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/pgadmin/upgrade_strategy b/library/ix-dev/community/pgadmin/upgrade_strategy new file mode 100755 index 0000000000..2fe85458b9 --- /dev/null +++ b/library/ix-dev/community/pgadmin/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/pgadmin/values.yaml b/library/ix-dev/community/pgadmin/values.yaml new file mode 100644 index 0000000000..aa3414d52e --- /dev/null +++ b/library/ix-dev/community/pgadmin/values.yaml @@ -0,0 +1,25 @@ +image: + repository: dpage/pgadmin4 + pullPolicy: IfNotPresent + tag: '7.4' + +resources: + limits: + cpu: 4000m + memory: 8Gi + +pgadminConfig: + adminEmail: '' + adminPassword: '' + additionalEnvs: [] + +pgadminNetwork: + webPort: 30056 + certificateID: null + hostNetwork: false + +pgadminStorage: + config: + type: ixVolume + datasetName: config + additionalStorages: []