Update the remote test launch utility (utils/remote-exec.py).

Allowed a single file execution without the execution directory.
This commit is contained in:
Vladimir Vereschaka 2022-10-06 19:07:33 -07:00
parent 220185552f
commit 20e1efcfe1
1 changed files with 39 additions and 21 deletions

View File

@ -41,7 +41,7 @@ def scp(args, src, dst):
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--host', type=str, required=True)
parser.add_argument('--execdir', type=str, required=True)
parser.add_argument('--execdir', type=str, required=False)
parser.add_argument('--extra-ssh-args', type=str, required=False)
parser.add_argument('--extra-scp-args', type=str, required=False)
parser.add_argument('--codesign_identity', type=str, required=False, default=None)
@ -55,7 +55,7 @@ def main():
# and changing their path when running on the remote host. It's also possible
# for there to be no such executable, for example in the case of a .sh.cpp
# test.
parser.add_argument('--exec-pattern', type=str, required=False, default='.*\.tmp\.exe',
parser.add_argument('--exec-pattern', type=str, required=False, default='.*',
help='The name regex pattern of the executables generated by \
a test file. Specifying it allows us to do custom \
processing like codesigning test-executables \
@ -68,6 +68,15 @@ def main():
args = parser.parse_args()
commandLine = args.command
execdir = args.execdir
if execdir == '.':
# Retrieve the exec directory from the command line.
execdir, _ = os.path.split(commandLine[0])
if execdir == '':
# Get the current directory in that case.
execdir = os.getcwd()
arcname = os.path.basename(execdir) if execdir else None
# Create a temporary directory where the test will be run.
# That is effectively the value of %T on the remote host.
tmp = subprocess.check_output(
@ -78,6 +87,8 @@ def main():
isExecutable = lambda exe: re.match(args.exec_pattern, exe) and os.path.exists(exe)
pathOnRemote = lambda file: posixpath.join(tmp, os.path.basename(file))
remoteCommands = []
try:
# Do any necessary codesigning of test-executables found in the command line.
if args.codesign_identity:
@ -88,27 +99,34 @@ def main():
# tar up the execution directory (which contains everything that's needed
# to run the test), and copy the tarball over to the remote host.
try:
tmpTar = tempfile.NamedTemporaryFile(suffix='.tar', delete=False)
with tarfile.open(fileobj=tmpTar, mode='w') as tarball:
tarball.add(args.execdir, arcname=os.path.basename(args.execdir))
if execdir:
try:
tmpTar = tempfile.NamedTemporaryFile(suffix='.tar', delete=False)
with tarfile.open(fileobj=tmpTar, mode='w') as tarball:
tarball.add(execdir, arcname=arcname)
# Make sure we close the file before we scp it, because accessing
# the temporary file while still open doesn't work on Windows.
tmpTar.close()
remoteTarball = pathOnRemote(tmpTar.name)
subprocess.check_call(scp(args, tmpTar.name, remoteTarball))
finally:
# Make sure we close the file in case an exception happens before
# we've closed it above -- otherwise close() is idempotent.
tmpTar.close()
os.remove(tmpTar.name)
# Make sure we close the file before we scp it, because accessing
# the temporary file while still open doesn't work on Windows.
tmpTar.close()
remoteTarball = pathOnRemote(tmpTar.name)
subprocess.check_call(scp(args, tmpTar.name, remoteTarball))
finally:
# Make sure we close the file in case an exception happens before
# we've closed it above -- otherwise close() is idempotent.
tmpTar.close()
os.remove(tmpTar.name)
# Untar the dependencies in the temporary directory and remove the tarball.
remoteCommands = [
'tar -xf {} -C {} --strip-components 1'.format(remoteTarball, tmp),
'rm {}'.format(remoteTarball)
]
# Untar the dependencies in the temporary directory and remove the tarball.
remoteCommands.extend([
'tar -xf {} -C {} --strip-components 1'.format(remoteTarball, tmp),
'rm {}'.format(remoteTarball)
])
else:
# Copy only the files, which are specified in the command line.
# Copy them to remote host one by one.
for x in commandLine:
_, f = os.path.split(x)
subprocess.check_call(scp(args, x, pathOnRemote(f)))
# Make sure all executables in the remote command line have 'execute'
# permissions on the remote host. The host that compiled the test-executable