149 lines
4.1 KiB
Python
Executable File
149 lines
4.1 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# Copyright (c) 2019 Computer Vision Center (CVC) at the Universitat Autonoma
|
|
# de Barcelona (UAB).
|
|
#
|
|
# This work is licensed under the terms of the MIT license.
|
|
# For a copy, see <https://opensource.org/licenses/MIT>.
|
|
|
|
"""
|
|
Helper script to generate consumables for Carla in Docker
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import docker
|
|
import docker_utils
|
|
import os
|
|
|
|
|
|
def print_formated_dict(dic):
|
|
for k, v in dic.items():
|
|
print(' - "' + str(k) + '"' + ": " + str(v))
|
|
print()
|
|
|
|
|
|
def bold(text):
|
|
return ''.join([docker_utils.BOLD, text, docker_utils.ENDC])
|
|
|
|
|
|
def bold_underline(text):
|
|
return ''.join([docker_utils.UNDERLINE, bold(text)])
|
|
|
|
|
|
def parse_args():
|
|
argparser = argparse.ArgumentParser(
|
|
description=__doc__)
|
|
argparser.add_argument(
|
|
'-i', '--input',
|
|
type=str,
|
|
help='Path of all the assets to convert')
|
|
argparser.add_argument(
|
|
'-o', '--output',
|
|
type=str,
|
|
help='Path where all the assets will be after conversion. Default: current directory.')
|
|
argparser.add_argument(
|
|
'--packages',
|
|
type=str,
|
|
help='(Optional) Packages to generate. Usage: "--packages=PkgeName1,PkgeName2"')
|
|
argparser.add_argument(
|
|
'-v', '--verbose',
|
|
action='store_true',
|
|
default=False,
|
|
help='Prints extra information')
|
|
argparser.add_argument(
|
|
'--image',
|
|
type=str,
|
|
help='Use a specific Carla image. Default: "carla:latest"',
|
|
default='carla:latest',
|
|
)
|
|
args = argparser.parse_args()
|
|
|
|
if not args.output:
|
|
args.output = os.getcwd()
|
|
|
|
if args.packages is not None and args.packages and not args.input:
|
|
print(
|
|
docker_utils.RED +
|
|
"[Error] The Input Path [-i|--input] must be specified "
|
|
"if you are processing individual packages." + docker_utils.ENDC)
|
|
exit(1)
|
|
|
|
print()
|
|
|
|
print(bold("- ") + bold_underline("Params:"))
|
|
print(" - Output path: " + str(args.output))
|
|
print(" - Packages: " + str(args.packages))
|
|
print(" - Input path: " + str(args.input))
|
|
print(" - Verbose: " + str(args.verbose))
|
|
print()
|
|
|
|
return args
|
|
|
|
|
|
def main():
|
|
|
|
args = parse_args()
|
|
carla_image_name = args.image
|
|
inbox_assets_path = '/home/carla/carla/Import'
|
|
client = docker.from_env()
|
|
|
|
# All possible Docker arguments are here:
|
|
# https://docker-py.readthedocs.io/en/stable/containers.html
|
|
container_args = {
|
|
"image": carla_image_name,
|
|
"user": 'carla',
|
|
"auto_remove": True,
|
|
"stdin_open": True,
|
|
"tty": True,
|
|
"detach": True}
|
|
|
|
if args.packages:
|
|
container_args["volumes"] = {
|
|
args.input: {'bind': inbox_assets_path, 'mode': 'rw'}}
|
|
|
|
print(bold("- ") + bold_underline("Docker arguments:"))
|
|
print_formated_dict(container_args)
|
|
|
|
try:
|
|
|
|
print("Running Docker...")
|
|
carla_container = client.containers.run(**container_args)
|
|
|
|
if args.packages:
|
|
# If there is packages, import them first and package them
|
|
docker_utils.exec_command(
|
|
carla_container,
|
|
'make import',
|
|
user='carla', verbose=args.verbose, ignore_error=False)
|
|
|
|
docker_utils.exec_command(
|
|
carla_container,
|
|
'make package ARGS="--packages=' + str(args.packages) + '"',
|
|
user='carla', verbose=args.verbose, ignore_error=False)
|
|
else:
|
|
# Just create a package of the whole project
|
|
docker_utils.exec_command(
|
|
carla_container,
|
|
'make package',
|
|
user='carla', verbose=args.verbose, ignore_error=False)
|
|
|
|
# Get the files routes to export
|
|
files_to_copy = docker_utils.get_file_paths(
|
|
carla_container,
|
|
'/home/carla/carla/Dist/*.tar.gz',
|
|
user='carla', verbose=args.verbose)
|
|
|
|
# Copy these files to the output folder
|
|
docker_utils.extract_files(carla_container, files_to_copy, args.output)
|
|
|
|
finally:
|
|
|
|
print("Closing container " + carla_image_name)
|
|
carla_container.stop()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|