1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
3  * agreements. See the NOTICE file distributed with this work for additional information regarding
4  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
5  * "License"); you may not use this file except in compliance with the License. You may obtain a
6  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
7  * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
8  * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
9  * for the specific language governing permissions and limitations under the License.
10  */
11 package org.apache.hadoop.hbase.client.replication;
12 
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertFalse;
15 import static org.junit.Assert.assertTrue;
16 import static org.junit.Assert.fail;
17 
18 import java.util.Collection;
19 import java.util.HashMap;
20 import java.util.Map;
21 
22 import org.apache.hadoop.hbase.HColumnDescriptor;
23 import org.apache.hadoop.hbase.HConstants;
24 import org.apache.hadoop.hbase.HTableDescriptor;
25 import org.apache.hadoop.hbase.TableName;
26 import org.apache.hadoop.hbase.TableNotFoundException;
27 import org.apache.hadoop.hbase.client.Admin;
28 import org.apache.hadoop.hbase.client.Connection;
29 import org.apache.hadoop.hbase.client.ConnectionFactory;
30 import org.apache.hadoop.hbase.replication.TestReplicationBase;
31 import org.apache.hadoop.hbase.testclassification.MediumTests;
32 import org.junit.AfterClass;
33 import org.junit.BeforeClass;
34 import org.junit.Test;
35 import org.junit.experimental.categories.Category;
36 
37 /**
38  * Unit testing of ReplicationAdmin with clusters
39  */
40 @Category({ MediumTests.class })
41 public class TestReplicationAdminWithClusters extends TestReplicationBase {
42 
43   static Connection connection1;
44   static Connection connection2;
45   static Admin admin1;
46   static Admin admin2;
47   static ReplicationAdmin adminExt;
48 
49   @BeforeClass
setUpBeforeClass()50   public static void setUpBeforeClass() throws Exception {
51     TestReplicationBase.setUpBeforeClass();
52     connection1 = ConnectionFactory.createConnection(conf1);
53     connection2 = ConnectionFactory.createConnection(conf2);
54     admin1 = connection1.getAdmin();
55     admin2 = connection2.getAdmin();
56     adminExt = new ReplicationAdmin(conf1);
57   }
58 
59   @AfterClass
tearDownAfterClass()60   public static void tearDownAfterClass() throws Exception {
61     admin1.close();
62     admin2.close();
63     adminExt.close();
64     connection1.close();
65     connection2.close();
66     TestReplicationBase.tearDownAfterClass();
67   }
68 
69   @Test(timeout = 300000)
testEnableReplicationWhenSlaveClusterDoesntHaveTable()70   public void testEnableReplicationWhenSlaveClusterDoesntHaveTable() throws Exception {
71     admin2.disableTable(tableName);
72     admin2.deleteTable(tableName);
73     assertFalse(admin2.tableExists(tableName));
74     adminExt.enableTableRep(tableName);
75     assertTrue(admin2.tableExists(tableName));
76   }
77 
78   @Test(timeout = 300000)
testEnableReplicationWhenReplicationNotEnabled()79   public void testEnableReplicationWhenReplicationNotEnabled() throws Exception {
80     HTableDescriptor table = admin1.getTableDescriptor(tableName);
81     for (HColumnDescriptor fam : table.getColumnFamilies()) {
82       fam.setScope(HConstants.REPLICATION_SCOPE_LOCAL);
83     }
84     admin1.disableTable(tableName);
85     admin1.modifyTable(tableName, table);
86     admin1.enableTable(tableName);
87 
88     admin2.disableTable(tableName);
89     admin2.modifyTable(tableName, table);
90     admin2.enableTable(tableName);
91 
92     adminExt.enableTableRep(tableName);
93     table = admin1.getTableDescriptor(tableName);
94     for (HColumnDescriptor fam : table.getColumnFamilies()) {
95       assertEquals(fam.getScope(), HConstants.REPLICATION_SCOPE_GLOBAL);
96     }
97   }
98 
99   @Test(timeout = 300000)
testEnableReplicationWhenTableDescriptorIsNotSameInClusters()100   public void testEnableReplicationWhenTableDescriptorIsNotSameInClusters() throws Exception {
101     HTableDescriptor table = admin2.getTableDescriptor(tableName);
102     HColumnDescriptor f = new HColumnDescriptor("newFamily");
103     table.addFamily(f);
104     admin2.disableTable(tableName);
105     admin2.modifyTable(tableName, table);
106     admin2.enableTable(tableName);
107 
108     try {
109       adminExt.enableTableRep(tableName);
110       fail("Exception should be thrown if table descriptors in the clusters are not same.");
111     } catch (RuntimeException ignored) {
112 
113     }
114     admin1.disableTable(tableName);
115     admin1.modifyTable(tableName, table);
116     admin1.enableTable(tableName);
117     adminExt.enableTableRep(tableName);
118     table = admin1.getTableDescriptor(tableName);
119     for (HColumnDescriptor fam : table.getColumnFamilies()) {
120       assertEquals(fam.getScope(), HConstants.REPLICATION_SCOPE_GLOBAL);
121     }
122   }
123 
124   @Test(timeout = 300000)
testDisableAndEnableReplication()125   public void testDisableAndEnableReplication() throws Exception {
126     adminExt.disableTableRep(tableName);
127     HTableDescriptor table = admin1.getTableDescriptor(tableName);
128     for (HColumnDescriptor fam : table.getColumnFamilies()) {
129       assertEquals(fam.getScope(), HConstants.REPLICATION_SCOPE_LOCAL);
130     }
131     table = admin2.getTableDescriptor(tableName);
132     for (HColumnDescriptor fam : table.getColumnFamilies()) {
133       assertEquals(fam.getScope(), HConstants.REPLICATION_SCOPE_LOCAL);
134     }
135     adminExt.enableTableRep(tableName);
136     table = admin1.getTableDescriptor(tableName);
137     for (HColumnDescriptor fam : table.getColumnFamilies()) {
138       assertEquals(fam.getScope(), HConstants.REPLICATION_SCOPE_GLOBAL);
139     }
140   }
141 
142   @Test(timeout = 300000, expected = TableNotFoundException.class)
testDisableReplicationForNonExistingTable()143   public void testDisableReplicationForNonExistingTable() throws Exception {
144     adminExt.disableTableRep(TableName.valueOf("nonExistingTable"));
145   }
146 
147   @Test(timeout = 300000, expected = TableNotFoundException.class)
testEnableReplicationForNonExistingTable()148   public void testEnableReplicationForNonExistingTable() throws Exception {
149     adminExt.enableTableRep(TableName.valueOf("nonExistingTable"));
150   }
151 
152   @Test(timeout = 300000, expected = IllegalArgumentException.class)
testDisableReplicationWhenTableNameAsNull()153   public void testDisableReplicationWhenTableNameAsNull() throws Exception {
154     adminExt.disableTableRep(null);
155   }
156 
157   @Test(timeout = 300000, expected = IllegalArgumentException.class)
testEnableReplicationWhenTableNameAsNull()158   public void testEnableReplicationWhenTableNameAsNull() throws Exception {
159     adminExt.enableTableRep(null);
160   }
161 
162   /*
163    * Test enable table replication should create table only in user explicit specified table-cfs.
164    * HBASE-14717
165    */
166   @Test(timeout = 300000)
testEnableReplicationForExplicitSetTableCfs()167   public void testEnableReplicationForExplicitSetTableCfs() throws Exception {
168     TableName tn = TableName.valueOf("testEnableReplicationForSetTableCfs");
169     String peerId = "2";
170     if (admin2.isTableAvailable(tableName)) {
171       admin2.disableTable(tableName);
172       admin2.deleteTable(tableName);
173     }
174     assertFalse("Table should not exists in the peer cluster", admin2.isTableAvailable(tableName));
175 
176     Map<TableName, ? extends Collection<String>> tableCfs =
177         new HashMap<TableName, Collection<String>>();
178     tableCfs.put(tn, null);
179     try {
180       adminExt.setPeerTableCFs(peerId, tableCfs);
181       adminExt.enableTableRep(tableName);
182       assertFalse("Table should not be created if user has set table cfs explicitly for the "
183           + "peer and this is not part of that collection",
184         admin2.isTableAvailable(tableName));
185 
186       tableCfs.put(tableName, null);
187       adminExt.setPeerTableCFs(peerId, tableCfs);
188       adminExt.enableTableRep(tableName);
189       assertTrue(
190         "Table should be created if user has explicitly added table into table cfs collection",
191         admin2.isTableAvailable(tableName));
192     } finally {
193       adminExt.removePeerTableCFs(peerId, adminExt.getPeerTableCFs(peerId));
194       adminExt.disableTableRep(tableName);
195     }
196   }
197 }
198