Repository: hbase Updated Branches: refs/heads/master 122e6f579 -> ca816f078
http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java index c096a9f..66ea050 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java @@ -2738,4 +2738,79 @@ public class TestAccessController extends SecureTestUtil { verifyDenied(replicateLogEntriesAction, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER, USER_GROUP_READ, USER_GROUP_ADMIN, USER_GROUP_CREATE); } + + @Test + public void testMoveServers() throws Exception { + AccessTestAction action1 = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preMoveServers(ObserverContext.createAndPrepare(CP_ENV, null), + null, null); + return null; + } + }; + + verifyAllowed(action1, SUPERUSER, USER_ADMIN); + verifyDenied(action1, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); + } + + @Test + public void testMoveTables() throws Exception { + AccessTestAction action1 = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preMoveTables(ObserverContext.createAndPrepare(CP_ENV, null), + null, null); + return null; + } + }; + + verifyAllowed(action1, SUPERUSER, USER_ADMIN); + verifyDenied(action1, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); + } + + @Test + public void testAddGroup() throws Exception { + AccessTestAction action1 = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preAddRSGroup(ObserverContext.createAndPrepare(CP_ENV, null), + null); + return null; + } + }; + + verifyAllowed(action1, SUPERUSER, USER_ADMIN); + verifyDenied(action1, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); + } + + @Test + public void testRemoveGroup() throws Exception { + AccessTestAction action1 = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preRemoveRSGroup(ObserverContext.createAndPrepare(CP_ENV, null), + null); + return null; + } + }; + + verifyAllowed(action1, SUPERUSER, USER_ADMIN); + verifyDenied(action1, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); + } + + @Test + public void testBalanceGroup() throws Exception { + AccessTestAction action1 = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preBalanceRSGroup(ObserverContext.createAndPrepare(CP_ENV, null), + null); + return null; + } + }; + + verifyAllowed(action1, SUPERUSER, USER_ADMIN); + verifyDenied(action1, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/pom.xml ---------------------------------------------------------------------- diff --git a/hbase-shell/pom.xml b/hbase-shell/pom.xml index 7c3754e..cf63e94 100644 --- a/hbase-shell/pom.xml +++ b/hbase-shell/pom.xml @@ -253,6 +253,41 @@ </dependency> </dependencies> <profiles> + <profile> + <id>rsgroup</id> + <activation> + <property> + <name>!skip-rsgroup</name> + </property> + </activation> + <dependencies> + <dependency> + <groupId>org.apache.hbase</groupId> + <artifactId>hbase-rsgroup</artifactId> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <id>add-test-source</id> + <goals> + <goal>add-test-source</goal> + </goals> + <configuration> + <sources> + <source>src/test/rsgroup</source> + </sources> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> <!-- Skip the tests in this module --> <profile> <id>skipShellTests</id> http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/hbase.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/hbase.rb b/hbase-shell/src/main/ruby/hbase.rb index aca1006..21f88f9 100644 --- a/hbase-shell/src/main/ruby/hbase.rb +++ b/hbase-shell/src/main/ruby/hbase.rb @@ -102,5 +102,6 @@ require 'hbase/quotas' require 'hbase/replication_admin' require 'hbase/security' require 'hbase/visibility_labels' +require 'hbase/rsgroup_admin' include HBaseQuotasConstants http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/hbase/hbase.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/hbase/hbase.rb b/hbase-shell/src/main/ruby/hbase/hbase.rb index 135e1d5..785f8bc 100644 --- a/hbase-shell/src/main/ruby/hbase/hbase.rb +++ b/hbase-shell/src/main/ruby/hbase/hbase.rb @@ -47,6 +47,10 @@ module Hbase ::Hbase::Admin.new(@connection.getAdmin, formatter) end + def rsgroup_admin(formatter) + ::Hbase::RSGroupAdmin.new(@connection, formatter) + end + # Create new one each time def table(table, shell) ::Hbase::Table.new(@connection.getTable(table), shell) http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/hbase/rsgroup_admin.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/hbase/rsgroup_admin.rb b/hbase-shell/src/main/ruby/hbase/rsgroup_admin.rb new file mode 100644 index 0000000..51a4efb --- /dev/null +++ b/hbase-shell/src/main/ruby/hbase/rsgroup_admin.rb @@ -0,0 +1,150 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +include Java +java_import org.apache.hadoop.hbase.util.Pair + +# Wrapper for org.apache.hadoop.hbase.group.GroupAdminClient +# Which is an API to manage region server groups + +module Hbase + class RSGroupAdmin + include HBaseConstants + + def initialize(connection, formatter) + @admin = org.apache.hadoop.hbase.rsgroup.RSGroupAdmin.newClient(connection) + @formatter = formatter + end + + def close + @admin.close + end + + #-------------------------------------------------------------------------- + # Returns a list of groups in hbase + def list_rs_groups + @admin.listRSGroups.map { |g| g.getName } + end + + #-------------------------------------------------------------------------- + # get a group's information + def get_rsgroup(group_name) + group = @admin.getRSGroupInfo(group_name) + if group.nil? + raise(ArgumentError, 'Group does not exist: ' + group_name) + end + + res = {} + if block_given? + yield('Servers:') + end + + servers = [] + group.getServers.each do |v| + if block_given? + yield(v.toString) + else + servers << v.toString + end + end + res[:servers] = servers + + tables = [] + if block_given? + yield('Tables:') + end + group.getTables.each do |v| + if block_given? + yield(v.toString) + else + tables << v.toString + end + end + res[:tables] = tables + + if !block_given? + res + else + nil + end + end + + #-------------------------------------------------------------------------- + # add a group + def add_rs_group(group_name) + @admin.addRSGroup(group_name) + end + + #-------------------------------------------------------------------------- + # remove a group + def remove_rs_group(group_name) + @admin.removeRSGroup(group_name) + end + + #-------------------------------------------------------------------------- + # balance a group + def balance_rs_group(group_name) + @admin.balanceRSGroup(group_name) + end + + #-------------------------------------------------------------------------- + # move server to a group + def move_servers(dest, *args) + servers = java.util.HashSet.new + args[0].each do |s| + servers.add(com.google.common.net.HostAndPort.fromString(s)) + end + @admin.moveServers(servers, dest) + end + + #-------------------------------------------------------------------------- + # move server to a group + def move_tables(dest, *args) + tables = java.util.HashSet.new; + args[0].each do |s| + tables.add(org.apache.hadoop.hbase.TableName.valueOf(s)) + end + @admin.moveTables(tables, dest) + end + + #-------------------------------------------------------------------------- + # get group of server + def get_rsgroup_of_server(server) + res = @admin.getRSGroupOfServer( + com.google.common.net.HostAndPort.fromString(server)) + if res.nil? + raise(ArgumentError,'Server has no group: ' + server) + end + res + end + + #-------------------------------------------------------------------------- + # get group of table + def get_rsgroup_of_table(table) + res = @admin.getRSGroupInfoOfTable( + org.apache.hadoop.hbase.TableName.valueOf(table)) + if res.nil? + raise(ArgumentError,'Table has no group: ' + table) + end + res + end + + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell.rb b/hbase-shell/src/main/ruby/shell.rb index 4144b91..ed7dd76 100644 --- a/hbase-shell/src/main/ruby/shell.rb +++ b/hbase-shell/src/main/ruby/shell.rb @@ -107,6 +107,10 @@ module Shell @hbase_quotas_admin ||= hbase.quotas_admin(formatter) end + def hbase_rsgroup_admin + @rsgroup_admin ||= hbase.rsgroup_admin(formatter) + end + def export_commands(where) ::Shell.commands.keys.each do |cmd| # here where is the IRB namespace @@ -429,3 +433,20 @@ Shell.load_command_group( set_visibility ] ) + +Shell.load_command_group( + 'rsgroup', + :full_name => 'RSGroups', + :comment => "NOTE: Above commands are only applicable if running with the Groups setup", + :commands => %w[ + list_rsgroups + get_rsgroup + add_rsgroup + remove_rsgroup + balance_rsgroup + move_rsgroup_servers + move_rsgroup_tables + get_server_rsgroup + get_table_rsgroup + ] +) http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands.rb b/hbase-shell/src/main/ruby/shell/commands.rb index 4ad04cd..0c37c4f 100644 --- a/hbase-shell/src/main/ruby/shell/commands.rb +++ b/hbase-shell/src/main/ruby/shell/commands.rb @@ -74,6 +74,10 @@ module Shell @shell.hbase_quotas_admin end + def rsgroup_admin + @shell.hbase_rsgroup_admin + end + #---------------------------------------------------------------------- def formatter http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/add_rsgroup.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/add_rsgroup.rb b/hbase-shell/src/main/ruby/shell/commands/add_rsgroup.rb new file mode 100644 index 0000000..5a42e27 --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/add_rsgroup.rb @@ -0,0 +1,39 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class AddRsgroup < Command + def help + return <<-EOF +Create a new region server group. + +Example: + + hbase> add_rsgroup 'my_group' +EOF + end + + def command(group_name) + rsgroup_admin.add_rs_group(group_name) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/balance_rsgroup.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/balance_rsgroup.rb b/hbase-shell/src/main/ruby/shell/commands/balance_rsgroup.rb new file mode 100644 index 0000000..bee139f --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/balance_rsgroup.rb @@ -0,0 +1,37 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class BalanceRsgroup < Command + def help + return <<-EOF +Balance a region server group + + hbase> balance_rsgroup 'my_group' +EOF + end + + def command(group_name) + rsgroup_admin.balance_rs_group(group_name) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/get_rsgroup.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/get_rsgroup.rb b/hbase-shell/src/main/ruby/shell/commands/get_rsgroup.rb new file mode 100644 index 0000000..6772aa1 --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/get_rsgroup.rb @@ -0,0 +1,44 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class GetRsgroup < Command + def help + return <<-EOF +Get a region server group's information. + +Example: + + hbase> get_rsgroup 'default' +EOF + end + + def command(group_name) + now = Time.now + formatter.header(['GROUP INFORMATION']) + group_admin.get_rsgroup(group_name) do |s| + formatter.row([s]) + end + formatter.footer(now) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/get_server_rsgroup.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/get_server_rsgroup.rb b/hbase-shell/src/main/ruby/shell/commands/get_server_rsgroup.rb new file mode 100644 index 0000000..322f6bb --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/get_server_rsgroup.rb @@ -0,0 +1,40 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class GetServerRsgroup < Command + def help + return <<-EOF +Get the group name the given region server is a member of. + + hbase> get_server_rsgroup 'server1:port1' +EOF + end + + def command(server) + now = Time.now + group_name = rsgroup_admin.getGroupOfServer(server).getName + formatter.row([group_name]) + formatter.footer(now, 1) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/get_table_rsgroup.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/get_table_rsgroup.rb b/hbase-shell/src/main/ruby/shell/commands/get_table_rsgroup.rb new file mode 100644 index 0000000..d15cffa --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/get_table_rsgroup.rb @@ -0,0 +1,41 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class GetTableRsgroup < Command + def help + return <<-EOF +Get the group name the given table is a member of. + + hbase> get_table_rsgroup 'myTable' +EOF + end + + def command(table) + now = Time.now + group_name = + rsgroup_admin.get_rsgroup_of_table(table).getName + formatter.row([group_name]) + formatter.footer(now, 1) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/list_rsgroups.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/list_rsgroups.rb b/hbase-shell/src/main/ruby/shell/commands/list_rsgroups.rb new file mode 100644 index 0000000..6ea1d45 --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/list_rsgroups.rb @@ -0,0 +1,50 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class ListRsgroups < Command + def help + return <<-EOF +List all region server groups. Optional regular expression parameter could +be used to filter the output. + +Example: + + hbase> list_rsgroups + hbase> list_rsgroups 'abc.*' +EOF + end + + def command(regex = '.*') + now = Time.now + formatter.header(['GROUPS']) + + regex = /#{regex}/ unless regex.is_a?(Regexp) + list = rsgroup_admin.list_rs_groups.grep(regex) + list.each do |group| + formatter.row([group]) + end + + formatter.footer(now, list.size) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_servers.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_servers.rb b/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_servers.rb new file mode 100644 index 0000000..6f48400 --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_servers.rb @@ -0,0 +1,37 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class MoveRsgroupServers < Command + def help + return <<-EOF +Reassign a region server from one group to another. + + hbase> move_rsgroup_servers 'dest',['server1:port','server2:port'] +EOF + end + + def command(dest, servers) + rsgroup_admin.move_servers(dest, servers) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_tables.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_tables.rb b/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_tables.rb new file mode 100644 index 0000000..3c1555a --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/move_rsgroup_tables.rb @@ -0,0 +1,37 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class MoveRsgroupTables < Command + def help + return <<-EOF +Reassign tables from one group to another. + + hbase> move_rsgroup_tables 'dest',['table1','table2'] +EOF + end + + def command(dest, tables) + rsgroup_admin.move_tables(dest, tables) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/main/ruby/shell/commands/remove_rsgroup.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/remove_rsgroup.rb b/hbase-shell/src/main/ruby/shell/commands/remove_rsgroup.rb new file mode 100644 index 0000000..9407732 --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/remove_rsgroup.rb @@ -0,0 +1,37 @@ +# +# Copyright The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class RemoveRsgroup < Command + def help + return <<-EOF +Remove a group. + + hbase> remove_rsgroup 'my_group' +EOF + end + + def command(group_name) + rsgroup_admin.remove_rs_group(group_name) + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestShell.java ---------------------------------------------------------------------- diff --git a/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestShell.java b/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestShell.java index 976ba45..882b811 100644 --- a/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestShell.java +++ b/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestShell.java @@ -31,7 +31,7 @@ public class TestShell extends AbstractTestShell { @Test public void testRunShellTests() throws IOException { - System.setProperty("shell.test.exclude", "replication_admin_test.rb"); + System.setProperty("shell.test.exclude", "replication_admin_test.rb,rsgroup_shell_test.rb"); // Start all ruby tests jruby.runScriptlet(PathType.ABSOLUTE, "src/test/ruby/tests_runner.rb"); } http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/test/rsgroup/org/apache/hadoop/hbase/client/rsgroup/TestShellRSGroups.java ---------------------------------------------------------------------- diff --git a/hbase-shell/src/test/rsgroup/org/apache/hadoop/hbase/client/rsgroup/TestShellRSGroups.java b/hbase-shell/src/test/rsgroup/org/apache/hadoop/hbase/client/rsgroup/TestShellRSGroups.java new file mode 100644 index 0000000..be23a59 --- /dev/null +++ b/hbase-shell/src/test/rsgroup/org/apache/hadoop/hbase/client/rsgroup/TestShellRSGroups.java @@ -0,0 +1,111 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.client.rsgroup; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; +import org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint; +import org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer; +import org.apache.hadoop.hbase.security.access.SecureTestUtil; +import org.apache.hadoop.hbase.security.visibility.VisibilityTestUtil; +import org.apache.hadoop.hbase.testclassification.ClientTests; +import org.apache.hadoop.hbase.testclassification.LargeTests; +import org.jruby.embed.PathType; +import org.jruby.embed.ScriptingContainer; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +//Separate Shell test class for Groups +//Since we need to use a different balancer and run more than 1 RS +@Category({ClientTests.class, LargeTests.class}) +public class TestShellRSGroups { + final Log LOG = LogFactory.getLog(getClass()); + private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); + private final static ScriptingContainer jruby = new ScriptingContainer(); + private static String basePath; + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + basePath = System.getProperty("basedir"); + + // Start mini cluster + TEST_UTIL.getConfiguration().setBoolean("hbase.online.schema.update.enable", true); + TEST_UTIL.getConfiguration().setInt("hbase.regionserver.msginterval", 100); + TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 250); + TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 6); + TEST_UTIL.getConfiguration().setBoolean(CoprocessorHost.ABORT_ON_ERROR_KEY, false); + TEST_UTIL.getConfiguration().setInt("hfile.format.version", 3); + TEST_UTIL.getConfiguration().setInt(HConstants.MASTER_INFO_PORT, -1); + TEST_UTIL.getConfiguration().setInt(HConstants.REGIONSERVER_INFO_PORT, -1); + // Security setup configuration + SecureTestUtil.enableSecurity(TEST_UTIL.getConfiguration()); + VisibilityTestUtil.enableVisiblityLabels(TEST_UTIL.getConfiguration()); + + //Setup RegionServer Groups + TEST_UTIL.getConfiguration().set( + HConstants.HBASE_MASTER_LOADBALANCER_CLASS, + RSGroupBasedLoadBalancer.class.getName()); + TEST_UTIL.getConfiguration().set( + CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, + RSGroupAdminEndpoint.class.getName()); + TEST_UTIL.getConfiguration().setBoolean( + HConstants.ZOOKEEPER_USEMULTI, + true); + + TEST_UTIL.startMiniCluster(1,4); + + // Configure jruby runtime + List<String> loadPaths = new ArrayList(); + loadPaths.add(basePath+"/src/main/ruby"); + loadPaths.add(basePath+"/src/test/ruby"); + jruby.getProvider().setLoadPaths(loadPaths); + jruby.put("$TEST_CLUSTER", TEST_UTIL); + System.setProperty("jruby.jit.logging.verbose", "true"); + System.setProperty("jruby.jit.logging", "true"); + System.setProperty("jruby.native.verbose", "true"); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + TEST_UTIL.shutdownMiniCluster(); + } + + @Test + public void testRunShellTests() throws IOException { + try { + // Start only GroupShellTest + System.setProperty("shell.test", "Hbase::RSGroupShellTest"); + jruby.runScriptlet(PathType.ABSOLUTE, + basePath + "/src/test/ruby/tests_runner.rb"); + } finally { + System.clearProperty("shell.test"); + } + } + +} + http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/test/ruby/shell/rsgroup_shell_test.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/test/ruby/shell/rsgroup_shell_test.rb b/hbase-shell/src/test/ruby/shell/rsgroup_shell_test.rb new file mode 100644 index 0000000..d892775 --- /dev/null +++ b/hbase-shell/src/test/ruby/shell/rsgroup_shell_test.rb @@ -0,0 +1,96 @@ +# +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'hbase' +require 'shell' +require 'shell/formatter' + +module Hbase + class RSGroupShellTest < Test::Unit::TestCase + def setup + @formatter = ::Shell::Formatter::Console.new + @hbase = ::Hbase::Hbase.new($TEST_CLUSTER.getConfiguration) + @shell = Shell::Shell.new(@hbase, @formatter) + connection = $TEST_CLUSTER.getConnection + @rsgroup_admin = + org.apache.hadoop.hbase.rsgroup.RSGroupAdmin.newClient(connection) + end + + define_test 'Test Basic RSGroup Commands' do + group_name = 'test_group' + table_name = 'test_table' + + @shell.command('create', table_name, 'f') + + @shell.command('add_rsgroup', group_name) + assert_not_nil(@rsgroup_admin.getRSGroupInfo(group_name)) + + @shell.command('remove_rsgroup', group_name) + assert_nil(@rsgroup_admin.getRSGroupInfo(group_name)) + + @shell.command('add_rsgroup', group_name) + group = @rsgroup_admin.getRSGroupInfo(group_name) + assert_not_nil(group) + assert_equal(0, group.getServers.count) + + hostport = + @rsgroup_admin.getRSGroupInfo('default').getServers.iterator.next.toString + @shell.command('move_rsgroup_servers', + group_name, + [hostport]) + assert_equal(1, @rsgroup_admin.getRSGroupInfo(group_name).getServers.count) + + @shell.command('move_rsgroup_tables', + group_name, + [table_name]) + assert_equal(1, @rsgroup_admin.getRSGroupInfo(group_name).getTables.count) + + count = 0 + @hbase.rsgroup_admin(@formatter).get_rsgroup(group_name) do |line| + case count + when 1 + assert_equal(hostport, line) + when 3 + assert_equal(table_name, line) + end + count += 1 + end + assert_equal(4, count) + + assert_equal(2, + @hbase.rsgroup_admin(@formatter).list_rs_groups.count) + + # just run it to verify jruby->java api binding + @hbase.rsgroup_admin(@formatter).balance_rs_group(group_name) + end + + # we test exceptions that could be thrown by the ruby wrappers + define_test 'Test bogus arguments' do + assert_raise(ArgumentError) do + @hbase.rsgroup_admin(@formatter).get_rsgroup('foobar') + end + assert_raise(ArgumentError) do + @hbase.rsgroup_admin(@formatter).get_rsgroup_of_server('foobar:123') + end + assert_raise(ArgumentError) do + @hbase.rsgroup_admin(@formatter).get_rsgroup_of_table('foobar') + end + end + end +end http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/hbase-shell/src/test/ruby/test_helper.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/test/ruby/test_helper.rb b/hbase-shell/src/test/ruby/test_helper.rb index 67bbb14..e75cd36 100644 --- a/hbase-shell/src/test/ruby/test_helper.rb +++ b/hbase-shell/src/test/ruby/test_helper.rb @@ -72,6 +72,10 @@ module Hbase @shell.hbase_replication_admin end + def group_admin(_formatter) + @shell.hbase_group_admin + end + def create_test_table(name) # Create the table if needed unless admin.exists?(name) http://git-wip-us.apache.org/repos/asf/hbase/blob/ca816f07/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index b3fa787..cc3df91 100644 --- a/pom.xml +++ b/pom.xml @@ -1353,6 +1353,18 @@ <scope>test</scope> </dependency> <dependency> + <artifactId>hbase-rsgroup</artifactId> + <groupId>org.apache.hbase</groupId> + <version>${project.version}</version> + </dependency> + <dependency> + <artifactId>hbase-rsgroup</artifactId> + <groupId>org.apache.hbase</groupId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> <artifactId>hbase-server</artifactId> <groupId>org.apache.hbase</groupId> <version>${project.version}</version> @@ -1800,6 +1812,17 @@ --> <profiles> <profile> + <id>rsgroup</id> + <activation> + <property> + <name>!skip-rsgroup</name> + </property> + </activation> + <modules> + <module>hbase-rsgroup</module> + </modules> + </profile> + <profile> <id>build-with-jdk8</id> <activation> <jdk>1.8</jdk>