001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.quotas;
019
020import static org.junit.jupiter.api.Assertions.assertFalse;
021import static org.junit.jupiter.api.Assertions.assertTrue;
022import static org.junit.jupiter.api.Assertions.fail;
023
024import java.io.IOException;
025import org.apache.hadoop.hbase.TableName;
026import org.apache.hadoop.hbase.quotas.QuotaSettingsFactory.QuotaGlobalsSettingsBypass;
027import org.apache.hadoop.hbase.testclassification.SmallTests;
028import org.junit.jupiter.api.Tag;
029import org.junit.jupiter.api.Test;
030
031@Tag(SmallTests.TAG)
032public class TestQuotaGlobalsSettingsBypass {
033
034  @Test
035  public void testMerge() throws IOException {
036    QuotaGlobalsSettingsBypass orig = new QuotaGlobalsSettingsBypass("joe", null, null, null, true);
037    assertFalse(
038      orig.merge(new QuotaGlobalsSettingsBypass("joe", null, null, null, false)).getBypass());
039  }
040
041  @Test
042  public void testInvalidMerges() throws IOException {
043    QuotaGlobalsSettingsBypass userBypass =
044      new QuotaGlobalsSettingsBypass("joe", null, null, null, true);
045    QuotaGlobalsSettingsBypass tableBypass =
046      new QuotaGlobalsSettingsBypass(null, TableName.valueOf("table"), null, null, true);
047    QuotaGlobalsSettingsBypass namespaceBypass =
048      new QuotaGlobalsSettingsBypass(null, null, "ns", null, true);
049    QuotaGlobalsSettingsBypass regionServerBypass =
050      new QuotaGlobalsSettingsBypass(null, null, null, "all", true);
051    QuotaGlobalsSettingsBypass userOnTableBypass =
052      new QuotaGlobalsSettingsBypass("joe", TableName.valueOf("table"), null, null, true);
053    QuotaGlobalsSettingsBypass userOnNamespaceBypass =
054      new QuotaGlobalsSettingsBypass("joe", null, "ns", null, true);
055    QuotaGlobalsSettingsBypass userOnRegionServerBypass =
056      new QuotaGlobalsSettingsBypass("joe", null, null, "all", true);
057
058    assertTrue(userBypass.merge(userBypass).getBypass());
059    expectFailure(userBypass, new QuotaGlobalsSettingsBypass("frank", null, null, null, false));
060    expectFailure(userBypass, tableBypass);
061    expectFailure(userBypass, namespaceBypass);
062    expectFailure(userBypass, regionServerBypass);
063    expectFailure(userBypass, userOnTableBypass);
064    expectFailure(userBypass, userOnNamespaceBypass);
065    expectFailure(userBypass, userOnRegionServerBypass);
066
067    assertTrue(tableBypass.merge(tableBypass).getBypass());
068    expectFailure(tableBypass, userBypass);
069    expectFailure(tableBypass,
070      new QuotaGlobalsSettingsBypass(null, TableName.valueOf("foo"), null, null, false));
071    expectFailure(tableBypass, namespaceBypass);
072    expectFailure(tableBypass, regionServerBypass);
073    expectFailure(tableBypass, userOnTableBypass);
074    expectFailure(tableBypass, userOnNamespaceBypass);
075    expectFailure(tableBypass, userOnRegionServerBypass);
076
077    assertTrue(namespaceBypass.merge(namespaceBypass).getBypass());
078    expectFailure(namespaceBypass, userBypass);
079    expectFailure(namespaceBypass, tableBypass);
080    expectFailure(namespaceBypass, regionServerBypass);
081    expectFailure(namespaceBypass, new QuotaGlobalsSettingsBypass(null, null, "sn", null, false));
082    expectFailure(namespaceBypass, userOnTableBypass);
083    expectFailure(namespaceBypass, userOnNamespaceBypass);
084    expectFailure(namespaceBypass, userOnNamespaceBypass);
085
086    assertTrue(regionServerBypass.merge(regionServerBypass).getBypass());
087    expectFailure(regionServerBypass, userBypass);
088    expectFailure(regionServerBypass, tableBypass);
089    expectFailure(regionServerBypass, namespaceBypass);
090    expectFailure(regionServerBypass,
091      new QuotaGlobalsSettingsBypass(null, null, null, "rs", false));
092    expectFailure(regionServerBypass, userOnTableBypass);
093    expectFailure(regionServerBypass, userOnNamespaceBypass);
094    expectFailure(regionServerBypass, userOnRegionServerBypass);
095
096    assertTrue(userOnTableBypass.merge(userOnTableBypass).getBypass());
097    expectFailure(userOnTableBypass, userBypass);
098    expectFailure(userOnTableBypass, tableBypass);
099    expectFailure(userOnTableBypass, namespaceBypass);
100    expectFailure(userOnTableBypass, regionServerBypass);
101    // Incorrect user
102    expectFailure(userOnTableBypass,
103      new QuotaGlobalsSettingsBypass("frank", TableName.valueOf("foo"), null, null, false));
104    // Incorrect tablename
105    expectFailure(userOnTableBypass,
106      new QuotaGlobalsSettingsBypass("joe", TableName.valueOf("bar"), null, null, false));
107    expectFailure(userOnTableBypass, userOnNamespaceBypass);
108    expectFailure(userOnTableBypass, userOnRegionServerBypass);
109
110    assertTrue(userOnNamespaceBypass.merge(userOnNamespaceBypass).getBypass());
111    expectFailure(userOnNamespaceBypass, userBypass);
112    expectFailure(userOnNamespaceBypass, tableBypass);
113    expectFailure(userOnNamespaceBypass, namespaceBypass);
114    expectFailure(userOnNamespaceBypass, regionServerBypass);
115    expectFailure(userOnNamespaceBypass, userOnTableBypass);
116    expectFailure(userOnNamespaceBypass,
117      new QuotaGlobalsSettingsBypass("frank", null, "ns", null, false));
118    expectFailure(userOnNamespaceBypass,
119      new QuotaGlobalsSettingsBypass("joe", null, "sn", null, false));
120    expectFailure(userOnNamespaceBypass, userOnRegionServerBypass);
121
122    assertTrue(userOnRegionServerBypass.merge(userOnRegionServerBypass).getBypass());
123    expectFailure(userOnRegionServerBypass, userBypass);
124    expectFailure(userOnRegionServerBypass, tableBypass);
125    expectFailure(userOnRegionServerBypass, namespaceBypass);
126    expectFailure(userOnRegionServerBypass, regionServerBypass);
127    expectFailure(userOnRegionServerBypass, userOnTableBypass);
128    expectFailure(userOnRegionServerBypass, userOnNamespaceBypass);
129    expectFailure(userOnRegionServerBypass,
130      new QuotaGlobalsSettingsBypass("frank", null, null, "all", false));
131    expectFailure(userOnRegionServerBypass,
132      new QuotaGlobalsSettingsBypass("joe", null, null, "rs", false));
133  }
134
135  void expectFailure(QuotaSettings one, QuotaSettings two) throws IOException {
136    try {
137      one.merge(two);
138      fail("Expected to see an Exception merging " + two + " into " + one);
139    } catch (IllegalArgumentException e) {
140      // Expected
141    }
142  }
143}