Browse Source

YARN-8445. Improved error message for duplicated service and component names.
Contributed by Chandni Singh

(cherry picked from commit 9f15483c5d7c94251f4c84e0155449188f202779)

Eric Yang 7 năm trước cách đây
mục cha
commit
63ce762959

+ 2 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/exceptions/RestApiErrorMessages.java

@@ -28,6 +28,8 @@ public interface RestApiErrorMessages {
           "than 63 characters";
   String ERROR_COMPONENT_NAME_INVALID =
       "Component name must be no more than %s characters: %s";
+  String ERROR_COMPONENT_NAME_CONFLICTS_WITH_SERVICE_NAME =
+      "Component name %s must not be same as service name %s";
   String ERROR_USER_NAME_INVALID =
       "User name must be no more than 63 characters";
 

+ 5 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/utils/ServiceApiUtil.java

@@ -143,6 +143,11 @@ public class ServiceApiUtil {
         throw new IllegalArgumentException(String.format(RestApiErrorMessages
             .ERROR_COMPONENT_NAME_INVALID, maxCompLength, comp.getName()));
       }
+      if (service.getName().equals(comp.getName())) {
+        throw new IllegalArgumentException(String.format(RestApiErrorMessages
+                .ERROR_COMPONENT_NAME_CONFLICTS_WITH_SERVICE_NAME,
+            comp.getName(), service.getName()));
+      }
       if (componentNames.contains(comp.getName())) {
         throw new IllegalArgumentException("Component name collision: " +
             comp.getName());

+ 18 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/test/java/org/apache/hadoop/yarn/service/TestServiceApiUtil.java

@@ -333,6 +333,24 @@ public class TestServiceApiUtil {
     }
   }
 
+  @Test
+  public void testComponentNameSameAsServiceName() throws IOException {
+    SliderFileSystem sfs = ServiceTestUtils.initMockFs();
+    Service app = new Service();
+    app.setName("test");
+    app.setVersion("v1");
+    app.addComponent(createValidComponent("test"));
+
+    //component name same as service name
+    try {
+      ServiceApiUtil.validateAndResolveService(app, sfs, CONF_DNS_ENABLED);
+      Assert.fail(EXCEPTION_PREFIX + "component name matches service name");
+    } catch (IllegalArgumentException e) {
+      assertEquals("Component name test must not be same as service name test",
+          e.getMessage());
+    }
+  }
+
   @Test
   public void testExternalDuplicateComponent() throws IOException {
     Service ext = createValidApplication("comp1");