forked from autotest/virt-test
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata_dir.py
executable file
·145 lines (118 loc) · 4.18 KB
/
data_dir.py
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/python
"""
Library used to provide the appropriate data dir for virt test.
"""
import os, sys, tempfile, glob, logging
_ROOT_PATH = os.path.join(sys.modules[__name__].__file__, "..", "..")
ROOT_DIR = os.path.abspath(_ROOT_PATH)
DATA_DIR = os.path.join(ROOT_DIR, 'shared', 'data')
DOWNLOAD_DIR = os.path.join(ROOT_DIR, 'shared', 'downloads')
TMP_DIR = os.path.join(ROOT_DIR, 'tmp')
BACKING_DATA_DIR = None
class SubdirList(list):
"""
List of all non-hidden subdirectories beneath basedir
"""
def __in_filter__(self, item):
if self.filterlist:
for _filter in self.filterlist:
if item.count(str(_filter)):
return True
return False
else:
return False
def __set_initset__(self):
for dirpath, dirnames, filenames in os.walk(self.basedir):
del filenames # not used
# Don't modify list while in use
del_list = []
for _dirname in dirnames:
if _dirname.startswith('.') or self.__in_filter__(_dirname):
# Don't descend into filtered or hidden directories
del_list.append(_dirname)
else:
self.initset.add(os.path.join(dirpath, _dirname))
# Remove items in del_list from dirnames list
for _dirname in del_list:
del dirnames[dirnames.index(_dirname)]
def __init__(self, basedir, filterlist=None):
self.basedir = os.path.abspath(str(basedir))
self.initset = set([self.basedir]) # enforce unique items
self.filterlist = filterlist
self.__set_initset__()
super(SubdirList, self).__init__(self.initset)
class SubdirGlobList(SubdirList):
"""
List of all files matching glob in all non-hidden basedir subdirectories
"""
def __initset_to_globset__(self):
globset = set()
for dirname in self.initset: # dirname is absolute
pathname = os.path.join(dirname, self.globstr)
for filepath in glob.glob(pathname):
if not self.__in_filter__(filepath):
globset.add(filepath)
self.initset = globset
def __set_initset__(self):
super(SubdirGlobList, self).__set_initset__()
self.__initset_to_globset__()
def __init__(self, basedir, globstr, filterlist=None):
self.globstr = str(globstr)
super(SubdirGlobList, self).__init__(basedir, filterlist)
def get_backing_data_dir():
if os.path.islink(DATA_DIR):
if os.path.isdir(DATA_DIR):
return os.readlink(DATA_DIR)
else:
# Invalid symlink
os.unlink(DATA_DIR)
elif os.path.isdir(DATA_DIR):
return DATA_DIR
try:
return os.environ['VIRT_TEST_DATA_DIR']
except KeyError:
pass
data_dir = '/var/lib/virt_test'
if os.path.isdir(data_dir):
try:
fd, path = tempfile.mkstemp(dir=data_dir)
os.close(fd)
os.unlink(path)
return data_dir
except OSError:
pass
else:
try:
os.makedirs(data_dir)
return data_dir
except OSError:
pass
data_dir = os.path.expanduser('~/virt_test')
if not os.path.isdir(data_dir):
os.makedirs(data_dir)
return os.path.realpath(data_dir)
def set_backing_data_dir(backing_data_dir):
if os.path.islink(DATA_DIR):
os.unlink(DATA_DIR)
backing_data_dir = os.path.expanduser(backing_data_dir)
if not os.path.isdir(backing_data_dir):
os.makedirs(backing_data_dir)
if not backing_data_dir == DATA_DIR:
os.symlink(backing_data_dir, DATA_DIR)
BACKING_DATA_DIR = get_backing_data_dir()
set_backing_data_dir(BACKING_DATA_DIR)
def get_root_dir():
return ROOT_DIR
def get_data_dir():
return DATA_DIR
def get_tmp_dir():
if not os.path.isdir(TMP_DIR):
os.makedirs(TMP_DIR)
return TMP_DIR
def get_download_dir():
return DOWNLOAD_DIR
if __name__ == '__main__':
print "root dir: " + ROOT_DIR
print "tmp dir: " + TMP_DIR
print "data dir: " + DATA_DIR
print "backing data dir: " + BACKING_DATA_DIR