opensearch-ruby 2.0.3 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +80 -46
  4. data/USER_GUIDE.md +149 -0
  5. data/bin/opensearch_ruby_console +4 -34
  6. data/lib/opensearch/api/actions/abort_benchmark.rb +49 -0
  7. data/lib/opensearch/api/actions/benchmark.rb +88 -0
  8. data/lib/opensearch/api/actions/bulk.rb +91 -0
  9. data/lib/opensearch/api/actions/cat/aliases.rb +79 -0
  10. data/lib/opensearch/api/actions/cat/all_pit_segments.rb +45 -0
  11. data/lib/opensearch/api/actions/cat/allocation.rb +83 -0
  12. data/lib/opensearch/api/actions/cat/cluster_manager.rb +54 -0
  13. data/lib/opensearch/api/actions/cat/count.rb +75 -0
  14. data/lib/opensearch/api/actions/cat/fielddata.rb +77 -0
  15. data/lib/opensearch/api/actions/cat/health.rb +72 -0
  16. data/lib/opensearch/api/actions/cat/help.rb +61 -0
  17. data/lib/opensearch/api/actions/cat/indices.rb +93 -0
  18. data/lib/opensearch/api/actions/cat/master.rb +73 -0
  19. data/lib/opensearch/api/actions/cat/nodeattrs.rb +73 -0
  20. data/lib/opensearch/api/actions/cat/nodes.rb +82 -0
  21. data/lib/opensearch/api/actions/cat/params_registry.rb +69 -0
  22. data/lib/opensearch/api/actions/cat/pending_tasks.rb +76 -0
  23. data/lib/opensearch/api/actions/cat/pit_segments.rb +48 -0
  24. data/lib/opensearch/api/actions/cat/plugins.rb +75 -0
  25. data/lib/opensearch/api/actions/cat/recovery.rb +84 -0
  26. data/lib/opensearch/api/actions/cat/repositories.rb +73 -0
  27. data/lib/opensearch/api/actions/cat/segments.rb +76 -0
  28. data/lib/opensearch/api/actions/cat/shards.rb +85 -0
  29. data/lib/opensearch/api/actions/cat/snapshots.rb +82 -0
  30. data/lib/opensearch/api/actions/cat/tasks.rb +77 -0
  31. data/lib/opensearch/api/actions/cat/templates.rb +80 -0
  32. data/lib/opensearch/api/actions/cat/thread_pool.rb +84 -0
  33. data/lib/opensearch/api/actions/clear_scroll.rb +62 -0
  34. data/lib/opensearch/api/actions/cluster/allocation_explain.rb +67 -0
  35. data/lib/opensearch/api/actions/cluster/delete_component_template.rb +68 -0
  36. data/lib/opensearch/api/actions/cluster/delete_voting_config_exclusions.rb +59 -0
  37. data/lib/opensearch/api/actions/cluster/exists_component_template.rb +70 -0
  38. data/lib/opensearch/api/actions/cluster/get_component_template.rb +70 -0
  39. data/lib/opensearch/api/actions/cluster/get_settings.rb +67 -0
  40. data/lib/opensearch/api/actions/cluster/health.rb +88 -0
  41. data/lib/opensearch/api/actions/cluster/params_registry.rb +69 -0
  42. data/lib/opensearch/api/actions/cluster/pending_tasks.rb +64 -0
  43. data/lib/opensearch/api/actions/cluster/post_voting_config_exclusions.rb +63 -0
  44. data/lib/opensearch/api/actions/cluster/put_component_template.rb +72 -0
  45. data/lib/opensearch/api/actions/cluster/put_settings.rb +68 -0
  46. data/{spec/unit/wrapper_gem_spec.rb → lib/opensearch/api/actions/cluster/remote_info.rb} +20 -17
  47. data/lib/opensearch/api/actions/cluster/reroute.rb +72 -0
  48. data/lib/opensearch/api/actions/cluster/state.rb +87 -0
  49. data/lib/opensearch/api/actions/cluster/stats.rb +68 -0
  50. data/lib/opensearch/api/actions/count.rb +96 -0
  51. data/lib/opensearch/api/actions/create.rb +60 -0
  52. data/lib/opensearch/api/actions/create_pit.rb +45 -0
  53. data/lib/opensearch/api/actions/dangling_indices/delete_dangling_index.rb +70 -0
  54. data/lib/opensearch/api/actions/dangling_indices/import_dangling_index.rb +69 -0
  55. data/lib/opensearch/api/actions/dangling_indices/list_dangling_indices.rb +51 -0
  56. data/lib/opensearch/api/actions/dangling_indices/params_registry.rb +69 -0
  57. data/lib/opensearch/api/actions/delete.rb +89 -0
  58. data/lib/opensearch/api/actions/delete_all_pits.rb +26 -0
  59. data/lib/opensearch/api/actions/delete_by_query.rb +133 -0
  60. data/lib/opensearch/api/actions/delete_by_query_rethrottle.rb +62 -0
  61. data/lib/opensearch/api/actions/delete_pit.rb +30 -0
  62. data/lib/opensearch/api/actions/delete_script.rb +66 -0
  63. data/lib/opensearch/api/actions/exists.rb +94 -0
  64. data/lib/opensearch/api/actions/exists_source.rb +89 -0
  65. data/lib/opensearch/api/actions/explain.rb +99 -0
  66. data/lib/opensearch/api/actions/features/get_features.rb +61 -0
  67. data/lib/opensearch/api/actions/features/params_registry.rb +69 -0
  68. data/lib/opensearch/api/actions/features/reset_features.rb +55 -0
  69. data/lib/opensearch/api/actions/field_caps.rb +78 -0
  70. data/lib/opensearch/api/actions/get.rb +93 -0
  71. data/lib/opensearch/api/actions/get_all_pits.rb +26 -0
  72. data/lib/opensearch/api/actions/get_script.rb +64 -0
  73. data/lib/opensearch/api/actions/get_script_context.rb +53 -0
  74. data/lib/opensearch/api/actions/get_script_languages.rb +53 -0
  75. data/lib/opensearch/api/actions/get_source.rb +87 -0
  76. data/lib/opensearch/api/actions/http/connect.rb +28 -0
  77. data/lib/opensearch/api/actions/http/delete.rb +28 -0
  78. data/lib/opensearch/api/actions/http/get.rb +28 -0
  79. data/lib/opensearch/api/actions/http/head.rb +28 -0
  80. data/lib/opensearch/api/actions/http/options.rb +28 -0
  81. data/lib/opensearch/api/actions/http/patch.rb +28 -0
  82. data/lib/opensearch/api/actions/http/post.rb +28 -0
  83. data/lib/opensearch/api/actions/http/put.rb +28 -0
  84. data/lib/opensearch/api/actions/http/request.rb +27 -0
  85. data/lib/opensearch/api/actions/http/trace.rb +28 -0
  86. data/lib/opensearch/api/actions/index.rb +96 -0
  87. data/lib/opensearch/api/actions/indices/add_block.rb +78 -0
  88. data/lib/opensearch/api/actions/indices/analyze.rb +71 -0
  89. data/lib/opensearch/api/actions/indices/clear_cache.rb +79 -0
  90. data/lib/opensearch/api/actions/indices/clone.rb +75 -0
  91. data/lib/opensearch/api/actions/indices/close.rb +76 -0
  92. data/lib/opensearch/api/actions/indices/create.rb +71 -0
  93. data/lib/opensearch/api/actions/indices/delete.rb +78 -0
  94. data/lib/opensearch/api/actions/indices/delete_alias.rb +72 -0
  95. data/lib/opensearch/api/actions/indices/delete_index_template.rb +68 -0
  96. data/lib/opensearch/api/actions/indices/delete_template.rb +72 -0
  97. data/lib/opensearch/api/actions/indices/disk_usage.rb +76 -0
  98. data/lib/opensearch/api/actions/indices/exists.rb +79 -0
  99. data/lib/opensearch/api/actions/indices/exists_alias.rb +82 -0
  100. data/lib/opensearch/api/actions/indices/exists_index_template.rb +72 -0
  101. data/lib/opensearch/api/actions/indices/exists_template.rb +75 -0
  102. data/lib/opensearch/api/actions/indices/field_usage_stats.rb +74 -0
  103. data/lib/opensearch/api/actions/indices/flush.rb +74 -0
  104. data/lib/opensearch/api/actions/indices/forcemerge.rb +76 -0
  105. data/lib/opensearch/api/actions/indices/get.rb +78 -0
  106. data/lib/opensearch/api/actions/indices/get_alias.rb +79 -0
  107. data/lib/opensearch/api/actions/indices/get_field_mapping.rb +83 -0
  108. data/lib/opensearch/api/actions/indices/get_index_template.rb +72 -0
  109. data/lib/opensearch/api/actions/indices/get_mapping.rb +81 -0
  110. data/lib/opensearch/api/actions/indices/get_settings.rb +87 -0
  111. data/lib/opensearch/api/actions/indices/get_template.rb +72 -0
  112. data/lib/opensearch/api/actions/indices/get_upgrade.rb +75 -0
  113. data/lib/opensearch/api/actions/indices/open.rb +76 -0
  114. data/lib/opensearch/api/actions/indices/params_registry.rb +69 -0
  115. data/lib/opensearch/api/actions/indices/put_alias.rb +73 -0
  116. data/lib/opensearch/api/actions/indices/put_index_template.rb +72 -0
  117. data/lib/opensearch/api/actions/indices/put_mapping.rb +82 -0
  118. data/lib/opensearch/api/actions/indices/put_settings.rb +83 -0
  119. data/lib/opensearch/api/actions/indices/put_template.rb +72 -0
  120. data/lib/opensearch/api/actions/indices/recovery.rb +68 -0
  121. data/lib/opensearch/api/actions/indices/refresh.rb +70 -0
  122. data/lib/opensearch/api/actions/indices/resolve_index.rb +68 -0
  123. data/lib/opensearch/api/actions/indices/rollover.rb +81 -0
  124. data/lib/opensearch/api/actions/indices/segments.rb +72 -0
  125. data/lib/opensearch/api/actions/indices/shard_stores.rb +72 -0
  126. data/lib/opensearch/api/actions/indices/shrink.rb +77 -0
  127. data/lib/opensearch/api/actions/indices/simulate_index_template.rb +71 -0
  128. data/lib/opensearch/api/actions/indices/simulate_template.rb +73 -0
  129. data/lib/opensearch/api/actions/indices/split.rb +77 -0
  130. data/lib/opensearch/api/actions/indices/stats.rb +100 -0
  131. data/lib/opensearch/api/actions/indices/update_aliases.rb +66 -0
  132. data/lib/opensearch/api/actions/indices/upgrade.rb +79 -0
  133. data/lib/opensearch/api/actions/indices/validate_query.rb +99 -0
  134. data/{Gemfile → lib/opensearch/api/actions/info.rb} +19 -8
  135. data/lib/opensearch/api/actions/ingest/delete_pipeline.rb +68 -0
  136. data/lib/opensearch/api/actions/ingest/geo_ip_stats.rb +51 -0
  137. data/lib/opensearch/api/actions/ingest/get_pipeline.rb +70 -0
  138. data/lib/opensearch/api/actions/ingest/params_registry.rb +69 -0
  139. data/lib/opensearch/api/actions/ingest/processor_grok.rb +51 -0
  140. data/lib/opensearch/api/actions/ingest/put_pipeline.rb +70 -0
  141. data/lib/opensearch/api/actions/ingest/simulate.rb +69 -0
  142. data/lib/opensearch/api/actions/mget.rb +86 -0
  143. data/lib/opensearch/api/actions/msearch.rb +105 -0
  144. data/lib/opensearch/api/actions/msearch_template.rb +89 -0
  145. data/lib/opensearch/api/actions/mtermvectors.rb +102 -0
  146. data/lib/opensearch/api/actions/nodes/hot_threads.rb +81 -0
  147. data/lib/opensearch/api/actions/nodes/info.rb +75 -0
  148. data/lib/opensearch/api/actions/nodes/params_registry.rb +69 -0
  149. data/lib/opensearch/api/actions/nodes/reload_secure_settings.rb +67 -0
  150. data/lib/opensearch/api/actions/nodes/shutdown.rb +65 -0
  151. data/lib/opensearch/api/actions/nodes/stats.rb +96 -0
  152. data/lib/opensearch/api/actions/nodes/usage.rb +73 -0
  153. data/lib/opensearch/api/actions/params_registry.rb +67 -0
  154. data/lib/opensearch/api/actions/ping.rb +54 -0
  155. data/lib/opensearch/api/actions/put_script.rb +76 -0
  156. data/lib/opensearch/api/actions/rank_eval.rb +77 -0
  157. data/lib/opensearch/api/actions/reindex.rb +76 -0
  158. data/lib/opensearch/api/actions/reindex_rethrottle.rb +62 -0
  159. data/{spec/integration/security_disabled/validation_integration_spec.rb → lib/opensearch/api/actions/remote/info.rb} +17 -11
  160. data/lib/opensearch/api/actions/remote_store/restore.rb +43 -0
  161. data/lib/opensearch/api/actions/render_search_template.rb +62 -0
  162. data/lib/opensearch/api/actions/scripts_painless_execute.rb +59 -0
  163. data/lib/opensearch/api/actions/scroll.rb +78 -0
  164. data/lib/opensearch/api/actions/search.rb +161 -0
  165. data/lib/opensearch/api/actions/search_shards.rb +74 -0
  166. data/lib/opensearch/api/actions/search_template.rb +96 -0
  167. data/lib/opensearch/api/actions/security/change_password.rb +39 -0
  168. data/lib/opensearch/api/actions/security/create_action_group.rb +42 -0
  169. data/lib/opensearch/api/actions/security/create_role.rb +43 -0
  170. data/lib/opensearch/api/actions/security/create_role_mapping.rb +43 -0
  171. data/lib/opensearch/api/actions/security/create_tenant.rb +42 -0
  172. data/lib/opensearch/api/actions/security/create_user.rb +43 -0
  173. data/lib/opensearch/api/actions/security/delete_action_group.rb +41 -0
  174. data/lib/opensearch/api/actions/security/delete_distinguished_names.rb +41 -0
  175. data/lib/opensearch/api/actions/security/delete_role.rb +41 -0
  176. data/lib/opensearch/api/actions/security/delete_role_mapping.rb +41 -0
  177. data/lib/opensearch/api/actions/security/delete_tenant.rb +41 -0
  178. data/lib/opensearch/api/actions/security/delete_user.rb +41 -0
  179. data/lib/opensearch/api/actions/security/flush_cache.rb +36 -0
  180. data/lib/opensearch/api/actions/security/get_account_details.rb +36 -0
  181. data/lib/opensearch/api/actions/security/get_action_group.rb +41 -0
  182. data/lib/opensearch/api/actions/security/get_action_groups.rb +36 -0
  183. data/lib/opensearch/api/actions/security/get_audit_configuration.rb +36 -0
  184. data/lib/opensearch/api/actions/security/get_certificates.rb +36 -0
  185. data/lib/opensearch/api/actions/security/get_configuration.rb +36 -0
  186. data/lib/opensearch/api/actions/security/get_distinguished_names.rb +39 -0
  187. data/lib/opensearch/api/actions/security/get_role.rb +41 -0
  188. data/lib/opensearch/api/actions/security/get_role_mapping.rb +41 -0
  189. data/lib/opensearch/api/actions/security/get_role_mappings.rb +36 -0
  190. data/lib/opensearch/api/actions/security/get_roles.rb +36 -0
  191. data/lib/opensearch/api/actions/security/get_tenant.rb +41 -0
  192. data/lib/opensearch/api/actions/security/get_tenants.rb +36 -0
  193. data/lib/opensearch/api/actions/security/get_user.rb +41 -0
  194. data/lib/opensearch/api/actions/security/get_users.rb +36 -0
  195. data/lib/opensearch/api/actions/security/health.rb +36 -0
  196. data/lib/opensearch/api/actions/security/patch_action_group.rb +42 -0
  197. data/lib/opensearch/api/actions/security/patch_action_groups.rb +37 -0
  198. data/lib/opensearch/api/actions/security/patch_audit_configuration.rb +39 -0
  199. data/lib/opensearch/api/actions/security/patch_configuration.rb +39 -0
  200. data/lib/opensearch/api/actions/security/patch_distinguished_names.rb +39 -0
  201. data/lib/opensearch/api/actions/security/patch_role.rb +43 -0
  202. data/lib/opensearch/api/actions/security/patch_role_mapping.rb +43 -0
  203. data/lib/opensearch/api/actions/security/patch_role_mappings.rb +39 -0
  204. data/lib/opensearch/api/actions/security/patch_roles.rb +39 -0
  205. data/lib/opensearch/api/actions/security/patch_tenant.rb +43 -0
  206. data/lib/opensearch/api/actions/security/patch_tenants.rb +39 -0
  207. data/lib/opensearch/api/actions/security/patch_user.rb +43 -0
  208. data/lib/opensearch/api/actions/security/patch_users.rb +39 -0
  209. data/lib/opensearch/api/actions/security/reload_http_certificates.rb +36 -0
  210. data/lib/opensearch/api/actions/security/reload_transport_certificates.rb +36 -0
  211. data/lib/opensearch/api/actions/security/update_audit_configuration.rb +39 -0
  212. data/lib/opensearch/api/actions/security/update_configuration.rb +39 -0
  213. data/lib/opensearch/api/actions/security/update_distinguished_names.rb +42 -0
  214. data/lib/opensearch/api/actions/shutdown/delete_node.rb +60 -0
  215. data/lib/opensearch/api/actions/shutdown/get_node.rb +62 -0
  216. data/lib/opensearch/api/actions/shutdown/params_registry.rb +69 -0
  217. data/lib/opensearch/api/actions/shutdown/put_node.rb +62 -0
  218. data/lib/opensearch/api/actions/snapshot/cleanup_repository.rb +68 -0
  219. data/lib/opensearch/api/actions/snapshot/clone.rb +76 -0
  220. data/lib/opensearch/api/actions/snapshot/create.rb +73 -0
  221. data/lib/opensearch/api/actions/snapshot/create_repository.rb +72 -0
  222. data/lib/opensearch/api/actions/snapshot/delete.rb +74 -0
  223. data/lib/opensearch/api/actions/snapshot/delete_repository.rb +72 -0
  224. data/lib/opensearch/api/actions/snapshot/get.rb +82 -0
  225. data/lib/opensearch/api/actions/snapshot/get_features.rb +61 -0
  226. data/lib/opensearch/api/actions/snapshot/get_repository.rb +73 -0
  227. data/lib/opensearch/api/actions/snapshot/params_registry.rb +69 -0
  228. data/lib/opensearch/api/actions/snapshot/repository_analyze.rb +84 -0
  229. data/lib/opensearch/api/actions/snapshot/restore.rb +73 -0
  230. data/lib/opensearch/api/actions/snapshot/status.rb +79 -0
  231. data/lib/opensearch/api/actions/snapshot/verify_repository.rb +68 -0
  232. data/lib/opensearch/api/actions/tasks/cancel.rb +76 -0
  233. data/lib/opensearch/api/actions/tasks/get.rb +68 -0
  234. data/lib/opensearch/api/actions/tasks/list.rb +75 -0
  235. data/lib/opensearch/api/actions/tasks/params_registry.rb +69 -0
  236. data/lib/opensearch/api/actions/termvectors.rb +108 -0
  237. data/lib/opensearch/api/actions/update.rb +99 -0
  238. data/lib/opensearch/api/actions/update_by_query.rb +137 -0
  239. data/lib/opensearch/api/actions/update_by_query_rethrottle.rb +62 -0
  240. data/{spec/integration/security_enabled/validation_integration_spec.rb → lib/opensearch/api/namespace/cat.rb} +19 -12
  241. data/lib/opensearch/api/namespace/cluster.rb +47 -0
  242. data/lib/opensearch/api/namespace/common.rb +72 -0
  243. data/lib/opensearch/api/namespace/dangling_indices.rb +47 -0
  244. data/lib/opensearch/api/namespace/features.rb +47 -0
  245. data/lib/opensearch/api/namespace/http.rb +30 -0
  246. data/lib/opensearch/api/namespace/indices.rb +47 -0
  247. data/lib/opensearch/api/namespace/ingest.rb +47 -0
  248. data/lib/opensearch/api/namespace/nodes.rb +47 -0
  249. data/lib/opensearch/api/namespace/remote.rb +47 -0
  250. data/lib/opensearch/api/namespace/remote_store.rb +30 -0
  251. data/lib/opensearch/api/namespace/security.rb +30 -0
  252. data/lib/opensearch/api/namespace/shutdown.rb +47 -0
  253. data/lib/opensearch/api/namespace/snapshot.rb +47 -0
  254. data/lib/opensearch/api/namespace/tasks.rb +47 -0
  255. data/lib/opensearch/api/utils.rb +296 -0
  256. data/lib/opensearch/api.rb +104 -0
  257. data/lib/opensearch/dsl/search/aggregation.rb +112 -0
  258. data/lib/opensearch/dsl/search/aggregations/avg.rb +49 -0
  259. data/lib/opensearch/dsl/search/aggregations/cardinality.rb +56 -0
  260. data/lib/opensearch/dsl/search/aggregations/children.rb +63 -0
  261. data/lib/opensearch/dsl/search/aggregations/composite.rb +68 -0
  262. data/lib/opensearch/dsl/search/aggregations/date_histogram.rb +64 -0
  263. data/lib/opensearch/dsl/search/aggregations/date_range.rb +59 -0
  264. data/lib/opensearch/dsl/search/aggregations/extended_stats.rb +48 -0
  265. data/lib/opensearch/dsl/search/aggregations/filter.rb +54 -0
  266. data/lib/opensearch/dsl/search/aggregations/filters.rb +59 -0
  267. data/lib/opensearch/dsl/search/aggregations/geo_bounds.rb +68 -0
  268. data/lib/opensearch/dsl/search/aggregations/geo_distance.rb +63 -0
  269. data/lib/opensearch/dsl/search/aggregations/geohash_grid.rb +59 -0
  270. data/lib/opensearch/dsl/search/aggregations/global.rb +52 -0
  271. data/{spec/integration/security_disabled/client_integration_spec.rb → lib/opensearch/dsl/search/aggregations/histogram.rb} +29 -29
  272. data/lib/opensearch/dsl/search/aggregations/ip_range.rb +55 -0
  273. data/lib/opensearch/dsl/search/aggregations/max.rb +49 -0
  274. data/lib/opensearch/dsl/search/aggregations/min.rb +49 -0
  275. data/lib/opensearch/dsl/search/aggregations/missing.rb +59 -0
  276. data/lib/opensearch/dsl/search/aggregations/nested.rb +57 -0
  277. data/lib/opensearch/dsl/search/aggregations/percentile_ranks.rb +58 -0
  278. data/lib/opensearch/dsl/search/aggregations/percentiles.rb +57 -0
  279. data/lib/opensearch/dsl/search/aggregations/pipeline/avg_bucket.rb +58 -0
  280. data/lib/opensearch/dsl/search/aggregations/pipeline/bucket_script.rb +60 -0
  281. data/lib/opensearch/dsl/search/aggregations/pipeline/bucket_selector.rb +59 -0
  282. data/lib/opensearch/dsl/search/aggregations/pipeline/bucket_sort.rb +111 -0
  283. data/lib/opensearch/dsl/search/aggregations/pipeline/cumulative_sum.rb +57 -0
  284. data/lib/opensearch/dsl/search/aggregations/pipeline/derivative.rb +58 -0
  285. data/lib/opensearch/dsl/search/aggregations/pipeline/extended_stats_bucket.rb +58 -0
  286. data/lib/opensearch/dsl/search/aggregations/pipeline/max_bucket.rb +58 -0
  287. data/lib/opensearch/dsl/search/aggregations/pipeline/min_bucket.rb +58 -0
  288. data/lib/opensearch/dsl/search/aggregations/pipeline/moving_avg.rb +66 -0
  289. data/lib/opensearch/dsl/search/aggregations/pipeline/percentiles_bucket.rb +60 -0
  290. data/lib/opensearch/dsl/search/aggregations/pipeline/serial_diff.rb +60 -0
  291. data/lib/opensearch/dsl/search/aggregations/pipeline/stats_bucket.rb +58 -0
  292. data/lib/opensearch/dsl/search/aggregations/pipeline/sum_bucket.rb +58 -0
  293. data/lib/opensearch/dsl/search/aggregations/range.rb +77 -0
  294. data/lib/opensearch/dsl/search/aggregations/reverse_nested.rb +61 -0
  295. data/lib/opensearch/dsl/search/aggregations/scripted_metric.rb +63 -0
  296. data/lib/opensearch/dsl/search/aggregations/significant_terms.rb +69 -0
  297. data/lib/opensearch/dsl/search/aggregations/stats.rb +61 -0
  298. data/lib/opensearch/dsl/search/aggregations/sum.rb +49 -0
  299. data/lib/opensearch/dsl/search/aggregations/terms.rb +66 -0
  300. data/lib/opensearch/dsl/search/aggregations/top_hits.rb +59 -0
  301. data/lib/opensearch/dsl/search/aggregations/value_count.rb +49 -0
  302. data/lib/opensearch/dsl/search/base_aggregation_component.rb +83 -0
  303. data/lib/opensearch/dsl/search/base_component.rb +191 -0
  304. data/lib/opensearch/dsl/search/base_compound_filter_component.rb +124 -0
  305. data/lib/opensearch/dsl/search/filter.rb +82 -0
  306. data/lib/opensearch/dsl/search/filters/and.rb +70 -0
  307. data/lib/opensearch/dsl/search/filters/bool.rb +103 -0
  308. data/lib/opensearch/dsl/search/filters/exists.rb +56 -0
  309. data/lib/opensearch/dsl/search/filters/geo_bounding_box.rb +69 -0
  310. data/lib/opensearch/dsl/search/filters/geo_distance.rb +81 -0
  311. data/lib/opensearch/dsl/search/filters/geo_distance_range.rb +56 -0
  312. data/lib/opensearch/dsl/search/filters/geo_polygon.rb +65 -0
  313. data/lib/opensearch/dsl/search/filters/geo_shape.rb +59 -0
  314. data/lib/opensearch/dsl/search/filters/geohash_cell.rb +71 -0
  315. data/lib/opensearch/dsl/search/filters/has_child.rb +98 -0
  316. data/lib/opensearch/dsl/search/filters/has_parent.rb +97 -0
  317. data/lib/opensearch/dsl/search/filters/ids.rb +56 -0
  318. data/lib/opensearch/dsl/search/filters/indices.rb +101 -0
  319. data/lib/opensearch/dsl/search/filters/limit.rb +55 -0
  320. data/lib/opensearch/dsl/search/filters/match_all.rb +52 -0
  321. data/lib/opensearch/dsl/search/filters/missing.rb +58 -0
  322. data/lib/opensearch/dsl/search/filters/nested.rb +91 -0
  323. data/lib/opensearch/dsl/search/filters/not.rb +98 -0
  324. data/lib/opensearch/dsl/search/filters/or.rb +70 -0
  325. data/lib/opensearch/dsl/search/filters/prefix.rb +53 -0
  326. data/lib/opensearch/dsl/search/filters/query.rb +77 -0
  327. data/lib/opensearch/dsl/search/filters/range.rb +63 -0
  328. data/lib/opensearch/dsl/search/filters/regexp.rb +58 -0
  329. data/lib/opensearch/dsl/search/filters/script.rb +56 -0
  330. data/lib/opensearch/dsl/search/filters/term.rb +55 -0
  331. data/lib/opensearch/dsl/search/filters/terms.rb +56 -0
  332. data/lib/opensearch/dsl/search/filters/type.rb +58 -0
  333. data/lib/opensearch/dsl/search/highlight.rb +117 -0
  334. data/lib/opensearch/dsl/search/options.rb +80 -0
  335. data/lib/opensearch/dsl/search/queries/bool.rb +110 -0
  336. data/lib/opensearch/dsl/search/queries/boosting.rb +57 -0
  337. data/lib/opensearch/dsl/search/queries/common.rb +62 -0
  338. data/lib/opensearch/dsl/search/queries/constant_score.rb +90 -0
  339. data/lib/opensearch/dsl/search/queries/dis_max.rb +59 -0
  340. data/lib/opensearch/dsl/search/queries/exists.rb +68 -0
  341. data/lib/opensearch/dsl/search/queries/filtered.rb +101 -0
  342. data/lib/opensearch/dsl/search/queries/function_score.rb +122 -0
  343. data/lib/opensearch/dsl/search/queries/fuzzy.rb +69 -0
  344. data/lib/opensearch/dsl/search/queries/fuzzy_like_this.rb +61 -0
  345. data/lib/opensearch/dsl/search/queries/fuzzy_like_this_field.rb +60 -0
  346. data/lib/opensearch/dsl/search/queries/geo_shape.rb +54 -0
  347. data/lib/opensearch/dsl/search/queries/has_child.rb +82 -0
  348. data/lib/opensearch/dsl/search/queries/has_parent.rb +82 -0
  349. data/lib/opensearch/dsl/search/queries/ids.rb +52 -0
  350. data/lib/opensearch/dsl/search/queries/indices.rb +58 -0
  351. data/lib/opensearch/dsl/search/queries/match.rb +66 -0
  352. data/lib/opensearch/dsl/search/queries/match_all.rb +50 -0
  353. data/lib/opensearch/dsl/search/queries/match_phrase.rb +56 -0
  354. data/lib/opensearch/dsl/search/queries/match_phrase_prefix.rb +55 -0
  355. data/lib/opensearch/dsl/search/queries/more_like_this.rb +88 -0
  356. data/lib/opensearch/dsl/search/queries/multi_match.rb +69 -0
  357. data/lib/opensearch/dsl/search/queries/nested.rb +80 -0
  358. data/lib/opensearch/dsl/search/queries/prefix.rb +54 -0
  359. data/lib/opensearch/dsl/search/queries/query_string.rb +75 -0
  360. data/lib/opensearch/dsl/search/queries/range.rb +71 -0
  361. data/lib/opensearch/dsl/search/queries/regexp.rb +55 -0
  362. data/lib/opensearch/dsl/search/queries/script_score.rb +62 -0
  363. data/lib/opensearch/dsl/search/queries/simple_query_string.rb +64 -0
  364. data/lib/opensearch/dsl/search/queries/span_first.rb +52 -0
  365. data/lib/opensearch/dsl/search/queries/span_multi.rb +52 -0
  366. data/lib/opensearch/dsl/search/queries/span_near.rb +56 -0
  367. data/lib/opensearch/dsl/search/queries/span_not.rb +57 -0
  368. data/lib/opensearch/dsl/search/queries/span_or.rb +52 -0
  369. data/lib/opensearch/dsl/search/queries/span_term.rb +50 -0
  370. data/lib/opensearch/dsl/search/queries/template.rb +55 -0
  371. data/lib/opensearch/dsl/search/queries/term.rb +50 -0
  372. data/lib/opensearch/dsl/search/queries/terms.rb +51 -0
  373. data/lib/opensearch/dsl/search/queries/top_children.rb +82 -0
  374. data/lib/opensearch/dsl/search/queries/wildcard.rb +54 -0
  375. data/lib/opensearch/dsl/search/query.rb +82 -0
  376. data/lib/opensearch/dsl/search/sort.rb +83 -0
  377. data/lib/opensearch/dsl/search/suggest.rb +52 -0
  378. data/lib/opensearch/dsl/search.rb +282 -0
  379. data/lib/opensearch/dsl/utils.rb +49 -0
  380. data/lib/opensearch/dsl.rb +69 -0
  381. data/lib/opensearch/transport/client.rb +362 -0
  382. data/lib/opensearch/transport/redacted.rb +82 -0
  383. data/lib/opensearch/transport/transport/base.rb +451 -0
  384. data/lib/opensearch/transport/transport/connections/collection.rb +134 -0
  385. data/lib/opensearch/transport/transport/connections/connection.rb +168 -0
  386. data/lib/opensearch/transport/transport/connections/selector.rb +100 -0
  387. data/lib/opensearch/transport/transport/errors.rb +97 -0
  388. data/lib/opensearch/transport/transport/http/curb.rb +139 -0
  389. data/lib/opensearch/transport/transport/http/faraday.rb +101 -0
  390. data/lib/opensearch/transport/transport/http/manticore.rb +188 -0
  391. data/lib/opensearch/transport/transport/loggable.rb +92 -0
  392. data/lib/opensearch/transport/transport/response.rb +47 -0
  393. data/lib/opensearch/transport/transport/serializer/multi_json.rb +61 -0
  394. data/lib/opensearch/transport/transport/sniffer.rb +110 -0
  395. data/lib/opensearch/transport.rb +44 -0
  396. data/lib/opensearch/version.rb +1 -1
  397. data/lib/opensearch-dsl.rb +27 -0
  398. data/lib/opensearch.rb +12 -12
  399. data/opensearch-ruby.gemspec +69 -0
  400. data/spec/spec_helper.rb +95 -4
  401. data/test/dsl/integration/search_aggregation_children_test.rb +91 -0
  402. data/test/dsl/integration/search_aggregation_geo_test.rb +112 -0
  403. data/test/dsl/integration/search_aggregation_nested_test.rb +129 -0
  404. data/test/dsl/integration/search_aggregations_test.rb +288 -0
  405. data/test/dsl/integration/search_filters_test.rb +290 -0
  406. data/test/dsl/integration/search_options_test.rb +54 -0
  407. data/test/dsl/integration/search_query_test.rb +98 -0
  408. data/test/dsl/integration/search_size_from_test.rb +71 -0
  409. data/test/dsl/integration/search_sort_test.rb +57 -0
  410. data/test/dsl/integration/search_suggest_test.rb +107 -0
  411. data/test/dsl/integration/search_test.rb +81 -0
  412. data/test/dsl/test_helper.rb +95 -0
  413. data/test/dsl/unit/dsl_test.rb +44 -0
  414. data/test/dsl/unit/search_aggregation_test.rb +96 -0
  415. data/test/dsl/unit/search_base_aggregation_component_test.rb +66 -0
  416. data/test/dsl/unit/search_base_component_test.rb +210 -0
  417. data/test/dsl/unit/search_filter_test.rb +84 -0
  418. data/test/dsl/unit/search_highlight_test.rb +103 -0
  419. data/test/dsl/unit/search_options_test.rb +114 -0
  420. data/test/dsl/unit/search_query_test.rb +88 -0
  421. data/test/dsl/unit/search_size_from_test.rb +68 -0
  422. data/test/dsl/unit/search_sort_test.rb +91 -0
  423. data/test/dsl/unit/search_suggest_test.rb +46 -0
  424. data/test/dsl/unit/search_test.rb +268 -0
  425. data/test/dsl/unit/utils_test.rb +47 -0
  426. data/test/transport/integration/transport_test.rb +117 -0
  427. data/test/transport/profile/client_benchmark_test.rb +141 -0
  428. data/test/transport/test_helper.rb +97 -0
  429. data/test/transport/unit/connection_test.rb +145 -0
  430. data/test/transport/unit/response_test.rb +46 -0
  431. data/test/transport/unit/serializer_test.rb +42 -0
  432. data/test/transport/unit/transport_base_test.rb +673 -0
  433. data/test/transport/unit/transport_curb_test.rb +143 -0
  434. data/test/transport/unit/transport_faraday_test.rb +237 -0
  435. data/test/transport/unit/transport_manticore_test.rb +191 -0
  436. data.tar.gz.sig +0 -0
  437. metadata +502 -191
  438. metadata.gz.sig +0 -0
  439. data/.gitignore +0 -21
  440. data/Rakefile +0 -69
  441. data/opensearch.gemspec +0 -81
  442. data/spec/integration/security_enabled/client_integration_spec.rb +0 -43
  443. data/spec/unit/opensearch_product_validation_spec.rb +0 -198
  444. /data/{LICENSE → LICENSE.txt} +0 -0
