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