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