@@ -0,0 +1,451 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # The OpenSearch Contributors require contributions made to
4
+ # this file be licensed under the Apache-2.0 license or a
5
+ # compatible open source license.
6
+ #
7
+ # Modifications Copyright OpenSearch Contributors. See
8
+ # GitHub history for details.
9
+ #
10
+ # Licensed to Elasticsearch B.V. under one or more contributor
11
+ # license agreements. See the NOTICE file distributed with
12
+ # this work for additional information regarding copyright
13
+ # ownership. Elasticsearch B.V. licenses this file to you under
14
+ # the Apache License, Version 2.0 (the "License"); you may
15
+ # not use this file except in compliance with the License.
16
+ # You may obtain a copy of the License at
17
+ #
18
+ # http://www.apache.org/licenses/LICENSE-2.0
19
+ #
20
+ # Unless required by applicable law or agreed to in writing,
21
+ # software distributed under the License is distributed on an
22
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
23
+ # KIND, either express or implied. See the License for the
24
+ # specific language governing permissions and limitations
25
+ # under the License.
26
+
27
+ module OpenSearch
28
+ module Transport
29
+ module Transport
30
+ # @abstract Module with common functionality for transport implementations.
31
+ #
32
+ module Base
33
+ include Loggable
34
+
35
+ DEFAULT_PORT = 9200
36
+ DEFAULT_PROTOCOL = 'http'
37
+ DEFAULT_RELOAD_AFTER = 10_000 # Requests
38
+ DEFAULT_RESURRECT_AFTER = 60 # Seconds
39
+ DEFAULT_MAX_RETRIES = 3 # Requests
40
+ DEFAULT_SERIALIZER_CLASS = Serializer::MultiJson
41
+ SANITIZED_PASSWORD = '*' * rand(1..14)
42
+
43
+ attr_reader :hosts, :options, :connections, :counter, :last_request_at, :protocol
44
+ attr_accessor :serializer, :sniffer, :logger, :tracer,
45
+ :reload_connections, :reload_after,
46
+ :resurrect_after
47
+
48
+ # Creates a new transport object
49
+ #
50
+ # @param arguments [Hash] Settings and options for the transport
51
+ # @param block [Proc] Lambda or Proc which can be evaluated in the context of the "session" object
52
+ #
53
+ # @option arguments [Array] :hosts An Array of normalized hosts information
54
+ # @option arguments [Array] :options A Hash with options (usually passed by {Client})
55
+ #
56
+ # @see Client#initialize
57
+ #
58
+ def initialize(arguments = {}, &block)
59
+ @state_mutex = Mutex.new
60
+
61
+ @hosts = arguments[:hosts] || []
62
+ @options = arguments[:options] || {}
63
+ @options[:http] ||= {}
64
+ @options[:retry_on_status] ||= []
65
+
66
+ @block = block
67
+ @compression = !@options[:compression].nil?
68
+ @connections = __build_connections
69
+
70
+ @serializer = options[:serializer] || (options[:serializer_class] ? options[:serializer_class].new(self) : DEFAULT_SERIALIZER_CLASS.new(self))
71
+ @protocol = options[:protocol] || DEFAULT_PROTOCOL
72
+
73
+ @logger = options[:logger]
74
+ @tracer = options[:tracer]
75
+
76
+ @sniffer = options[:sniffer_class] ? options[:sniffer_class].new(self) : Sniffer.new(self)
77
+ @counter = 0
78
+ @counter_mtx = Mutex.new
79
+ @last_request_at = Time.now
80
+ @reload_connections = options[:reload_connections]
81
+ @reload_after = options[:reload_connections].is_a?(Integer) ? options[:reload_connections] : DEFAULT_RELOAD_AFTER
82
+ @resurrect_after = options[:resurrect_after] || DEFAULT_RESURRECT_AFTER
83
+ @retry_on_status = Array(options[:retry_on_status]).map(&:to_i)
84
+ end
85
+
86
+ # Returns a connection from the connection pool by delegating to {Connections::Collection#get_connection}.
87
+ #
88
+ # Resurrects dead connection if the `resurrect_after` timeout has passed.
89
+ # Increments the counter and performs connection reloading if the `reload_connections` option is set.
90
+ #
91
+ # @return [Connections::Connection]
92
+ # @see Connections::Collection#get_connection
93
+ #
94
+ def get_connection(options = {})
95
+ resurrect_dead_connections! if Time.now > @last_request_at + @resurrect_after
96
+
97
+ @counter_mtx.synchronize { @counter += 1 }
98
+ reload_connections! if reload_connections && (counter % reload_after).zero?
99
+ connections.get_connection(options)
100
+ end
101
+
102
+ # Reloads and replaces the connection collection based on cluster information
103
+ #
104
+ # @see Sniffer#hosts
105
+ #
106
+ def reload_connections!
107
+ hosts = sniffer.hosts
108
+ __rebuild_connections hosts: hosts, options: options
109
+ self
110
+ rescue SnifferTimeoutError
111
+ log_error '[SnifferTimeoutError] Timeout when reloading connections.'
112
+ self
113
+ end
114
+
115
+ # Tries to "resurrect" all eligible dead connections
116
+ #
117
+ # @see Connections::Connection#resurrect!
118
+ #
119
+ def resurrect_dead_connections!
120
+ connections.dead.each(&:resurrect!)
121
+ end
122
+
123
+ # Rebuilds the connections collection in the transport.
124
+ #
125
+ # The methods *adds* new connections from the passed hosts to the collection,
126
+ # and *removes* all connections not contained in the passed hosts.
127
+ #
128
+ # @return [Connections::Collection]
129
+ # @api private
130
+ #
131
+ def __rebuild_connections(arguments = {})
132
+ @state_mutex.synchronize do
133
+ @hosts = arguments[:hosts] || []
134
+ @options = arguments[:options] || {}
135
+
136
+ __close_connections
137
+
138
+ new_connections = __build_connections
139
+ stale_connections = @connections.all.reject { |c| new_connections.include?(c) }
140
+ new_connections = new_connections.reject { |c| @connections.all.include?(c) }
141
+
142
+ @connections.remove(stale_connections)
143
+ @connections.add(new_connections)
144
+ @connections
145
+ end
146
+ end
147
+
148
+ # Builds and returns a collection of connections
149
+ #
150
+ # The adapters have to implement the {Base#__build_connection} method.
151
+ #
152
+ # @return [Connections::Collection]
153
+ # @api private
154
+ #
155
+ def __build_connections
156
+ Connections::Collection.new \
157
+ connections: hosts.map { |host|
158
+ host[:protocol] =
159
+ host[:scheme] || options[:scheme] || options[:http][:scheme] || DEFAULT_PROTOCOL
160
+ host[:port] ||= options[:port] || options[:http][:port] || DEFAULT_PORT
161
+ if (options[:user] || options[:http][:user]) && !host[:user]
162
+ host[:user] ||= options[:user] || options[:http][:user]
163
+ host[:password] ||= options[:password] || options[:http][:password]
164
+ end
165
+
166
+ __build_connection(host, (options[:transport_options] || {}), @block)
167
+ },
168
+ selector_class: options[:selector_class],
169
+ selector: options[:selector]
170
+ end
171
+
172
+ # @abstract Build and return a connection.
173
+ # A transport implementation *must* implement this method.
174
+ # See {HTTP::Faraday#__build_connection} for an example.
175
+ #
176
+ # @return [Connections::Connection]
177
+ # @api private
178
+ #
179
+ def __build_connection(_host, _options = {}, _block = nil)
180
+ raise NoMethodError, 'Implement this method in your class'
181
+ end
182
+
183
+ # Closes the connections collection
184
+ #
185
+ # @api private
186
+ #
187
+ def __close_connections
188
+ # A hook point for specific adapters when they need to close connections
189
+ end
190
+
191
+ # Log request and response information
192
+ #
193
+ # @api private
194
+ #
195
+ def __log_response(method, _path, _params, body, url, response, _json, took, duration)
196
+ return unless logger
197
+ sanitized_url = url.to_s.gsub(%r{//(.+):(.+)@}, "//\\1:#{SANITIZED_PASSWORD}@")
198
+ log_info "#{method.to_s.upcase} #{sanitized_url} " \
199
+ "[status:#{response.status}, request:#{format('%.3fs', duration)}, query:#{took}]"
200
+ log_debug "> #{__convert_to_json(body)}" if body
201
+ log_debug "< #{response.body}"
202
+ end
203
+
204
+ # Trace the request in the `curl` format
205
+ #
206
+ # @api private
207
+ #
208
+ def __trace(method, path, params, headers, body, _url, response, json, _took, duration)
209
+ trace_url = "http://localhost:9200/#{path}?pretty" +
210
+ (params.empty? ? '' : "&#{::Faraday::Utils::ParamsHash[params].to_query}")
211
+ trace_body = body ? " -d '#{__convert_to_json(body, pretty: true)}'" : ''
212
+ trace_command = "curl -X #{method.to_s.upcase}"
213
+ trace_command += " -H '#{headers.collect { |k, v| "#{k}: #{v}" }.join(', ')}'" if headers && !headers.empty?
214
+ trace_command += " '#{trace_url}'#{trace_body}\n"
215
+ tracer.info trace_command
216
+ tracer.debug "# #{Time.now.iso8601} [#{response.status}] (#{format('%.3f', duration)}s)\n#"
217
+ return "# #{response.body}\n" unless tracer.debug json
218
+ "#{serializer.dump(json, pretty: true).gsub(/^/, '# ').sub(/\}$/, "\n# }")}\n"
219
+ end
220
+
221
+ # Raise error specific for the HTTP response status or a generic server error
222
+ #
223
+ # @api private
224
+ #
225
+ def __raise_transport_error(response)
226
+ error = ERRORS[response.status] || ServerError
227
+ raise error, "[#{response.status}] #{response.body}"
228
+ end
229
+
230
+ # Converts any non-String object to JSON
231
+ #
232
+ # @api private
233
+ #
234
+ def __convert_to_json(obj = nil, options = {})
235
+ obj.is_a?(String) ? obj : serializer.dump(obj, options)
236
+ end
237
+
238
+ # Returns a full URL based on information from host
239
+ #
240
+ # @param host [Hash] Host configuration passed in from {Client}
241
+ #
242
+ # @api private
243
+ def __full_url(host)
244
+ url = "#{host[:protocol]}://"
245
+ url += "#{CGI.escape(host[:user])}:#{CGI.escape(host[:password])}@" if host[:user]
246
+ url += host[:host]
247
+ url += ":#{host[:port]}" if host[:port]
248
+ url += host[:path] if host[:path]
249
+ url
250
+ end
251
+
252
+ # Performs a request to Elasticsearch, while handling logging, tracing, marking dead connections,
253
+ # retrying the request and reloading the connections.
254
+ #
255
+ # @abstract The transport implementation has to implement this method either in full,
256
+ # or by invoking this method with a block. See {HTTP::Faraday#perform_request} for an example.
257
+ #
258
+ # @param method [String] Request method
259
+ # @param path [String] The API endpoint
260
+ # @param params [Hash] Request parameters (will be serialized by {Connections::Connection#full_url})
261
+ # @param body [Hash] Request body (will be serialized by the {#serializer})
262
+ # @param headers [Hash] Request headers (will be serialized by the {#serializer})
263
+ # @param block [Proc] Code block to evaluate, passed from the implementation
264
+ #
265
+ # @return [Response]
266
+ # @raise [NoMethodError] If no block is passed
267
+ # @raise [ServerError] If request failed on server
268
+ # @raise [Error] If no connection is available
269
+ #
270
+ def perform_request(method, path, params = {}, body = nil, _headers = nil, opts = {}, &block)
271
+ raise NoMethodError, 'Implement this method in your transport class' unless block_given?
272
+
273
+ start = Time.now
274
+ tries = 0
275
+ reload_on_failure = opts.fetch(:reload_on_failure, @options[:reload_on_failure])
276
+
277
+ max_retries = if opts.key?(:retry_on_failure)
278
+ opts[:retry_on_failure] == true ? DEFAULT_MAX_RETRIES : opts[:retry_on_failure]
279
+ elsif options.key?(:retry_on_failure)
280
+ options[:retry_on_failure] == true ? DEFAULT_MAX_RETRIES : options[:retry_on_failure]
281
+ end
282
+
283
+ params = params.clone
284
+
285
+ ignore = Array(params.delete(:ignore)).compact.map(&:to_i)
286
+
287
+ begin
288
+ tries += 1
289
+ connection = get_connection or raise(Error, 'Cannot get new connection from pool.')
290
+
291
+ if connection.connection.respond_to?(:params) && connection.connection.params.respond_to?(:to_hash)
292
+ params = connection.connection.params.merge(params.to_hash)
293
+ end
294
+
295
+ url = connection.full_url(path, params)
296
+
297
+ response = block.call(connection, url)
298
+
299
+ connection.healthy! if connection.failures.positive?
300
+
301
+ # Raise an exception so we can catch it for `retry_on_status`
302
+ if response.status.to_i >= 300 && @retry_on_status.include?(response.status.to_i)
303
+ __raise_transport_error(response)
304
+ end
305
+ rescue OpenSearch::Transport::Transport::ServerError => e
306
+ raise e unless response && @retry_on_status.include?(response.status)
307
+ log_warn "[#{e.class}] Attempt #{tries} to get response from #{url}"
308
+ if tries <= (max_retries || DEFAULT_MAX_RETRIES)
309
+ retry
310
+ else
311
+ log_fatal "[#{e.class}] Cannot get response from #{url} after #{tries} tries"
312
+ raise e
313
+ end
314
+ rescue *host_unreachable_exceptions => e
315
+ log_error "[#{e.class}] #{e.message} #{connection.host.inspect}"
316
+
317
+ connection.dead!
318
+
319
+ if reload_on_failure && (tries < connections.all.size)
320
+ log_warn "[#{e.class}] Reloading connections (attempt #{tries} of #{connections.all.size})"
321
+ reload_connections! and retry
322
+ end
323
+
324
+ raise e unless max_retries
325
+ log_warn "[#{e.class}] Attempt #{tries} connecting to #{connection.host.inspect}"
326
+ if tries <= max_retries
327
+ retry
328
+ else
329
+ log_fatal "[#{e.class}] Cannot connect to #{connection.host.inspect} after #{tries} tries"
330
+ raise e
331
+ end
332
+ rescue StandardError => e
333
+ log_fatal "[#{e.class}] #{e.message} (#{connection.host.inspect if connection})"
334
+ raise e
335
+ end
336
+
337
+ duration = Time.now - start
338
+
339
+ if response.status.to_i >= 300
340
+ __log_response method, path, params, body, url, response, nil, 'N/A', duration
341
+ if tracer
342
+ __trace method, path, params, connection.connection.headers, body, url, response, nil, 'N/A',
343
+ duration
344
+ end
345
+
346
+ # Log the failure only when `ignore` doesn't match the response status
347
+ log_fatal "[#{response.status}] #{response.body}" unless ignore.include?(response.status.to_i)
348
+
349
+ __raise_transport_error response unless ignore.include?(response.status.to_i)
350
+ end
351
+
352
+ if response.body && !response.body.empty? && response.headers && response.headers['content-type'] =~ /json/
353
+ json = serializer.load(response.body)
354
+ end
355
+ took = begin
356
+ (json['took'] ? format('%.3fs', json['took'] / 1000.0) : 'n/a')
357
+ rescue StandardError
358
+ 'n/a'
359
+ end
360
+
361
+ unless ignore.include?(response.status.to_i)
362
+ __log_response method, path, params, body, url, response, json, took, duration
363
+ end
364
+
365
+ if tracer
366
+ __trace method, path, params, connection.connection.headers, body, url, response, nil, 'N/A',
367
+ duration
368
+ end
369
+
370
+ warnings(response.headers['warning']) if response.headers&.[]('warning')
371
+
372
+ Response.new response.status, json || response.body, response.headers
373
+ ensure
374
+ @last_request_at = Time.now
375
+ end
376
+
377
+ # @abstract Returns an Array of connection errors specific to the transport implementation.
378
+ # See {HTTP::Faraday#host_unreachable_exceptions} for an example.
379
+ #
380
+ # @return [Array]
381
+ #
382
+ def host_unreachable_exceptions
383
+ [Errno::ECONNREFUSED]
384
+ end
385
+
386
+ private
387
+
388
+ USER_AGENT_STR = 'User-Agent'.freeze
389
+ USER_AGENT_REGEX = /user-?_?agent/
390
+ CONTENT_TYPE_STR = 'Content-Type'.freeze
391
+ CONTENT_TYPE_REGEX = /content-?_?type/
392
+ DEFAULT_CONTENT_TYPE = 'application/json'.freeze
393
+ GZIP = 'gzip'.freeze
394
+ ACCEPT_ENCODING = 'Accept-Encoding'.freeze
395
+ GZIP_FIRST_TWO_BYTES = '1f8b'.freeze
396
+ HEX_STRING_DIRECTIVE = 'H*'.freeze
397
+ RUBY_ENCODING = '1.9'.respond_to?(:force_encoding)
398
+
399
+ def decompress_response(body)
400
+ return body unless use_compression?
401
+ return body unless gzipped?(body)
402
+
403
+ io = StringIO.new(body)
404
+ gzip_reader = if RUBY_ENCODING
405
+ Zlib::GzipReader.new(io, encoding: 'ASCII-8BIT')
406
+ else
407
+ Zlib::GzipReader.new(io)
408
+ end
409
+ gzip_reader.read
410
+ end
411
+
412
+ def gzipped?(body)
413
+ body[0..1].unpack1(HEX_STRING_DIRECTIVE) == GZIP_FIRST_TWO_BYTES
414
+ end
415
+
416
+ def use_compression?
417
+ @compression
418
+ end
419
+
420
+ def apply_headers(client, options)
421
+ headers = options[:headers] || {}
422
+ headers[CONTENT_TYPE_STR] = find_value(headers, CONTENT_TYPE_REGEX) || DEFAULT_CONTENT_TYPE
423
+ headers[USER_AGENT_STR] = find_value(headers, USER_AGENT_REGEX) || user_agent_header(client)
424
+ client.headers[ACCEPT_ENCODING] = GZIP if use_compression?
425
+ client.headers.merge!(headers)
426
+ end
427
+
428
+ def find_value(hash, regex)
429
+ key_value = hash.find { |k, _v| k.to_s.downcase =~ regex }
430
+ return unless key_value
431
+ hash.delete(key_value[0])
432
+ key_value[1]
433
+ end
434
+
435
+ def user_agent_header(_client)
436
+ @user_agent_header ||= begin
437
+ meta = ["RUBY_VERSION: #{RUBY_VERSION}"]
438
+ if RbConfig::CONFIG && RbConfig::CONFIG['host_os']
439
+ meta << "#{RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase} #{RbConfig::CONFIG['target_cpu']}"
440
+ end
441
+ "opensearch-ruby/#{VERSION} (#{meta.join('; ')})"
442
+ end
443
+ end
444
+
445
+ def warnings(warning)
446
+ warn("warning: #{warning}")
447
+ end
448
+ end
449
+ end
450
+ end
451
+ end
@@ -0,0 +1,134 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # The OpenSearch Contributors require contributions made to
4
+ # this file be licensed under the Apache-2.0 license or a
5
+ # compatible open source license.
6
+ #
7
+ # Modifications Copyright OpenSearch Contributors. See
8
+ # GitHub history for details.
9
+ #
10
+ # Licensed to Elasticsearch B.V. under one or more contributor
11
+ # license agreements. See the NOTICE file distributed with
12
+ # this work for additional information regarding copyright
13
+ # ownership. Elasticsearch B.V. licenses this file to you under
14
+ # the Apache License, Version 2.0 (the "License"); you may
15
+ # not use this file except in compliance with the License.
16
+ # You may obtain a copy of the License at
17
+ #
18
+ # http://www.apache.org/licenses/LICENSE-2.0
19
+ #
20
+ # Unless required by applicable law or agreed to in writing,
21
+ # software distributed under the License is distributed on an
22
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
23
+ # KIND, either express or implied. See the License for the
24
+ # specific language governing permissions and limitations
25
+ # under the License.
26
+
27
+ module OpenSearch
28
+ module Transport
29
+ module Transport
30
+ module Connections
31
+ # Wraps the collection of connections for the transport object as an Enumerable object.
32
+ #
33
+ # @see Base#connections
34
+ # @see Selector::Base#select
35
+ # @see Connection
36
+ #
37
+ class Collection
38
+ include Enumerable
39
+
40
+ DEFAULT_SELECTOR = Selector::RoundRobin
41
+
42
+ attr_reader :selector
43
+
44
+ # @option arguments [Array] :connections An array of {Connection} objects.
45
+ # @option arguments [Constant] :selector_class The class to be used as a connection selector strategy.
46
+ # @option arguments [Object] :selector The selector strategy object.
47
+ #
48
+ def initialize(arguments = {})
49
+ selector_class = arguments[:selector_class] || DEFAULT_SELECTOR
50
+ @connections = arguments[:connections] || []
51
+ @selector = arguments[:selector] || selector_class.new(arguments.merge(connections: self))
52
+ end
53
+
54
+ # Returns an Array of hosts information in this collection as Hashes.
55
+ #
56
+ # @return [Array]
57
+ #
58
+ def hosts
59
+ @connections.to_a.map(&:host)
60
+ end
61
+
62
+ # Returns an Array of alive connections.
63
+ #
64
+ # @return [Array]
65
+ #
66
+ def connections
67
+ @connections.reject(&:dead?)
68
+ end
69
+ alias alive connections
70
+
71
+ # Returns an Array of dead connections.
72
+ #
73
+ # @return [Array]
74
+ #
75
+ def dead
76
+ @connections.select(&:dead?)
77
+ end
78
+
79
+ # Returns an Array of all connections, both dead and alive
80
+ #
81
+ # @return [Array]
82
+ #
83
+ def all
84
+ @connections
85
+ end
86
+
87
+ # Returns a connection.
88
+ #
89
+ # If there are no alive connections, returns a connection with least failures.
90
+ # Delegates to selector's `#select` method to get the connection.
91
+ #
92
+ # @return [Connection]
93
+ #
94
+ def get_connection(options = {})
95
+ selector.select(options) || @connections.min_by(&:failures)
96
+ end
97
+
98
+ def each(&block)
99
+ connections.each(&block)
100
+ end
101
+
102
+ def slice(*args)
103
+ connections.slice(*args)
104
+ end
105
+ alias [] slice
106
+
107
+ def size
108
+ connections.size
109
+ end
110
+
111
+ # Add connection(s) to the collection
112
+ #
113
+ # @param connections [Connection,Array] A connection or an array of connections to add
114
+ # @return [self]
115
+ #
116
+ def add(connections)
117
+ @connections += Array(connections).to_a
118
+ self
119
+ end
120
+
121
+ # Remove connection(s) from the collection
122
+ #
123
+ # @param connections [Connection,Array] A connection or an array of connections to remove
124
+ # @return [self]
125
+ #
126
+ def remove(connections)
127
+ @connections -= Array(connections).to_a
128
+ self
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end