Add initial ROS core chart for drone demo

Change-Id: I065c9640a1d965e53b8a691413d59a41c278dece
diff --git a/apps/ros-core/templates/_helpers.tpl b/apps/ros-core/templates/_helpers.tpl
new file mode 100644
index 0000000..706bdf7
--- /dev/null
+++ b/apps/ros-core/templates/_helpers.tpl
@@ -0,0 +1,28 @@
+{{- /*
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+{{/*
+Renders a set of standardised labels.
+*/}}
+{{- define "ros-core.metadata_labels" -}}
+{{- $application := index . 0 -}}
+{{- $context := index . 1 -}}
+release: {{ $context.Release.Name }}
+app: {{ $application }}
+{{- end -}}
+
+{{/*
+Render the given template.
+*/}}
+{{- define "ros-core.template" -}}
+{{- $name := index . 0 -}}
+{{- $context := index . 1 -}}
+{{- $last := base $context.Template.Name }}
+{{- $wtf := $context.Template.Name | replace $last $name -}}
+{{ include $wtf $context }}
+{{- end -}}
diff --git a/apps/ros-core/templates/bin/_run_roscore.sh.tpl b/apps/ros-core/templates/bin/_run_roscore.sh.tpl
new file mode 100644
index 0000000..66b3402
--- /dev/null
+++ b/apps/ros-core/templates/bin/_run_roscore.sh.tpl
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Copyright 2021-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -ex
+
+{{- range .Values.config.rosCore.droneList }}
+echo "{{ .ipAddr }} {{ .domain }}" >> /etc/hosts
+{{- end }}
+
+{{ if .Values.config.rosCore.debug }}
+while true; do sleep 3600; done;
+{{ else }}
+source /opt/ros/melodic/setup.bash && roscore;
+{{ end }}
diff --git a/apps/ros-core/templates/configmap-roscore.yaml b/apps/ros-core/templates/configmap-roscore.yaml
new file mode 100644
index 0000000..a2cfa8f
--- /dev/null
+++ b/apps/ros-core/templates/configmap-roscore.yaml
@@ -0,0 +1,14 @@
+# Copyright 2021-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: ros-core
+  labels:
+{{ tuple "ros-core" . | include "ros-core.metadata_labels" | indent 4 }}
+data:
+  run_roscore.sh: |
+{{ tuple "bin/_run_roscore.sh.tpl" . | include "ros-core.template" | indent 4 }}
diff --git a/apps/ros-core/templates/statefulset-roscore.yaml b/apps/ros-core/templates/statefulset-roscore.yaml
new file mode 100644
index 0000000..85dacfb
--- /dev/null
+++ b/apps/ros-core/templates/statefulset-roscore.yaml
@@ -0,0 +1,40 @@
+# Copyright 2021-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: ros-core
+  labels:
+{{ tuple "ros-core" . | include "ros-core.metadata_labels" | indent 4 }}
+spec:
+  replicas: 1
+  serviceName: ros-core
+  selector:
+    matchLabels:
+{{ tuple "ros-core" . | include "ros-core.metadata_labels" | indent 6 }}
+  template:
+    metadata:
+      labels:
+{{ tuple "ros-core" . | include "ros-core.metadata_labels" | indent 8 }}
+    spec:
+      hostNetwork: true
+      containers:
+      - name: ros-core
+        image: {{ .Values.images.tags.rosCore }}
+        imagePullPolicy: {{ .Values.images.pullPolicy }}
+        securityContext:
+          privileged: true
+        command:
+        - /root/run_roscore.sh
+        volumeMounts:
+        - name: ros-core
+          mountPath: /root/run_roscore.sh
+          subPath: run_roscore.sh
+      volumes:
+        - name: ros-core
+          configMap:
+            name: ros-core
+            defaultMode: 493