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,673 @@
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
+ require_relative '../test_helper'
28
+
29
+ class OpenSearch::Transport::Transport::BaseTest < Minitest::Test
30
+
31
+ class EmptyTransport
32
+ include OpenSearch::Transport::Transport::Base
33
+ end
34
+
35
+ class DummyTransport
36
+ include OpenSearch::Transport::Transport::Base
37
+ def __build_connection(host, options={}, block=nil)
38
+ OpenSearch::Transport::Transport::Connections::Connection.new :host => host, :connection => Object.new
39
+ end
40
+ end
41
+
42
+ class DummyTransportPerformer < DummyTransport
43
+ def perform_request(method, path, params={}, body=nil, &block); super; end
44
+ end
45
+
46
+ class DummySerializer
47
+ def initialize(*); end
48
+ end
49
+
50
+ class DummySniffer
51
+ def initialize(*); end
52
+ end
53
+
54
+ context "Transport::Base" do
55
+ should "raise exception when it doesn't implement __build_connection" do
56
+ assert_raise NoMethodError do
57
+ EmptyTransport.new.__build_connection({ :host => 'foo'}, {})
58
+ end
59
+ end
60
+
61
+ should "build connections on initialization" do
62
+ DummyTransport.any_instance.expects(:__build_connections)
63
+ transport = DummyTransport.new
64
+ end
65
+
66
+ should "have default serializer" do
67
+ transport = DummyTransport.new
68
+ assert_instance_of OpenSearch::Transport::Transport::Base::DEFAULT_SERIALIZER_CLASS, transport.serializer
69
+ end
70
+
71
+ should "have custom serializer" do
72
+ transport = DummyTransport.new :options => { :serializer_class => DummySerializer }
73
+ assert_instance_of DummySerializer, transport.serializer
74
+
75
+ transport = DummyTransport.new :options => { :serializer => DummySerializer.new }
76
+ assert_instance_of DummySerializer, transport.serializer
77
+ end
78
+
79
+ should "have default sniffer" do
80
+ transport = DummyTransport.new
81
+ assert_instance_of OpenSearch::Transport::Transport::Sniffer, transport.sniffer
82
+ end
83
+
84
+ should "have custom sniffer" do
85
+ transport = DummyTransport.new :options => { :sniffer_class => DummySniffer }
86
+ assert_instance_of DummySniffer, transport.sniffer
87
+ end
88
+
89
+ context "when combining the URL" do
90
+ setup do
91
+ @transport = DummyTransport.new
92
+ @basic_parts = { :protocol => 'http', :host => 'myhost', :port => 8080 }
93
+ end
94
+
95
+ should "combine basic parts" do
96
+ assert_equal 'http://myhost:8080', @transport.__full_url(@basic_parts)
97
+ end
98
+
99
+ should "combine path" do
100
+ assert_equal 'http://myhost:8080/api', @transport.__full_url(@basic_parts.merge :path => '/api')
101
+ end
102
+
103
+ should "combine authentication credentials" do
104
+ assert_equal 'http://U:P@myhost:8080', @transport.__full_url(@basic_parts.merge :user => 'U', :password => 'P')
105
+ end
106
+
107
+ should "escape the username and password" do
108
+ assert_equal 'http://user%40domain:foo%2Fbar@myhost:8080',
109
+ @transport.__full_url(@basic_parts.merge :user => 'user@domain', :password => 'foo/bar')
110
+ end
111
+ end
112
+ end
113
+
114
+ context "getting a connection" do
115
+ setup do
116
+ @transport = DummyTransportPerformer.new :options => { :reload_connections => 5 }
117
+ @transport.stubs(:connections).returns(stub :get_connection => Object.new)
118
+ @transport.stubs(:sniffer).returns(stub :hosts => [])
119
+ end
120
+
121
+ should "get a connection" do
122
+ assert_not_nil @transport.get_connection
123
+ end
124
+
125
+ should "increment the counter" do
126
+ assert_equal 0, @transport.counter
127
+ 3.times { @transport.get_connection }
128
+ assert_equal 3, @transport.counter
129
+ end
130
+
131
+ should "reload connections when it hits the threshold" do
132
+ @transport.expects(:reload_connections!).twice
133
+ 12.times { @transport.get_connection }
134
+ assert_equal 12, @transport.counter
135
+ end
136
+
137
+ should "not reload connections by default" do
138
+ @transport = DummyTransportPerformer.new
139
+ @transport.stubs(:connections).returns(stub :get_connection => Object.new)
140
+ @transport.expects(:reload_connections!).never
141
+
142
+ 10_010.times { @transport.get_connection }
143
+ assert_equal 10_010, @transport.counter
144
+ end
145
+
146
+ should "not reload connections when the option is set to false" do
147
+ @transport = DummyTransportPerformer.new :options => { :reload_connections => false }
148
+ @transport.stubs(:connections).returns(stub :get_connection => Object.new)
149
+ @transport.expects(:reload_connections!).never
150
+
151
+ 10_010.times { @transport.get_connection }
152
+ assert_equal 10_010, @transport.counter
153
+ end
154
+ end
155
+
156
+ context "performing a request" do
157
+ setup do
158
+ @transport = DummyTransportPerformer.new
159
+ end
160
+
161
+ should "raise an error when no block is passed" do
162
+ assert_raise NoMethodError do
163
+ @transport.peform_request 'GET', '/'
164
+ end
165
+ end
166
+
167
+ should "get the connection" do
168
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
169
+ @transport.perform_request 'GET', '/' do; OpenSearch::Transport::Transport::Response.new 200, 'OK'; end
170
+ end
171
+
172
+ should "raise an error when no connection is available" do
173
+ @transport.expects(:get_connection).returns(nil)
174
+ assert_raise OpenSearch::Transport::Transport::Error do
175
+ @transport.perform_request 'GET', '/' do; OpenSearch::Transport::Transport::Response.new 200, 'OK'; end
176
+ end
177
+ end
178
+
179
+ should "call the passed block" do
180
+ x = 0
181
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
182
+
183
+ @transport.perform_request 'GET', '/' do |connection, url|
184
+ x += 1
185
+ OpenSearch::Transport::Transport::Response.new 200, 'OK'
186
+ end
187
+
188
+ assert_equal 1, x
189
+ end
190
+
191
+ should "deserialize a response JSON body" do
192
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
193
+ @transport.serializer.expects(:load).returns({'foo' => 'bar'})
194
+
195
+ response = @transport.perform_request 'GET', '/' do
196
+ OpenSearch::Transport::Transport::Response.new 200, '{"foo":"bar"}', {"content-type" => 'application/json'}
197
+ end
198
+
199
+ assert_instance_of OpenSearch::Transport::Transport::Response, response
200
+ assert_equal 'bar', response.body['foo']
201
+ end
202
+
203
+ should "not deserialize a response string body" do
204
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
205
+ @transport.serializer.expects(:load).never
206
+ response = @transport.perform_request 'GET', '/' do
207
+ OpenSearch::Transport::Transport::Response.new 200, 'FOOBAR', {"content-type" => 'text/plain'}
208
+ end
209
+
210
+ assert_instance_of OpenSearch::Transport::Transport::Response, response
211
+ assert_equal 'FOOBAR', response.body
212
+ end
213
+
214
+ should "not deserialize an empty response body" do
215
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
216
+ @transport.serializer.expects(:load).never
217
+ response = @transport.perform_request 'GET', '/' do
218
+ OpenSearch::Transport::Transport::Response.new 200, '', {"content-type" => 'application/json'}
219
+ end
220
+
221
+ assert_instance_of OpenSearch::Transport::Transport::Response, response
222
+ assert_equal '', response.body
223
+ end
224
+
225
+ should "serialize non-String objects" do
226
+ @transport.serializer.expects(:dump).times(3)
227
+ @transport.__convert_to_json({:foo => 'bar'})
228
+ @transport.__convert_to_json([1, 2, 3])
229
+ @transport.__convert_to_json(nil)
230
+ end
231
+
232
+ should "not serialize a String object" do
233
+ @transport.serializer.expects(:dump).never
234
+ @transport.__convert_to_json('{"foo":"bar"}')
235
+ end
236
+
237
+ should "raise an error for HTTP status 404" do
238
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
239
+ assert_raise OpenSearch::Transport::Transport::Errors::NotFound do
240
+ @transport.perform_request 'GET', '/' do
241
+ OpenSearch::Transport::Transport::Response.new 404, 'NOT FOUND'
242
+ end
243
+ end
244
+ end
245
+
246
+ should "raise an error for HTTP status 404 with application/json content type" do
247
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
248
+ assert_raise OpenSearch::Transport::Transport::Errors::NotFound do
249
+ @transport.perform_request 'GET', '/' do
250
+ OpenSearch::Transport::Transport::Response.new 404, 'NOT FOUND', {"content-type" => 'application/json'}
251
+ end
252
+ end
253
+ end
254
+
255
+ should "raise an error on server failure" do
256
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
257
+ assert_raise OpenSearch::Transport::Transport::Errors::InternalServerError do
258
+ @transport.perform_request 'GET', '/' do
259
+ OpenSearch::Transport::Transport::Response.new 500, 'ERROR'
260
+ end
261
+ end
262
+ end
263
+
264
+ should "raise an error on connection failure" do
265
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
266
+
267
+ # `block.expects(:call).raises(::Errno::ECONNREFUSED)` fails on Ruby 1.8
268
+ block = lambda { |a,b| raise ::Errno::ECONNREFUSED }
269
+
270
+ assert_raise ::Errno::ECONNREFUSED do
271
+ @transport.perform_request 'GET', '/', &block
272
+ end
273
+ end
274
+
275
+ should 'raise TooManyRequestsError on 429' do
276
+ @transport.expects(:get_connection).returns(stub_everything :failures => 1)
277
+ assert_raise OpenSearch::Transport::Transport::Errors::TooManyRequests do
278
+ @transport.perform_request 'GET', '/' do
279
+ OpenSearch::Transport::Transport::Response.new 429, 'ERROR'
280
+ end
281
+ end
282
+ end
283
+
284
+ should "not raise an error when the :ignore argument has been passed" do
285
+ @transport.stubs(:get_connection).returns(stub_everything :failures => 1)
286
+
287
+ assert_raise OpenSearch::Transport::Transport::Errors::BadRequest do
288
+ @transport.perform_request 'GET', '/' do
289
+ OpenSearch::Transport::Transport::Response.new 400, 'CLIENT ERROR'
290
+ end
291
+ end
292
+
293
+ # No `BadRequest` error
294
+ @transport.perform_request 'GET', '/', :ignore => 400 do
295
+ OpenSearch::Transport::Transport::Response.new 400, 'CLIENT ERROR'
296
+ end
297
+ end
298
+
299
+ should "mark the connection as dead on failure" do
300
+ c = stub_everything :failures => 1
301
+ @transport.expects(:get_connection).returns(c)
302
+
303
+ block = lambda { |a,b| raise ::Errno::ECONNREFUSED }
304
+
305
+ c.expects(:dead!)
306
+
307
+ assert_raise( ::Errno::ECONNREFUSED ) { @transport.perform_request 'GET', '/', &block }
308
+ end
309
+ end
310
+
311
+ context "performing a request with reload connections on connection failures" do
312
+ setup do
313
+ fake_collection = stub_everything :get_connection => stub_everything(:failures => 1),
314
+ :all => stub_everything(:size => 2)
315
+ @transport = DummyTransportPerformer.new :options => { :reload_on_failure => 2 }
316
+ @transport.stubs(:connections).
317
+ returns(fake_collection)
318
+ @block = lambda { |c, u| puts "UNREACHABLE" }
319
+ end
320
+
321
+ should "reload connections when host is unreachable" do
322
+ @block.expects(:call).times(2).
323
+ raises(Errno::ECONNREFUSED).
324
+ then.returns(stub_everything :failures => 1)
325
+
326
+ @transport.expects(:reload_connections!).returns([])
327
+
328
+ @transport.perform_request('GET', '/', &@block)
329
+ assert_equal 2, @transport.counter
330
+ end
331
+ end
332
+
333
+ context "performing a request with retry on connection failures" do
334
+ setup do
335
+ @transport = DummyTransportPerformer.new :options => { :retry_on_failure => true }
336
+ @transport.stubs(:connections).returns(stub :get_connection => stub_everything(:failures => 1))
337
+ @block = Proc.new { |c, u| puts "UNREACHABLE" }
338
+ end
339
+
340
+ should "retry DEFAULT_MAX_RETRIES when host is unreachable" do
341
+ @block.expects(:call).times(4).
342
+ raises(Errno::ECONNREFUSED).
343
+ then.raises(Errno::ECONNREFUSED).
344
+ then.raises(Errno::ECONNREFUSED).
345
+ then.returns(stub_everything :failures => 1)
346
+
347
+ assert_nothing_raised do
348
+ @transport.perform_request('GET', '/', &@block)
349
+ assert_equal 4, @transport.counter
350
+ end
351
+ end
352
+
353
+ should "raise an error after max tries" do
354
+ @block.expects(:call).times(4).
355
+ raises(Errno::ECONNREFUSED).
356
+ then.raises(Errno::ECONNREFUSED).
357
+ then.raises(Errno::ECONNREFUSED).
358
+ then.raises(Errno::ECONNREFUSED).
359
+ then.returns(stub_everything :failures => 1)
360
+
361
+ assert_raise Errno::ECONNREFUSED do
362
+ @transport.perform_request('GET', '/', &@block)
363
+ end
364
+ end
365
+ end
366
+
367
+ context "performing a request with retry on status" do
368
+ setup do
369
+ DummyTransportPerformer.any_instance.stubs(:connections).returns(stub :get_connection => stub_everything(:failures => 1))
370
+
371
+ logger = Logger.new(STDERR)
372
+ logger.level = Logger::DEBUG
373
+ DummyTransportPerformer.any_instance.stubs(:logger).returns(logger)
374
+ @block = Proc.new { |c, u| puts "ERROR" }
375
+ end
376
+
377
+ should "not retry when the status code does not match" do
378
+ @transport = DummyTransportPerformer.new :options => { :retry_on_status => 500 }
379
+ assert_equal [500], @transport.instance_variable_get(:@retry_on_status)
380
+
381
+ @block.expects(:call).
382
+ returns(OpenSearch::Transport::Transport::Response.new 400, 'Bad Request').
383
+ times(1)
384
+
385
+ @transport.logger.
386
+ expects(:warn).
387
+ with( regexp_matches(/Attempt \d to get response/) ).
388
+ never
389
+
390
+ assert_raise OpenSearch::Transport::Transport::Errors::BadRequest do
391
+ @transport.perform_request('GET', '/', {}, nil, &@block)
392
+ end
393
+ end
394
+
395
+ should "retry when the status code does match" do
396
+ @transport = DummyTransportPerformer.new :options => { :retry_on_status => 500 }
397
+ assert_equal [500], @transport.instance_variable_get(:@retry_on_status)
398
+
399
+ @block.expects(:call).
400
+ returns(OpenSearch::Transport::Transport::Response.new 500, 'Internal Error').
401
+ times(4)
402
+
403
+ @transport.logger.
404
+ expects(:warn).
405
+ with( regexp_matches(/Attempt \d to get response/) ).
406
+ times(4)
407
+
408
+ assert_raise OpenSearch::Transport::Transport::Errors::InternalServerError do
409
+ @transport.perform_request('GET', '/', &@block)
410
+ end
411
+ end
412
+ end
413
+
414
+ context "logging" do
415
+ setup do
416
+ @transport = DummyTransportPerformer.new :options => { :logger => Logger.new('/dev/null') }
417
+
418
+ fake_connection = stub :full_url => 'localhost:9200/_search?size=1',
419
+ :host => 'localhost',
420
+ :connection => stub_everything,
421
+ :failures => 0,
422
+ :healthy! => true
423
+
424
+ @transport.stubs(:get_connection).returns(fake_connection)
425
+ @transport.serializer.stubs(:load).returns 'foo' => 'bar'
426
+ @transport.serializer.stubs(:dump).returns '{"foo":"bar"}'
427
+ end
428
+
429
+ should "log the request and response" do
430
+ @transport.logger.expects(:info). with do |line|
431
+ line =~ %r|POST localhost\:9200/_search\?size=1 \[status\:200, request:.*s, query:n/a\]|
432
+ end
433
+ @transport.logger.expects(:debug). with '> {"foo":"bar"}'
434
+ @transport.logger.expects(:debug). with '< {"foo":"bar"}'
435
+
436
+ @transport.perform_request 'POST', '_search', {:size => 1}, {:foo => 'bar'} do
437
+ OpenSearch::Transport::Transport::Response.new 200, '{"foo":"bar"}'
438
+ end
439
+ end
440
+
441
+ should "sanitize password in the URL" do
442
+ fake_connection = stub :full_url => 'http://user:password@localhost:9200/_search?size=1',
443
+ :host => 'localhost',
444
+ :connection => stub_everything,
445
+ :failures => 0,
446
+ :healthy! => true
447
+ @transport.stubs(:get_connection).returns(fake_connection)
448
+
449
+ @transport.logger.expects(:info).with do |message|
450
+ assert_match(/http:\/\/user:\*{1,15}@localhost\:9200/, message)
451
+ true
452
+ end
453
+
454
+
455
+ @transport.perform_request('GET', '/') {OpenSearch::Transport::Transport::Response.new 200, '{"foo":"bar"}' }
456
+ end
457
+
458
+ should "log a failed OpenSearch request as fatal" do
459
+ @block = Proc.new { |c, u| puts "ERROR" }
460
+ @block.expects(:call).returns(OpenSearch::Transport::Transport::Response.new 500, 'ERROR')
461
+
462
+ @transport.expects(:__log_response)
463
+ @transport.logger.expects(:fatal)
464
+
465
+ assert_raise OpenSearch::Transport::Transport::Errors::InternalServerError do
466
+ @transport.perform_request('POST', '_search', &@block)
467
+ end
468
+ end
469
+
470
+ should "not log a failed OpenSearch request as fatal" do
471
+ @block = Proc.new { |c, u| puts "ERROR" }
472
+ @block.expects(:call).returns(OpenSearch::Transport::Transport::Response.new 500, 'ERROR')
473
+
474
+ @transport.expects(:__log_response).once
475
+ @transport.logger.expects(:fatal).never
476
+
477
+ # No `BadRequest` error
478
+ @transport.perform_request('POST', '_search', :ignore => 500, &@block)
479
+ end
480
+
481
+ should "log and re-raise a Ruby exception" do
482
+ @block = Proc.new { |c, u| puts "ERROR" }
483
+ @block.expects(:call).raises(StandardError)
484
+
485
+ @transport.expects(:__log_response).never
486
+ @transport.logger.expects(:fatal)
487
+
488
+ assert_raise(Exception) { @transport.perform_request('POST', '_search', &@block) }
489
+ end
490
+ end
491
+
492
+ context "tracing" do
493
+ setup do
494
+ @transport = DummyTransportPerformer.new :options => { :tracer => Logger.new('/dev/null') }
495
+
496
+ fake_connection = stub :full_url => 'localhost:9200/_search?size=1',
497
+ :host => 'localhost',
498
+ :connection => stub_everything,
499
+ :failures => 0,
500
+ :healthy! => true
501
+
502
+ @transport.stubs(:get_connection).returns(fake_connection)
503
+ @transport.serializer.stubs(:load).returns 'foo' => 'bar'
504
+ @transport.serializer.stubs(:dump).returns <<-JSON.gsub(/^ /, '')
505
+ {
506
+ "foo" : {
507
+ "bar" : {
508
+ "bam" : true
509
+ }
510
+ }
511
+ }
512
+ JSON
513
+ end
514
+
515
+ should "trace the request" do
516
+ @transport.tracer.expects(:info). with do |message|
517
+ message == <<-CURL.gsub(/^ /, '')
518
+ curl -X POST 'http://localhost:9200/_search?pretty&size=1' -d '{
519
+ "foo" : {
520
+ "bar" : {
521
+ "bam" : true
522
+ }
523
+ }
524
+ }
525
+ '
526
+ CURL
527
+ end.once
528
+
529
+ @transport.perform_request 'POST', '_search', {:size => 1}, {:q => 'foo'} do
530
+ OpenSearch::Transport::Transport::Response.new 200, '{"foo":"bar"}'
531
+ end
532
+ end
533
+
534
+ should "trace a failed OpenSearch request" do
535
+ @block = Proc.new { |c, u| puts "ERROR" }
536
+ @block.expects(:call).returns(OpenSearch::Transport::Transport::Response.new 500, 'ERROR')
537
+
538
+ @transport.expects(:__trace)
539
+
540
+ assert_raise OpenSearch::Transport::Transport::Errors::InternalServerError do
541
+ @transport.perform_request('POST', '_search', &@block)
542
+ end
543
+ end
544
+
545
+ end
546
+
547
+ context "reloading connections" do
548
+ setup do
549
+ @transport = DummyTransport.new :options => { :logger => Logger.new('/dev/null') }
550
+ end
551
+
552
+ should "rebuild connections" do
553
+ @transport.sniffer.expects(:hosts).returns([])
554
+ @transport.expects(:__rebuild_connections)
555
+ @transport.reload_connections!
556
+ end
557
+
558
+ should "log error and continue when timing out while sniffing hosts" do
559
+ @transport.sniffer.expects(:hosts).raises(OpenSearch::Transport::Transport::SnifferTimeoutError)
560
+ @transport.logger.expects(:error)
561
+ assert_nothing_raised do
562
+ @transport.reload_connections!
563
+ end
564
+ end
565
+
566
+ should "keep existing connections" do
567
+ @transport.__rebuild_connections :hosts => [ { :host => 'node1', :port => 1 } ], :options => { :http => {} }
568
+ assert_equal 1, @transport.connections.size
569
+
570
+ old_connection_id = @transport.connections.first.object_id
571
+
572
+ @transport.__rebuild_connections :hosts => [ { :host => 'node1', :port => 1 },
573
+ { :host => 'node2', :port => 2 } ],
574
+ :options => { :http => {} }
575
+
576
+ assert_equal 2, @transport.connections.size
577
+ assert_equal old_connection_id, @transport.connections.first.object_id
578
+ end
579
+
580
+ should "remove dead connections" do
581
+ @transport.__rebuild_connections :hosts => [ { :host => 'node1', :port => 1 },
582
+ { :host => 'node2', :port => 2 } ],
583
+ :options => { :http => {} }
584
+ assert_equal 2, @transport.connections.size
585
+
586
+ @transport.connections[1].dead!
587
+
588
+ @transport.__rebuild_connections :hosts => [ { :host => 'node1', :port => 1 } ], :options => { :http => {} }
589
+
590
+ assert_equal 1, @transport.connections.size
591
+ assert_equal 1, @transport.connections.all.size
592
+ end
593
+
594
+ should "not duplicate connections" do
595
+ @transport.__rebuild_connections :hosts => [ { :host => 'node1', :port => 1 },
596
+ { :host => 'node2', :port => 2 } ],
597
+ :options => { :http => {} }
598
+ assert_equal 2, @transport.connections.size
599
+
600
+ @transport.connections[0].dead!
601
+
602
+ @transport.__rebuild_connections :hosts => [ { :host => 'node1', :port => 1 },
603
+ { :host => 'node2', :port => 2 } ],
604
+ :options => { :http => {} }
605
+
606
+ assert_equal 2, @transport.connections.all.size
607
+ assert_equal 1, @transport.connections.size
608
+ end
609
+ end
610
+
611
+ context "rebuilding connections" do
612
+ setup do
613
+ @transport = DummyTransport.new
614
+ end
615
+
616
+ should "close connections" do
617
+ @transport.expects(:__close_connections)
618
+ @transport.__rebuild_connections :hosts => [ { :scheme => 'http', :host => 'foo', :port => 1 } ], :options => { :http => {} }
619
+ end
620
+
621
+ should "should replace the connections" do
622
+ assert_equal 0, @transport.connections.size
623
+
624
+ @transport.__rebuild_connections :hosts => [{ :scheme => 'http', :host => 'foo', :port => 1 }],
625
+ :options => { :http => {} }
626
+
627
+ assert_equal 1, @transport.connections.size
628
+ end
629
+ end
630
+
631
+ context "resurrecting connections" do
632
+ setup do
633
+ @transport = DummyTransportPerformer.new
634
+ end
635
+
636
+ should "delegate to dead connections" do
637
+ @transport.connections.expects(:dead).returns([])
638
+ @transport.resurrect_dead_connections!
639
+ end
640
+
641
+ should "not resurrect connections until timeout" do
642
+ @transport.connections.expects(:get_connection).returns(stub_everything :failures => 1).times(5)
643
+ @transport.expects(:resurrect_dead_connections!).never
644
+ 5.times { @transport.get_connection }
645
+ end
646
+
647
+ should "resurrect connections after timeout" do
648
+ @transport.connections.expects(:get_connection).returns(stub_everything :failures => 1).times(5)
649
+ @transport.expects(:resurrect_dead_connections!)
650
+
651
+ 4.times { @transport.get_connection }
652
+
653
+ now = Time.now + 60*2
654
+ Time.stubs(:now).returns(now)
655
+
656
+ @transport.get_connection
657
+ end
658
+
659
+ should "mark connection healthy if it succeeds" do
660
+ c = stub_everything(:failures => 1)
661
+ @transport.expects(:get_connection).returns(c)
662
+ c.expects(:healthy!)
663
+
664
+ @transport.perform_request('GET', '/') { |connection, url| OpenSearch::Transport::Transport::Response.new 200, 'OK' }
665
+ end
666
+ end
667
+
668
+ context "errors" do
669
+ should "raise highest-level Error exception for any ServerError" do
670
+ assert_kind_of OpenSearch::Transport::Transport::Error, OpenSearch::Transport::Transport::ServerError.new
671
+ end
672
+ end
673
+ end