From 4440f08ac07d421a0da13428fece04f6b986ae65 Mon Sep 17 00:00:00 2001 From: sagit <36596628+Sagit-chu@users.noreply.github.com> Date: Sat, 19 Mar 2022 18:07:58 +0800 Subject: [PATCH] feat(zerotier): Add zerotier (#2204) * add-zerotier * update * Update charts/incubator/zerotier/questions.yaml * Update charts/incubator/zerotier/questions.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update charts/incubator/zerotier/questions.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Co-authored-by: Kjeld Schouten-Lebbing Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> --- charts/incubator/zerotier/.helmignore | 26 ++ charts/incubator/zerotier/Chart.yaml | 29 ++ charts/incubator/zerotier/questions.yaml | 264 ++++++++++++++++++ .../incubator/zerotier/templates/common.yaml | 1 + charts/incubator/zerotier/values.yaml | 35 +++ docs/_static/img/appicons/zerotier.png | Bin 0 -> 20991 bytes docs/manual/default-ports.md | 1 + 7 files changed, 356 insertions(+) create mode 100644 charts/incubator/zerotier/.helmignore create mode 100644 charts/incubator/zerotier/Chart.yaml create mode 100644 charts/incubator/zerotier/questions.yaml create mode 100644 charts/incubator/zerotier/templates/common.yaml create mode 100644 charts/incubator/zerotier/values.yaml create mode 100644 docs/_static/img/appicons/zerotier.png diff --git a/charts/incubator/zerotier/.helmignore b/charts/incubator/zerotier/.helmignore new file mode 100644 index 00000000000..4379e2b3014 --- /dev/null +++ b/charts/incubator/zerotier/.helmignore @@ -0,0 +1,26 @@ +# 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 +# helm-docs templates +*.gotmpl diff --git a/charts/incubator/zerotier/Chart.yaml b/charts/incubator/zerotier/Chart.yaml new file mode 100644 index 00000000000..cc436220af2 --- /dev/null +++ b/charts/incubator/zerotier/Chart.yaml @@ -0,0 +1,29 @@ +apiVersion: v2 +kubeVersion: ">=1.16.0-0" +name: zerotier +version: 0.0.1 +appVersion: "2.2.0" +description: ZeroTier is a smart programmable Ethernet switch for planet Earth +type: application +deprecated: false +home: https://github.com/truecharts/apps/tree/master/charts/stable/zerotier +icon: https://truecharts.org/_static/img/appicons/zerotier.png +keywords: + - zerotier + - network +sources: + - https://hub.docker.com/r/zerotier/zerotier +dependencies: +- name: common + repository: https://truecharts.org + version: 9.1.6 + # condition: +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +annotations: + truecharts.org/catagories: | + - network + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/zerotier/questions.yaml b/charts/incubator/zerotier/questions.yaml new file mode 100644 index 00000000000..19e1cfda782 --- /dev/null +++ b/charts/incubator/zerotier/questions.yaml @@ -0,0 +1,264 @@ +# Include{groups} +portals: {} +questions: +# 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: "deployment" + 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: "Recreate" + 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: 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: 10190 + 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: "UDP" + 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: 9993 + + - 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: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + additional_attrs: true + type: dict + attrs: + - variable: config + label: "App Config Storage" + description: "Stores the Application Config." + schema: + additional_attrs: true + type: dict + 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: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# 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} +# 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: false +# 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: 0 + - 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/incubator/zerotier/templates/common.yaml b/charts/incubator/zerotier/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/incubator/zerotier/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/incubator/zerotier/values.yaml b/charts/incubator/zerotier/values.yaml new file mode 100644 index 00000000000..45d9afdb5f4 --- /dev/null +++ b/charts/incubator/zerotier/values.yaml @@ -0,0 +1,35 @@ +image: + repository: zerotier/zerotier + pullPolicy: IfNotPresent + tag: 1.8.4@sha256:b57e76e4291fbc26e1c75df07bc3534e9180457343c7ceff5d7ac8c4e25f6f44 + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + capabilities: + add: + - NET_ADMIN + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +service: + main: + ports: + main: + protocol: UDP + targetPort: 9993 + port: 10190 + +persistence: + config: + enabled: true + mountPath: "/var/lib/zerotier-one" + tun: + enabled: true + type: hostPath + hostPath: /dev/net/tun + mountPath: /dev/net/tun + hostPathType: "" + readOnly: false diff --git a/docs/_static/img/appicons/zerotier.png b/docs/_static/img/appicons/zerotier.png new file mode 100644 index 0000000000000000000000000000000000000000..634511f2e5be8006443059f36efb1a5147669a1a GIT binary patch literal 20991 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