1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
from contextlib import contextmanager
import errno
import os
from shutil import rmtree
import socket
import sys
from time import sleep
from tempfile import mkdtemp
from jujupy import until_timeout
@contextmanager
def scoped_environ():
old_environ = dict(os.environ)
try:
yield
finally:
os.environ.clear()
os.environ.update(old_environ)
class PortTimeoutError(Exception):
pass
def wait_for_port(host, port, closed=False, timeout=30):
for remaining in until_timeout(timeout):
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.settimeout(max(remaining, 5))
try:
conn.connect((host, port))
except socket.timeout:
if closed:
return
except socket.error as e:
if e.errno not in (errno.ECONNREFUSED, errno.ETIMEDOUT):
raise
if closed:
return
except Exception as e:
print_now('Unexpected %r: %s' % (type(e), e))
raise
else:
conn.close()
if not closed:
return
sleep(1)
raise PortTimeoutError('Timed out waiting for port.')
def print_now(string):
print(string)
sys.stdout.flush()
@contextmanager
def temp_dir(parent=None):
directory = mkdtemp(dir=parent)
try:
yield directory
finally:
rmtree(directory)
|