blob: bcd565644d181d64224009b602846ac359571779 [file] [log] [blame]
/*
* *
* 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.yarn.server.nodemanager;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.NetworkTagMappingJsonManager;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.NetworkTagMappingJsonManager.Group;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.NetworkTagMappingJsonManager.NetworkTagMapping;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.NetworkTagMappingJsonManager.User;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Test NetworkTagMapping Json Manager.
*
*/
public class TestNetworkTagMappingJsonManager {
private Path jsonDirDirPath = new Path("target/json");
private Configuration conf = new YarnConfiguration();
private FileSystem fs;
@Before
public void setUp() throws IOException {
fs = FileSystem.get(conf);
if (fs.exists(jsonDirDirPath)) {
fs.delete(jsonDirDirPath, true);
}
assertTrue(fs.mkdirs(jsonDirDirPath));
}
@After
public void tearDown() throws IOException {
if (fs.exists(jsonDirDirPath)) {
fs.delete(jsonDirDirPath, true);
}
}
@Test (timeout=10000)
public void testNetworkMappingJsonManager() throws Exception {
Path jsonFilePath = new Path(jsonDirDirPath, "test.json");
File jsonFile = new File(jsonFilePath.toString());
NetworkTagMappingJsonManager manager = new NetworkTagMappingJsonManager();
JSONObject json = new JSONObject();
JSONArray userArray = new JSONArray();
// add users
Map<String, String> createdUsers = createUserNetworkTagIDMapping();
for(Entry<String, String> user : createdUsers.entrySet()) {
JSONObject userJson = new JSONObject();
userJson.put("name", user.getKey());
userJson.put("network-tag-id", user.getValue());
userArray.put(userJson);
}
// add duplicate user1
JSONObject duplicateUser1 = new JSONObject();
duplicateUser1.put("name", "user1");
duplicateUser1.put("network-tag-id", "0x88888888");
userArray.put(duplicateUser1);
json.put("users", userArray);
JSONArray groupArray = new JSONArray();
// add groups
Map<String, String> createdGroups = createGroupNetworkTagIDMapping();
for(Entry<String, String> group : createdGroups.entrySet()) {
JSONObject groupJson = new JSONObject();
groupJson.put("name", group.getKey());
groupJson.put("network-tag-id", group.getValue());
groupArray.put(groupJson);
}
// add duplicate group1
JSONObject duplicateGroup1 = new JSONObject();
duplicateGroup1.put("name", "team1");
duplicateGroup1.put("network-tag-id", "0x20002003");
groupArray.put(duplicateGroup1);
json.put("groups", groupArray);
writeJson(jsonFile, json.toString());
conf.set(YarnConfiguration.NM_NETWORK_TAG_MAPPING_FILE_PATH,
jsonFile.getAbsolutePath());
try {
manager.initialize(conf);
fail("Should get an exception. Becase we did not "
+ "set default-network-tag-id");
} catch (Exception ex) {
// Do Nothing
}
// add default-network-tag-id
json.put("default-network-tag-id", "0x99999999");
// remove previous json file
if (fs.exists(jsonFilePath)) {
fs.delete(jsonFilePath, false);
}
assertFalse(fs.exists(jsonFilePath));
writeJson(jsonFile, json.toString());
manager.initialize(conf);
NetworkTagMapping networkTagMapping = manager.getNetworkTagMapping();
// Verify the default-network-tag-id
assertTrue(networkTagMapping != null);
assertTrue("0x99999999".equals(networkTagMapping
.getDefaultNetworkTagID()));
// Verify the users
List<User> users = networkTagMapping.getUsers();
// The number of users should be 4 which is user1, user2, user3 and user4.
assertTrue(users.size() == 4);
for (int index = 0; index < users.size(); index++) {
String userName = users.get(index).getUserName();
String classId = users.get(index).getNetworkTagID();
assertTrue(createdUsers.containsValue(classId));
String createdUserName = getUserName(createdUsers, classId);
assertTrue(createdUserName.contains(userName));
}
// Verify the groups
List<Group> groups = networkTagMapping.getGroups();
// The number of groups should be 2 which is team1 and team2.
assertTrue(groups.size() == 2);
for (int index = 0; index < groups.size(); index++) {
String groupName = groups.get(index).getGroupName();
String classId = groups.get(index).getNetworkTagID();
assertTrue(createdGroups.containsKey(groupName));
assertTrue(classId.equals(createdGroups.get(groupName)));
}
}
@Test (timeout=10000)
public void testNetworkTagIDMatchPattern() throws Exception {
Path jsonFilePath = new Path(jsonDirDirPath, "test.json");
File jsonFile = new File(jsonFilePath.toString());
NetworkTagMappingJsonManager manager = new NetworkTagMappingJsonManager();
JSONObject json = new JSONObject();
JSONArray userArray = new JSONArray();
JSONObject user1 = new JSONObject();
user1.put("name", "user1");
user1.put("network-tag-id", "1x88888888");
userArray.put(user1);
json.put("users", userArray);
writeJson(jsonFile, json.toString());
conf.set(YarnConfiguration.NM_NETWORK_TAG_MAPPING_FILE_PATH,
jsonFile.getAbsolutePath());
try {
manager.initialize(conf);
fail("Should get an exception. "
+ "Becase we did not set network-tag-id for user1 correctly");
} catch(Exception ex) {
// should catch exception here
assertTrue(ex.getMessage().contains(
"User-network-tag-id mapping configuraton error."));
}
json.remove("users");
userArray = new JSONArray();
user1 = new JSONObject();
user1.put("name", "user1");
user1.put("network-tag-id", "0x88888888");
userArray.put(user1);
json.put("users", userArray);
JSONArray groupArray = new JSONArray();
JSONObject group1 = new JSONObject();
group1.put("name", "team1");
group1.put("network-tag-id", "0x2000003");
groupArray.put(group1);
json.put("groups", groupArray);
// remove previous json file
if (fs.exists(jsonFilePath)) {
fs.delete(jsonFilePath, false);
}
assertFalse(fs.exists(jsonFilePath));
writeJson(jsonFile, json.toString());
try {
manager.initialize(conf);
fail("Should get an exception. "
+ "Becase we did not set network-tag-id for group1 correctly");
} catch(Exception ex) {
// should catch exception here
assertTrue(ex.getMessage().contains(
"Group-network-tag-id mapping configuraton error."));
}
json.remove("groups");
groupArray = new JSONArray();
group1 = new JSONObject();
group1.put("name", "team1");
group1.put("network-tag-id", "0x20002003");
groupArray.put(group1);
json.put("groups", groupArray);
json.put("default-network-tag-id", "0x99");
// remove previous json file
if (fs.exists(jsonFilePath)) {
fs.delete(jsonFilePath, false);
}
assertFalse(fs.exists(jsonFilePath));
writeJson(jsonFile, json.toString());
try {
manager.initialize(conf);
fail("Should get an exception. "
+ "Becase we did not set default-network-tag-id correctly");
} catch(Exception ex) {
// should catch exception here
assertTrue(ex.getMessage().contains(
"Configuration error on default-network-tag-id."));
}
json.remove("default-network-tag-id");
json.put("default-network-tag-id", "0x99999999");
// remove previous json file
if (fs.exists(jsonFilePath)) {
fs.delete(jsonFilePath, false);
}
assertFalse(fs.exists(jsonFilePath));
writeJson(jsonFile, json.toString());
manager.initialize(conf);
}
private void writeJson(File jsonFile, String jsonStr) throws IOException {
Writer writer = null;
try {
writer = new FileWriter(jsonFile);
writer.write(jsonStr);
} finally {
if (writer != null) {
writer.close();
}
}
}
private Map<String, String> createUserNetworkTagIDMapping() {
Map<String, String> classIdMap = new LinkedHashMap<>();
classIdMap.put("user1", "0x10001001");
classIdMap.put("user2", "0x10001002");
classIdMap.put("user3,user4", "0x10001003");
return classIdMap;
}
private Map<String, String> createGroupNetworkTagIDMapping() {
Map<String, String> classIdMap = new LinkedHashMap<>();
classIdMap.put("team1", "0x20002001");
classIdMap.put("team2", "0x20002002");
return classIdMap;
}
private String getUserName(Map<String, String> userMapping, String classId) {
for (Entry<String, String> o : userMapping.entrySet()) {
if (o.getValue().equals(classId)) {
return o.getKey();
}
}
return null;
}
}