diff options
Diffstat (limited to 'lavalab-gen.py')
-rwxr-xr-x | lavalab-gen.py | 83 |
1 files changed, 70 insertions, 13 deletions
diff --git a/lavalab-gen.py b/lavalab-gen.py index b0b58b4..6332284 100755 --- a/lavalab-gen.py +++ b/lavalab-gen.py @@ -14,6 +14,7 @@ tokens_yaml = "tokens.yaml" baud_default = 115200 ser2net_port_start = 63001 ser2net_ports = {} +allowed_hosts_list = [ '"127.0.0.1"' ] template_conmux = string.Template("""# # auto-generated by lavalab-gen.py for ${board} @@ -60,12 +61,22 @@ template_settings_conf = string.Template(""" "HTTPS_XML_RPC": false, "LOGIN_URL": "/accounts/login/", "LOGIN_REDIRECT_URL": "/", + "ALLOWED_HOSTS": [ $allowed_hosts ], "CSRF_TRUSTED_ORIGINS": ["$lava_http_fqdn"], "CSRF_COOKIE_SECURE": $cookie_secure, "SESSION_COOKIE_SECURE": $session_cookie_secure } """) +template_lava_coordinator_conf = string.Template(""" +{ + "port": 3079, + "blocksize": 4096, + "poll_delay": 3, + "coordinator_hostname": "$masterurl" +} +""") + def dockcomp_add_device(dockcomp, worker_name, devicemap): if "devices" in dockcomp["services"][worker_name]: dc_devices = dockcomp["services"][worker_name]["devices"] @@ -94,7 +105,7 @@ def main(): else: masters = workers["masters"] for master in masters: - keywords_master = [ "name", "type", "host", "users", "groups", "tokens", "webadmin_https", "persistent_db", "zmq_auth", "zmq_auth_key", "zmq_auth_key_secret", "http_fqdn", "slave_keys", "slaveenv", "loglevel" ] + keywords_master = [ "name", "type", "host", "users", "groups", "tokens", "webadmin_https", "persistent_db", "zmq_auth", "zmq_auth_key", "zmq_auth_key_secret", "http_fqdn", "slave_keys", "slaveenv", "loglevel", "allowed_hosts", "lava-coordinator" ] for keyword in master: if not keyword in keywords_master: print("WARNING: unknown keyword %s" % keyword) @@ -117,6 +128,8 @@ def main(): dockcomp["services"][name]["volumes"] = [ "/boot:/boot", "/lib/modules:/lib/modules" ] dockcomp["services"][name]["build"] = {} dockcomp["services"][name]["build"]["context"] = name + if "lava-coordinator" in master and master["lava-coordinator"]: + dockcomp["services"][name]["ports"].append('3079:3079') persistent_db = False if "persistent_db" in master: persistent_db = master["persistent_db"] @@ -149,13 +162,19 @@ def main(): session_cookie_secure = "false" if "http_fqdn" in worker: lava_http_fqdn = worker["http_fqdn"] + allowed_hosts_list.append('"%s"' % lava_http_fqdn) else: - lava_http_fqdn = "example.com" + lava_http_fqdn = "127.0.0.1" + allowed_hosts_list.append('"%s"' % name) + if "allowed_hosts" in worker: + for allow_host in worker["allowed_hosts"]: + allowed_hosts_list.append('"%s"' % allow_host) + allowed_hosts = ','.join(allowed_hosts_list) f_fqdn = open("%s/lava_http_fqdn" % workerdir, 'w') f_fqdn.write(lava_http_fqdn) f_fqdn.close() fsettings = open("%s/settings.conf" % workerdir, 'w') - fsettings.write(template_settings_conf.substitute(cookie_secure=cookie_secure, session_cookie_secure=session_cookie_secure, lava_http_fqdn=lava_http_fqdn)) + fsettings.write(template_settings_conf.substitute(cookie_secure=cookie_secure, session_cookie_secure=session_cookie_secure, lava_http_fqdn=lava_http_fqdn, allowed_hosts=allowed_hosts)) fsettings.close() master_use_zmq_auth = False if "zmq_auth" in worker: @@ -273,7 +292,7 @@ def main(): else: slaves = workers["slaves"] for slave in slaves: - keywords_slaves = [ "name", "host", "dispatcher_ip", "remote_user", "remote_master", "remote_address", "remote_rpc_port", "remote_proto", "extra_actions", "zmq_auth_key", "zmq_auth_key_secret", "default_slave", "export_ser2net", "expose_ser2net", "remote_user_token", "zmq_auth_master_key", "expose_ports", "env", "bind_dev", "loglevel" ] + keywords_slaves = [ "name", "host", "dispatcher_ip", "remote_user", "remote_master", "remote_address", "remote_rpc_port", "remote_proto", "extra_actions", "zmq_auth_key", "zmq_auth_key_secret", "default_slave", "export_ser2net", "expose_ser2net", "remote_user_token", "zmq_auth_master_key", "expose_ports", "env", "bind_dev", "loglevel", "use_nfs", "arch", "devices", "lava-coordinator", "use_tap" ] for keyword in slave: if not keyword in keywords_slaves: print("WARNING: unknown keyword %s" % keyword) @@ -321,6 +340,13 @@ def main(): worker = slave worker_name = name slave_master = None + if "arch" in worker: + if worker["arch"] == 'arm64': + dockerfile = open("%s/Dockerfile" % workerdir, "r+") + dockerfilec = dockerfile.read().replace("lava-slave-base", "lava-slave-base-arm64") + dockerfile.seek(0) + dockerfile.write(dockerfilec) + dockerfile.close() #NOTE remote_master is on slave if not "remote_master" in worker: remote_master = "lava-master" @@ -387,17 +413,26 @@ def main(): remote_proto = worker["remote_proto"] remote_uri = "%s://%s:%s@%s:%s/RPC2" % (remote_proto, remote_user, remote_token, remote_address, remote_rpc_port) dockcomp["services"][worker_name]["environment"]["LAVA_MASTER_URI"] = remote_uri + dockcomp["services"][worker_name]["environment"]["LAVA_MASTER_USER"] = remote_user + dockcomp["services"][worker_name]["environment"]["LAVA_MASTER_BASEURI"] = "%s://%s:%s/RPC2" % (remote_proto, remote_address, remote_rpc_port) + dockcomp["services"][worker_name]["environment"]["LAVA_MASTER_TOKEN"] = remote_token + if "lava-coordinator" in worker and worker["lava-coordinator"]: + fcoordinator = open("%s/lava-coordinator/lava-coordinator.cnf" % workerdir, 'w') + fcoordinator.write(template_lava_coordinator_conf.substitute(masterurl=remote_address)) + fcoordinator.close() if "dispatcher_ip" in worker: dockcomp["services"][worker_name]["environment"]["LAVA_DISPATCHER_IP"] = worker["dispatcher_ip"] if "expose_ports" in worker: for eports in worker["expose_ports"]: dockcomp["services"][name]["ports"].append("%s" % eports) - if "bind_dev" in worker: + if "bind_dev" in worker and worker["bind_dev"]: dockcomp["services"][worker_name]["volumes"].append("/dev:/dev") dockcomp["services"][worker_name]["privileged"] = True - with open(dockcomposeymlpath, 'w') as f: - yaml.dump(dockcomp, f) + if "use_tap" in worker and worker["use_tap"]: + dockcomp_add_device(dockcomp, worker_name, "/dev/net/tun:/dev/net/tun") + dockcomp["services"][worker_name]["cap_add"] = [] + dockcomp["services"][worker_name]["cap_add"].append("NET_ADMIN") if "extra_actions" in worker: fp = open("%s/scripts/extra_actions" % workerdir, "w") for eaction in worker["extra_actions"]: @@ -405,6 +440,33 @@ def main(): fp.write("\n") fp.close() os.chmod("%s/scripts/extra_actions" % workerdir, 0o755) + + if "devices" in worker: + if not os.path.isdir("output/%s/udev" % host): + os.mkdir("output/%s/udev" % host) + for udev_dev in worker["devices"]: + udev_line = 'SUBSYSTEM=="tty", ATTRS{idVendor}=="%04x", ATTRS{idProduct}=="%04x",' % (udev_dev["idvendor"], udev_dev["idproduct"]) + if "serial" in udev_dev: + udev_line += 'ATTRS{serial}=="%s", ' % udev_dev["serial"] + if "devpath" in udev_dev: + udev_line += 'ATTRS{devpath}=="%s", ' % udev_dev["devpath"] + udev_line += 'MODE="0664", OWNER="uucp", SYMLINK+="%s"\n' % udev_dev["name"] + fudev = open("output/%s/udev/99-lavaworker-udev.rules" % host, "a") + fudev.write(udev_line) + fudev.close() + if not "bind_dev" in slave or not slave["bind_dev"]: + dockcomp_add_device(dockcomp, worker_name, "/dev/%s:/dev/%s" % (udev_dev["name"], udev_dev["name"])) + use_nfs = False + if "use_nfs" in worker: + use_nfs = worker["use_nfs"] + if use_nfs: + dockcomp["services"][worker_name]["volumes"].append("/var/lib/lava/dispatcher/tmp:/var/lib/lava/dispatcher/tmp") + fp = open("%s/scripts/extra_actions" % workerdir, "a") + fp.write("apt-get -y install nfs-kernel-server\n") + fp.close() + os.chmod("%s/scripts/extra_actions" % workerdir, 0o755) + with open(dockcomposeymlpath, 'w') as f: + yaml.dump(dockcomp, f) if "loglevel" in worker: for component in worker["loglevel"]: if component != "lava-slave": @@ -461,11 +523,6 @@ def main(): if use_kvm: dockcomp_add_device(dockcomp, worker_name, "/dev/kvm:/dev/kvm") # board specific hacks - use_tap = False - if "tap" in board: - use_tap = board["tap"] - if use_tap: - dockcomp_add_device(dockcomp, worker_name, "/dev/net/tun:/dev/net/tun") if devicetype == "qemu" and not use_kvm: device_line += "{% set no_kvm = True %}\n" if "uart" in board: @@ -492,7 +549,7 @@ def main(): fp = open("output/%s/udev/99-lavaworker-udev.rules" % host, "a") fp.write(udev_line) fp.close() - if not "bind_dev" in slave: + if not "bind_dev" in slave or not slave["bind_dev"]: dockcomp_add_device(dockcomp, worker_name, "/dev/%s:/dev/%s" % (board_name, board_name)) use_conmux = False use_ser2net = False |