diff options
author | Eric Avdey <eiri@eiri.ca> | 2018-12-06 15:32:05 -0400 |
---|---|---|
committer | Eric Avdey <eiri@eiri.ca> | 2018-12-10 19:27:43 -0400 |
commit | 3a46fb4fcd3b9426875bc8621459001b9f7e2cab (patch) | |
tree | 2a59b0c357b56a42969fe6234b6928987d6167f4 /test/elixir/lib | |
parent | 445e232d5539faf644c80cec495c0665671af3f9 (diff) | |
download | couchdb-3a46fb4fcd3b9426875bc8621459001b9f7e2cab.tar.gz |
Add elixir helper to restart a node or the whole cluster
Diffstat (limited to 'test/elixir/lib')
-rw-r--r-- | test/elixir/lib/couch.ex | 4 | ||||
-rw-r--r-- | test/elixir/lib/couch/db_test.ex | 53 |
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 |