diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/UpgradeComponentsFinder.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/UpgradeComponentsFinder.java index d6663ec985a..f9bd6a2f4cf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/UpgradeComponentsFinder.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/UpgradeComponentsFinder.java @@ -100,55 +100,54 @@ targetDef.getComponents().forEach(component -> { Component currentComp = currentDef.getComponent(component.getName()); - if (!Objects.equals(currentComp.getName(), component.getName())) { + if ( currentComp != null) { + if (!Objects.equals(currentComp.getName(), component.getName())) { + throw new UnsupportedOperationException( + "changes to component name not supported by upgrade"); + } + + if (!Objects.equals(currentComp.getDependencies(), component.getDependencies())) { + throw new UnsupportedOperationException( + "changes to component dependencies not supported by upgrade"); + } + + if (!Objects.equals(currentComp.getReadinessCheck(), component.getReadinessCheck())) { + throw new UnsupportedOperationException( + "changes to component readiness check not supported by upgrade"); + } + + if (!Objects.equals(currentComp.getResource(), component.getResource())) { + + throw new UnsupportedOperationException( + "changes to component resource not supported by upgrade"); + } + + if (!Objects.equals(currentComp.getRunPrivilegedContainer(), component.getRunPrivilegedContainer())) { + throw new UnsupportedOperationException( + "changes to run privileged container not supported by upgrade"); + } + + if (!Objects.equals(currentComp.getPlacementPolicy(), component.getPlacementPolicy())) { + throw new UnsupportedOperationException( + "changes to component placement policy not supported by upgrade"); + } + + if (!Objects.equals(currentComp.getQuicklinks(), component.getQuicklinks())) { + throw new UnsupportedOperationException( + "changes to component quick links not supported by upgrade"); + } + + if (!Objects.equals(currentComp.getArtifact(), component.getArtifact()) || !Objects.equals( + currentComp.getLaunchCommand(), component.getLaunchCommand()) || !Objects.equals(currentComp.getConfiguration(), + component.getConfiguration())) { + targetComps.add(component); + } + } else { throw new UnsupportedOperationException( - "changes to component name not supported by upgrade"); - } - - if (!Objects.equals(currentComp.getDependencies(), - component.getDependencies())) { - throw new UnsupportedOperationException( - "changes to component dependencies not supported by upgrade"); - } - - if (!Objects.equals(currentComp.getReadinessCheck(), - component.getReadinessCheck())) { - throw new UnsupportedOperationException( - "changes to component readiness check not supported by upgrade"); - } - - if (!Objects.equals(currentComp.getResource(), - component.getResource())) { - throw new UnsupportedOperationException( - "changes to component resource not supported by upgrade"); - } - - - if (!Objects.equals(currentComp.getRunPrivilegedContainer(), - component.getRunPrivilegedContainer())) { - throw new UnsupportedOperationException( - "changes to run privileged container not supported by upgrade"); - } - - if (!Objects.equals(currentComp.getPlacementPolicy(), - component.getPlacementPolicy())) { - throw new UnsupportedOperationException( - "changes to component placement policy not supported by upgrade"); - } - - if (!Objects.equals(currentComp.getQuicklinks(), - component.getQuicklinks())) { - throw new UnsupportedOperationException( - "changes to component quick links not supported by upgrade"); - } - - if (!Objects.equals(currentComp.getArtifact(), - component.getArtifact()) || - !Objects.equals(currentComp.getLaunchCommand(), - component.getLaunchCommand()) || - !Objects.equals(currentComp.getConfiguration(), - component.getConfiguration())) { - targetComps.add(component); + "addition/deletion of components not supported by upgrade. " + + "Could not find component " + component.getName() + " in " + + "current service definition." + ); } }); return targetComps; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/test/java/org/apache/hadoop/yarn/service/TestDefaultUpgradeComponentsFinder.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/test/java/org/apache/hadoop/yarn/service/TestDefaultUpgradeComponentsFinder.java index 086fdbe0aff..4812c989e9c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/test/java/org/apache/hadoop/yarn/service/TestDefaultUpgradeComponentsFinder.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/test/java/org/apache/hadoop/yarn/service/TestDefaultUpgradeComponentsFinder.java @@ -23,6 +23,7 @@ import org.junit.Test; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -45,6 +46,21 @@ public void testServiceArtifactChange() { targetDef)); } + @Test + public void testServiceUpgradeWithNewComponentAddition() { + Service currentDef = ServiceTestUtils.createExampleApplication(); + Service targetDef = ServiceTestUtils.createExampleApplication(); + Iterator targetComponentsIter = targetDef.getComponents().iterator(); + Component firstComponent = targetComponentsIter.next(); + firstComponent.setName("newComponentA"); + + try { + finder.findTargetComponentSpecs(currentDef, targetDef); + } catch(UnsupportedOperationException usoe) { + //Expected + } + } + @Test public void testComponentArtifactChange() { Service currentDef = TestServiceManager.createBaseDef("test");