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/client/ServiceClient.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/client/ServiceClient.java index 453619b9729..47562993701 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/client/ServiceClient.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/client/ServiceClient.java @@ -71,6 +71,7 @@ import org.apache.hadoop.yarn.service.containerlaunch.JavaCommandLineBuilder; import org.apache.hadoop.yarn.service.exceptions.BadClusterStateException; import org.apache.hadoop.yarn.service.exceptions.BadConfigException; +import org.apache.hadoop.yarn.service.exceptions.ErrorStrings; import org.apache.hadoop.yarn.service.exceptions.SliderException; import org.apache.hadoop.yarn.service.provider.AbstractClientProvider; import org.apache.hadoop.yarn.service.provider.ProviderUtils; @@ -215,6 +216,14 @@ public int actionUpgrade(String appName, String fileName) } public int actionUpgrade(Service service) throws YarnException, IOException { + boolean upgradeEnabled = getConfig().getBoolean( + YARN_SERVICE_UPGRADE_ENABLED, + YARN_SERVICE_UPGRADE_ENABLED_DEFAULT); + + if (!upgradeEnabled) { + throw new YarnException(ErrorStrings.SERVICE_UPGRADE_DISABLED); + } + Service persistedService = ServiceApiUtil.loadService(fs, service.getName()); if (!StringUtils.isEmpty(persistedService.getId())) { 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/conf/YarnServiceConf.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/conf/YarnServiceConf.java index eda280f7665..9069248d16b 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/conf/YarnServiceConf.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/conf/YarnServiceConf.java @@ -124,6 +124,13 @@ public static final String DEPENDENCY_TARBALL_PATH = YARN_SERVICE_PREFIX + "framework.path"; + /** + * Upgrade feature enabled for services. + */ + public static final String YARN_SERVICE_UPGRADE_ENABLED = + "yarn.service.upgrade.enabled"; + public static final boolean YARN_SERVICE_UPGRADE_ENABLED_DEFAULT = false; + /** * Get long value for the property. First get from the userConf, if not * present, get from systemConf. 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/exceptions/ErrorStrings.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/exceptions/ErrorStrings.java index 83658c89ea2..6ae124faedd 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/exceptions/ErrorStrings.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/exceptions/ErrorStrings.java @@ -39,4 +39,6 @@ "Too many arguments"; String ERROR_DUPLICATE_ENTRY = "Duplicate entry for "; + String SERVICE_UPGRADE_DISABLED = "Service upgrade is disabled."; + } 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/TestYarnNativeServices.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/TestYarnNativeServices.java index 443ba0b4035..2b30cc451ef 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/TestYarnNativeServices.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/TestYarnNativeServices.java @@ -63,6 +63,7 @@ import static org.apache.hadoop.yarn.api.records.YarnApplicationState.FINISHED; import static org.apache.hadoop.yarn.service.conf.YarnServiceConf.YARN_SERVICE_BASE_PATH; +import static org.apache.hadoop.yarn.service.conf.YarnServiceConf.YARN_SERVICE_UPGRADE_ENABLED; import static org.apache.hadoop.yarn.service.exceptions.LauncherExitCodes.EXIT_COMMAND_ARGUMENT_ERROR; import static org.apache.hadoop.yarn.service.exceptions.LauncherExitCodes.EXIT_NOT_FOUND; @@ -374,6 +375,7 @@ public void testRecoverComponentsAfterRMRestart() throws Exception { @Test(timeout = 200000) public void testUpgradeService() throws Exception { setupInternal(NUM_NMS); + getConf().setBoolean(YARN_SERVICE_UPGRADE_ENABLED, true); ServiceClient client = createClient(getConf()); Service service = createExampleApplication(); 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/client/TestServiceClient.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/client/TestServiceClient.java index cc5b6ec7fe4..2ddef4549ea 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/client/TestServiceClient.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/client/TestServiceClient.java @@ -26,10 +26,13 @@ import org.apache.hadoop.yarn.api.records.ApplicationReport; import org.apache.hadoop.yarn.api.records.YarnApplicationAttemptState; import org.apache.hadoop.yarn.client.api.YarnClient; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.service.ClientAMProtocol; import org.apache.hadoop.yarn.service.ServiceTestUtils; import org.apache.hadoop.yarn.service.api.records.Service; +import org.apache.hadoop.yarn.service.conf.YarnServiceConf; +import org.apache.hadoop.yarn.service.exceptions.ErrorStrings; import org.apache.hadoop.yarn.service.utils.ServiceApiUtil; import org.junit.Assert; import org.junit.Rule; @@ -51,11 +54,33 @@ public ServiceTestUtils.ServiceFSWatcher rule = new ServiceTestUtils.ServiceFSWatcher(); + @Test + public void testUpgradeDisabledByDefault() throws Exception { + ApplicationId applicationId = ApplicationId.newInstance( + System.currentTimeMillis(), 1); + ServiceClient client = createServiceClient(applicationId, false); + + Service service = ServiceTestUtils.createExampleApplication(); + service.setVersion("v1"); + client.actionCreate(service); + + //upgrade the service + service.setVersion("v2"); + try { + client.actionUpgrade(service); + } catch (YarnException ex) { + Assert.assertEquals(ErrorStrings.SERVICE_UPGRADE_DISABLED, + ex.getMessage()); + return; + } + Assert.fail(); + } + @Test public void testActionUpgrade() throws Exception { ApplicationId applicationId = ApplicationId.newInstance( System.currentTimeMillis(), 1); - ServiceClient client = createServiceClient(applicationId); + ServiceClient client = createServiceClient(applicationId, true); Service service = ServiceTestUtils.createExampleApplication(); service.setVersion("v1"); @@ -73,7 +98,8 @@ public void testActionUpgrade() throws Exception { } - private ServiceClient createServiceClient(ApplicationId applicationId) + private ServiceClient createServiceClient(ApplicationId applicationId, + boolean enableUpgrade) throws Exception { ClientAMProtocol amProxy = mock(ClientAMProtocol.class); YarnClient yarnClient = createMockYarnClient(); @@ -110,7 +136,8 @@ ApplicationId submitApp(Service app) throws IOException, YarnException { client.setFileSystem(rule.getFs()); client.setYarnClient(yarnClient); - + rule.getConf().setBoolean(YarnServiceConf.YARN_SERVICE_UPGRADE_ENABLED, + enableUpgrade); client.init(rule.getConf()); client.start(); return client;