1 # -*- encoding: binary -*-
10 def setup_mogilefs(plugins = nil)
12 @test_host = "127.0.0.1"
14 @tracker = TCPServer.new(@test_host, 0)
15 @tracker_port = @tracker.addr[1]
17 @dbname = Tempfile.new(["mogfresh", ".sqlite3"], @docroot)
18 @mogilefsd_conf = Tempfile.new(["mogilefsd", "conf"], @docroot)
19 @mogilefsd_pid = Tempfile.new(["mogilefsd", "pid"], @docroot)
20 @dbpath = @dbname.path
22 cmd = %w(mogdbsetup --yes --type=SQLite --dbname) << @dbpath
25 @mogilefsd_conf.puts "db_dsn DBI:SQLite:#@dbpath"
26 @mogilefsd_conf.write <<EOF
27 conf_port #@tracker_port
29 pidfile #{@mogilefsd_pid.path}
33 mogstored_stream_port #{@mogstored_mgmt_port}
38 @trackers = @hosts = [ "#@test_host:#@tracker_port" ]
41 @admin = MogileFS::Admin.new(:hosts => @hosts)
43 break if File.size(@mogstored_pid.path) > 0
49 x!("mogilefsd", "--daemon", "--config=#{@mogilefsd_conf.path}")
50 wait_for_port @tracker_port
53 def wait_for_port(port)
56 TCPSocket.new(@test_host, port).close
60 end while (tries -= 1) > 0
61 raise "#@test_host:#{port} never became ready"
64 def add_host_device_domain
65 assert_equal [], @admin.get_hosts
66 args = { :ip => @test_host, :port => @mogstored_http_port }
67 args[:status] = "alive"
68 @admin.create_host("me", args)
69 assert File.directory?("#@docroot/dev1")
70 assert File.directory?("#@docroot/dev2")
71 yield_for_monitor_update { @admin.get_hosts.empty? or break }
73 me = @admin.get_hosts.find { |x| x["hostname"] == "me" }
74 assert_instance_of Hash, me, me.inspect
75 assert_kind_of Integer, me["hostid"], me
76 assert_equal true, @admin.create_device(me["hostid"], 1)
77 yield_for_monitor_update { @admin.get_devices.empty? or break }
78 wait_for_usage_file "dev1"
79 assert_equal true, @admin.create_device("me", 2)
80 wait_for_usage_file "dev2"
82 # MogileFS::Server 2.60+ shows reject_bad_md5 monitor status
83 dev = @admin.get_devices[0]
84 if dev.include?("reject_bad_md5")
85 assert [true, false, nil].include?(dev["reject_bad_md5"]), dev.inspect
93 status, out, err = mogadm("check")
94 assert status.success?, status.inspect
101 end until out.read =~ /write?able/
103 domain = "rbmogtest.#$$"
104 @admin.create_domain(domain)
105 yield_for_monitor_update { @admin.get_domains.include?(domain) and break }
109 def teardown_mogilefs
110 return if $$ != @teardown_pid
112 pid = File.read(@mogstored_pid.path).to_i
113 Process.kill(:TERM, pid) if pid > 0
116 s = TCPSocket.new(@test_host, @tracker_port)
117 s.write "!shutdown\r\n"
120 FileUtils.rmtree(@docroot)
123 def wait_for_usage_file(device)
124 uri = URI("http://#@test_host:#@mogstored_http_port/#{device}/usage")
127 res = Net::HTTP.get_response(uri)
128 if Net::HTTPOK === res
129 puts res.body if $DEBUG
132 puts res.inspect if $DEBUG
135 raise "#{uri} failed to appear: #{res.inspect}"
139 @docroot = Dir.mktmpdir(["mogfresh", "docroot"])
140 Dir.mkdir("#@docroot/dev1")
141 Dir.mkdir("#@docroot/dev2")
142 @mogstored_mgmt = TCPServer.new(@test_host, 0)
143 @mogstored_http = TCPServer.new(@test_host, 0)
144 @mogstored_mgmt_port = @mogstored_mgmt.addr[1]
145 @mogstored_http_port = @mogstored_http.addr[1]
146 @mogstored_conf = Tempfile.new(["mogstored", "conf"], @docroot)
147 @mogstored_pid = Tempfile.new(["mogstored", "pid"], @docroot)
148 @mogstored_conf.write <<EOF
149 pidfile = #{@mogstored_pid.path}
151 httplisten = #@test_host:#{@mogstored_http_port}
152 mgmtlisten = #@test_host:#{@mogstored_mgmt_port}
155 @mogstored_conf.flush
156 @mogstored_mgmt.close
157 @mogstored_http.close
159 x!("mogstored", "--daemon", "--config=#{@mogstored_conf.path}")
160 wait_for_port @mogstored_mgmt_port
161 wait_for_port @mogstored_http_port