tests: create fresh intances for all integration tests
[ruby-mogilefs-client.git] / test / fresh.rb
blob6afacde43542f78ad84a6bb8d1f00091a58aecb5
1 # -*- encoding: binary -*-
2 require "./test/exec"
3 require "tmpdir"
4 require "fileutils"
5 require "net/http"
7 module TestFreshSetup
8   include TestExec
10   def setup
11     setup_mogilefs
12   end
14   def setup_mogilefs(plugins = nil)
15     @test_host = "127.0.0.1"
16     setup_mogstored
17     @tracker = TCPServer.new(@test_host, 0)
18     @tracker_port = @tracker.addr[1]
20     @dbname = Tempfile.new(["mogfresh", ".sqlite3"])
21     @mogilefsd_conf = Tempfile.new(["mogilefsd", "conf"])
22     @mogilefsd_pid = Tempfile.new(["mogilefsd", "pid"])
24     cmd = %w(mogdbsetup --yes --type=SQLite --dbname) << @dbname.path
25     x!(*cmd)
27     @mogilefsd_conf.puts "db_dsn DBI:SQLite:#{@dbname.path}"
28     @mogilefsd_conf.write <<EOF
29 conf_port #@tracker_port
30 listen #@test_host
31 pidfile #{@mogilefsd_pid.path}
32 replicate_jobs 1
33 fsck_jobs 1
34 query_jobs 1
35 mogstored_stream_port #{@mogstored_mgmt_port}
36 node_timeout 10
37 EOF
38     @mogilefsd_conf.flush
40     @trackers = @hosts = [ "#@test_host:#@tracker_port" ]
41     @tracker.close
42     start_tracker
43     @admin = MogileFS::Admin.new(:hosts => @hosts)
44     50.times do
45       break if File.size(@mogstored_pid.path) > 0
46       sleep 0.1
47     end
48   end
50   def start_tracker
51     x!("mogilefsd", "--daemon", "--config=#{@mogilefsd_conf.path}")
52     wait_for_port @tracker_port
53   end
55   def wait_for_port(port)
56     tries = 50
57     begin
58       TCPSocket.new(@test_host, port).close
59       return
60     rescue
61       sleep 0.1
62     end while (tries -= 1) > 0
63     raise "#@test_host:#{port} never became ready"
64   end
66   def add_host_device_domain
67     assert_equal [], @admin.get_hosts
68     args = { :ip => @test_host, :port => @mogstored_http_port }
69     args[:status] = "alive"
70     @admin.create_host("me", args)
71     assert File.directory?("#@docroot/dev1")
72     assert File.directory?("#@docroot/dev2")
73     yield_for_monitor_update { @admin.get_hosts.empty? or break }
75     me = @admin.get_hosts.find { |x| x["hostname"] == "me" }
76     assert_instance_of Hash, me, me.inspect
77     assert_kind_of Integer, me["hostid"], me
78     assert_equal true, @admin.create_device(me["hostid"], 1)
79     yield_for_monitor_update { @admin.get_devices.empty? or break }
80     wait_for_usage_file "dev1"
81     assert_equal true, @admin.create_device("me", 2)
82     wait_for_usage_file "dev2"
84     # MogileFS::Server 2.60+ shows reject_bad_md5 monitor status
85     dev = @admin.get_devices[0]
86     if dev.include?("reject_bad_md5")
87       assert [true, false].include?(dev["reject_bad_md5"])
88     end
90     out = err = nil
91     tries = 0
92     begin
93       out.close! if out
94       err.close! if err
95       status, out, err = mogadm("check")
96       assert status.success?, status.inspect
97       if (tries += 1) > 100
98         warn err.read
99         puts out.read
100         raise "mogadm failed"
101       end
102       sleep 0.1
103     end until out.read =~ /write?able/
105     domain = "rbmogtest.#$$"
106     @admin.create_domain(domain)
107     yield_for_monitor_update { @admin.get_domains.include?(domain) and break }
108     @domain = domain
109   end
111   def teardown_mogilefs
112     if @mogstored_pid
113       pid = File.read(@mogstored_pid.path).to_i
114       Process.kill(:TERM, pid) if pid > 0
115     end
116     if @mogilefsd_pid
117       s = TCPSocket.new(@test_host, @tracker_port)
118       s.write "!shutdown\r\n"
119       s.close
120     end
121     FileUtils.rmtree(@docroot)
122   end
124   def wait_for_usage_file(device)
125     uri = URI("http://#@test_host:#@mogstored_http_port/#{device}/usage")
126     res = nil
127     100.times do
128       res = Net::HTTP.get_response(uri)
129       if Net::HTTPOK === res
130         puts res.body if $DEBUG
131         return
132       end
133       puts res.inspect if $DEBUG
134       sleep 0.1
135     end
136     raise "#{uri} failed to appear: #{res.inspect}"
137   end
139   def setup_mogstored
140     @docroot = Dir.mktmpdir(["mogfresh", "docroot"])
141     Dir.mkdir("#@docroot/dev1")
142     Dir.mkdir("#@docroot/dev2")
143     @mogstored_mgmt = TCPServer.new(@test_host, 0)
144     @mogstored_http = TCPServer.new(@test_host, 0)
145     @mogstored_mgmt_port = @mogstored_mgmt.addr[1]
146     @mogstored_http_port = @mogstored_http.addr[1]
147     @mogstored_conf = Tempfile.new(["mogstored", "conf"])
148     @mogstored_pid = Tempfile.new(["mogstored", "pid"])
149     @mogstored_conf.write <<EOF
150 pidfile = #{@mogstored_pid.path}
151 maxconns = 1000
152 httplisten = #@test_host:#{@mogstored_http_port}
153 mgmtlisten = #@test_host:#{@mogstored_mgmt_port}
154 docroot = #@docroot
156     @mogstored_conf.flush
157     @mogstored_mgmt.close
158     @mogstored_http.close
160     x!("mogstored", "--daemon", "--config=#{@mogstored_conf.path}")
161     wait_for_port @mogstored_mgmt_port
162     wait_for_port @mogstored_http_port
163   end