Does this depend on the "Make OSv bootable as a Linux 64-bit ELF" patch which I now see I haven't reviewed yet? Do you have any other patches waiting for review (sorry about that...)?
-- Nadav Har'El [email protected] On Fri, Feb 22, 2019 at 4:15 PM Waldemar Kozaczuk <[email protected]> wrote: > This patch adds simple Python script that allows > booting OSv loader.elf on firecracker. > > It also automates process of downloading and installing > firecracker. Evenntually it might be incorporated > into scripts/run.py > > Signed-off-by: Waldemar Kozaczuk <[email protected]> > --- > scripts/firecracker.py | 126 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 126 insertions(+) > create mode 100755 scripts/firecracker.py > > diff --git a/scripts/firecracker.py b/scripts/firecracker.py > new file mode 100755 > index 00000000..bed4cf58 > --- /dev/null > +++ b/scripts/firecracker.py > @@ -0,0 +1,126 @@ > +#!/usr/bin/env python > +# > +# pip install requests-unixsocket > +import sys > +import os > +import stat > +import json > +import subprocess > +import time > +from os.path import expanduser > +from datetime import datetime > +import requests_unixsocket > + > + > +class ApiClient(object): > + def __init__(self, domain_socket_path): > + self.socket_path = domain_socket_path > + self.session = requests_unixsocket.Session() > + > + def api_socket_url(self, path): > + return "http+unix://%s%s" % (self.socket_path, path) > + > + def make_put_call(self, path, request_body): > + url = self.api_socket_url(path) > + res = self.session.put(url, data=json.dumps(request_body)) > + print("%s: %s" % (path, res.status_code)) > + if res.status_code != 204: > + print(res.text) > + return res.status_code > + > + def create_instance(self, kernel_image_path, cmdline): > + self.make_put_call('/boot-source', { > + 'kernel_image_path': kernel_image_path, > + 'boot_args': cmdline > + }) > + > + def start_instance(self): > + self.make_put_call('/actions', { > + 'action_type': 'InstanceStart' > + }) > + > + def configure_logging(self): > + self.make_put_call('/logger', { > + "log_fifo": "log.fifo", > + "metrics_fifo": "metrics.fifo", > + "level": "Info", > + "show_level": True, > + "show_log_origin": True > + }) > + > + > +def print_time(msg): > + now = datetime.now() > + print("%s: %s" % (now.strftime('%H:%M:%S.%f'), msg)) > + > + > +# Check if firecracker is installed > +home_dir = expanduser("~") > +firecracker_path = os.path.join(home_dir, '.firecracker/firecracker') > +if os.environ.get('FIRECRACKER_PATH'): > + firecracker_path = os.environ.get('FIRECRACKER_PATH') > + > +# And offer to install if not found > +if not os.path.exists(firecracker_path): > + download_url = ' > https://github.com/firecracker-microvm/firecracker/releases/download/v0.14.0/firecracker-v0.14.0 > ' > + answer = raw_input("Firecracker executable has not been found under > %s. " > + "Would you like to download it from %s and place > it under %s? [y|Y]" % > + (firecracker_path, download_url, firecracker_path)) > + if answer.capitalize() != 'Y': > + print("Firecracker not available. Exiting ...") > + sys.exit(-1) > + > + directory = os.path.dirname(firecracker_path) > + if not os.path.exists(directory): > + os.mkdir(directory) > + subprocess.call(['wget', download_url, '-O', firecracker_path]) > + os.chmod(firecracker_path, stat.S_IRUSR | stat.S_IXUSR) > + > +# Firecracker is installed so lets start > +print_time("Start") > +socket_path = '/tmp/firecracker.socket' > + > +# Delete socker file if exists > +if os.path.exists(socket_path): > + os.unlink(socket_path) > + > +# Start firecracker process to communicate over specified UNIX socker file > +firecracker = subprocess.Popen([firecracker_path, '--api-sock', > socket_path], > + stdin=subprocess.PIPE, stdout=sys.stdout, > + stderr=subprocess.STDOUT) > + > +# Prepare arguments we are going to pass when creating VM instance > +dirname = os.path.dirname(os.path.abspath(__file__)) > +kernel_path = os.path.join(dirname, > '../build/release/loader-stripped.elf') > + > +if len(sys.argv) > 1: > + cmdline = sys.argv[1] > +else: > + with open(os.path.join(dirname, '../build/release/cmdline'), 'r') as > f: > + cmdline = f.read() > + > +# Create API client and make API calls > +client = ApiClient(socket_path.replace("/", "%2F")) > + > +try: > + # Very often on the very first run firecracker process > + # is not ready yet to accept calls over socket file > + # so we poll existence of this file as an good > + # enough indicator of firecracker readyness > + while not os.path.exists(socket_path): > + time.sleep(0.01) > + print_time("Firecracker ready") > + > + client.create_instance(kernel_path, cmdline) > + print_time("Created OSv VM") > + > + client.start_instance() > + print_time("Booted OSv VM") > +except Exception as e: > + print("Failed to run OSv on firecracker due to: ({0}): {1} > !!!".format(e.errno, e.strerror)) > + firecracker.kill() > + exit(-1) > + > +print_time("Waiting for firecracker process to terminate") > +firecracker.wait() > +print_time("End") > -- > 2.19.1 > > -- > You received this message because you are subscribed to the Google Groups > "OSv Development" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
