From 0fc68c265e34db3346fe404fc195e5a8a2def352 Mon Sep 17 00:00:00 2001 From: sagit <36596628+Sagit-chu@users.noreply.github.com> Date: Mon, 28 Mar 2022 19:22:15 +0800 Subject: [PATCH] feat(mongodb): add-mongodb (#2307) * add-mongodb * fix secret * Update charts/dependency/mongodb/Chart.yaml * Update charts/dependency/mongodb/templates/secret.yaml * Update charts/dependency/mongodb/Chart.yaml * Update charts/dependency/mongodb/values.yaml * Update charts/dependency/mongodb/values.yaml * Update charts/dependency/mongodb/values.yaml * Update charts/dependency/mongodb/values.yaml * Update charts/dependency/mongodb/values.yaml * Update charts/dependency/mongodb/values.yaml * test probes * escape * test hardcoded 1st * hmm * again * different syntax * var * try different * revert * quit * try rootless? * adjust questions * Update charts/dependency/mongodb/values.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Co-authored-by: Kjeld Schouten-Lebbing --- charts/dependency/mongodb/.helmignore | 24 ++ charts/dependency/mongodb/Chart.yaml | 31 ++ charts/dependency/mongodb/questions.yaml | 303 ++++++++++++++++++ .../dependency/mongodb/templates/common.yaml | 1 + .../dependency/mongodb/templates/secret.yaml | 14 + charts/dependency/mongodb/values.yaml | 116 +++++++ docs/_static/img/appicons/mongodb.png | Bin 0 -> 22766 bytes docs/manual/default-ports.md | 1 + 8 files changed, 490 insertions(+) create mode 100644 charts/dependency/mongodb/.helmignore create mode 100644 charts/dependency/mongodb/Chart.yaml create mode 100644 charts/dependency/mongodb/questions.yaml create mode 100644 charts/dependency/mongodb/templates/common.yaml create mode 100644 charts/dependency/mongodb/templates/secret.yaml create mode 100644 charts/dependency/mongodb/values.yaml create mode 100644 docs/_static/img/appicons/mongodb.png diff --git a/charts/dependency/mongodb/.helmignore b/charts/dependency/mongodb/.helmignore new file mode 100644 index 00000000000..e559de0a012 --- /dev/null +++ b/charts/dependency/mongodb/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS diff --git a/charts/dependency/mongodb/Chart.yaml b/charts/dependency/mongodb/Chart.yaml new file mode 100644 index 00000000000..fd6d4c65c48 --- /dev/null +++ b/charts/dependency/mongodb/Chart.yaml @@ -0,0 +1,31 @@ +apiVersion: v2 +appVersion: "4.2.19" +dependencies: +- name: common + repository: https://library-charts.truecharts.org + version: 9.1.15 +deprecated: false +description: Fast, reliable, scalable, and easy to use open-source no-sql database system. +home: https://github.com/truecharts/apps/tree/master/stable/mongodb +icon: https://truecharts.org/_static/img/appicons/mongodb.png +keywords: + - mongodb + - database + - nosql +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: mongodb +sources: + - https://hub.docker.com/r/bitnami/mongodb + - https://github.com/bitnami/bitnami-docker-mongodb + - https://www.mongodb.com +type: application +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - database + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/dependency/mongodb/questions.yaml b/charts/dependency/mongodb/questions.yaml new file mode 100644 index 00000000000..474591b44a0 --- /dev/null +++ b/charts/dependency/mongodb/questions.yaml @@ -0,0 +1,303 @@ +# Include{groups} +questions: + - variable: portal + group: "Container Image" + label: "Configure Portal Button" + schema: + type: dict + hidden: true + attrs: + - variable: enabled + label: "Enable" + description: "enable the portal button" + schema: + hidden: true + editable: false + type: boolean + default: false +# Include{global} + - variable: controller + group: "Controller" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "statefulset" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "RollingUpdate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" +# Include{controllerExpert} + +# Include{containerConfig} + + - variable: mongodbDatabase + group: "App Configuration" + label: "Database Name" + schema: + type: string + default: "mydatabase" + required: true + - variable: mongodbUsername + group: "App Configuration" + label: "Database User" + schema: + type: string + default: "mydatabaseuser" + required: true + - variable: mongodbPassword + group: "App Configuration" + label: "Database Password" + schema: + type: string + default: "" + required: true + + - variable: service + group: "Networking and Services" + label: "Configure Service(s)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + additional_attrs: true + type: dict + attrs: +# Include{serviceSelector} + - variable: main + label: "Main Service Port Configuration" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 27017 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: protocol + label: "Port Type" + schema: + type: string + default: "TCP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 27017 + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + +# Include{serviceExpert} + +# Include{serviceList} + + - variable: volumeClaimTemplates + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + additional_attrs: true + type: dict + attrs: + - variable: data + label: "DB Storage" + description: "Stores the old Application Database." + schema: + type: dict + hidden: true + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "pvc" + description: "pvc" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} + - variable: mountPath + label: "mountPath (Non-editable)" + description: "Path inside the container the storage is mounted" + schema: + type: string + default: "/bitnami/mariadb" + editable: false + valid_chars: '^\/([a-zA-Z0-9._-]+(\s?[a-zA-Z0-9._-]+|\/?))+$' + +# Include{persistenceList} + +# Include{ingressList} + +# Include{security} + + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: true +# Include{securityContextAdvanced} + + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 568 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 0 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/dependency/mongodb/templates/common.yaml b/charts/dependency/mongodb/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/dependency/mongodb/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/dependency/mongodb/templates/secret.yaml b/charts/dependency/mongodb/templates/secret.yaml new file mode 100644 index 00000000000..c36531b5dbe --- /dev/null +++ b/charts/dependency/mongodb/templates/secret.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "common.labels" . | nindent 4 }} + annotations: + {{- with .Values.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +type: Opaque +data: + mongodb-password: {{ ( .Values.mongodbPassword | default "empty" ) | b64enc | quote }} + mongodb-root-password: {{ ( .Values.mongodbRootPassword | default "empty" ) | b64enc | quote }} diff --git a/charts/dependency/mongodb/values.yaml b/charts/dependency/mongodb/values.yaml new file mode 100644 index 00000000000..780ae1099ad --- /dev/null +++ b/charts/dependency/mongodb/values.yaml @@ -0,0 +1,116 @@ +image: + repository: bitnami/mongodb + pullPolicy: IfNotPresent + tag: 4.4.13@sha256:c78b3d35adaae2efe74aa75be9ca31a9825bf43fd88ae50a674d8cf9915f4a45 + +controller: + # -- Set the controller type. + # Valid options are deployment, daemonset or statefulset + type: statefulset + # -- Number of desired pods + replicas: 1 + # -- Set the controller upgrade strategy + # For Deployments, valid values are Recreate (default) and RollingUpdate. + # For StatefulSets, valid values are OnDelete and RollingUpdate (default). + # DaemonSets ignore this. + strategy: RollingUpdate + rollingUpdate: + # -- Set deployment RollingUpdate max unavailable + unavailable: 1 + # -- Set deployment RollingUpdate max surge + surge: + # -- Set statefulset RollingUpdate partition + partition: + # -- ReplicaSet revision history limit + revisionHistoryLimit: 3 + +service: + main: + ports: + main: + port: 27017 + targetPort: 27017 + +securityContext: + readOnlyRootFilesystem: false + +podSecurityContext: + runAsGroup: 0 + +volumeClaimTemplates: + data: + enabled: true + mountPath: "/bitnami/mongodb" + +# -- Probe configuration +# -- [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) +# @default -- See below +probes: + # -- Liveness probe configuration + # @default -- See below + liveness: + # -- Enable the liveness probe + enabled: true + # -- Set this to `true` if you wish to specify your own livenessProbe + custom: true + # -- The spec field contains the values for the default livenessProbe. + # If you selected `custom: true`, this field holds the definition of the livenessProbe. + # @default -- See below + spec: + exec: + command: + - /bin/bash + - -ec + - echo "db.runCommand(\"ping\").ok" | mongo --host localhost --port 27017 ${MONGODB_DATABASE} --quiet + + # -- Redainess probe configuration + # @default -- See below + readiness: + # -- Enable the readiness probe + enabled: true + # -- Set this to `true` if you wish to specify your own readinessProbe + custom: true + # -- The spec field contains the values for the default readinessProbe. + # If you selected `custom: true`, this field holds the definition of the readinessProbe. + # @default -- See below + spec: + exec: + command: + - /bin/bash + - -ec + - echo "db.runCommand(\"ping\").ok" | mongo --host localhost --port 27017 ${MONGODB_DATABASE} --quiet + # -- Startup probe configuration + # @default -- See below + startup: + # -- Enable the startup probe + enabled: true + custom: true + # -- The spec field contains the values for the default livenessProbe. + # If you selected `custom: true`, this field holds the definition of the livenessProbe. + # @default -- See below + spec: + exec: + command: + - /bin/bash + - -ec + - echo "db.runCommand(\"ping\").ok" | mongo --host localhost --port 27017 ${MONGODB_DATABASE} --quiet + +mongodbPassword: "testpass" +mongodbUsername: "test" +mongodbDatabase: "test" +mongodbRootPassword: "testroot" +existingSecret: "" + +envValueFrom: + MONGODB_PASSWORD: + secretKeyRef: + name: '{{ ( tpl .Values.existingSecret $ ) | default ( include "common.names.fullname" . ) }}' + key: "mongodb-password" + MONGODB_ROOT_PASSWORD: + secretKeyRef: + name: '{{ ( tpl .Values.existingSecret $ ) | default ( include "common.names.fullname" . ) }}' + key: "mongodb-root-password" + +env: + MONGODB_USERNAME: "{{ .Values.mongodbUsername }}" + MONGODB_DATABASE: "{{ .Values.mongodbDatabase }}" diff --git a/docs/_static/img/appicons/mongodb.png b/docs/_static/img/appicons/mongodb.png new file mode 100644 index 0000000000000000000000000000000000000000..e39c991ec51909a70bbb3cdf06098e139d4985ea GIT binary patch literal 22766 zcmXtAby!qQ7gv-HX+%OwR=Nb1MkHKfk(QPcB$sXwSVUS%K$ezH=|+|oWl8Do?ym3h zy}110^UT~kbLQ0iPF#cEK;`gpp5WZOcMl)(T3Yqqy@$|y_wJKpVE`j;V*@{ce=v*{ zgA4}Dm8ss}(?1-l)f#bYo-@$B zydTGeOn>}E0z#<%<{>HR{kSwN|B%V2kr?&IgOY(h=0-v*z@E_&m>PWDn0hHYSKDy`T|8c%Zwc$T<7Jm5O*u9_J z1{#&`_J2{&ea|-twQO8ieSA0bT*#_X4)>YhZ^mzj)i<*89I`ieGm`Fk`2iS&O6L=P zPK0-3u`%CtbVC`-KM_I?ZzxI>h+y)c$%X ztB05LO1@aL6O{J$4jn-Kx7@wir~J+qpE4l6BJhZR=W5O!670|D*rbNXjOnC}g%M!h zJuI=hdR;^Q!l36Ru#Q@0Z%VL}=-pJ!A2{~YA*l{Ap%CV)tzwH<9shslxTi @COy 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