diff --git a/charts/incubator/openhab/.helmignore b/charts/incubator/openhab/.helmignore
new file mode 100644
index 00000000000..e559de0a012
--- /dev/null
+++ b/charts/incubator/openhab/.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/incubator/openhab/Chart.yaml b/charts/incubator/openhab/Chart.yaml
new file mode 100644
index 00000000000..d1ad265fb29
--- /dev/null
+++ b/charts/incubator/openhab/Chart.yaml
@@ -0,0 +1,28 @@
+apiVersion: v2
+appVersion: "0.20.636"
+dependencies:
+- name: common
+ repository: https://truecharts.org
+ version: 9.0.0
+deprecated: false
+description: OpenHab is a home-automation application
+home: https://github.com/truecharts/apps/tree/master/charts/stable/openhab
+icon: https://truecharts.org/_static/img/appicons/openhab-icon.png
+keywords:
+- openhab
+kubeVersion: '>=1.16.0-0'
+maintainers:
+- email: info@truecharts.org
+ name: TrueCharts
+ url: https://truecharts.org
+name: openhab
+sources:
+- https://hub.docker.com/r/openhab/openhab
+type: application
+version: 0.0.1
+annotations:
+ truecharts.org/catagories: |
+ - media
+ - test
+ truecharts.org/SCALE-support: "true"
+ truecharts.org/grade: U
diff --git a/charts/incubator/openhab/questions.yaml b/charts/incubator/openhab/questions.yaml
new file mode 100644
index 00000000000..9916a57387d
--- /dev/null
+++ b/charts/incubator/openhab/questions.yaml
@@ -0,0 +1,462 @@
+# Include{groups}
+portals:
+ open:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+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: true
+# 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: 10169
+ required: true
+ - variable: advanced
+ label: "Show Advanced settings"
+ schema:
+ type: boolean
+ default: false
+ show_subquestions_if: true
+ subquestions:
+ - variable: enabled
+ label: "Enable the port"
+ schema:
+ type: boolean
+ default: true
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ 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: 10169
+ - variable: https
+ label: "https Service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ additional_attrs: true
+ type: dict
+ attrs:
+# Include{serviceSelector}
+ - variable: https
+ label: "https 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: 10170
+ required: true
+ - variable: advanced
+ label: "Show Advanced settings"
+ schema:
+ type: boolean
+ default: false
+ show_subquestions_if: true
+ subquestions:
+ - variable: enabled
+ label: "Enable the port"
+ schema:
+ type: boolean
+ default: true
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ 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: 10170
+
+
+ - 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 Configuration."
+ 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}
+ - variable: addons
+ label: "App addons Storage"
+ description: "Stores the Application addons."
+ 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}
+ - variable: userdata
+ label: "App userdata Storage"
+ description: "Stores the Application userdata."
+ 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}
+
+ - variable: ingress
+ label: ""
+ group: "Ingress"
+ schema:
+ additional_attrs: true
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main Ingress"
+ schema:
+ additional_attrs: true
+ type: dict
+ attrs:
+# Include{ingressDefault}
+
+# Include{ingressTLS}
+
+# Include{ingressTraefik}
+
+# Include{ingressExpert}
+
+# 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: 568
+ - 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/openhab/templates/_configmap.tpl b/charts/incubator/openhab/templates/_configmap.tpl
new file mode 100644
index 00000000000..2371d9538cb
--- /dev/null
+++ b/charts/incubator/openhab/templates/_configmap.tpl
@@ -0,0 +1,14 @@
+{{/* Append the hardcoded volumes */}}
+{{- define "openhab.configmap" -}}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "common.names.fullname" . }}-init
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+data:
+ enable-console-logging.sh: |
+ echo 'Enabling console logging.'
+ sed -i -E 's|().*|\1|' /openhab/userdata/etc/log4j2.xml
+{{- end -}}
diff --git a/charts/incubator/openhab/templates/common.yaml b/charts/incubator/openhab/templates/common.yaml
new file mode 100644
index 00000000000..1b4c06f5949
--- /dev/null
+++ b/charts/incubator/openhab/templates/common.yaml
@@ -0,0 +1,22 @@
+{{/* Make sure all variables are set properly */}}
+{{- include "common.setup" . }}
+
+{{/* Render configmap for openhab */}}
+{{- include "openhab.configmap" . }}
+
+{{/* Append the hardcoded volumes */}}
+{{- define "openhab.hardcodedValues" -}}
+persistence:
+ init:
+ enabled: true
+ mountPath: /etc/cont-init.d/enable-console-logging.sh
+ subPath: enable-console-logging.sh
+ type: custom
+ volumeSpec:
+ configMap:
+ name: {{ printf "%v-init" (include "common.names.fullname" .) }}
+{{- end -}}
+{{- $_ := mergeOverwrite .Values (include "openhab.hardcodedValues" . | fromYaml) -}}
+
+{{/* Render the templates */}}
+{{ include "common.postSetup" . }}
diff --git a/charts/incubator/openhab/values.yaml b/charts/incubator/openhab/values.yaml
new file mode 100644
index 00000000000..3879542d536
--- /dev/null
+++ b/charts/incubator/openhab/values.yaml
@@ -0,0 +1,42 @@
+image:
+ repository: tccr.io/truecharts/openhab
+ pullPolicy: IfNotPresent
+ tag: v3.2.0@sha256:813f937332689854c808142b0b8af38edeed276e1c5a07bf4c77cb76ea6e7e61
+
+service:
+ main:
+ protocol: HTTP
+ ports:
+ main:
+ port: 10169
+ https:
+ protocol: HTTPS
+ enabled: true
+ ports:
+ https:
+ enabled: true
+ port: 10170
+
+securityContext:
+ readOnlyRootFilesystem: false
+ runAsNonRoot: false
+
+podSecurityContext:
+ runAsUser: 0
+ runAsGroup: 0
+
+env:
+ OPENHAB_HTTP_PORT: "{{ .Values.service.main.ports.main.port }}"
+ OPENHAB_HTTPS_PORT: "{{ .Values.service.https.ports.https.port }}"
+
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/openhab/conf"
+ addons:
+ enabled: true
+ mountPath: "/openhab/addons"
+ userdata:
+ enabled: true
+ mountPath: "/openhab/userdata"
diff --git a/docs/manual/default-ports.md b/docs/manual/default-ports.md
index 084480f5f7f..9ebba4491ac 100644
--- a/docs/manual/default-ports.md
+++ b/docs/manual/default-ports.md
@@ -326,6 +326,8 @@ These defaults can of course be changed, but as we guarantee "sane, working defa
| ghost | main | main | 10166 | TCP | |
| alist | main | main | 10167 | TCP | |
| ddns-go | main | main | 10168 | TCP | |
+| OpenHAB | main | main | 10169 | HTTP | |
+| OpenHAB | main | main | 10170 | HTTPS | |
| satisfactory | beacon | beacon | 15000 | UDP | |
| satisfactory | query | query | 15777 | UDP | |
| minecraft-bedrock | main | main | 19132 | UDP | |