diff --git a/hbase-shell/src/main/ruby/shell/commands/regioninfo.rb b/hbase-shell/src/main/ruby/shell/commands/regioninfo.rb index 725dd6534e6..4facbf8c71f 100644 --- a/hbase-shell/src/main/ruby/shell/commands/regioninfo.rb +++ b/hbase-shell/src/main/ruby/shell/commands/regioninfo.rb @@ -16,6 +16,13 @@ # limitations under the License. # +include Java +java_import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil +java_import org.apache.hadoop.hbase.util.FutureUtils +java_import org.apache.hadoop.hbase.client.ConnectionFactory +java_import org.apache.hadoop.hbase.security.UserProvider +java_import org.apache.hadoop.hbase.client.ClusterConnectionFactory + module Shell module Commands class Regioninfo < Command @@ -35,12 +42,20 @@ Below we pass first encoded region name and then full region name. EOF end - def command(regionname) - connection = org.apache.hadoop.hbase.client.ConnectionFactory.createConnection() - admin = connection.getAdmin() + def command(region_name) + admin = @shell.hbase.connection.getAdmin() sn = admin.getMaster() - puts org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil.getRegionInfo(nil, - connection.getAdmin(sn), regionname.to_java_bytes) + + conf = @shell.hbase.configuration + user = UserProvider.instantiate(conf).getCurrent() + clusterConnection = ClusterConnectionFactory.createAsyncClusterConnection(conf, nil, user) + regionInfo = ProtobufUtil.toRegionInfo(FutureUtils.get( + clusterConnection.getRegionServerAdmin(sn).getRegionInfo( + ProtobufUtil.getGetRegionInfoRequest(region_name.to_java_bytes))).getRegionInfo()) + if clusterConnection != nil + clusterConnection.close() + end + puts regionInfo end end end diff --git a/hbase-shell/src/test/ruby/hbase/admin2_test.rb b/hbase-shell/src/test/ruby/hbase/admin2_test.rb index e420c74779f..9d3834ee667 100644 --- a/hbase-shell/src/test/ruby/hbase/admin2_test.rb +++ b/hbase-shell/src/test/ruby/hbase/admin2_test.rb @@ -435,5 +435,47 @@ class CommissioningTest < Test::Unit::TestCase end end end + + # Tests for the `regioninfo` shell command + class RegionInfoTest < Test::Unit::TestCase + include TestHelpers + include HBaseConstants + + def setup + setup_hbase + # Create test table if it does not exist + @test_name = "hbase_shell_regioninfo_test" + drop_test_table(@test_name) + create_test_table(@test_name) + end + + def teardown + shutdown + end + + define_test "Get region info without any args" do + assert_raise(ArgumentError) do + command(:regioninfo) + end + end + + define_test 'Get region info with encoded region name' do + region = command(:locate_region, @test_name, '') + encodedRegionName = region.getRegion.getEncodedName + output = capture_stdout { command(:regioninfo, encodedRegionName) } + puts "Region info output:\n#{output}" + assert output.include? 'ENCODED' + assert output.include? 'STARTKEY' + end + + define_test 'Get region info with region name' do + region = command(:locate_region, @test_name, '') + regionName = region.getRegion.getRegionNameAsString + output = capture_stdout { command(:regioninfo, regionName) } + puts "Region info output:\n#{output}" + assert output.include? 'ENCODED' + assert output.include? 'STARTKEY' + end + end # rubocop:enable ClassLength end