/* * 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.resourcemanager; import java.io.File; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.NodeLabel; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.google.common.collect.ImmutableSet; public class TestRMHAForNodeLabels extends RMHATestBase { public static final Log LOG = LogFactory .getLog(TestSubmitApplicationWithRMHA.class); @Before @Override public void setup() throws Exception { super.setup(); // Create directory for node label store File tempDir = File.createTempFile("nlb", ".tmp"); tempDir.delete(); tempDir.mkdirs(); tempDir.deleteOnExit(); confForRM1.setBoolean(YarnConfiguration.NODE_LABELS_ENABLED, true); confForRM1.set(YarnConfiguration.FS_NODE_LABELS_STORE_ROOT_DIR, tempDir.getAbsolutePath()); confForRM2.setBoolean(YarnConfiguration.NODE_LABELS_ENABLED, true); confForRM2.set(YarnConfiguration.FS_NODE_LABELS_STORE_ROOT_DIR, tempDir.getAbsolutePath()); } @Test public void testRMHARecoverNodeLabels() throws Exception { // start two RMs, and transit rm1 to active, rm2 to standby startRMs(); // Add labels to rm1 rm1.getRMContext() .getNodeLabelManager() .addToCluserNodeLabels( Arrays.asList(NodeLabel.newInstance("a"), NodeLabel.newInstance("b"), NodeLabel.newInstance("c"))); Map<NodeId, Set<String>> nodeToLabels = new HashMap<>(); nodeToLabels.put(NodeId.newInstance("host1", 0), ImmutableSet.of("a")); nodeToLabels.put(NodeId.newInstance("host2", 0), ImmutableSet.of("b")); rm1.getRMContext().getNodeLabelManager().replaceLabelsOnNode(nodeToLabels); // Do the failover explicitFailover(); // Check labels in rm2 Assert .assertTrue(rm2.getRMContext().getNodeLabelManager() .getClusterNodeLabelNames() .containsAll(ImmutableSet.of("a", "b", "c"))); Assert.assertTrue(rm2.getRMContext().getNodeLabelManager() .getNodeLabels().get(NodeId.newInstance("host1", 0)).contains("a")); Assert.assertTrue(rm2.getRMContext().getNodeLabelManager() .getNodeLabels().get(NodeId.newInstance("host2", 0)).contains("b")); } }