Skip to content

Commit 73682fc

Browse files
Merge pull request #2620 from blublinsky/azure
Add support for SSL with custom certificates for Azure
2 parents 66ee713 + 2537ac4 commit 73682fc

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

ols/app/models/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ def __init__(
365365
constants.PROVIDER_RHOAI_VLLM,
366366
constants.PROVIDER_RHELAI_VLLM,
367367
constants.PROVIDER_OPENAI,
368+
constants.PROVIDER_AZURE_OPENAI,
368369
):
369370
self.certificates_store = os.path.join(
370371
certificate_directory, constants.CERTIFICATE_STORAGE_FILENAME

ols/src/llms/providers/azure_openai.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def default_params(self) -> dict[str, Any]:
5757
deployment_name = self.provider_config.deployment_name
5858
azure_config = self.provider_config.azure_config
5959

60-
# provider-specific configuration has precendence over regular configuration
60+
# provider-specific configuration has precedence over regular configuration
6161
if azure_config is not None:
6262
self.url = str(azure_config.url)
6363
deployment_name = azure_config.deployment_name
@@ -73,8 +73,8 @@ def default_params(self) -> dict[str, Any]:
7373
"cache": None,
7474
"max_tokens": 512,
7575
"verbose": False,
76-
"http_client": self._construct_httpx_client(False, False),
77-
"http_async_client": self._construct_httpx_client(False, True),
76+
"http_client": self._construct_httpx_client(True, False),
77+
"http_async_client": self._construct_httpx_client(True, True),
7878
}
7979

8080
# gpt-5 and o-series models don't support certain parameters
@@ -92,6 +92,7 @@ def default_params(self) -> dict[str, Any]:
9292
# client_id and client_secret)
9393
access_token = self.resolve_access_token(azure_config)
9494
default_parameters["azure_ad_token"] = access_token
95+
logger.info("Created Azure default parameters %s", default_parameters)
9596
return default_parameters
9697

9798
def load(self) -> BaseChatModel:

ols/src/llms/providers/provider.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ def _construct_httpx_client( # noqa: C901
370370
}
371371

372372
sec_profile = self.provider_config.tls_security_profile
373+
logger.info("Security profile %s", sec_profile)
373374

374375
# if security profile is not set, use httpx client as is
375376
if sec_profile is None or sec_profile.profile_type is None:
@@ -385,6 +386,9 @@ def _construct_httpx_client( # noqa: C901
385386
cafile=self.provider_config.certificates_store
386387
)
387388
verify = custom_context
389+
logger.info(
390+
"No security profiles. creating httpx.Client with verify %s", verify
391+
)
388392
if use_async:
389393
return httpx.AsyncClient(verify=verify, proxies=proxy, mounts=mounts)
390394
return httpx.Client(verify=verify, proxies=proxy, mounts=mounts)
@@ -411,6 +415,9 @@ def _construct_httpx_client( # noqa: C901
411415

412416
if use_custom_certificate_store:
413417
context.load_verify_locations(self.provider_config.certificates_store)
418+
logger.info(
419+
"With security profile, creating httpx.Client with verify %s", context
420+
)
414421
if use_async:
415422
return httpx.AsyncClient(verify=context, proxies=proxy)
416423
return httpx.Client(verify=context, proxies=proxy)

tests/unit/llms/providers/test_azure_openai.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Unit tests for Azure OpenAI provider."""
22

3+
import os
34
import time
45
from unittest.mock import patch
56

@@ -9,13 +10,28 @@
910
from langchain_openai import AzureChatOpenAI
1011
from pydantic import AnyHttpUrl
1112

13+
from ols import constants
1214
from ols.app.models.config import AzureOpenAIConfig, ProviderConfig
1315
from ols.src.llms.providers.azure_openai import (
1416
TOKEN_EXPIRATION_LEEWAY,
1517
AzureOpenAI,
1618
TokenCache,
1719
)
1820

21+
cert_in_certificates_store_path = "tests/unit/extra_certs/sample_cert_1.crt"
22+
23+
24+
@pytest.fixture
25+
def fake_certifi_store(tmpdir):
26+
"""Create a fake certifi store."""
27+
cert_store_path = os.path.join(
28+
constants.DEFAULT_CERTIFICATE_DIRECTORY, constants.CERTIFICATE_STORAGE_FILENAME
29+
)
30+
with open(cert_store_path, "wb") as cert_store:
31+
with open(cert_in_certificates_store_path, "rb") as cert_file:
32+
cert_store.write(cert_file.read())
33+
return cert_store_path
34+
1935

2036
@pytest.fixture
2137
def provider_config():
@@ -189,7 +205,7 @@ def provider_config_access_token_related_parameters():
189205
)
190206

191207

192-
def test_basic_interface(provider_config):
208+
def test_basic_interface(provider_config, fake_certifi_store):
193209
"""Test basic interface."""
194210
azure_openai = AzureOpenAI(
195211
model="uber-model", params={}, provider_config=provider_config
@@ -236,7 +252,9 @@ def test_credentials_in_directory_handling(provider_config_credentials_directory
236252
assert azure_openai.default_params["api_key"] == "secret_key"
237253

238254

239-
def test_loading_provider_specific_parameters(provider_config_with_specific_parameters):
255+
def test_loading_provider_specific_parameters(
256+
provider_config_with_specific_parameters, fake_certifi_store
257+
):
240258
"""Test if provider-specific parameters are loaded too."""
241259
azure_openai = AzureOpenAI(
242260
model="uber-model",
@@ -268,7 +286,7 @@ def test_loading_provider_specific_parameters(provider_config_with_specific_para
268286
assert azure_openai.credentials == "secret_key_2"
269287

270288

271-
def test_params_handling(provider_config):
289+
def test_params_handling(provider_config, fake_certifi_store):
272290
"""Test that not allowed parameters are removed before model init."""
273291
# first three parameters should be removed before model init
274292
# rest need to stay

0 commit comments

Comments
 (0)