|
@@ -0,0 +1,310 @@
|
|
|
+/*
|
|
|
+ * *
|
|
|
+ * 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;
|
|
|
+ }
|
|
|
+}
|