forked from phoenix-oss/llama-stack-mirror
# What does this PR do? We want to bundle a bunch of (typically remote) providers in a distro template and be able to configure them "on the fly" via environment variables. So far, we have been able to do this with simple env var replacements. However, sometimes you want to only conditionally enable providers (because the relevant remote services may not be alive, or relevant.) This was not possible until now. To aid this, we add a simple (bash-like) env var replacement enhancement: `${env.FOO+bar}` evaluates to `bar` if the variable is SET and evaluates to empty string if it is not. On top of that, we update our main resolver to ignore any provider whose ID is null. This allows using the distro like this: ```bash llama stack run dev --env CHROMADB_URL=http://localhost:6001 --env ENABLE_CHROMADB=1 ``` when only Chroma is UP. This disables the other `pgvector` provider in the run configuration. ## Test Plan Hard code `chromadb` as the vector io provider inside `test_vector_io.py` and run: ```bash LLAMA_STACK_BASE_URL=http://localhost:8321 pytest -s -v tests/client-sdk/vector_io/ --embedding-model all-MiniLM-L6-v2 ```
66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the terms described in the LICENSE file in
|
|
# the root directory of this source tree.
|
|
|
|
import os
|
|
import unittest
|
|
|
|
from llama_stack.distribution.stack import replace_env_vars
|
|
|
|
|
|
class TestReplaceEnvVars(unittest.TestCase):
|
|
def setUp(self):
|
|
# Clear any existing environment variables we'll use in tests
|
|
for var in ["TEST_VAR", "EMPTY_VAR", "ZERO_VAR"]:
|
|
if var in os.environ:
|
|
del os.environ[var]
|
|
|
|
# Set up test environment variables
|
|
os.environ["TEST_VAR"] = "test_value"
|
|
os.environ["EMPTY_VAR"] = ""
|
|
os.environ["ZERO_VAR"] = "0"
|
|
|
|
def test_simple_replacement(self):
|
|
self.assertEqual(replace_env_vars("${env.TEST_VAR}"), "test_value")
|
|
|
|
def test_default_value_when_not_set(self):
|
|
self.assertEqual(replace_env_vars("${env.NOT_SET:default}"), "default")
|
|
|
|
def test_default_value_when_set(self):
|
|
self.assertEqual(replace_env_vars("${env.TEST_VAR:default}"), "test_value")
|
|
|
|
def test_default_value_when_empty(self):
|
|
self.assertEqual(replace_env_vars("${env.EMPTY_VAR:default}"), "default")
|
|
|
|
def test_conditional_value_when_set(self):
|
|
self.assertEqual(replace_env_vars("${env.TEST_VAR+conditional}"), "conditional")
|
|
|
|
def test_conditional_value_when_not_set(self):
|
|
self.assertEqual(replace_env_vars("${env.NOT_SET+conditional}"), "")
|
|
|
|
def test_conditional_value_when_empty(self):
|
|
self.assertEqual(replace_env_vars("${env.EMPTY_VAR+conditional}"), "")
|
|
|
|
def test_conditional_value_with_zero(self):
|
|
self.assertEqual(replace_env_vars("${env.ZERO_VAR+conditional}"), "conditional")
|
|
|
|
def test_mixed_syntax(self):
|
|
self.assertEqual(replace_env_vars("${env.TEST_VAR:default} and ${env.NOT_SET+conditional}"), "test_value and ")
|
|
self.assertEqual(
|
|
replace_env_vars("${env.NOT_SET:default} and ${env.TEST_VAR+conditional}"), "default and conditional"
|
|
)
|
|
|
|
def test_nested_structures(self):
|
|
data = {
|
|
"key1": "${env.TEST_VAR:default}",
|
|
"key2": ["${env.NOT_SET:default}", "${env.TEST_VAR+conditional}"],
|
|
"key3": {"nested": "${env.NOT_SET+conditional}"},
|
|
}
|
|
expected = {"key1": "test_value", "key2": ["default", "conditional"], "key3": {"nested": ""}}
|
|
self.assertEqual(replace_env_vars(data), expected)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|