6a5608c908c36a8fea3f61d4817edfca0d3a24af
8 from contextlib
import closing
11 def line_count(file_path
):
13 with
open(file_path
) as f
:
19 def sha256_checksum(filename
, block_size
=65536):
20 sha256
= hashlib
.sha256()
21 with
open(filename
, 'rb') as f
:
22 for block
in iter(lambda: f
.read(block_size
), b
''):
24 return sha256
.hexdigest()
27 # TODO: timeout as a parameter or Settings
28 # TODO: Custom exception
29 def wait_for_file(path
):
32 while not os
.path
.exists(path
):
36 raise Exception("File still does not exists. Timeout expired")
39 # TODO: find better exception
40 def create_empty_file(path
):
41 if os
.path
.exists(path
):
42 raise Exception("Path already exist")
43 open(path
, 'w').close()
46 def __dummy_sigusr1_handler():
50 def sessiond_spawn(runtime
):
51 agent_port
= find_free_port()
52 previous_handler
= signal
.signal(signal
.SIGUSR1
, __dummy_sigusr1_handler
)
53 sessiond
= runtime
.spawn_subprocess("lttng-sessiond -vvv -S --agent-tcp-port {}".format(agent_port
))
54 signal
.sigtimedwait({signal
.SIGUSR1
}, 60)
55 previous_handler
= signal
.signal(signal
.SIGUSR1
, previous_handler
)
59 def relayd_spawn(runtime
, url
="localhost"):
61 Return a tuple (relayd_uuid, ctrl_port, data_port, live_port)
63 ports
= find_multiple_free_port(3)
64 data_port
= ports
.pop()
65 ctrl_port
= ports
.pop()
66 live_port
= ports
.pop()
68 base_cmd
= "lttng-relayd -vvv"
69 data_string
= "-D tcp://{}:{}".format(url
, data_port
)
70 ctrl_string
= "-C tcp://{}:{}".format(url
, ctrl_port
)
71 live_string
= "-L tcp://{}:{}".format(url
, live_port
)
73 cmd
= " ".join([base_cmd
, data_string
, ctrl_string
, live_string
])
74 relayd
= runtime
.spawn_subprocess(cmd
)
76 # Synchronization based on verbosity since no -S is available for
78 log_path
= runtime
.get_subprocess_stderr_path(relayd
)
80 # TODO: Move to settings.
81 ready_cue
= "Listener accepting live viewers connections"
82 # TODO: Move to settings.
85 for i
in range(timeout
):
86 if file_contains(log_path
, ready_cue
):
92 # Cleanup is performed by runtime
93 raise Exception("Relayd readyness timeout expired")
95 return (relayd
, ctrl_port
, data_port
, live_port
)
99 # There is no guarantee that the port will be free at runtime but should be
101 with
closing(socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)) as s
:
103 return s
.getsockname()[1]
106 def find_multiple_free_port(number
):
108 Return a list of supposedly free port
112 while(len(ports
) != number
):
113 port
= find_free_port()
120 def file_contains(file_path
, list_of_string
):
121 with
open(file_path
, 'r') as f
:
123 for s
in list_of_string
:
128 def find_dir(root
, name
):
130 Returns the absolute path or None.
133 for base
, dirs
, files
in os
.walk(root
):
135 if tmp
.endswith(name
):
136 abs_path
= os
.path
.abspath(os
.path
.join(base
, tmp
))
140 def find_file(root
, name
):
142 Returns the absolute path or None.
145 for base
, dirs
, files
in os
.walk(root
):
147 if tmp
.endswith(name
):
148 abs_path
= os
.path
.abspath(os
.path
.join(base
, tmp
))
152 def validate(xml_path
, xsd_path
):
154 xmlschema_doc
= etree
.parse(xsd_path
)
155 xmlschema
= etree
.XMLSchema(xmlschema_doc
)
157 xml_doc
= etree
.parse(xml_path
)
158 result
= xmlschema
.validate(xml_doc
)
162 def xpath_query(xml_file
, xpath
):
164 Return a list of xml node corresponding to the xpath. The list can be of lenght
167 with
open(xml_file
, 'r') as f
:
168 tree
= etree
.parse(f
)
169 root
= tree
.getroot()
170 # Remove all namespace
171 # https://stackoverflow.com/questions/18159221/remove-namespace-and-prefix-from-xml-in-python-using-lxml
172 for elem
in root
.getiterator():
173 if not hasattr(elem
.tag
, 'find'):
175 i
= elem
.tag
.find('}')
177 elem
.tag
= elem
.tag
[i
+1:]
179 return root
.xpath(xpath
)
This page took 0.035085 seconds and 4 git commands to generate.