| |
@@ -1,19 +1,20 @@
|
| |
#!/usr/bin/env python
|
| |
|
| |
import argparse
|
| |
+ import distutils.util
|
| |
import errno
|
| |
import json
|
| |
+ import multiprocessing
|
| |
import os
|
| |
- import shutil
|
| |
+ import random
|
| |
import shlex
|
| |
+ import shutil
|
| |
import signal
|
| |
- import multiprocessing
|
| |
import socket
|
| |
import subprocess
|
| |
import sys
|
| |
import tempfile
|
| |
import time
|
| |
- import distutils.util
|
| |
|
| |
IDENTITY = """
|
| |
-----BEGIN RSA PRIVATE KEY-----
|
| |
@@ -111,7 +112,10 @@
|
| |
|
| |
|
| |
def start_qemu(image, cloudinit, log, portrange=(2222, 5555)):
|
| |
- for port in range(*portrange):
|
| |
+
|
| |
+ tries = 0
|
| |
+ while tries < (portrange[1] - portrange[0]):
|
| |
+ port = random.randrange(*portrange)
|
| |
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
| |
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
| |
try:
|
| |
@@ -122,18 +126,24 @@
|
| |
break
|
| |
finally:
|
| |
sock.close()
|
| |
+ tries += 1
|
| |
else:
|
| |
raise RuntimeError("unable to find free local port to map SSH to")
|
| |
|
| |
+ vncoffset = portrange[1] - port
|
| |
# Use -cpu host and -smp by default.
|
| |
# virtio-rng-pci: https://wiki.qemu.org/Features/VirtIORNG
|
| |
- return subprocess.Popen(["/usr/bin/qemu-system-x86_64",
|
| |
- "-cpu", "host", "-smp", "{}".format(multiprocessing.cpu_count()),
|
| |
- "-m", "1024", image, "-enable-kvm", "-snapshot", "-cdrom", cloudinit,
|
| |
- "-net", "nic,model=virtio", "-net", "user,hostfwd=tcp:127.0.0.3:{0}-:22".format(port),
|
| |
- "-device", "virtio-rng-pci", "-rtc", "base=utc",
|
| |
- "-device", "isa-serial,chardev=pts2", "-chardev", "file,id=pts2,path=" + log,
|
| |
- "-display", "none", "-vnc", ":1"], stdout=open(log, 'a'), stderr=subprocess.STDOUT), port
|
| |
+ return subprocess.Popen(
|
| |
+ ["/usr/bin/qemu-system-x86_64", "-cpu", "host",
|
| |
+ "-smp", "{}".format(multiprocessing.cpu_count()),
|
| |
+ "-m", "1024", image, "-enable-kvm", "-snapshot", "-cdrom", cloudinit,
|
| |
+ "-net", "nic,model=virtio",
|
| |
+ "-net", "user,hostfwd=tcp:127.0.0.3:{0}-:22".format(port),
|
| |
+ "-device", "virtio-rng-pci", "-rtc", "base=utc",
|
| |
+ "-device", "isa-serial,chardev=pts2",
|
| |
+ "-chardev", "file,id=pts2,path=" + log, "-display", "none",
|
| |
+ "-vnc", ":" + str(vncoffset)
|
| |
+ ], stdout=open(log, 'a'), stderr=subprocess.STDOUT), port
|
| |
|
| |
|
| |
def inv_host(image):
|
| |