diff --git a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java index 90d576434bb..4f7f9545ecd 100644 --- a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java +++ b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java @@ -34206,6 +34206,21 @@ public final class MasterProtos { * optional bool include_sys_tables = 3 [default = false]; */ boolean getIncludeSysTables(); + + // optional string namespace = 4; + /** + * optional string namespace = 4; + */ + boolean hasNamespace(); + /** + * optional string namespace = 4; + */ + java.lang.String getNamespace(); + /** + * optional string namespace = 4; + */ + com.google.protobuf.ByteString + getNamespaceBytes(); } /** * Protobuf type {@code GetTableDescriptorsRequest} @@ -34276,6 +34291,11 @@ public final class MasterProtos { includeSysTables_ = input.readBool(); break; } + case 34: { + bitField0_ |= 0x00000004; + namespace_ = input.readBytes(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -34414,10 +34434,54 @@ public final class MasterProtos { return includeSysTables_; } + // optional string namespace = 4; + public static final int NAMESPACE_FIELD_NUMBER = 4; + private java.lang.Object namespace_; + /** + * optional string namespace = 4; + */ + public boolean hasNamespace() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string namespace = 4; + */ + public java.lang.String getNamespace() { + java.lang.Object ref = namespace_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + namespace_ = s; + } + return s; + } + } + /** + * optional string namespace = 4; + */ + public com.google.protobuf.ByteString + getNamespaceBytes() { + java.lang.Object ref = namespace_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + private void initFields() { tableNames_ = java.util.Collections.emptyList(); regex_ = ""; includeSysTables_ = false; + namespace_ = ""; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -34446,6 +34510,9 @@ public final class MasterProtos { if (((bitField0_ & 0x00000002) == 0x00000002)) { output.writeBool(3, includeSysTables_); } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(4, getNamespaceBytes()); + } getUnknownFields().writeTo(output); } @@ -34467,6 +34534,10 @@ public final class MasterProtos { size += com.google.protobuf.CodedOutputStream .computeBoolSize(3, includeSysTables_); } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, getNamespaceBytes()); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -34502,6 +34573,11 @@ public final class MasterProtos { result = result && (getIncludeSysTables() == other.getIncludeSysTables()); } + result = result && (hasNamespace() == other.hasNamespace()); + if (hasNamespace()) { + result = result && getNamespace() + .equals(other.getNamespace()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -34527,6 +34603,10 @@ public final class MasterProtos { hash = (37 * hash) + INCLUDE_SYS_TABLES_FIELD_NUMBER; hash = (53 * hash) + hashBoolean(getIncludeSysTables()); } + if (hasNamespace()) { + hash = (37 * hash) + NAMESPACE_FIELD_NUMBER; + hash = (53 * hash) + getNamespace().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -34647,6 +34727,8 @@ public final class MasterProtos { bitField0_ = (bitField0_ & ~0x00000002); includeSysTables_ = false; bitField0_ = (bitField0_ & ~0x00000004); + namespace_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); return this; } @@ -34692,6 +34774,10 @@ public final class MasterProtos { to_bitField0_ |= 0x00000002; } result.includeSysTables_ = includeSysTables_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000004; + } + result.namespace_ = namespace_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -34742,6 +34828,11 @@ public final class MasterProtos { if (other.hasIncludeSysTables()) { setIncludeSysTables(other.getIncludeSysTables()); } + if (other.hasNamespace()) { + bitField0_ |= 0x00000008; + namespace_ = other.namespace_; + onChanged(); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -35122,6 +35213,80 @@ public final class MasterProtos { return this; } + // optional string namespace = 4; + private java.lang.Object namespace_ = ""; + /** + * optional string namespace = 4; + */ + public boolean hasNamespace() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string namespace = 4; + */ + public java.lang.String getNamespace() { + java.lang.Object ref = namespace_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + namespace_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string namespace = 4; + */ + public com.google.protobuf.ByteString + getNamespaceBytes() { + java.lang.Object ref = namespace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string namespace = 4; + */ + public Builder setNamespace( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + namespace_ = value; + onChanged(); + return this; + } + /** + * optional string namespace = 4; + */ + public Builder clearNamespace() { + bitField0_ = (bitField0_ & ~0x00000008); + namespace_ = getDefaultInstance().getNamespace(); + onChanged(); + return this; + } + /** + * optional string namespace = 4; + */ + public Builder setNamespaceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + namespace_ = value; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:GetTableDescriptorsRequest) } @@ -35881,6 +36046,21 @@ public final class MasterProtos { * optional bool include_sys_tables = 2 [default = false]; */ boolean getIncludeSysTables(); + + // optional string namespace = 3; + /** + * optional string namespace = 3; + */ + boolean hasNamespace(); + /** + * optional string namespace = 3; + */ + java.lang.String getNamespace(); + /** + * optional string namespace = 3; + */ + com.google.protobuf.ByteString + getNamespaceBytes(); } /** * Protobuf type {@code GetTableNamesRequest} @@ -35943,6 +36123,11 @@ public final class MasterProtos { includeSysTables_ = input.readBool(); break; } + case 26: { + bitField0_ |= 0x00000004; + namespace_ = input.readBytes(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -36042,9 +36227,53 @@ public final class MasterProtos { return includeSysTables_; } + // optional string namespace = 3; + public static final int NAMESPACE_FIELD_NUMBER = 3; + private java.lang.Object namespace_; + /** + * optional string namespace = 3; + */ + public boolean hasNamespace() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string namespace = 3; + */ + public java.lang.String getNamespace() { + java.lang.Object ref = namespace_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + namespace_ = s; + } + return s; + } + } + /** + * optional string namespace = 3; + */ + public com.google.protobuf.ByteString + getNamespaceBytes() { + java.lang.Object ref = namespace_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + private void initFields() { regex_ = ""; includeSysTables_ = false; + namespace_ = ""; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -36064,6 +36293,9 @@ public final class MasterProtos { if (((bitField0_ & 0x00000002) == 0x00000002)) { output.writeBool(2, includeSysTables_); } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getNamespaceBytes()); + } getUnknownFields().writeTo(output); } @@ -36081,6 +36313,10 @@ public final class MasterProtos { size += com.google.protobuf.CodedOutputStream .computeBoolSize(2, includeSysTables_); } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getNamespaceBytes()); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -36114,6 +36350,11 @@ public final class MasterProtos { result = result && (getIncludeSysTables() == other.getIncludeSysTables()); } + result = result && (hasNamespace() == other.hasNamespace()); + if (hasNamespace()) { + result = result && getNamespace() + .equals(other.getNamespace()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -36135,6 +36376,10 @@ public final class MasterProtos { hash = (37 * hash) + INCLUDE_SYS_TABLES_FIELD_NUMBER; hash = (53 * hash) + hashBoolean(getIncludeSysTables()); } + if (hasNamespace()) { + hash = (37 * hash) + NAMESPACE_FIELD_NUMBER; + hash = (53 * hash) + getNamespace().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -36248,6 +36493,8 @@ public final class MasterProtos { bitField0_ = (bitField0_ & ~0x00000001); includeSysTables_ = false; bitField0_ = (bitField0_ & ~0x00000002); + namespace_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); return this; } @@ -36284,6 +36531,10 @@ public final class MasterProtos { to_bitField0_ |= 0x00000002; } result.includeSysTables_ = includeSysTables_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.namespace_ = namespace_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -36308,6 +36559,11 @@ public final class MasterProtos { if (other.hasIncludeSysTables()) { setIncludeSysTables(other.getIncludeSysTables()); } + if (other.hasNamespace()) { + bitField0_ |= 0x00000004; + namespace_ = other.namespace_; + onChanged(); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -36442,6 +36698,80 @@ public final class MasterProtos { return this; } + // optional string namespace = 3; + private java.lang.Object namespace_ = ""; + /** + * optional string namespace = 3; + */ + public boolean hasNamespace() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string namespace = 3; + */ + public java.lang.String getNamespace() { + java.lang.Object ref = namespace_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + namespace_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string namespace = 3; + */ + public com.google.protobuf.ByteString + getNamespaceBytes() { + java.lang.Object ref = namespace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string namespace = 3; + */ + public Builder setNamespace( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + namespace_ = value; + onChanged(); + return this; + } + /** + * optional string namespace = 3; + */ + public Builder clearNamespace() { + bitField0_ = (bitField0_ & ~0x00000004); + namespace_ = getDefaultInstance().getNamespace(); + onChanged(); + return this; + } + /** + * optional string namespace = 3; + */ + public Builder setNamespaceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + namespace_ = value; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:GetTableNamesRequest) } @@ -48349,115 +48679,116 @@ public final class MasterProtos { "equest\022\036\n\ntable_name\030\001 \002(\0132\n.TableName\"T", "\n\034GetSchemaAlterStatusResponse\022\035\n\025yet_to" + "_update_regions\030\001 \001(\r\022\025\n\rtotal_regions\030\002" + - " \001(\r\"o\n\032GetTableDescriptorsRequest\022\037\n\013ta" + - "ble_names\030\001 \003(\0132\n.TableName\022\r\n\005regex\030\002 \001" + - "(\t\022!\n\022include_sys_tables\030\003 \001(\010:\005false\"A\n" + - "\033GetTableDescriptorsResponse\022\"\n\014table_sc" + - "hema\030\001 \003(\0132\014.TableSchema\"H\n\024GetTableName" + - "sRequest\022\r\n\005regex\030\001 \001(\t\022!\n\022include_sys_t" + - "ables\030\002 \001(\010:\005false\"8\n\025GetTableNamesRespo" + - "nse\022\037\n\013table_names\030\001 \003(\0132\n.TableName\"6\n\024", - "GetTableStateRequest\022\036\n\ntable_name\030\001 \002(\013" + - "2\n.TableName\"9\n\025GetTableStateResponse\022 \n" + - "\013table_state\030\001 \002(\0132\013.TableState\"\031\n\027GetCl" + - "usterStatusRequest\"B\n\030GetClusterStatusRe" + - "sponse\022&\n\016cluster_status\030\001 \002(\0132\016.Cluster" + - "Status\"\030\n\026IsMasterRunningRequest\"4\n\027IsMa" + - "sterRunningResponse\022\031\n\021is_master_running" + - "\030\001 \002(\010\"@\n\024ExecProcedureRequest\022(\n\tproced" + - "ure\030\001 \002(\0132\025.ProcedureDescription\"F\n\025Exec" + - "ProcedureResponse\022\030\n\020expected_timeout\030\001 ", - "\001(\003\022\023\n\013return_data\030\002 \001(\014\"B\n\026IsProcedureD" + - "oneRequest\022(\n\tprocedure\030\001 \001(\0132\025.Procedur" + - "eDescription\"W\n\027IsProcedureDoneResponse\022" + - "\023\n\004done\030\001 \001(\010:\005false\022\'\n\010snapshot\030\002 \001(\0132\025" + - ".ProcedureDescription\"\273\001\n\017SetQuotaReques" + - "t\022\021\n\tuser_name\030\001 \001(\t\022\022\n\nuser_group\030\002 \001(\t" + - "\022\021\n\tnamespace\030\003 \001(\t\022\036\n\ntable_name\030\004 \001(\0132" + - "\n.TableName\022\022\n\nremove_all\030\005 \001(\010\022\026\n\016bypas" + - "s_globals\030\006 \001(\010\022\"\n\010throttle\030\007 \001(\0132\020.Thro" + - "ttleRequest\"\022\n\020SetQuotaResponse2\346\030\n\rMast", - "erService\022S\n\024GetSchemaAlterStatus\022\034.GetS" + - "chemaAlterStatusRequest\032\035.GetSchemaAlter" + - "StatusResponse\022P\n\023GetTableDescriptors\022\033." + - "GetTableDescriptorsRequest\032\034.GetTableDes" + - "criptorsResponse\022>\n\rGetTableNames\022\025.GetT" + - "ableNamesRequest\032\026.GetTableNamesResponse" + - "\022G\n\020GetClusterStatus\022\030.GetClusterStatusR" + - "equest\032\031.GetClusterStatusResponse\022D\n\017IsM" + - "asterRunning\022\027.IsMasterRunningRequest\032\030." + - "IsMasterRunningResponse\0222\n\tAddColumn\022\021.A", - "ddColumnRequest\032\022.AddColumnResponse\022;\n\014D" + - "eleteColumn\022\024.DeleteColumnRequest\032\025.Dele" + - "teColumnResponse\022;\n\014ModifyColumn\022\024.Modif" + - "yColumnRequest\032\025.ModifyColumnResponse\0225\n" + - "\nMoveRegion\022\022.MoveRegionRequest\032\023.MoveRe" + - "gionResponse\022Y\n\026DispatchMergingRegions\022\036" + - ".DispatchMergingRegionsRequest\032\037.Dispatc" + - "hMergingRegionsResponse\022;\n\014AssignRegion\022" + - "\024.AssignRegionRequest\032\025.AssignRegionResp" + - "onse\022A\n\016UnassignRegion\022\026.UnassignRegionR", - "equest\032\027.UnassignRegionResponse\022>\n\rOffli" + - "neRegion\022\025.OfflineRegionRequest\032\026.Offlin" + - "eRegionResponse\0228\n\013DeleteTable\022\023.DeleteT" + - "ableRequest\032\024.DeleteTableResponse\022>\n\rtru" + - "ncateTable\022\025.TruncateTableRequest\032\026.Trun" + - "cateTableResponse\0228\n\013EnableTable\022\023.Enabl" + - "eTableRequest\032\024.EnableTableResponse\022;\n\014D" + - "isableTable\022\024.DisableTableRequest\032\025.Disa" + - "bleTableResponse\0228\n\013ModifyTable\022\023.Modify" + - "TableRequest\032\024.ModifyTableResponse\0228\n\013Cr", - "eateTable\022\023.CreateTableRequest\032\024.CreateT" + - "ableResponse\022/\n\010Shutdown\022\020.ShutdownReque" + - "st\032\021.ShutdownResponse\0225\n\nStopMaster\022\022.St" + - "opMasterRequest\032\023.StopMasterResponse\022,\n\007" + - "Balance\022\017.BalanceRequest\032\020.BalanceRespon" + - "se\022M\n\022SetBalancerRunning\022\032.SetBalancerRu" + - "nningRequest\032\033.SetBalancerRunningRespons" + - "e\022A\n\016RunCatalogScan\022\026.RunCatalogScanRequ" + - "est\032\027.RunCatalogScanResponse\022S\n\024EnableCa" + - "talogJanitor\022\034.EnableCatalogJanitorReque", - "st\032\035.EnableCatalogJanitorResponse\022\\\n\027IsC" + - "atalogJanitorEnabled\022\037.IsCatalogJanitorE" + - "nabledRequest\032 .IsCatalogJanitorEnabledR" + - "esponse\022L\n\021ExecMasterService\022\032.Coprocess" + - "orServiceRequest\032\033.CoprocessorServiceRes" + - "ponse\022/\n\010Snapshot\022\020.SnapshotRequest\032\021.Sn" + - "apshotResponse\022V\n\025GetCompletedSnapshots\022" + - "\035.GetCompletedSnapshotsRequest\032\036.GetComp" + - "letedSnapshotsResponse\022A\n\016DeleteSnapshot" + - "\022\026.DeleteSnapshotRequest\032\027.DeleteSnapsho", - "tResponse\022A\n\016IsSnapshotDone\022\026.IsSnapshot" + - "DoneRequest\032\027.IsSnapshotDoneResponse\022D\n\017" + - "RestoreSnapshot\022\027.RestoreSnapshotRequest" + - "\032\030.RestoreSnapshotResponse\022V\n\025IsRestoreS" + - "napshotDone\022\035.IsRestoreSnapshotDoneReque" + - "st\032\036.IsRestoreSnapshotDoneResponse\022>\n\rEx" + - "ecProcedure\022\025.ExecProcedureRequest\032\026.Exe" + - "cProcedureResponse\022E\n\024ExecProcedureWithR" + - "et\022\025.ExecProcedureRequest\032\026.ExecProcedur" + - "eResponse\022D\n\017IsProcedureDone\022\027.IsProcedu", - "reDoneRequest\032\030.IsProcedureDoneResponse\022" + - "D\n\017ModifyNamespace\022\027.ModifyNamespaceRequ" + - "est\032\030.ModifyNamespaceResponse\022D\n\017CreateN" + - "amespace\022\027.CreateNamespaceRequest\032\030.Crea" + - "teNamespaceResponse\022D\n\017DeleteNamespace\022\027" + - ".DeleteNamespaceRequest\032\030.DeleteNamespac" + - "eResponse\022Y\n\026GetNamespaceDescriptor\022\036.Ge" + - "tNamespaceDescriptorRequest\032\037.GetNamespa" + - "ceDescriptorResponse\022_\n\030ListNamespaceDes" + - "criptors\022 .ListNamespaceDescriptorsReque", - "st\032!.ListNamespaceDescriptorsResponse\022t\n" + - "\037ListTableDescriptorsByNamespace\022\'.ListT" + - "ableDescriptorsByNamespaceRequest\032(.List" + - "TableDescriptorsByNamespaceResponse\022b\n\031L" + - "istTableNamesByNamespace\022!.ListTableName" + - "sByNamespaceRequest\032\".ListTableNamesByNa" + - "mespaceResponse\022>\n\rGetTableState\022\025.GetTa" + - "bleStateRequest\032\026.GetTableStateResponse\022" + - "/\n\010SetQuota\022\020.SetQuotaRequest\032\021.SetQuota" + - "ResponseBB\n*org.apache.hadoop.hbase.prot", - "obuf.generatedB\014MasterProtosH\001\210\001\001\240\001\001" + " \001(\r\"\202\001\n\032GetTableDescriptorsRequest\022\037\n\013t" + + "able_names\030\001 \003(\0132\n.TableName\022\r\n\005regex\030\002 " + + "\001(\t\022!\n\022include_sys_tables\030\003 \001(\010:\005false\022\021" + + "\n\tnamespace\030\004 \001(\t\"A\n\033GetTableDescriptors" + + "Response\022\"\n\014table_schema\030\001 \003(\0132\014.TableSc" + + "hema\"[\n\024GetTableNamesRequest\022\r\n\005regex\030\001 " + + "\001(\t\022!\n\022include_sys_tables\030\002 \001(\010:\005false\022\021" + + "\n\tnamespace\030\003 \001(\t\"8\n\025GetTableNamesRespon", + "se\022\037\n\013table_names\030\001 \003(\0132\n.TableName\"6\n\024G" + + "etTableStateRequest\022\036\n\ntable_name\030\001 \002(\0132" + + "\n.TableName\"9\n\025GetTableStateResponse\022 \n\013" + + "table_state\030\001 \002(\0132\013.TableState\"\031\n\027GetClu" + + "sterStatusRequest\"B\n\030GetClusterStatusRes" + + "ponse\022&\n\016cluster_status\030\001 \002(\0132\016.ClusterS" + + "tatus\"\030\n\026IsMasterRunningRequest\"4\n\027IsMas" + + "terRunningResponse\022\031\n\021is_master_running\030" + + "\001 \002(\010\"@\n\024ExecProcedureRequest\022(\n\tprocedu" + + "re\030\001 \002(\0132\025.ProcedureDescription\"F\n\025ExecP", + "rocedureResponse\022\030\n\020expected_timeout\030\001 \001" + + "(\003\022\023\n\013return_data\030\002 \001(\014\"B\n\026IsProcedureDo" + + "neRequest\022(\n\tprocedure\030\001 \001(\0132\025.Procedure" + + "Description\"W\n\027IsProcedureDoneResponse\022\023" + + "\n\004done\030\001 \001(\010:\005false\022\'\n\010snapshot\030\002 \001(\0132\025." + + "ProcedureDescription\"\273\001\n\017SetQuotaRequest" + + "\022\021\n\tuser_name\030\001 \001(\t\022\022\n\nuser_group\030\002 \001(\t\022" + + "\021\n\tnamespace\030\003 \001(\t\022\036\n\ntable_name\030\004 \001(\0132\n" + + ".TableName\022\022\n\nremove_all\030\005 \001(\010\022\026\n\016bypass" + + "_globals\030\006 \001(\010\022\"\n\010throttle\030\007 \001(\0132\020.Throt", + "tleRequest\"\022\n\020SetQuotaResponse2\346\030\n\rMaste" + + "rService\022S\n\024GetSchemaAlterStatus\022\034.GetSc" + + "hemaAlterStatusRequest\032\035.GetSchemaAlterS" + + "tatusResponse\022P\n\023GetTableDescriptors\022\033.G" + + "etTableDescriptorsRequest\032\034.GetTableDesc" + + "riptorsResponse\022>\n\rGetTableNames\022\025.GetTa" + + "bleNamesRequest\032\026.GetTableNamesResponse\022" + + "G\n\020GetClusterStatus\022\030.GetClusterStatusRe" + + "quest\032\031.GetClusterStatusResponse\022D\n\017IsMa" + + "sterRunning\022\027.IsMasterRunningRequest\032\030.I", + "sMasterRunningResponse\0222\n\tAddColumn\022\021.Ad" + + "dColumnRequest\032\022.AddColumnResponse\022;\n\014De" + + "leteColumn\022\024.DeleteColumnRequest\032\025.Delet" + + "eColumnResponse\022;\n\014ModifyColumn\022\024.Modify" + + "ColumnRequest\032\025.ModifyColumnResponse\0225\n\n" + + "MoveRegion\022\022.MoveRegionRequest\032\023.MoveReg" + + "ionResponse\022Y\n\026DispatchMergingRegions\022\036." + + "DispatchMergingRegionsRequest\032\037.Dispatch" + + "MergingRegionsResponse\022;\n\014AssignRegion\022\024" + + ".AssignRegionRequest\032\025.AssignRegionRespo", + "nse\022A\n\016UnassignRegion\022\026.UnassignRegionRe" + + "quest\032\027.UnassignRegionResponse\022>\n\rOfflin" + + "eRegion\022\025.OfflineRegionRequest\032\026.Offline" + + "RegionResponse\0228\n\013DeleteTable\022\023.DeleteTa" + + "bleRequest\032\024.DeleteTableResponse\022>\n\rtrun" + + "cateTable\022\025.TruncateTableRequest\032\026.Trunc" + + "ateTableResponse\0228\n\013EnableTable\022\023.Enable" + + "TableRequest\032\024.EnableTableResponse\022;\n\014Di" + + "sableTable\022\024.DisableTableRequest\032\025.Disab" + + "leTableResponse\0228\n\013ModifyTable\022\023.ModifyT", + "ableRequest\032\024.ModifyTableResponse\0228\n\013Cre" + + "ateTable\022\023.CreateTableRequest\032\024.CreateTa" + + "bleResponse\022/\n\010Shutdown\022\020.ShutdownReques" + + "t\032\021.ShutdownResponse\0225\n\nStopMaster\022\022.Sto" + + "pMasterRequest\032\023.StopMasterResponse\022,\n\007B" + + "alance\022\017.BalanceRequest\032\020.BalanceRespons" + + "e\022M\n\022SetBalancerRunning\022\032.SetBalancerRun" + + "ningRequest\032\033.SetBalancerRunningResponse" + + "\022A\n\016RunCatalogScan\022\026.RunCatalogScanReque" + + "st\032\027.RunCatalogScanResponse\022S\n\024EnableCat", + "alogJanitor\022\034.EnableCatalogJanitorReques" + + "t\032\035.EnableCatalogJanitorResponse\022\\\n\027IsCa" + + "talogJanitorEnabled\022\037.IsCatalogJanitorEn" + + "abledRequest\032 .IsCatalogJanitorEnabledRe" + + "sponse\022L\n\021ExecMasterService\022\032.Coprocesso" + + "rServiceRequest\032\033.CoprocessorServiceResp" + + "onse\022/\n\010Snapshot\022\020.SnapshotRequest\032\021.Sna" + + "pshotResponse\022V\n\025GetCompletedSnapshots\022\035" + + ".GetCompletedSnapshotsRequest\032\036.GetCompl" + + "etedSnapshotsResponse\022A\n\016DeleteSnapshot\022", + "\026.DeleteSnapshotRequest\032\027.DeleteSnapshot" + + "Response\022A\n\016IsSnapshotDone\022\026.IsSnapshotD" + + "oneRequest\032\027.IsSnapshotDoneResponse\022D\n\017R" + + "estoreSnapshot\022\027.RestoreSnapshotRequest\032" + + "\030.RestoreSnapshotResponse\022V\n\025IsRestoreSn" + + "apshotDone\022\035.IsRestoreSnapshotDoneReques" + + "t\032\036.IsRestoreSnapshotDoneResponse\022>\n\rExe" + + "cProcedure\022\025.ExecProcedureRequest\032\026.Exec" + + "ProcedureResponse\022E\n\024ExecProcedureWithRe" + + "t\022\025.ExecProcedureRequest\032\026.ExecProcedure", + "Response\022D\n\017IsProcedureDone\022\027.IsProcedur" + + "eDoneRequest\032\030.IsProcedureDoneResponse\022D" + + "\n\017ModifyNamespace\022\027.ModifyNamespaceReque" + + "st\032\030.ModifyNamespaceResponse\022D\n\017CreateNa" + + "mespace\022\027.CreateNamespaceRequest\032\030.Creat" + + "eNamespaceResponse\022D\n\017DeleteNamespace\022\027." + + "DeleteNamespaceRequest\032\030.DeleteNamespace" + + "Response\022Y\n\026GetNamespaceDescriptor\022\036.Get" + + "NamespaceDescriptorRequest\032\037.GetNamespac" + + "eDescriptorResponse\022_\n\030ListNamespaceDesc", + "riptors\022 .ListNamespaceDescriptorsReques" + + "t\032!.ListNamespaceDescriptorsResponse\022t\n\037" + + "ListTableDescriptorsByNamespace\022\'.ListTa" + + "bleDescriptorsByNamespaceRequest\032(.ListT" + + "ableDescriptorsByNamespaceResponse\022b\n\031Li" + + "stTableNamesByNamespace\022!.ListTableNames" + + "ByNamespaceRequest\032\".ListTableNamesByNam" + + "espaceResponse\022>\n\rGetTableState\022\025.GetTab" + + "leStateRequest\032\026.GetTableStateResponse\022/" + + "\n\010SetQuota\022\020.SetQuotaRequest\032\021.SetQuotaR", + "esponseBB\n*org.apache.hadoop.hbase.proto" + + "buf.generatedB\014MasterProtosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -48889,7 +49220,7 @@ public final class MasterProtos { internal_static_GetTableDescriptorsRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_GetTableDescriptorsRequest_descriptor, - new java.lang.String[] { "TableNames", "Regex", "IncludeSysTables", }); + new java.lang.String[] { "TableNames", "Regex", "IncludeSysTables", "Namespace", }); internal_static_GetTableDescriptorsResponse_descriptor = getDescriptor().getMessageTypes().get(71); internal_static_GetTableDescriptorsResponse_fieldAccessorTable = new @@ -48901,7 +49232,7 @@ public final class MasterProtos { internal_static_GetTableNamesRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_GetTableNamesRequest_descriptor, - new java.lang.String[] { "Regex", "IncludeSysTables", }); + new java.lang.String[] { "Regex", "IncludeSysTables", "Namespace", }); internal_static_GetTableNamesResponse_descriptor = getDescriptor().getMessageTypes().get(73); internal_static_GetTableNamesResponse_fieldAccessorTable = new diff --git a/hbase-protocol/src/main/protobuf/Master.proto b/hbase-protocol/src/main/protobuf/Master.proto index 82104f5ecdd..e55dcc0cd42 100644 --- a/hbase-protocol/src/main/protobuf/Master.proto +++ b/hbase-protocol/src/main/protobuf/Master.proto @@ -316,6 +316,7 @@ message GetTableDescriptorsRequest { repeated TableName table_names = 1; optional string regex = 2; optional bool include_sys_tables = 3 [default=false]; + optional string namespace = 4; } message GetTableDescriptorsResponse { @@ -325,6 +326,7 @@ message GetTableDescriptorsResponse { message GetTableNamesRequest { optional string regex = 1; optional bool include_sys_tables = 2 [default=false]; + optional string namespace = 3; } message GetTableNamesResponse { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java index 9d702fafb4d..fbf505e3822 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java @@ -158,6 +158,16 @@ public abstract class BaseMasterAndRegionObserver extends BaseRegionObserver NamespaceDescriptor ns) throws IOException { } + @Override + public void preListNamespaceDescriptors(ObserverContext ctx, + List descriptors) throws IOException { + } + + @Override + public void postListNamespaceDescriptors(ObserverContext ctx, + List descriptors) throws IOException { + } + @Override public void preAddColumn(ObserverContext ctx, TableName tableName, HColumnDescriptor column) throws IOException { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java index b26e7d4988d..e33288d7203 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java @@ -151,6 +151,16 @@ public class BaseMasterObserver implements MasterObserver { public void postModifyNamespace(ObserverContext ctx, NamespaceDescriptor ns) throws IOException { } + @Override + public void preListNamespaceDescriptors(ObserverContext ctx, + List descriptors) throws IOException { + } + + @Override + public void postListNamespaceDescriptors(ObserverContext ctx, + List descriptors) throws IOException { + } + @Override public void preAddColumn(ObserverContext ctx, TableName tableName, HColumnDescriptor column) throws IOException { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java index 50912b36abe..bad2c5fdadf 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java @@ -788,6 +788,25 @@ public interface MasterObserver extends Coprocessor { void postModifyNamespace(final ObserverContext ctx, NamespaceDescriptor ns) throws IOException; + /** + * Called before a listNamespaceDescriptors request has been processed. + * @param ctx the environment to interact with the framework and master + * @param descriptors an empty list, can be filled with what to return if bypassing + * @throws IOException + */ + void preListNamespaceDescriptors(ObserverContext ctx, + List descriptors) throws IOException; + + /** + * Called after a listNamespaceDescriptors request has been processed. + * @param ctx the environment to interact with the framework and master + * @param descriptors the list of descriptors about to be returned + * @throws IOException + */ + void postListNamespaceDescriptors(ObserverContext ctx, + List descriptors) throws IOException; + + /** * Called before the table memstore is flushed to disk. * @param ctx the environment to interact with the framework and master diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index b6175192204..3d87c679a25 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -140,7 +140,6 @@ import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.servlet.Context; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.protobuf.Descriptors; import com.google.protobuf.Service; @@ -2042,34 +2041,45 @@ public class HMaster extends HRegionServer implements MasterServices, Server { @Override public List listNamespaceDescriptors() throws IOException { checkNamespaceManagerReady(); - return Lists.newArrayList(tableNamespaceManager.list()); + + final List descriptors = new ArrayList(); + boolean bypass = false; + if (cpHost != null) { + bypass = cpHost.preListNamespaceDescriptors(descriptors); + } + + if (!bypass) { + descriptors.addAll(tableNamespaceManager.list()); + + if (cpHost != null) { + cpHost.postListNamespaceDescriptors(descriptors); + } + } + return descriptors; } @Override public List listTableDescriptorsByNamespace(String name) throws IOException { getNamespaceDescriptor(name); // check that namespace exists - return Lists.newArrayList(tableDescriptors.getByNamespace(name).values()); + return listTableDescriptors(name, null, null, true); } @Override public List listTableNamesByNamespace(String name) throws IOException { - List tableNames = Lists.newArrayList(); getNamespaceDescriptor(name); // check that namespace exists - for (HTableDescriptor descriptor: tableDescriptors.getByNamespace(name).values()) { - tableNames.add(descriptor.getTableName()); - } - return tableNames; + return listTableNames(name, null, true); } /** * Returns the list of table descriptors that match the specified request * + * @param namespace the namespace to query, or null if querying for all * @param regex The regular expression to match against, or null if querying for all * @param tableNameList the list of table names, or null if querying for all * @param includeSysTables False to match only against userspace tables * @return the list of table descriptors */ - public List listTableDescriptors(final String regex, + public List listTableDescriptors(final String namespace, final String regex, final List tableNameList, final boolean includeSysTables) throws IOException { final List descriptors = new ArrayList(); @@ -2082,7 +2092,13 @@ public class HMaster extends HRegionServer implements MasterServices, Server { if (!bypass) { if (tableNameList == null || tableNameList.size() == 0) { // request for all TableDescriptors - Collection htds = tableDescriptors.getAll().values(); + Collection htds; + if (namespace != null && namespace.length() > 0) { + htds = tableDescriptors.getByNamespace(namespace).values(); + } else { + htds = tableDescriptors.getAll().values(); + } + for (HTableDescriptor desc: htds) { if (includeSysTables || !desc.getTableName().isSystemTable()) { descriptors.add(desc); @@ -2112,11 +2128,12 @@ public class HMaster extends HRegionServer implements MasterServices, Server { /** * Returns the list of table names that match the specified request * @param regex The regular expression to match against, or null if querying for all + * @param namespace the namespace to query, or null if querying for all * @param includeSysTables False to match only against userspace tables * @return the list of table names */ - public List listTableNames(final String regex, final boolean includeSysTables) - throws IOException { + public List listTableNames(final String namespace, final String regex, + final boolean includeSysTables) throws IOException { final List descriptors = new ArrayList(); boolean bypass = false; @@ -2126,7 +2143,13 @@ public class HMaster extends HRegionServer implements MasterServices, Server { if (!bypass) { // get all descriptors - Collection htds = tableDescriptors.getAll().values(); + Collection htds; + if (namespace != null && namespace.length() > 0) { + htds = tableDescriptors.getByNamespace(namespace).values(); + } else { + htds = tableDescriptors.getAll().values(); + } + for (HTableDescriptor htd: htds) { if (includeSysTables || !htd.getTableName().isSystemTable()) { descriptors.add(htd); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java index cdddbfaa848..679e62a3321 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java @@ -150,6 +150,28 @@ public class MasterCoprocessorHost }); } + public boolean preListNamespaceDescriptors(final List descriptors) + throws IOException { + return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver oserver, ObserverContext ctx) + throws IOException { + oserver.preListNamespaceDescriptors(ctx, descriptors); + } + }); + } + + public void postListNamespaceDescriptors(final List descriptors) + throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver oserver, ObserverContext ctx) + throws IOException { + oserver.postListNamespaceDescriptors(ctx, descriptors); + } + }); + } + /* Implementation of hooks for invoking MasterObservers */ public void preCreateTable(final HTableDescriptor htd, final HRegionInfo[] regions) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index 1c413689289..84f4d362d2c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -787,6 +787,7 @@ public class MasterRpcServices extends RSRpcServices master.checkInitialized(); final String regex = req.hasRegex() ? req.getRegex() : null; + final String namespace = req.hasNamespace() ? req.getNamespace() : null; List tableNameList = null; if (req.getTableNamesCount() > 0) { tableNameList = new ArrayList(req.getTableNamesCount()); @@ -795,8 +796,8 @@ public class MasterRpcServices extends RSRpcServices } } - List descriptors = master.listTableDescriptors(regex, tableNameList, - req.getIncludeSysTables()); + List descriptors = master.listTableDescriptors(namespace, regex, + tableNameList, req.getIncludeSysTables()); GetTableDescriptorsResponse.Builder builder = GetTableDescriptorsResponse.newBuilder(); if (descriptors != null && descriptors.size() > 0) { @@ -825,7 +826,9 @@ public class MasterRpcServices extends RSRpcServices master.checkServiceStarted(); final String regex = req.hasRegex() ? req.getRegex() : null; - List tableNames = master.listTableNames(regex, req.getIncludeSysTables()); + final String namespace = req.hasNamespace() ? req.getNamespace() : null; + List tableNames = master.listTableNames(namespace, regex, + req.getIncludeSysTables()); GetTableNamesResponse.Builder builder = GetTableNamesResponse.newBuilder(); if (tableNames != null && tableNames.size() > 0) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java index 6f3edd7ea80..f959bb051b1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java @@ -1206,6 +1206,22 @@ public class AccessController extends BaseMasterAndRegionObserver requireGlobalPermission("modifyNamespace", Action.ADMIN, ns.getName()); } + @Override + public void postListNamespaceDescriptors(ObserverContext ctx, + List descriptors) throws IOException { + // Retains only those which passes authorization checks, as the checks weren't done as part + // of preGetTableDescriptors. + Iterator itr = descriptors.iterator(); + while (itr.hasNext()) { + NamespaceDescriptor desc = itr.next(); + try { + requireGlobalPermission("listNamespaces", Action.ADMIN, desc.getName()); + } catch (AccessDeniedException e) { + itr.remove(); + } + } + } + @Override public void preTableFlush(final ObserverContext ctx, final TableName tableName) throws IOException { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java index d3593cdf829..cca3496fdfe 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java @@ -93,6 +93,8 @@ public class TestMasterObserver { private boolean postDeleteNamespaceCalled; private boolean preModifyNamespaceCalled; private boolean postModifyNamespaceCalled; + private boolean preListNamespaceDescriptorsCalled; + private boolean postListNamespaceDescriptorsCalled; private boolean preAddColumnCalled; private boolean postAddColumnCalled; private boolean preModifyColumnCalled; @@ -173,6 +175,8 @@ public class TestMasterObserver { postDeleteNamespaceCalled = false; preModifyNamespaceCalled = false; postModifyNamespaceCalled = false; + preListNamespaceDescriptorsCalled = false; + postListNamespaceDescriptorsCalled = false; preAddColumnCalled = false; postAddColumnCalled = false; preModifyColumnCalled = false; @@ -394,6 +398,29 @@ public class TestMasterObserver { return preModifyNamespaceCalled && !postModifyNamespaceCalled; } + @Override + public void preListNamespaceDescriptors(ObserverContext env, + List descriptors) throws IOException { + if (bypass) { + env.bypass(); + } + preListNamespaceDescriptorsCalled = true; + } + + @Override + public void postListNamespaceDescriptors(ObserverContext env, + List descriptors) throws IOException { + postListNamespaceDescriptorsCalled = true; + } + + public boolean wasListNamespaceDescriptorsCalled() { + return preListNamespaceDescriptorsCalled && postListNamespaceDescriptorsCalled; + } + + public boolean preListNamespaceDescriptorsCalledOnly() { + return preListNamespaceDescriptorsCalled && !postListNamespaceDescriptorsCalled; + } + @Override public void preAddColumn(ObserverContext env, TableName tableName, HColumnDescriptor column) throws IOException { @@ -1428,6 +1455,22 @@ public class TestMasterObserver { admin.createNamespace(NamespaceDescriptor.create(testNamespace).build()); assertTrue("Test namespace should not be created", cp.preCreateNamespaceCalledOnly()); + + // turn on bypass, run the test + cp.enableBypass(true); + cp.resetStates(); + + admin.listNamespaceDescriptors(); + assertTrue("post listNamespace should not have been called", + cp.preListNamespaceDescriptorsCalledOnly()); + + // turn off bypass, run the tests again + cp.enableBypass(false); + cp.resetStates(); + + admin.listNamespaceDescriptors(); + assertTrue("post listNamespace should have been called", + cp.wasListNamespaceDescriptorsCalled()); } private void modifyTableSync(Admin admin, TableName tableName, HTableDescriptor htd) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestNamespaceCommands.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestNamespaceCommands.java index 59f722e2585..e26a9ca6316 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestNamespaceCommands.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestNamespaceCommands.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.List; +import java.util.Arrays; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseTestingUtility; @@ -29,6 +30,9 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Result; @@ -187,6 +191,31 @@ public class TestNamespaceCommands extends SecureTestUtil { verifyDenied(deleteNamespace, USER_NSP_WRITE, USER_CREATE, USER_RW); } + @Test + public void testListNamespaces() throws Exception { + AccessTestAction listAction = new AccessTestAction() { + @Override + public Object run() throws Exception { + Connection unmanagedConnection = + ConnectionFactory.createConnection(UTIL.getConfiguration()); + Admin admin = unmanagedConnection.getAdmin(); + try { + return Arrays.asList(admin.listNamespaceDescriptors()); + } finally { + admin.close(); + unmanagedConnection.close(); + } + } + }; + + verifyAllowed(listAction, SUPERUSER, USER_NSP_ADMIN); + verifyDenied(listAction, USER_NSP_WRITE, USER_CREATE, USER_RW); + + // we have 3 namespaces: [default, hbase, TEST_NAMESPACE, TEST_NAMESPACE2] + assertEquals(4, ((List)SUPERUSER.runAs(listAction)).size()); + assertEquals(2, ((List)USER_NSP_ADMIN.runAs(listAction)).size()); + } + @Test public void testGrantRevoke() throws Exception{ final String testUser = "testUser";