xref: /unit/test/unit/utils.py (revision 2264)
11912So.canty@f5.comimport glob
21735Szelenkov@nginx.comimport os
31735Szelenkov@nginx.comimport socket
41772Szelenkov@nginx.comimport subprocess
51735Szelenkov@nginx.comimport time
61735Szelenkov@nginx.com
71735Szelenkov@nginx.comimport pytest
81735Szelenkov@nginx.com
91735Szelenkov@nginx.com
101735Szelenkov@nginx.comdef public_dir(path):
111735Szelenkov@nginx.com    os.chmod(path, 0o777)
121735Szelenkov@nginx.com
131735Szelenkov@nginx.com    for root, dirs, files in os.walk(path):
141735Szelenkov@nginx.com        for d in dirs:
152257Szelenkov@nginx.com            try:
162257Szelenkov@nginx.com                os.chmod(os.path.join(root, d), 0o777)
172257Szelenkov@nginx.com            except FileNotFoundError:
182257Szelenkov@nginx.com                pass
191735Szelenkov@nginx.com        for f in files:
202257Szelenkov@nginx.com            try:
212257Szelenkov@nginx.com                os.chmod(os.path.join(root, f), 0o777)
222257Szelenkov@nginx.com            except FileNotFoundError:
232257Szelenkov@nginx.com                pass
241735Szelenkov@nginx.com
251735Szelenkov@nginx.com
261912So.canty@f5.comdef waitforfiles(*files, timeout=50):
271912So.canty@f5.com    for i in range(timeout):
281735Szelenkov@nginx.com        wait = False
291735Szelenkov@nginx.com
301735Szelenkov@nginx.com        for f in files:
311735Szelenkov@nginx.com            if not os.path.exists(f):
321735Szelenkov@nginx.com                wait = True
331735Szelenkov@nginx.com                break
341735Szelenkov@nginx.com
351735Szelenkov@nginx.com        if not wait:
361735Szelenkov@nginx.com            return True
371735Szelenkov@nginx.com
381735Szelenkov@nginx.com        time.sleep(0.1)
391735Szelenkov@nginx.com
401735Szelenkov@nginx.com    return False
411735Szelenkov@nginx.com
421735Szelenkov@nginx.com
431912So.canty@f5.comdef waitforglob(pattern, count=1, timeout=50):
441912So.canty@f5.com    for i in range(timeout):
451912So.canty@f5.com        n = 0
461912So.canty@f5.com
471912So.canty@f5.com        for f in glob.glob(pattern):
481912So.canty@f5.com            n += 1
491912So.canty@f5.com
501912So.canty@f5.com        if n == count:
511912So.canty@f5.com            return True
521912So.canty@f5.com
531912So.canty@f5.com        time.sleep(0.1)
541912So.canty@f5.com
551912So.canty@f5.com    return False
561912So.canty@f5.com
571912So.canty@f5.com
581735Szelenkov@nginx.comdef waitforsocket(port):
591735Szelenkov@nginx.com    for i in range(50):
601735Szelenkov@nginx.com        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
611735Szelenkov@nginx.com            try:
621735Szelenkov@nginx.com                sock.settimeout(5)
631735Szelenkov@nginx.com                sock.connect(('127.0.0.1', port))
641735Szelenkov@nginx.com                return
651735Szelenkov@nginx.com
661735Szelenkov@nginx.com            except ConnectionRefusedError:
671735Szelenkov@nginx.com                time.sleep(0.1)
681735Szelenkov@nginx.com
691735Szelenkov@nginx.com            except KeyboardInterrupt:
701735Szelenkov@nginx.com                raise
711735Szelenkov@nginx.com
721803Szelenkov@nginx.com    pytest.fail('Can\'t connect to the 127.0.0.1:' + str(port))
731735Szelenkov@nginx.com
741740Szelenkov@nginx.com
75*2264Szelenkov@nginx.comdef check_findmnt():
761772Szelenkov@nginx.com    try:
77*2264Szelenkov@nginx.com        return subprocess.check_output(
781772Szelenkov@nginx.com            ['findmnt', '--raw'], stderr=subprocess.STDOUT
791772Szelenkov@nginx.com        ).decode()
801772Szelenkov@nginx.com    except FileNotFoundError:
81*2264Szelenkov@nginx.com        return False
82*2264Szelenkov@nginx.com
83*2264Szelenkov@nginx.com
84*2264Szelenkov@nginx.comdef findmnt():
85*2264Szelenkov@nginx.com    out = check_findmnt()
86*2264Szelenkov@nginx.com
87*2264Szelenkov@nginx.com    if not out:
881772Szelenkov@nginx.com        pytest.skip('requires findmnt')
891772Szelenkov@nginx.com
901772Szelenkov@nginx.com    return out
911772Szelenkov@nginx.com
921772Szelenkov@nginx.com
931877Szelenkov@nginx.comdef sysctl():
941877Szelenkov@nginx.com    try:
951877Szelenkov@nginx.com        out = subprocess.check_output(
961877Szelenkov@nginx.com            ['sysctl', '-a'], stderr=subprocess.STDOUT
971877Szelenkov@nginx.com        ).decode()
981877Szelenkov@nginx.com    except FileNotFoundError:
991877Szelenkov@nginx.com        pytest.skip('requires sysctl')
1001877Szelenkov@nginx.com
1011877Szelenkov@nginx.com    return out
1021877Szelenkov@nginx.com
1031877Szelenkov@nginx.com
1041912So.canty@f5.comdef waitformount(template, timeout=50):
1051912So.canty@f5.com    for i in range(timeout):
1061772Szelenkov@nginx.com        if findmnt().find(template) != -1:
1071772Szelenkov@nginx.com            return True
1081772Szelenkov@nginx.com
1091772Szelenkov@nginx.com        time.sleep(0.1)
1101772Szelenkov@nginx.com
1111772Szelenkov@nginx.com    return False
1121772Szelenkov@nginx.com
1131772Szelenkov@nginx.com
1141912So.canty@f5.comdef waitforunmount(template, timeout=50):
1151912So.canty@f5.com    for i in range(timeout):
1161772Szelenkov@nginx.com        if findmnt().find(template) == -1:
1171772Szelenkov@nginx.com            return True
1181772Szelenkov@nginx.com
1191772Szelenkov@nginx.com        time.sleep(0.1)
1201772Szelenkov@nginx.com
1211772Szelenkov@nginx.com    return False
1221772Szelenkov@nginx.com
1231772Szelenkov@nginx.com
1241740Szelenkov@nginx.comdef getns(nstype):
1251740Szelenkov@nginx.com    # read namespace id from symlink file:
1261740Szelenkov@nginx.com    # it points to: '<nstype>:[<ns id>]'
1271740Szelenkov@nginx.com    # # eg.: 'pid:[4026531836]'
1281740Szelenkov@nginx.com    nspath = '/proc/self/ns/' + nstype
1291740Szelenkov@nginx.com    data = None
1301740Szelenkov@nginx.com
1311740Szelenkov@nginx.com    if os.path.exists(nspath):
1321740Szelenkov@nginx.com        data = int(os.readlink(nspath)[len(nstype) + 2 : -1])
1331740Szelenkov@nginx.com
1341740Szelenkov@nginx.com    return data
135