summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Avdey <eiri@eiri.ca>2018-12-06 15:32:05 -0400
committerEric Avdey <eiri@eiri.ca>2018-12-10 19:27:43 -0400
commit3a46fb4fcd3b9426875bc8621459001b9f7e2cab (patch)
tree2a59b0c357b56a42969fe6234b6928987d6167f4
parent445e232d5539faf644c80cec495c0665671af3f9 (diff)
downloadcouchdb-3a46fb4fcd3b9426875bc8621459001b9f7e2cab.tar.gz
Add elixir helper to restart a node or the whole cluster
-rw-r--r--test/elixir/lib/couch.ex4
-rw-r--r--test/elixir/lib/couch/db_test.ex53
2 files changed, 57 insertions, 0 deletions
diff --git a/test/elixir/lib/couch.ex b/test/elixir/lib/couch.ex
index 302b8276a..934262216 100644
--- a/test/elixir/lib/couch.ex
+++ b/test/elixir/lib/couch.ex
@@ -50,6 +50,10 @@ defmodule Couch do
CouchDB library to power test suite.
"""
+ def process_url("http://" <> _ = url) do
+ url
+ end
+
def process_url(url) do
"http://127.0.0.1:15984" <> url
end
diff --git a/test/elixir/lib/couch/db_test.ex b/test/elixir/lib/couch/db_test.ex
index 930090b51..3bbfb7eaa 100644
--- a/test/elixir/lib/couch/db_test.ex
+++ b/test/elixir/lib/couch/db_test.ex
@@ -239,4 +239,57 @@ defmodule Couch.DBTest do
opts = [pretty: true, width: 20, limit: :infinity, printable_limit: :infinity]
inspect(resp, opts)
end
+
+ def restart_cluster() do
+ resp = Couch.get("/_membership")
+ assert resp.status_code == 200
+ nodes = resp.body["all_nodes"]
+
+ nodes_ports =
+ Enum.reduce(nodes, [], fn node, acc ->
+ port = node_to_port(node)
+ [{node, port} | acc]
+ end)
+
+ tasks =
+ Enum.map(nodes_ports, fn {node, port} ->
+ Task.async(fn -> restart_node(node, port) end)
+ end)
+
+ Task.yield_many(tasks, length(nodes) * 5000)
+ end
+
+ def restart_node(node \\ "node1@127.0.0.1") do
+ port = node_to_port(node)
+ restart_node(node, port)
+ end
+
+ defp restart_node(node, port) do
+ url = "http://127.0.0.1:#{port}/_node/#{node}/_restart"
+ resp = Couch.post(url)
+ assert HTTPotion.Response.success?(resp)
+ assert resp.body["ok"]
+ # make sure node went down. we assuming the node can't bounce quick
+ # enough to inroduce a race here
+ retry_until(fn -> !node_is_running(port) end)
+ # wait utill node is back
+ retry_until(fn -> node_is_running(port) end, 500, 10_000)
+ end
+
+ defp node_is_running(port) do
+ url = "http://127.0.0.1:#{port}/_up"
+ resp = Couch.get(url)
+
+ case HTTPotion.Response.success?(resp) do
+ true -> resp.status_code in 200..399
+ false -> false
+ end
+ end
+
+ defp node_to_port(node) do
+ url = "/_node/#{node}/_config/chttpd/port"
+ resp = Couch.get(url)
+ assert HTTPotion.Response.success?(resp)
+ resp.body
+ end
end