def test_container_build_with_container_tool(mocker): ''' Tests that container_tool argument is parsed and passed to container build. ''' container_tool = "podman" #with docker_build argument arg_strings = [ "path/to/open-ce", "build", "env", "--docker_build", "my-env.yaml", "--container_tool", container_tool ] args = make_args() mocker.patch('os.system', return_value=0) container_build.build_with_container_tool(args, arg_strings) #with container_build argument arg_strings = [ "path/to/open-ce", "build", "env", "--container_build", "my-env.yaml", "--container_tool", container_tool ] args = make_args() mocker.patch('os.system', return_value=0) container_build.build_with_container_tool(args, arg_strings)
def test_container_build_with_container_tool_build_args(mocker): ''' Tests that container build arguments are parsed and passed to container build. ''' build_args = "--build-arg ENV1=test1 --build-arg ENV2=test2 same_setting 0,1" #with docker_build argument arg_strings = [ "path/to/open-ce", "build", "env", "--docker_build", "my-env.yaml", "--container_build_args", build_args ] args = make_args() mocker.patch('os.system', return_value=0) container_build.build_with_container_tool(args, arg_strings) #with container_build argument arg_strings = [ "path/to/open-ce", "build", "env", "--container_build", "my-env.yaml", "--container_build_args", build_args ] args = make_args() mocker.patch('os.system', return_value=0) container_build.build_with_container_tool(args, arg_strings)
def test_build_with_container_tool_incompatible_cuda_versions(mocker): ''' Tests that passing incompatible value in --cuda_versions argument fails. ''' mocker.patch('open_ce.container_build._capable_of_cuda_containers', return_value=0) mocker.patch('open_ce.utils.get_driver_level', return_value="abc") #with docker_build argument arg_strings = [ "path/to/open-ce", "build", "env", "--docker_build", "my-env.yaml", "--cuda_versions", "10.2", "--build_types", "cuda" ] args = make_args() with pytest.raises(OpenCEError) as exc: container_build.build_with_container_tool(args, arg_strings) assert "Driver level" in str(exc.value) #with container_build argument arg_strings = [ "path/to/open-ce", "build", "env", "--container_build", "my-env.yaml", "--cuda_versions", "10.2", "--build_types", "cuda" ] args = make_args() mocker.patch('open_ce.container_build._capable_of_cuda_containers', return_value=0) mocker.patch('open_ce.utils.get_driver_level', return_value="abc") with pytest.raises(OpenCEError) as exc: container_build.build_with_container_tool(args, arg_strings) assert "Driver level" in str(exc.value)
def test_build_with_container_tool_failures(mocker): ''' Failure cases for build_with_container_tool ''' arg_strings = [ "path/to/open-ce", "build", "env", "--container_build", "my-env.yaml", "--cuda_versions", "10.2", "--build_types", "cuda" ] args = make_args() mocker.patch('os.system', return_value=1) with pytest.raises(OpenCEError) as exc: container_build.build_with_container_tool(args, arg_strings) assert "Failure building image" in str(exc.value)
def build_env(args): '''Entry Function''' utils.check_conda_build_configs_exist(args.conda_build_configs) if args.container_build: if len(args.cuda_versions.split(',')) > 1: raise OpenCEError(Error.TOO_MANY_CUDA) container_build.build_with_container_tool(args, sys.argv) return # Importing BuildTree is intentionally done here because it checks for the # existence of conda-build as BuildTree uses conda_build APIs. from open_ce.build_tree import construct_build_tree # pylint: disable=import-outside-toplevel build_tree = construct_build_tree(args) # Generate conda environment files conda_env_files = build_tree.write_conda_env_files( output_folder=os.path.abspath(args.output_folder), path=os.path.abspath(args.output_folder)) log.info( "Generated conda environment files from the selected build arguments: %s", conda_env_files.values()) log.info("One can use these environment files to create a conda" \ " environment using \"conda env create -f <conda_env_file_name>.\"") if not args.skip_build_packages: # Build each package in the packages list for build_command in build_tree: if not build_command.all_outputs_exist(args.output_folder): try: log.info("Building %s", build_command.recipe) build_feedstock.build_feedstock_from_command( build_command, output_folder=os.path.abspath(args.output_folder), pkg_format=args.conda_pkg_format) except OpenCEError as exc: raise OpenCEError(Error.BUILD_RECIPE, build_command.repository, exc.msg) from exc else: log.info("Skipping build of %s because it already exists.", build_command.recipe) if args.run_tests: _run_tests(build_tree, inputs.parse_arg_list(args.test_labels), conda_env_files, os.path.abspath(args.output_folder))
def test_build_with_container_tool(mocker): ''' Simple test for build_with_container_tool ''' image_name = "my_image" arg_strings = [ "path/to/open-ce", "build", "env", "--container_build", "my-env.yaml", "--cuda_versions", "10.2", "--build_types", "cuda" ] args = make_args() mocker.patch('open_ce.container_build.build_image', return_value=(0, image_name)) mocker.patch('open_ce.container_build.build_in_container', return_value=0) mocker.patch('os.system', return_value=0) container_build.build_with_container_tool(args, arg_strings)
def build_env(args): '''Entry Function''' utils.check_conda_build_configs_exist(args.conda_build_configs) if args.container_build: if len(args.cuda_versions.split(',')) > 1: raise OpenCEError(Error.TOO_MANY_CUDA) container_build.build_with_container_tool(args, sys.argv) return # Checking conda-build existence if --container_build is not specified utils.check_if_package_exists('conda-build') # Here, importing BuildTree is intentionally done after checking # existence of conda-build as BuildTree uses conda_build APIs. from open_ce.build_tree import BuildTree # pylint: disable=import-outside-toplevel # If repository_folder doesn't exist, create it if args.repository_folder and not os.path.exists(args.repository_folder): os.mkdir(args.repository_folder) # Create the build tree build_tree = BuildTree( env_config_files=args.env_config_file, python_versions=inputs.parse_arg_list(args.python_versions), build_types=inputs.parse_arg_list(args.build_types), mpi_types=inputs.parse_arg_list(args.mpi_types), cuda_versions=inputs.parse_arg_list(args.cuda_versions), repository_folder=args.repository_folder, channels=args.channels_list, git_location=args.git_location, git_tag_for_env=args.git_tag_for_env, git_up_to_date=args.git_up_to_date, conda_build_config=args.conda_build_configs, packages=inputs.parse_arg_list(args.packages)) # Generate conda environment files conda_env_files = build_tree.write_conda_env_files( output_folder=os.path.abspath(args.output_folder), path=os.path.abspath(args.output_folder)) print( "Generated conda environment files from the selected build arguments:", conda_env_files.values()) print("INFO: One can use these environment files to create a conda" \ " environment using \"conda env create -f <conda_env_file_name>.\"") if not args.skip_build_packages: # Build each package in the packages list for build_command in build_tree: if not build_command.all_outputs_exist(args.output_folder): try: print("Building " + build_command.recipe) build_feedstock.build_feedstock_from_command( build_command, output_folder=os.path.abspath(args.output_folder)) except OpenCEError as exc: raise OpenCEError(Error.BUILD_RECIPE, build_command.repository, exc.msg) from exc else: print("Skipping build of " + build_command.recipe + " because it already exists") if args.run_tests: _run_tests(build_tree, inputs.parse_arg_list(args.test_labels), conda_env_files)