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