|
20 | 20 | import typing as t
|
21 | 21 |
|
22 | 22 | from elastic_transport import (
|
| 23 | + ApiResponse, |
23 | 24 | AsyncTransport,
|
24 | 25 | BaseNode,
|
25 | 26 | BinaryApiResponse,
|
26 | 27 | HeadApiResponse,
|
| 28 | + HttpHeaders, |
27 | 29 | NodeConfig,
|
28 | 30 | NodePool,
|
29 | 31 | NodeSelector,
|
|
97 | 99 | SelfType = t.TypeVar("SelfType", bound="AsyncElasticsearch")
|
98 | 100 |
|
99 | 101 |
|
100 |
| -class AsyncElasticsearch(BaseClient): |
| 102 | +class AsyncElasticsearch: |
101 | 103 | """
|
102 | 104 | Elasticsearch low-level client. Provides a straightforward mapping from
|
103 | 105 | Python to Elasticsearch REST APIs.
|
@@ -224,6 +226,18 @@ def __init__(
|
224 | 226 | ):
|
225 | 227 | sniff_callback = default_sniff_callback
|
226 | 228 |
|
| 229 | + headers = HttpHeaders() |
| 230 | + if headers is not DEFAULT and headers is not None: |
| 231 | + headers.update(headers) |
| 232 | + if opaque_id is not DEFAULT and opaque_id is not None: # type: ignore[comparison-overlap] |
| 233 | + headers["x-opaque-id"] = opaque_id |
| 234 | + headers = resolve_auth_headers( |
| 235 | + headers, |
| 236 | + api_key=api_key, |
| 237 | + basic_auth=basic_auth, |
| 238 | + bearer_auth=bearer_auth, |
| 239 | + ) |
| 240 | + |
227 | 241 | if _transport is None:
|
228 | 242 | node_configs = client_node_configs(
|
229 | 243 | hosts,
|
@@ -295,72 +309,92 @@ def __init__(
|
295 | 309 | **transport_kwargs,
|
296 | 310 | )
|
297 | 311 |
|
298 |
| - super().__init__(_transport) |
| 312 | + self._base_client = BaseClient(_transport, headers=headers) |
299 | 313 |
|
300 | 314 | # These are set per-request so are stored separately.
|
301 |
| - self._request_timeout = request_timeout |
302 |
| - self._max_retries = max_retries |
303 |
| - self._retry_on_timeout = retry_on_timeout |
| 315 | + self._base_client._request_timeout = request_timeout |
| 316 | + self._base_client._max_retries = max_retries |
| 317 | + self._base_client._retry_on_timeout = retry_on_timeout |
304 | 318 | if isinstance(retry_on_status, int):
|
305 | 319 | retry_on_status = (retry_on_status,)
|
306 |
| - self._retry_on_status = retry_on_status |
| 320 | + self._base_client._retry_on_status = retry_on_status |
307 | 321 |
|
308 | 322 | else:
|
309 |
| - super().__init__(_transport) |
310 |
| - |
311 |
| - if headers is not DEFAULT and headers is not None: |
312 |
| - self._headers.update(headers) |
313 |
| - if opaque_id is not DEFAULT and opaque_id is not None: # type: ignore[comparison-overlap] |
314 |
| - self._headers["x-opaque-id"] = opaque_id |
315 |
| - self._headers = resolve_auth_headers( |
316 |
| - self._headers, |
317 |
| - api_key=api_key, |
318 |
| - basic_auth=basic_auth, |
319 |
| - bearer_auth=bearer_auth, |
320 |
| - ) |
| 323 | + self._base_client = BaseClient(_transport, headers=headers) |
321 | 324 |
|
322 | 325 | # namespaced clients for compatibility with API names
|
323 |
| - self.async_search = AsyncSearchClient(self) |
324 |
| - self.autoscaling = AutoscalingClient(self) |
325 |
| - self.cat = CatClient(self) |
326 |
| - self.cluster = ClusterClient(self) |
327 |
| - self.connector = ConnectorClient(self) |
328 |
| - self.fleet = FleetClient(self) |
329 |
| - self.features = FeaturesClient(self) |
330 |
| - self.indices = IndicesClient(self) |
331 |
| - self.inference = InferenceClient(self) |
332 |
| - self.ingest = IngestClient(self) |
333 |
| - self.nodes = NodesClient(self) |
334 |
| - self.snapshot = SnapshotClient(self) |
335 |
| - self.tasks = TasksClient(self) |
336 |
| - |
337 |
| - self.xpack = XPackClient(self) |
338 |
| - self.ccr = CcrClient(self) |
339 |
| - self.dangling_indices = DanglingIndicesClient(self) |
340 |
| - self.enrich = EnrichClient(self) |
341 |
| - self.eql = EqlClient(self) |
342 |
| - self.esql = EsqlClient(self) |
343 |
| - self.graph = GraphClient(self) |
344 |
| - self.ilm = IlmClient(self) |
345 |
| - self.license = LicenseClient(self) |
346 |
| - self.logstash = LogstashClient(self) |
347 |
| - self.migration = MigrationClient(self) |
348 |
| - self.ml = MlClient(self) |
349 |
| - self.monitoring = MonitoringClient(self) |
350 |
| - self.query_rules = QueryRulesClient(self) |
351 |
| - self.rollup = RollupClient(self) |
352 |
| - self.search_application = SearchApplicationClient(self) |
353 |
| - self.searchable_snapshots = SearchableSnapshotsClient(self) |
354 |
| - self.security = SecurityClient(self) |
355 |
| - self.slm = SlmClient(self) |
356 |
| - self.simulate = SimulateClient(self) |
357 |
| - self.shutdown = ShutdownClient(self) |
358 |
| - self.sql = SqlClient(self) |
359 |
| - self.ssl = SslClient(self) |
360 |
| - self.synonyms = SynonymsClient(self) |
361 |
| - self.text_structure = TextStructureClient(self) |
362 |
| - self.transform = TransformClient(self) |
363 |
| - self.watcher = WatcherClient(self) |
| 326 | + self.async_search = AsyncSearchClient(self._base_client) |
| 327 | + self.autoscaling = AutoscalingClient(self._base_client) |
| 328 | + self.cat = CatClient(self._base_client) |
| 329 | + self.cluster = ClusterClient(self._base_client) |
| 330 | + self.connector = ConnectorClient(self._base_client) |
| 331 | + self.fleet = FleetClient(self._base_client) |
| 332 | + self.features = FeaturesClient(self._base_client) |
| 333 | + self.indices = IndicesClient(self._base_client) |
| 334 | + self.inference = InferenceClient(self._base_client) |
| 335 | + self.ingest = IngestClient(self._base_client) |
| 336 | + self.nodes = NodesClient(self._base_client) |
| 337 | + self.snapshot = SnapshotClient(self._base_client) |
| 338 | + self.tasks = TasksClient(self._base_client) |
| 339 | + |
| 340 | + self.xpack = XPackClient(self._base_client) |
| 341 | + self.ccr = CcrClient(self._base_client) |
| 342 | + self.dangling_indices = DanglingIndicesClient(self._base_client) |
| 343 | + self.enrich = EnrichClient(self._base_client) |
| 344 | + self.eql = EqlClient(self._base_client) |
| 345 | + self.esql = EsqlClient(self._base_client) |
| 346 | + self.graph = GraphClient(self._base_client) |
| 347 | + self.ilm = IlmClient(self._base_client) |
| 348 | + self.license = LicenseClient(self._base_client) |
| 349 | + self.logstash = LogstashClient(self._base_client) |
| 350 | + self.migration = MigrationClient(self._base_client) |
| 351 | + self.ml = MlClient(self._base_client) |
| 352 | + self.monitoring = MonitoringClient(self._base_client) |
| 353 | + self.query_rules = QueryRulesClient(self._base_client) |
| 354 | + self.rollup = RollupClient(self._base_client) |
| 355 | + self.search_application = SearchApplicationClient(self._base_client) |
| 356 | + self.searchable_snapshots = SearchableSnapshotsClient(self._base_client) |
| 357 | + self.security = SecurityClient(self._base_client) |
| 358 | + self.slm = SlmClient(self._base_client) |
| 359 | + self.simulate = SimulateClient(self._base_client) |
| 360 | + self.shutdown = ShutdownClient(self._base_client) |
| 361 | + self.sql = SqlClient(self._base_client) |
| 362 | + self.ssl = SslClient(self._base_client) |
| 363 | + self.synonyms = SynonymsClient(self._base_client) |
| 364 | + self.text_structure = TextStructureClient(self._base_client) |
| 365 | + self.transform = TransformClient(self._base_client) |
| 366 | + self.watcher = WatcherClient(self._base_client) |
| 367 | + |
| 368 | + @property |
| 369 | + def transport(self) -> AsyncTransport: |
| 370 | + return self._base_client._transport |
| 371 | + |
| 372 | + async def perform_request( |
| 373 | + self, |
| 374 | + method: str, |
| 375 | + path: str, |
| 376 | + *, |
| 377 | + params: t.Optional[t.Mapping[str, t.Any]] = None, |
| 378 | + headers: t.Optional[t.Mapping[str, str]] = None, |
| 379 | + body: t.Optional[t.Any] = None, |
| 380 | + endpoint_id: t.Optional[str] = None, |
| 381 | + path_parts: t.Optional[t.Mapping[str, t.Any]] = None, |
| 382 | + ) -> ApiResponse[t.Any]: |
| 383 | + with self._base_client._otel.span( |
| 384 | + method, |
| 385 | + endpoint_id=endpoint_id, |
| 386 | + path_parts=path_parts or {}, |
| 387 | + ) as otel_span: |
| 388 | + response = await self._base_client._perform_request( |
| 389 | + method, |
| 390 | + path, |
| 391 | + params=params, |
| 392 | + headers=headers, |
| 393 | + body=body, |
| 394 | + otel_span=otel_span, |
| 395 | + ) |
| 396 | + otel_span.set_elastic_cloud_metadata(response.meta.headers) |
| 397 | + return response |
364 | 398 |
|
365 | 399 | def __repr__(self) -> str:
|
366 | 400 | try:
|
@@ -413,44 +447,44 @@ def options(
|
413 | 447 | resolved_headers["x-opaque-id"] = resolved_opaque_id
|
414 | 448 |
|
415 | 449 | if resolved_headers:
|
416 |
| - new_headers = self._headers.copy() |
| 450 | + new_headers = self._base_client._headers.copy() |
417 | 451 | new_headers.update(resolved_headers)
|
418 |
| - client._headers = new_headers |
| 452 | + client._base_client._headers = new_headers |
419 | 453 | else:
|
420 |
| - client._headers = self._headers.copy() |
| 454 | + client._base_client._headers = self._headers.copy() |
421 | 455 |
|
422 | 456 | if request_timeout is not DEFAULT:
|
423 |
| - client._request_timeout = request_timeout |
| 457 | + client._base_client._request_timeout = request_timeout |
424 | 458 | else:
|
425 |
| - client._request_timeout = self._request_timeout |
| 459 | + client._base_client._request_timeout = self._base_client._request_timeout |
426 | 460 |
|
427 | 461 | if ignore_status is not DEFAULT:
|
428 | 462 | if isinstance(ignore_status, int):
|
429 | 463 | ignore_status = (ignore_status,)
|
430 |
| - client._ignore_status = ignore_status |
| 464 | + client._base_client._ignore_status = ignore_status |
431 | 465 | else:
|
432 |
| - client._ignore_status = self._ignore_status |
| 466 | + client._base_client._ignore_status = self._base_client._ignore_status |
433 | 467 |
|
434 | 468 | if max_retries is not DEFAULT:
|
435 | 469 | if not isinstance(max_retries, int):
|
436 | 470 | raise TypeError("'max_retries' must be of type 'int'")
|
437 |
| - client._max_retries = max_retries |
| 471 | + client._base_client._max_retries = max_retries |
438 | 472 | else:
|
439 |
| - client._max_retries = self._max_retries |
| 473 | + client._base_client._max_retries = self._base_client._max_retries |
440 | 474 |
|
441 | 475 | if retry_on_status is not DEFAULT:
|
442 | 476 | if isinstance(retry_on_status, int):
|
443 | 477 | retry_on_status = (retry_on_status,)
|
444 |
| - client._retry_on_status = retry_on_status |
| 478 | + client._base_client._retry_on_status = retry_on_status |
445 | 479 | else:
|
446 |
| - client._retry_on_status = self._retry_on_status |
| 480 | + client._base_client._retry_on_status = self._base_client._retry_on_status |
447 | 481 |
|
448 | 482 | if retry_on_timeout is not DEFAULT:
|
449 | 483 | if not isinstance(retry_on_timeout, bool):
|
450 | 484 | raise TypeError("'retry_on_timeout' must be of type 'bool'")
|
451 |
| - client._retry_on_timeout = retry_on_timeout |
| 485 | + client._base_client._retry_on_timeout = retry_on_timeout |
452 | 486 | else:
|
453 |
| - client._retry_on_timeout = self._retry_on_timeout |
| 487 | + client._base_client._retry_on_timeout = self._base_client._retry_on_timeout |
454 | 488 |
|
455 | 489 | return client
|
456 | 490 |
|
|
0 commit comments