1defmodule ReshardHelpers do
2  use CouchTestCase
3
4  def get_summary do
5    resp = Couch.get("/_reshard")
6    assert resp.status_code == 200
7    resp.body
8  end
9
10  def get_state do
11    resp = Couch.get("/_reshard/state")
12    assert resp.status_code == 200
13    resp.body
14  end
15
16  def put_state_running do
17    resp = Couch.put("/_reshard/state", body: %{:state => "running"})
18    assert resp.status_code == 200
19    resp
20  end
21
22  def put_state_stopped(reason \\ "") do
23    body = %{:state => "stopped", :reason => reason}
24    resp = Couch.put("/_reshard/state", body: body)
25    assert resp.status_code == 200
26    resp
27  end
28
29  def get_jobs do
30    resp = Couch.get("/_reshard/jobs")
31    assert resp.status_code == 200
32    resp.body["jobs"]
33  end
34
35  def post_job_db(db) do
36    body = %{:type => :split, :db => db}
37    Couch.post("/_reshard/jobs", body: body)
38  end
39
40  def post_job_node(db, node) do
41    body = %{:type => :split, :db => db, :node => node}
42    Couch.post("/_reshard/jobs", body: body)
43  end
44
45  def post_job_range(db, range) do
46    body = %{:type => :split, :db => db, :range => range}
47    Couch.post("/_reshard/jobs", body: body)
48  end
49
50  def post_job_node_and_range(db, node, range) do
51    body = %{:type => :split, :db => db, :node => node, :range => range}
52    Couch.post("/_reshard/jobs", body: body)
53  end
54
55  def get_job(id) when is_binary(id) do
56    Couch.get("/_reshard/jobs/#{id}")
57  end
58
59  def remove_job(id) when is_binary(id) do
60    Couch.delete("/_reshard/jobs/#{id}")
61  end
62
63  def get_job_state(id) when is_binary(id) do
64    resp = Couch.get("/_reshard/jobs/#{id}/state")
65    assert resp.status_code == 200
66    resp.body["state"]
67  end
68
69  def stop_job(id, reason \\ "") when is_binary(id) do
70    body = %{:state => "stopped", :reason => reason}
71    Couch.post("/_reshard/jobs/#{id}/state", body: body)
72  end
73
74  def resume_job(id) when is_binary(id) do
75    body = %{:state => "running"}
76    Couch.post("/_reshard/jobs/#{id}/state", body: body)
77  end
78
79  def job_ids(jobs) do
80    Enum.map(fn job -> job["id"] end, jobs)
81  end
82
83  def get_first_node do
84    mresp = Couch.get("/_membership")
85    assert mresp.status_code == 200
86    all_nodes = mresp.body["all_nodes"]
87
88    mresp.body["cluster_nodes"]
89    |> Enum.filter(fn n -> n in all_nodes end)
90    |> Enum.sort()
91    |> hd()
92  end
93
94  def wait_job_removed(id) do
95    retry_until(fn -> get_job(id).status_code == 404 end, 200, 60_000)
96  end
97
98  def wait_job_completed(id) do
99    wait_job_state(id, "completed")
100  end
101
102  def wait_job_state(id, state) do
103    retry_until(fn -> get_job_state(id) == state end, 200, 60_000)
104  end
105
106  def reset_reshard_state do
107    get_jobs()
108    |> Enum.map(fn j -> j["id"] end)
109    |> Enum.each(fn id -> remove_job(id) end)
110
111    assert get_jobs() == []
112    put_state_running()
113  end
114end
115