fix: avoid failure when no special pip deps and better exit (#1228)

# What does this PR do?

When building providers in a virtual environment or containers, special
pip dependencies may not always be provided (e.g., for Ollama). The
check should only fail if the required number of arguments is missing.
Currently, two arguments are mandatory:

1. Environment name
2. Pip dependencies

Additionally, return statements were replaced with sys.exit(1) in error
conditions to ensure immediate termination on critical failures. Error
handling in the stack build process was also improved to guarantee the
program exits with status 1 when facing configuration issues or build
failures.

Signed-off-by: Sébastien Han <seb@redhat.com>

[//]: # (If resolving an issue, uncomment and update the line below)
[//]: # (Closes #[issue-number])

## Test Plan

This command shouldn't fail:

```
llama stack build --template ollama --image-type venv
```

[//]: # (## Documentation)

Signed-off-by: Sébastien Han <seb@redhat.com>
This commit is contained in:
Sébastien Han 2025-02-24 19:18:52 +01:00 committed by GitHub
parent d6356f822a
commit c4987bc349
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 12 deletions

View file

@ -9,6 +9,7 @@ import importlib.resources
import json import json
import os import os
import shutil import shutil
import sys
import textwrap import textwrap
from functools import lru_cache from functools import lru_cache
from pathlib import Path from pathlib import Path
@ -79,7 +80,7 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
f"Could not find template {args.template}. Please run `llama stack build --list-templates` to check out the available templates", f"Could not find template {args.template}. Please run `llama stack build --list-templates` to check out the available templates",
color="red", color="red",
) )
return sys.exit(1)
build_config = available_templates[args.template] build_config = available_templates[args.template]
if args.image_type: if args.image_type:
build_config.image_type = args.image_type build_config.image_type = args.image_type
@ -88,7 +89,7 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
f"Please specify a image-type (container | conda | venv) for {args.template}", f"Please specify a image-type (container | conda | venv) for {args.template}",
color="red", color="red",
) )
return sys.exit(1)
elif not args.config and not args.template: elif not args.config and not args.template:
name = prompt( name = prompt(
"> Enter a name for your Llama Stack (e.g. my-local-stack): ", "> Enter a name for your Llama Stack (e.g. my-local-stack): ",
@ -169,14 +170,14 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
f"Could not parse config file {args.config}: {e}", f"Could not parse config file {args.config}: {e}",
color="red", color="red",
) )
return sys.exit(1)
if build_config.image_type == ImageType.container.value and not args.image_name: if build_config.image_type == ImageType.container.value and not args.image_name:
cprint( cprint(
"Please specify --image-name when building a container from a config file", "Please specify --image-name when building a container from a config file",
color="red", color="red",
) )
return sys.exit(1)
if args.print_deps_only: if args.print_deps_only:
print(f"# Dependencies for {args.template or args.config or image_name}") print(f"# Dependencies for {args.template or args.config or image_name}")
@ -195,18 +196,18 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
template_name=args.template, template_name=args.template,
) )
except Exception as exc: except (Exception, RuntimeError) as exc:
cprint( cprint(
f"Error building stack: {exc}", f"Error building stack: {exc}",
color="red", color="red",
) )
return sys.exit(1)
if run_config is None: if run_config is None:
cprint( cprint(
"Run config path is empty", "Run config path is empty",
color="red", color="red",
) )
return sys.exit(1)
if args.run: if args.run:
run_config = Path(run_config) run_config = Path(run_config)
@ -312,7 +313,7 @@ def _run_stack_build_command_from_build_config(
template_or_config=template_name or config_path, template_or_config=template_name or config_path,
) )
if return_code != 0: if return_code != 0:
return raise RuntimeError(f"Failed to build image {image_name}")
if template_name: if template_name:
# copy run.yaml from template to build_dir instead of generating it again # copy run.yaml from template to build_dir instead of generating it again

View file

@ -34,7 +34,7 @@ container_base="$3"
build_file_path="$4" build_file_path="$4"
host_build_dir="$5" host_build_dir="$5"
pip_dependencies="$6" pip_dependencies="$6"
special_pip_deps="$7" special_pip_deps="${7:-}"
# Define color codes # Define color codes

View file

@ -25,7 +25,7 @@ if [ -n "$LLAMA_MODELS_DIR" ]; then
echo "Using llama-models-dir=$LLAMA_MODELS_DIR" echo "Using llama-models-dir=$LLAMA_MODELS_DIR"
fi fi
if [ "$#" -lt 3 ]; then if [ "$#" -lt 2 ]; then
echo "Usage: $0 <distribution_type> <env_name> <pip_dependencies> [<special_pip_deps>]" >&2 echo "Usage: $0 <distribution_type> <env_name> <pip_dependencies> [<special_pip_deps>]" >&2
echo "Example: $0 <distribution_type> mybuild ./my-stack-build.yaml 'numpy pandas scipy'" >&2 echo "Example: $0 <distribution_type> mybuild ./my-stack-build.yaml 'numpy pandas scipy'" >&2
exit 1 exit 1