This one can be reviewed and applied independently of the other one. But logically they are related.
This and the other one is what I am waiting for review of. Thanks in advance. Soon I hope I will be sending another 1 or two more new patches for virtio mmio to support block and networking devices on firecracker. Waldek Waldek Sent from my iPhone > On Feb 26, 2019, at 04:47, Nadav Har'El <[email protected]> wrote: > > 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.
