def execute(command, code=True, combine=False, check=True, text=True, shell=True, onlycode=False, onlyerror=False): logger.info('Command %s gets executed.' % (command,)) if combine: process = run(command, stdout=PIPE, stderr=STDOUT, text=text, shell=shell, executable='/bin/bash') logger.debug('Exit code: %s \nStdout: %s \nStderr: %s' % (process.returncode, process.stdout, process.stderr)) else: process = run(command, capture_output=True, text=text, shell=shell, executable='/bin/bash') logger.debug('Exit code: %s \nStdout: %s' % (process.returncode, process.stdout)) if check and process.returncode != 0: raise FailedToExecute(command, process.returncode, process.stderr) if onlycode: return process.returncode elif onlyerror: return process.stderr, process.returncode elif code and combine: return process.stdout, process.returncode elif code: return process.stdout, process.stderr, process.returncode elif combine: return process.stdout else: return process.stdout, process.stderr
def upgrade() -> None: logger.info('Upgrading snap packages') err, code = execute('snap refresh', onlyerror=True) if code != 0: logger.error( 'Cannot upgrade snap packages (exited with %s). Stderr:\n%s' % (code, err))
def pull(name, tag='latest', **kwargs) -> Image: logger.info('Pulling image %s' % (name, ) if not tag else 'Pulling image %s:%s' % (name, tag)) image = get_client().images.pull(name, tag=tag, **kwargs) if type(image) == list(): return image[0] return image
def install(*package_names) -> None: for name in package_names: logger.info('Installing pip package %s' % (name, )) err, code = execute('python3 -m pip install --upgrade %s' % (name, ), check=False, onlyerror=True) if code != 0: logger.error('Pip package %s cannot be installed. Stderr:\n%s' % (name, err))
def remove(*package_names) -> None: for name in package_names: logger.info('Removing pip package %s' % (name, )) err, code = execute('python3 -m pip uninstall %s' % (name, ), check=False, onlyerror=True) if code != 0: logger.error('Pip package %s cannot be removed. Stderr:\n%s' % (name, err))
def install(*package_names) -> None: for name in package_names: logger.info('Installing snap package %s' % (name, )) if execute('snap info %s' % (name, ), onlycode=True) != 0: logger.error('Snap package %s not found!' % (name, )) continue if name in list_all(): logger.warning('Snap package %s already installed!' % (name, )) continue err, code = execute('snap install %s' % (name, ), check=False, onlyerror=True) if code != 0: logger.error( 'Snap package %s cannot be installed (exited with %s). Stderr:\n%s' % (name, code, err))
def build(fp, tag, logs=False, remove=True, timeout=300, pull_image=True, **kwargs): logger.info('Building image %s from %s' % (tag, fp)) try: image, log = get_client().images.build(path=fp, tag=tag, rm=remove, timeout=timeout, pull=pull_image, **kwargs) if logs: return (image, log) else: return image except BuildError: logger.error('Build for image from %s failed' % (fp, ))
def start(*container_names) -> None: logger.info('Starting containers: ' % (name, image_name)) [get_client().containers.get(name).start() for name in container_names]
def create(image_name, name, detach=True, **kwargs): logger.info('Create a container with name %s from image %s' % (name, image_name)) container = get_client().containers.create(image_name, name=name, detach=detach, **kwargs)
def run(image_name, name, detach=True, **kwargs) -> Container: logger.info('Run a container with name %s from image %s' % (name, image_name)) try: container = get_client().containers.run(image_name, name=name, detach=detach, **kwargs) if container.status !=
def save(name, fp, chunk_size=2097152, named=True) -> None: logger.info('Saving image %s to file %s' % (name, fp)) with open(fp, 'wb') as f: for e in get_client().images.get(name).save(chunk_size=chunk_size, named=named): f.write(e)
def change_mod_conjugated(fp, subfp, mode): _chmod(_join(fp, subfp), mode) logger.info('Changed mod for %s to %s' % (_join(fp, subfp), mode))
def change_mod(fp, mode): _chmod(fp, mode) logger.info('Changed mod for %s to %s' % (fp, mode))
def move(source, destination): _move(source, destination) logger.info('Move %s to %s' % (source, destination))
def copy(source, destination): _copy(source, destination) logger.info('Copied %s to %s' % (source, destination))
def upgrade() -> None: logger.info('Upgrading pip packages') install(*list_all())