summaryrefslogtreecommitdiffstats
path: root/lavalab-gen.py
diff options
context:
space:
mode:
authorCorentin LABBE <clabbe@baylibre.com>2017-10-25 12:22:30 +0200
committerCorentin LABBE <clabbe@baylibre.com>2017-10-25 12:29:56 +0200
commit5d1654506ae782d6b7d4467076555e70656f5c85 (patch)
tree9ec9c93d20ae7fcf972b699a6d3d4961362511b9 /lavalab-gen.py
parent88baa3f2459a5d32150048745003f4987b964be2 (diff)
Introduce docker-compose
This commit introduce two compoments: lavalab-en.py which generate: - device files - conmux config files - users files - tokens files - udev rules for host - final docker-compose.yml file Except of docker-compose.yml, all other files are ignored for the moment and will be handled by a following commit. docker-compose: The docker compose permits to building and running easily lava-docker images. It permit also to remove some contraints like knowing the LAVA_SERVER_IP/LAVA_MASTER.
Diffstat (limited to 'lavalab-gen.py')
-rwxr-xr-xlavalab-gen.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/lavalab-gen.py b/lavalab-gen.py
new file mode 100755
index 0000000..a584a1f
--- /dev/null
+++ b/lavalab-gen.py
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+#
+from __future__ import print_function
+import os, sys, time
+import subprocess
+import argparse
+import yaml
+import string
+import socket
+
+# Defaults
+boards_yaml = "boards.yaml"
+tokens_yaml = "tokens.yaml"
+baud_default = 115200
+
+template = string.Template("""#
+# auto-generated by lavalab-gen.py for ${board}
+#
+listener ${board}
+application console '${board} console' 'exec sg dialout "cu-loop /dev/${board} ${baud}"'
+command 'hardreset' 'Reboot ${board}' 'pduclient --daemon ${daemon} --host ${host} --port ${port} --command reboot ${delay} '
+command 'b' 'Reboot ${board}' 'pduclient --daemon ${daemon} --host ${host} --port ${port} --command reboot '
+command 'off' 'Power off ${board}' 'pduclient --daemon ${daemon} --host ${host} --port ${port} --command off '
+command 'on' 'Power on ${board}' 'pduclient --daemon ${daemon} --host ${host} --port ${port} --command on '
+""")
+
+#no comment it is volontary
+template_device = string.Template("""{% extends '${devicetype}.jinja2' %}
+{% set connection_command = 'conmux-console ${board}' %}
+{% set hard_reset_command = 'pduclient --daemon localhost --hostname acme-0 --port ${port} --command=reboot' %}
+{% set power_off_command = 'pduclient --daemon localhost --hostname acme-0 --port ${port} --command=off' %}
+{% set power_on_command = 'pduclient --daemon localhost --hostname acme-0 --port ${port} --command=on' %}
+""")
+
+template_udev = string.Template("""#
+SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="${serial}", MODE="0664", OWNER="uucp", SYMLINK+="${board}"
+""")
+
+def main(args):
+ fp = open(boards_yaml, "r")
+ labs = yaml.load(fp)
+ fp.close()
+ udev_line =""
+ tdc = open("docker-compose.template", "r")
+ dockcomp = yaml.load(tdc)
+ tdc.close()
+ dc_devices = dockcomp["services"]["lava-slave"]["devices"]
+ if dc_devices is None:
+ dockcomp["services"]["lava-slave"]["devices"] = []
+ dc_devices = dockcomp["services"]["lava-slave"]["devices"]
+
+ for lab_name in labs:
+ lab = labs[lab_name]
+ for board_name in lab:
+ b = lab[board_name]
+ if b.get("disabled", None):
+ continue
+
+ if not b.has_key("uart"):
+ print("WARNING: %s missing uart property" % board_name)
+ continue
+
+ baud = b["uart"].get("baud", baud_default)
+ if b.has_key("pdu"):
+ daemon = b["pdu"]["daemon"]
+ host = b["pdu"]["host"]
+ port = b["pdu"]["port"]
+ devicetype = b["type"]
+ delay_opt = ""
+ line = template.substitute(board=board_name, baud=baud, daemon=daemon, host=host, port=port, delay=delay_opt)
+ device_line = template_device.substitute(board=board_name, port=port, devicetype=devicetype)
+ serial = b["uart"]["serial"]
+ udev_line += template_udev.substitute(board=board_name, serial=serial)
+ dc_devices.append("/dev/%s:/dev/%s" % (board_name, board_name))
+ if b.has_key("fastboot_serial_number"):
+ fserial = b["fastboot_serial_number"]
+ device_line += "{%% set fastboot_serial_number = '%s' %%}" % fserial
+
+ if not os.path.isdir("lava-slave/conmux/"):
+ os.mkdir("lava-slave/conmux/")
+ if not os.path.isdir("lava-master/devices/"):
+ os.mkdir("lava-master/devices/")
+ device_path = "lava-master/devices/%s" % lab_name
+ if not os.path.isdir(device_path):
+ os.mkdir(device_path)
+ fp = open("lava-slave/conmux/%s.cf" % board_name, "w")
+ fp.write(line)
+ fp.close()
+ board_device_file = "%s/%s.jinja2" % (device_path, board_name)
+ fp = open(board_device_file, "w")
+ fp.write(device_line)
+ fp.close()
+ fp = open("lavalab-udev-%s.rules" % lab_name, "w")
+ fp.write(udev_line)
+ fp.close()
+ if not os.path.isdir("lava-master/slaves/"):
+ os.mkdir("lava-master/slaves/")
+ fp = open("lava-master/slaves/%s.yaml" % lab_name, "w")
+ fp.write("dispatcher_ip: 192.168.66.1")
+ fp.close()
+
+ #now proceed with tokens
+ fp = open(tokens_yaml, "r")
+ tokens = yaml.load(fp)
+ fp.close()
+ if not os.path.isdir("lava-master/users/"):
+ os.mkdir("lava-master/users/")
+ if not os.path.isdir("lava-master/tokens/"):
+ os.mkdir("lava-master/tokens/")
+ for section_name in tokens:
+ section = tokens[section_name]
+ if section_name == "lava_server_users":
+ for user in section:
+ username = user["name"]
+ ftok = open("lava-master/users/%s" % username, "w")
+ token = user["token"]
+ ftok.write("TOKEN=" + token + "\n")
+ if user.has_key("password"):
+ password = user["password"]
+ ftok.write("PASSWORD=" + password)
+ ftok.close()
+ if section_name == "callback_tokens":
+ for token in section:
+ filename = token["filename"]
+ ftok = open("lava-master/tokens/%s" % filename, "w")
+ username = token["username"]
+ ftok.write("USER=" + username + "\n")
+ vtoken = token["token"]
+ ftok.write("TOKEN=" + vtoken + "\n")
+ description = token["description"]
+ ftok.write("DESCRIPTION=" + description)
+ ftok.close()
+ with file('docker-compose.yml', 'w') as f:
+ yaml.dump(dockcomp, f)
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--header", help="use this file as header for output file")
+ args = parser.parse_args()
+ main(args)
+