split gcs and roscore in ros-core chart

Change-Id: I9453d5bea8de8f04d71663aff77f108c2f386b5c
diff --git a/apps/ros-core/Chart.yaml b/apps/ros-core/Chart.yaml
index 4444a62..ada44be 100644
--- a/apps/ros-core/Chart.yaml
+++ b/apps/ros-core/Chart.yaml
@@ -5,6 +5,6 @@
 apiVersion: v1
 description: ROS-Core chart for Drone use-case
 name: ros-core
-icon: https://guide.opencord.org/logos/cord.svg
+icon: https://www.ros.org/wp-content/uploads/2013/10/rosorg-logo1.png
 
-version: 0.1.2
+version: 0.1.3
diff --git a/apps/ros-core/templates/_helpers.tpl b/apps/ros-core/templates/_helpers.tpl
index 706bdf7..c7d4731 100644
--- a/apps/ros-core/templates/_helpers.tpl
+++ b/apps/ros-core/templates/_helpers.tpl
@@ -26,3 +26,70 @@
 {{- $wtf := $context.Template.Name | replace $last $name -}}
 {{ include $wtf $context }}
 {{- end -}}
+
+{{/*
+Render ServiceAccount, Role, and RoleBinding required for kubernetes-entrypoint.
+*/}}
+{{- define "ros-core.service_account" -}}
+{{- $context := index . 1 -}}
+{{- $saName := index . 0 -}}
+{{- $saNamespace := $context.Release.Namespace }}
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ $saName }}
+  namespace: {{ $saNamespace }}
+  labels:
+{{ tuple $saName $context | include "ros-core.metadata_labels" | indent 4 }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: RoleBinding
+metadata:
+  name: {{ $saName }}
+  namespace: {{ $saNamespace }}
+  labels:
+{{ tuple $saName $context | include "ros-core.metadata_labels" | indent 4 }}
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: {{ $saName }}
+subjects:
+  - kind: ServiceAccount
+    name: {{ $saName }}
+    namespace: {{ $saNamespace }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: Role
+metadata:
+  name: {{ $saName }}
+  namespace: {{ $saNamespace }}
+  labels:
+{{ tuple $saName $context | include "ros-core.metadata_labels" | indent 4 }}
+rules:
+  - apiGroups:
+      - ""
+      - extensions
+      - batch
+      - apps
+    verbs:
+      - get
+      - list
+      - patch
+    resources:
+      - statefulsets
+      - daemonsets
+      - jobs
+      - pods
+      - services
+      - endpoints
+      - configmaps
+{{- end -}}
\ No newline at end of file
diff --git a/apps/ros-core/templates/bin/_net_listener.tpl b/apps/ros-core/templates/bin/_net_listener.py.tpl
similarity index 100%
rename from apps/ros-core/templates/bin/_net_listener.tpl
rename to apps/ros-core/templates/bin/_net_listener.py.tpl
diff --git a/apps/ros-core/templates/bin/_run_gcs.sh.tpl b/apps/ros-core/templates/bin/_run_gcs.sh.tpl
new file mode 100644
index 0000000..a85b059
--- /dev/null
+++ b/apps/ros-core/templates/bin/_run_gcs.sh.tpl
@@ -0,0 +1,13 @@
+#!/bin/bash
+# Copyright 2021-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -ex
+
+{{ if .Values.config.rosCore.debug }}
+while true; do sleep 3600; done;
+{{ else }}
+cd /root/TrajBridge-PX4;
+source devel/setup.bash; roslaunch bridge_px4 gcs.launch
+{{ end }}
diff --git a/apps/ros-core/templates/bin/_run_roscore.sh.tpl b/apps/ros-core/templates/bin/_run_roscore.sh.tpl
index 54eff77..b937b4a 100644
--- a/apps/ros-core/templates/bin/_run_roscore.sh.tpl
+++ b/apps/ros-core/templates/bin/_run_roscore.sh.tpl
@@ -8,5 +8,6 @@
 {{ if .Values.config.rosCore.debug }}
 while true; do sleep 3600; done;
 {{ else }}
-source /opt/ros/melodic/setup.bash && roscore;
+cd /root/TrajBridge-PX4;
+source devel/setup.bash; roslaunch bridge_px4 core.launch
 {{ end }}
diff --git a/apps/ros-core/templates/configmap-gcs.yaml b/apps/ros-core/templates/configmap-gcs.yaml
new file mode 100644
index 0000000..594e1b2
--- /dev/null
+++ b/apps/ros-core/templates/configmap-gcs.yaml
@@ -0,0 +1,40 @@
+# Copyright 2021-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: gcs
+  labels:
+{{ tuple "gcs" . | include "ros-core.metadata_labels" | indent 4 }}
+data:
+  run_gcs.sh: |
+{{ tuple "bin/_run_gcs.sh.tpl" . | include "ros-core.template" | indent 4 }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: gcs-launch
+  labels:
+{{ tuple "gcs-launch" . | include "ros-core.metadata_labels" | indent 4 }}
+data:
+{{- range $key, $value := .Values.config.gcs.launchFiles }}
+  {{ $key }}: |-
+{{ $value | indent 4 }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: gcs-trajectory
+  labels:
+{{ tuple "gcs-trajectory" . | include "ros-core.metadata_labels" | indent 4 }}
+data:
+{{- range $key, $value := .Values.config.gcs.trajectoryFiles }}
+  {{ $key }}: |-
+{{ $value | indent 4 }}
+{{- end }}
\ No newline at end of file
diff --git a/apps/ros-core/templates/configmap-roscore.yaml b/apps/ros-core/templates/configmap-roscore.yaml
index 5a7680f..ea74bcf 100644
--- a/apps/ros-core/templates/configmap-roscore.yaml
+++ b/apps/ros-core/templates/configmap-roscore.yaml
@@ -13,4 +13,17 @@
   run_roscore.sh: |
 {{ tuple "bin/_run_roscore.sh.tpl" . | include "ros-core.template" | indent 4 }}
   net_listener.py: |
-{{ tuple "bin/_net_listener.tpl" . | include "ros-core.template" | indent 4 }}
+{{ tuple "bin/_net_listener.py.tpl" . | include "ros-core.template" | indent 4 }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: ros-core-launch
+  labels:
+{{ tuple "ros-core-launch" . | include "ros-core.metadata_labels" | indent 4 }}
+data:
+{{- range $key, $value := .Values.config.rosCore.launchFiles }}
+  {{ $key }}: |-
+{{ $value | indent 4 }}
+{{- end }}
\ No newline at end of file
diff --git a/apps/ros-core/templates/statefulset-gcs.yaml b/apps/ros-core/templates/statefulset-gcs.yaml
new file mode 100644
index 0000000..ff80453
--- /dev/null
+++ b/apps/ros-core/templates/statefulset-gcs.yaml
@@ -0,0 +1,96 @@
+# Copyright 2021-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+{{ tuple "gcs" . | include "ros-core.service_account" }}
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: gcs
+  labels:
+{{ tuple "gcs" . | include "ros-core.metadata_labels" | indent 4 }}
+spec:
+  replicas: 1
+  serviceName: gcs
+  selector:
+    matchLabels:
+{{ tuple "gcs" . | include "ros-core.metadata_labels" | indent 6 }}
+  template:
+    metadata:
+      labels:
+{{ tuple "gcs" . | include "ros-core.metadata_labels" | indent 8 }}
+    spec:
+  {{- if .Values.nodeSelector.enabled }}
+      nodeSelector:
+        {{ .Values.nodeSelector.gcs.label }}: {{ .Values.nodeSelector.gcs.value }}
+  {{- end }}
+      serviceAccountName: gcs
+  {{- if .Values.networks.hostNetwork }}
+      hostNetwork: true
+      dnsPolicy: None
+      dnsConfig:
+        nameservers:
+          - {{ .Values.coredns.service.clusterIP }}
+  {{- end }}
+      initContainers:
+      - name: gcs-dep-check
+        image: {{ .Values.images.tags.depCheck }}
+        imagePullPolicy: {{ .Values.images.pullPolicy }}
+        securityContext:
+          allowPrivilegeEscalation: false
+          readOnlyRootFilesystem: false
+          runAsUser: 0
+        env:
+          - name: POD_NAME
+            valueFrom:
+              fieldRef:
+                apiVersion: v1
+                fieldPath: metadata.name
+          - name: NAMESPACE
+            valueFrom:
+              fieldRef:
+                apiVersion: v1
+                fieldPath: metadata.namespace
+          - name: PATH
+            value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/
+          - name: COMMAND
+            value: "echo done"
+          - name: DEPENDENCY_POD_JSON
+            value: '[{"labels": {"app": "ros-core"}, "requireSameNode": false}]'
+          # add dependency job for make_certs.sh
+        command:
+          - kubernetes-entrypoint
+        volumeMounts:
+          []
+      containers:
+      - name: gcs
+        image: {{ .Values.images.tags.rosCore }}
+        imagePullPolicy: {{ .Values.images.pullPolicy }}
+        securityContext:
+          privileged: true
+        stdin: true
+        tty: true
+        command:
+        - /root/run_gcs.sh
+        volumeMounts:
+        - name: gcs
+          mountPath: /root/run_gcs.sh
+          subPath: run_gcs.sh
+        - name: gcs-launch
+          mountPath: /root/TrajBridge-PX4/src/bridge_px4/launch
+        - name: gcs-trajectory
+          mountPath: /root/TrajBridge-PX4/src/bridge_px4/trajectories
+      volumes:
+        - name: gcs
+          configMap:
+            name: gcs
+            defaultMode: 493
+        - name: gcs-launch
+          configMap:
+            name: gcs-launch
+            defaultMode: 420
+        - name: gcs-trajectory
+          configMap:
+            name: gcs-trajectory
+            defaultMode: 420
diff --git a/apps/ros-core/templates/statefulset-roscore.yaml b/apps/ros-core/templates/statefulset-roscore.yaml
index 28cb41a..2e88aca 100644
--- a/apps/ros-core/templates/statefulset-roscore.yaml
+++ b/apps/ros-core/templates/statefulset-roscore.yaml
@@ -2,6 +2,7 @@
 #
 # SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
 
+{{ tuple "ros-core" . | include "ros-core.service_account" }}
 ---
 apiVersion: apps/v1
 kind: StatefulSet
@@ -24,6 +25,7 @@
       nodeSelector:
         {{ .Values.nodeSelector.rosCore.label }}: {{ .Values.nodeSelector.rosCore.value }}
   {{- end }}
+      serviceAccountName: ros-core
   {{- if .Values.networks.hostNetwork }}
       hostNetwork: true
       dnsPolicy: None
@@ -45,6 +47,8 @@
         - name: ros-core
           mountPath: /root/run_roscore.sh
           subPath: run_roscore.sh
+        - name: ros-core-launch
+          mountPath: /root/TrajBridge-PX4/src/bridge_px4/launch
       - name: drone-net-listener
         image: {{ .Values.images.tags.droneNetListener }}
         imagePullPolicy: {{ .Values.images.pullPolicy }}
@@ -62,3 +66,7 @@
           configMap:
             name: ros-core
             defaultMode: 493
+        - name: ros-core-launch
+          configMap:
+            name: ros-core-launch
+            defaultMode: 420
diff --git a/apps/ros-core/values.yaml b/apps/ros-core/values.yaml
index 8b73ea6..6bd00ac 100644
--- a/apps/ros-core/values.yaml
+++ b/apps/ros-core/values.yaml
@@ -4,8 +4,9 @@
 
 images:
   tags:
-    rosCore: docker.io/ros:melodic
+    rosCore: docker.io/drone-ros:0.0.1-debug
     droneNetListener: docker.io/ros:melodic
+    depCheck: quay.io/stackanetes/kubernetes-entrypoint:v0.3.1
   pullPolicy: IfNotPresent
 
 nodeSelector:
@@ -13,6 +14,12 @@
   rosCore:
     label: drone-ros-core
     value: enabled
+  gcs:
+    label: drone-ros-core
+    value: enabled
+  console:
+    label: drone-ros-core
+    value: enabled
 
 resources:
   enabled: false
@@ -20,6 +27,86 @@
 config:
   rosCore:
     debug: false
+    launchFiles:
+      core.launch: |
+        <launch>
+          <arg name="server" default="mocap.local"/>
+          <node pkg="vrpn_client_ros" type="vrpn_client_node" name="vrpn_client_node" output="screen">
+            <rosparam subst_value="true">
+              server: $(arg server)
+              port: 3883
+              update_frequency: 100.0
+              frame_id: world
+              use_server_time: false
+              broadcast_tf: true
+              refresh_tracker_frequency: 1.0
+            </rosparam>
+            <remap from="/vrpn_client_node/drone1/pose" to="drone1/mavros/vision_pose/pose" />
+            <remap from="/vrpn_client_node/drone2/pose" to="drone2/mavros/vision_pose/pose" />
+            <remap from="/vrpn_client_node/drone3/pose" to="drone3/mavros/vision_pose/pose" />
+            </node>
+        </launch>
+  gcs:
+    debug: false
+    launchFiles:
+      gcs.launch: |
+        <launch>
+           <arg name="traj_drone1" default="$(find bridge_px4)/trajectories/ysmrr1.csv"/>
+           <arg name="traj_drone2" default="$(find bridge_px4)/trajectories/ysmrr2.csv"/>
+           <arg name="traj_drone3" default="$(find bridge_px4)/trajectories/line.csv"/>
+           <group ns="drone1">
+                <node pkg="bridge_px4" type="sp_pos_t_node" name ="sp_pos_t_node" output="screen">
+                   <param name="traj_id" value="$(arg traj_drone1)"/>
+                </node>
+           </group>
+           <group ns="drone2">
+                <node pkg="bridge_px4" type="sp_pos_t_node" name ="sp_pos_t_node" output="screen">
+                   <param name="traj_id" value="$(arg traj_drone2)"/>
+                </node>
+           </group>
+           <group ns="drone3">
+                <node pkg="bridge_px4" type="sp_pos_t_node" name ="sp_pos_t_node" output="screen">
+                   <param name="traj_id" value="$(arg traj_drone3)"/>
+                </node>
+           </group>
+        </launch>
+    trajectoryFiles:
+      square1.csv: |
+        2.00,3.00,6.00,9.00,12.00,15.00,18.00,21.00,24.00,27.00
+        1.00,1.00,1.00,1.00,3.00,3.00,3.00,3.00,1.00,1.00
+        -1.00,-1.00,1.00,1.00,1.00,1.00,-1.00,-1.00,-1.00,-1.00
+        1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00
+        0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00
+      square2.csv: |
+        2.00,3.00,6.00,9.00,12.00,15.00,18.00,21.00,24.00,27.00
+        -1.00,-1.00,-1.00,-1.00,-3.00,-3.00,-3.00,-3.00,-1.00,-1.00
+        1.00,1.00,-1.00,-1.00,-1.00,-1.00,1.00,1.00,1.00,1.00
+        1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00
+        0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00
+      ysmrr1.csv: |
+        2.00,3.00,4.00,5.00,6.00,6.50,7.00,7.50,8.00,8.50,9.00,9.50,10.00,15.00,20.00
+        1.00,1.00,3.00,3.00,3.00,3.00,3.00,3.00,3.00,3.00,3.00,3.00,3.00,1.00,1.00
+        0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00
+        1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50
+        0.00,0.00,0.00,0.00,0.00,0.40,0.80,1.20,1.60,2.00,2.40,2.80,3.20,3.20,3.20
+      ysmrr2.csv: |
+        2.00,3.00,4.00,5.00,6.00,6.50,7.00,7.50,8.00,8.50,9.00,9.50,10.00,15.00,20.00
+        -1.00,-1.00,-3.00,-3.00,-3.00,-3.00,-3.00,-3.00,-3.00,-3.00,-3.00,-3.00,-3.00,-1.00,-1.00
+        0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00
+        1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50,1.50
+        0.00,0.00,0.00,0.00,0.00,0.40,0.80,1.20,1.60,2.00,2.40,2.80,3.20,3.20,3.20
+      line.csv: |
+        3.00,6.00,9.00
+        0.00,1.00,1.00
+        0.00,0.00,0.00
+        1.00,1.00,1.00
+        0.00,0.00,0.00
+      orbit.csv: |
+        3.00,7.00,8.10,9.20,10.30,11.40,12.50,13.60,14.70,15.80,16.90,18.00,21.00
+        0.00,-0.50,-0.21,0.54,1.46,2.21,2.50,2.21,1.46,0.54,-0.21,-0.50,-0.50
+        0.00,1.00,0.12,-0.43,-0.43,0.12,1.00,1.88,2.43,2.43,1.88,1.00,1.00
+        1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,0.00
+        0.00,0.00,0.63,1.26,1.88,2.51,3.14,3.77,4.40,5.03,5.65,6.28,6.28
   droneNetListener:
     port: 58080
 
@@ -59,5 +146,8 @@
     - name: ready
     - name: hosts
       configBlock: |-
-        192.168.251.4 aah.local
-        10.250.255.234 spirit-of-adventure.local
\ No newline at end of file
+        10.250.255.1 drone1.local
+        10.250.255.2 drone2.local
+        10.250.255.3 drone3.local
+        10.64.5.35 mocap.local
+        10.64.4.139 node2.local
\ No newline at end of file