def delete(type=None, distro=None, branch=None, system=None, image_version=None, version=None, name=None, base_directory=casa_distro_directory(), interactive=True): """ Delete an existing environment. The whole environment directory will be removed and forgotten. Use with care. Image files will be left untouched - use clean_images for this. Parameters ---------- {type} {distro} {branch} {system} {image_version} {version} {name} {base_directory} interactive default={interactive_default} if true (or 1, or yes), ask confirmation interactively for each selected environment. """ interactive = check_boolean('interactive', interactive) if not interactive and type is None and distro is None and system is None \ and image_version is None and name is None: raise RuntimeError( 'Refusing to delete all environments without confirmation. ' 'Either use interactive=True, or provide an explicit pattern for ' 'environment selection parameters') for config in iter_environments(base_directory, type=type, distro=distro, branch=branch, system=system, image_version=image_version, version=version, name=name): if interactive: confirm = interactive_input( 'delete environment %s [y/N]: ' % config['name']) if confirm not in ('y', 'yes', 'Y', 'YES'): print('skip.') continue print('deleting environment %s' % config['name']) directory = config['directory'] print('rm -rf "%s"' % directory) shutil.rmtree(directory)
def setup_user(dir='/casa/setup', rw_install=False, distro=None, version=os.environ.get('CASA_VERSION'), url='https://brainvisa.info/download'): """ Create all necessary directories and files to setup a user environment. This command is not supposed to be called directly but using a user image:: mkdir ~/brainvisa cd ~/brainvisa singularity run --bind .:/casa/setup brainvisa-5.0.sif Parameters ---------- dir dir={dir_default} Target environment directory rw_install {rw_install_default} if true, install in a read-write directory /casa/host/install in the container but on the host filesystem. This install allows to add external toolboxes on top of the standard BrainVisa install distro {distro_default} if specified, the install will download the BrainVisa distro from the web site, and install it in a writable directory /casa/host/install in the container, like with the rw_install mode above. version {version_default} version of the Brainvisa distribution to be downloaded (for use with the distro option). url {url_default} download URL for use with the distro option. """ rw_install = check_boolean('rw_install', rw_install) env_setup_user(dir, rw_install=rw_install, distro=distro, version=version, url=url)
def mrun(type=None, distro=None, branch=None, system=None, image_version=None, name=None, version=None, base_directory=casa_distro_directory(), gui=True, opengl="auto", root=False, cwd=None, env=None, image=None, container_options=[], args_list=[], verbose=None): ''' Start any command in one or several container with the given repository configuration. By default, command is executed in all existing build workflows. example:: # Launch bv_maker on all build workflows using any version of Ubuntu casa_distro mrun bv_maker system=ubuntu-* Parameters ---------- {type} {distro} {branch} {system} {image_version} {name} {version} {base_directory} {gui} {opengl} {root} {cwd} {env} {image} {container_options} {verbose} ''' verbose = verbose_file(verbose) gui = check_boolean('gui', gui) root = check_boolean('root', root) if container_options: container_options = parse_list(container_options) if env: env_list = parse_list(env) try: env = dict(e.split('=') for e in env_list) except ValueError: raise ValueError('env syntax error. Should be in the shape ' '"VAR1=value1,VAR2=value2" etc.') command = args_list res = [] for config in iter_environments(base_directory, type=type, distro=distro, branch=branch, system=system, image_version=image_version, name=name, version=version): res.append(run_container(config, command=command, gui=gui, opengl=opengl, root=root, cwd=cwd, env=env, image=image, container_options=container_options, base_directory=base_directory, verbose=verbose)) if all(r == 0 for r in res): return 0 else: sys.stderr.write('Exit codes: {0}\n'.format(res)) return max(res)
def run(type=None, distro=None, branch=None, system=None, image_version=None, version=None, name=None, base_directory=casa_distro_directory(), gui=True, opengl="auto", root=False, cwd=None, env=None, image=None, container_options=None, args_list=[], verbose=None): """ Start any command in a selected run or dev environment example:: casa_distro branch=master ls -als /casa Parameters ---------- {type} {distro} {branch} {system} {image_version} {name} {version} {base_directory} {gui} {opengl} {root} {cwd} {env} {image} {container_options} {verbose} """ verbose = verbose_file(verbose) gui = check_boolean('gui', gui) root = check_boolean('root', root) config = select_environment(base_directory, type=type, distro=distro, branch=branch, system=system, image_version=image_version, name=name, version=version) if container_options: container_options = parse_list(container_options) if env: env_list = parse_list(env) try: env = dict(e.split('=') for e in env_list) except ValueError: raise ValueError('env syntax error. Should be in the shape ' '"VAR1=value1,VAR2=value2" etc.') command = args_list return run_container(config, command=command, gui=gui, opengl=opengl, root=root, cwd=cwd, env=env, image=image, container_options=container_options, base_directory=base_directory, verbose=verbose)
def list_command(type=None, distro=None, branch=None, system=None, image_version=None, name=None, base_directory=casa_distro_directory(), json='no', verbose=None): '''List run or dev environments created by "setup"/"setup_dev" command. Parameters ---------- {type} {distro} {branch} {system} {image_version} {name} {base_directory} json default = {json_default} The output is written as a list of configuration dictionaries in JSON format. {verbose} ''' json_output = check_boolean('json', json) json = sys.modules['json'] verbose = verbose_file(verbose) # json parameter is hiding json module. # it is not possible to get back to a global # variable for json. Therefore, the json module is # stored in the local variable import json json_result = [] for config in iter_environments(base_directory, type=type, distro=distro, branch=branch, system=system, image_version=image_version, name=name): if json_output: json_result.append(config) else: print(config['name']) for i in ('type', 'distro', 'branch', 'version', 'system', 'image_version', 'container_type', 'image'): v = config.get(i) if v is not None: print(' %s:' % i, config[i]) overlay = config.get('overlay') if overlay: print(' writable file system:', overlay) print(' writable file system size:', size_to_string(config['overlay_size'])) print(' directory:', config['directory']) if verbose: print(' full environment:') for line in json.dumps(config, indent=2, separators=(',', ': ')).split('\n'): print(' ', line) if json_output: json.dump(json_result, sys.stdout)