diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/NodeLabelUtil.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/NodeLabelUtil.java index 0dd0755e51..395ff8183c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/NodeLabelUtil.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/NodeLabelUtil.java @@ -38,6 +38,8 @@ private NodeLabelUtil() { Pattern.compile("^[0-9a-zA-Z][0-9a-zA-Z-_]*"); private static final Pattern PREFIX_PATTERN = Pattern.compile("^[0-9a-zA-Z][0-9a-zA-Z-_\\.]*"); + private static final Pattern ATTRIBUTE_VALUE_PATTERN = + Pattern.compile("^[0-9a-zA-Z][0-9a-zA-Z-_.]*"); public static void checkAndThrowLabelName(String label) throws IOException { if (label == null || label.isEmpty() || label.length() > MAX_LABEL_LENGTH) { @@ -69,7 +71,7 @@ public static void checkAndThrowAttributeValue(String value) return; } - boolean match = LABEL_OR_VALUE_PATTERN.matcher(value).matches(); + boolean match = ATTRIBUTE_VALUE_PATTERN.matcher(value).matches(); if (!match) { throw new IOException("attribute value should only contains " diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestNodeLabelUtil.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestNodeLabelUtil.java new file mode 100644 index 0000000000..d43da4fb95 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestNodeLabelUtil.java @@ -0,0 +1,47 @@ +/** + * 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.nodelabels; + +import static org.junit.Assert.fail; +import org.junit.Test; + +public class TestNodeLabelUtil { + + @Test + public void testAttributeValueAddition() { + String[] values = + new String[] {"1_8", "1.8", "ABZ", "ABZ", "az", "a-z","a_z", "123456789"}; + for (String val : values) { + try { + NodeLabelUtil.checkAndThrowAttributeValue(val); + } catch (Exception e) { + fail("Valid values for NodeAttributeValue :" + val); + } + } + + String[] invalidVals = new String[] {"_18","1,8","1/5",".15","1\\5"}; + for (String val : invalidVals) { + try { + NodeLabelUtil.checkAndThrowAttributeValue(val); + fail("Valid values for NodeAttributeValue :" + val); + } catch (Exception e) { + // IGNORE + } + } + } +}