opensearch-ruby 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (432) 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 +28 -40
  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 +489 -189
  427. metadata.gz.sig +0 -0
  428. data/.gitignore +0 -21
  429. data/Rakefile +0 -69
  430. data/spec/integration/security_enabled/client_integration_spec.rb +0 -43
  431. data/spec/unit/opensearch_product_validation_spec.rb +0 -198
  432. /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