Skip to content

Commit 8a99c07

Browse files
authored
Merge pull request #75 from pinecone-io/certifi-certs
Fix log level updates and set default openapi_config ssl_ca_cert bundle to point to certifi bundle
2 parents 385e613 + 040ac98 commit 8a99c07

File tree

3 files changed

+58
-9
lines changed

3 files changed

+58
-9
lines changed

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Changelog
2+
3+
## [Unreleased]
4+
5+
### Changed
6+
- `pinecone.init()` can now be used to set the pinecone logger's log level.
7+
- The python client `pinecone.config.OpenApiConfiguration` object now uses the certifi package's SSL CA bundle by default. This should fix HTTPS connection errors in certain environments depending on their default CA bundle, including some Google Colab notebooks.
8+
9+
## [2.0.0] - 2020-10-04
10+
### Added
11+
- New major release!
12+
13+
### Changed
14+
- `pinecone.create_index()` now requires a `dimension` parameter.
15+
- The `pinecone.Index` interface has changed:
16+
- `Index.upsert`, `Index.query`, `Index.fetch`, and `Index.delete` now take different parameters and return different results.
17+
- `Index.info` has been removed. See `Index.describe_index_stats()` as an alternative.
18+
- The `Index()` constructor no longer validates index existence. This is instead done on all operations executed using the Index instance.
19+
20+
21+
[Unreleased]: https://github.com/pinecone-io/pinecone-python-client/compare/v2.0.1...HEAD
22+
[2.0.1]: https://github.com/pinecone-io/pinecone-python-client/compare/v2.0.0...v2.0.1
23+
[2.0.0]: https://github.com/pinecone-io/pinecone-python-client/compare/v2.0.0...v2.0.1

pinecone/config.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import NamedTuple
66
import os
77

8+
import certifi
89
from loguru import logger
910
import requests
1011
import sentry_sdk
@@ -14,7 +15,7 @@
1415
from pinecone.core.api_action import ActionAPI, WhoAmIResponse
1516
from pinecone.core.utils.constants import CLIENT_VERSION
1617
from pinecone.core.utils.sentry import sentry_decorator as sentry
17-
from pinecone.core.client.configuration import Configuration
18+
from pinecone.core.client.configuration import Configuration as OpenApiConfiguration
1819

1920
__all__ = [
2021
"Config", "logger", "init"
@@ -35,7 +36,7 @@ class ConfigBase(NamedTuple):
3536
project_name: str = ""
3637
controller_host: str = ""
3738
log_level: str = ""
38-
openapi_config: Configuration = None
39+
openapi_config: OpenApiConfiguration = None
3940

4041

4142
class _CONFIG:
@@ -50,6 +51,7 @@ class _CONFIG:
5051
"""
5152

5253
def __init__(self):
54+
self._loguru_handler_id = None
5355
self.reset()
5456

5557
def validate(self):
@@ -108,11 +110,11 @@ def reset(self, config_file=None, **kwargs):
108110
self._config = config
109111

110112
# Set OpenAPI client config
113+
default_openapi_config = OpenApiConfiguration.get_default_copy()
114+
default_openapi_config.ssl_ca_cert = certifi.where()
111115
openapi_config = (
112116
kwargs.pop("openapi_config", None)
113-
or os.getenv("PINECONE_OPENAPI_CONFIG")
114-
or file_config.pop("openapi_config", None)
115-
or Configuration.get_default_copy()
117+
or default_openapi_config
116118
)
117119

118120
config = config._replace(openapi_config=openapi_config)
@@ -122,8 +124,12 @@ def reset(self, config_file=None, **kwargs):
122124
log_level = (
123125
kwargs.pop("log_level", None)
124126
or os.getenv("PINECONE_LOG_LEVEL")
127+
or os.getenv("PINECONE_LOGGING")
125128
or file_config.pop("log_level", None)
126129
)
130+
if log_level or not self._loguru_handler_id:
131+
logger.remove(self._loguru_handler_id)
132+
self._loguru_handler_id = logger.add(sys.stdout, enqueue=True, level=(log_level or "ERROR"))
127133
config = config._replace(log_level=log_level)
128134
self._config = config
129135

@@ -188,7 +194,7 @@ def LOG_LEVEL(self):
188194

189195
@sentry
190196
def init(api_key: str = None, host: str = None, environment: str = None, project_name: str = None,
191-
log_level: str = None, openapi_config: Configuration = None,
197+
log_level: str = None, openapi_config: OpenApiConfiguration = None,
192198
config: str = "~/.pinecone", **kwargs):
193199
"""Initializes the Pinecone client.
194200
@@ -207,9 +213,6 @@ def init(api_key: str = None, host: str = None, environment: str = None, project
207213
logger.warning("API key is required.")
208214

209215

210-
logger.remove()
211-
logger.add(sys.stdout, enqueue=True, level=(os.getenv("PINECONE_LOGGING") or "ERROR"))
212-
213216
Config = _CONFIG()
214217

215218
# Init

tests/unit/test_config.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import pinecone
2+
from pinecone.config import logger, Config
3+
4+
5+
def test_update_log_level():
6+
default_level = 'ERROR'
7+
assert list(logger._core.handlers.values())[0].levelno == logger.level(default_level).no
8+
new_level = 'INFO'
9+
pinecone.init(log_level=new_level)
10+
assert list(logger._core.handlers.values())[0].levelno == logger.level(new_level).no
11+
12+
13+
def test_multi_init():
14+
env = 'test-env'
15+
level = 'INFO'
16+
# first init() sets log level
17+
pinecone.init(log_level=level)
18+
assert Config.ENVIRONMENT == 'us-west1-gcp'
19+
assert list(logger._core.handlers.values())[0].levelno == logger.level(level).no
20+
# next init() shouldn't clobber log level
21+
pinecone.init(environment=env)
22+
assert Config.ENVIRONMENT == env
23+
assert list(logger._core.handlers.values())[0].levelno == logger.level(level).no

0 commit comments

Comments
 (0)