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.

Reply via email to