You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2017/09/08 14:07:45 UTC
ambari git commit: AMBARI-21906. Consider Not Scheduling
ConfigureAction Tasks During PATCH/MAINT Upgrades (ncole)
Repository: ambari
Updated Branches:
refs/heads/branch-2.6 f01e26bdd -> b238b367e
AMBARI-21906. Consider Not Scheduling ConfigureAction Tasks During PATCH/MAINT Upgrades (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/b238b367
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/b238b367
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/b238b367
Branch: refs/heads/branch-2.6
Commit: b238b367eae7751bc59223d7a3e7545c9d5baeeb
Parents: f01e26b
Author: Nate Cole <nc...@hortonworks.com>
Authored: Thu Sep 7 13:49:20 2017 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Fri Sep 8 10:07:40 2017 -0400
----------------------------------------------------------------------
.../internal/UpgradeResourceProvider.java | 24 +-
.../state/stack/upgrade/ConfigureTask.java | 5 +-
.../src/main/resources/upgrade-pack.xsd | 1 +
.../AmbariManagementControllerTest.java | 2 +-
.../internal/UpgradeResourceProviderTest.java | 108 ++++++++
.../server/state/stack/UpgradePackTest.java | 1 +
.../upgrade_test_force_config_change.xml | 267 +++++++++++++++++++
.../version_definition_test_patch_config.xml | 55 ++++
8 files changed, 457 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
index 3d72a6e..a28fb02 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
@@ -727,11 +727,12 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
itemEntity.setText(wrapper.getText());
itemEntity.setTasks(wrapper.getTasksJson());
itemEntity.setHosts(wrapper.getHostsJson());
- itemEntities.add(itemEntity);
injectVariables(configHelper, cluster, itemEntity);
- makeServerSideStage(group, upgradeContext, effectiveRepositoryVersion, req,
- itemEntity, (ServerSideActionTask) task, configUpgradePack);
+ if (makeServerSideStage(group, upgradeContext, effectiveRepositoryVersion, req,
+ itemEntity, (ServerSideActionTask) task, configUpgradePack)) {
+ itemEntities.add(itemEntity);
+ }
}
}
} else {
@@ -1180,7 +1181,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
* upgrade
* @throws AmbariException
*/
- private void makeServerSideStage(UpgradeGroupHolder group, UpgradeContext context,
+ private boolean makeServerSideStage(UpgradeGroupHolder group, UpgradeContext context,
RepositoryVersionEntity effectiveRepositoryVersion, RequestStageContainer request,
UpgradeItemEntity entity, ServerSideActionTask task, ConfigUpgradePack configUpgradePack)
throws AmbariException {
@@ -1197,6 +1198,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
String itemDetail = entity.getText();
String stageText = StringUtils.abbreviate(entity.getText(), 255);
+ boolean process = true;
+
switch (task.getType()) {
case SERVER_ACTION:
case MANUAL: {
@@ -1232,6 +1235,13 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
}
case CONFIGURE: {
ConfigureTask ct = (ConfigureTask) task;
+
+ // !!! would prefer to do this in the sequence generator, but there's too many
+ // places to miss
+ if (context.getOrchestrationType().isRevertable() && !ct.supportsPatch) {
+ process = false;
+ }
+
Map<String, String> configurationChanges =
ct.getConfigurationChanges(cluster, configUpgradePack);
@@ -1262,6 +1272,10 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
break;
}
+ if (!process) {
+ return false;
+ }
+
ActionExecutionContext actionContext = new ActionExecutionContext(cluster.getClusterName(),
Role.AMBARI_SERVER_ACTION.toString(), Collections.<RequestResourceFilter> emptyList(),
commandParams);
@@ -1299,6 +1313,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
context.isComponentFailureAutoSkipped());
request.addStages(Collections.singletonList(stage));
+
+ return true;
}
/**
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ConfigureTask.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ConfigureTask.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ConfigureTask.java
index b7be2ec..9f4440f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ConfigureTask.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ConfigureTask.java
@@ -110,6 +110,9 @@ public class ConfigureTask extends ServerSideActionTask {
@XmlAttribute(name = "id")
public String id;
+ @XmlAttribute(name="supports-patch")
+ public boolean supportsPatch = false;
+
/**
* {@inheritDoc}
*/
@@ -217,7 +220,7 @@ public class ConfigureTask extends ServerSideActionTask {
// replacements
- List<Replace> replacements = new ArrayList<Replace>();
+ List<Replace> replacements = new ArrayList<>();
replacements.addAll(definition.getReplacements());
//Fetch the replacements that used regex to find a string
replacements.addAll(definition.getRegexReplacements(cluster));
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/main/resources/upgrade-pack.xsd
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/upgrade-pack.xsd b/ambari-server/src/main/resources/upgrade-pack.xsd
index aa7ddd8..21606bd 100644
--- a/ambari-server/src/main/resources/upgrade-pack.xsd
+++ b/ambari-server/src/main/resources/upgrade-pack.xsd
@@ -331,6 +331,7 @@
<xs:extension base="abstract-server-task-type">
<xs:sequence />
<xs:attribute name="id" use="required"/>
+ <xs:attribute name="supports-patch" type="xs:boolean" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 856f2fa..cf4c98f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -6978,7 +6978,7 @@ public class AmbariManagementControllerTest {
Assert.assertEquals(1, responsesWithParams.size());
StackVersionResponse resp = responsesWithParams.iterator().next();
assertNotNull(resp.getUpgradePacks());
- assertEquals(15, resp.getUpgradePacks().size());
+ assertTrue(resp.getUpgradePacks().size() > 0);
assertTrue(resp.getUpgradePacks().contains("upgrade_test"));
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
index 9c961da..7b93078 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
@@ -84,6 +84,7 @@ import org.apache.ambari.server.orm.entities.UpgradeHistoryEntity;
import org.apache.ambari.server.orm.entities.UpgradeItemEntity;
import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.serveraction.upgrades.AutoSkipFailedSummaryAction;
+import org.apache.ambari.server.serveraction.upgrades.ConfigureAction;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.Config;
@@ -1733,6 +1734,113 @@ public class UpgradeResourceProviderTest extends EasyMockSupport {
upgradeResourceProvider.createResources(request);
}
+ @Test
+ public void testCreatePatchWithConfigChanges() throws Exception {
+ Cluster cluster = clusters.getCluster("c1");
+
+ File f = new File("src/test/resources/version_definition_test_patch_config.xml");
+ repoVersionEntity2112.setType(RepositoryType.PATCH);
+ repoVersionEntity2112.setVersionXml(IOUtils.toString(new FileInputStream(f)));
+ repoVersionEntity2112.setVersionXsd("version_definition.xsd");
+ repoVersionDao.merge(repoVersionEntity2112);
+
+ List<UpgradeEntity> upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+ assertEquals(0, upgrades.size());
+
+ Map<String, Object> requestProps = new HashMap<>();
+ requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+ requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, String.valueOf(repoVersionEntity2112.getId()));
+ requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
+ requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
+ requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name());
+
+ // !!! test that a PATCH upgrade skips config changes
+ ResourceProvider upgradeResourceProvider = createProvider(amc);
+
+ Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+ RequestStatus status = upgradeResourceProvider.createResources(request);
+ Set<Resource> resources = status.getAssociatedResources();
+ assertEquals(1, resources.size());
+ Long requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id");
+ assertNotNull(requestId);
+
+ UpgradeEntity upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId);
+ assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration());
+
+ HostRoleCommandDAO hrcDAO = injector.getInstance(HostRoleCommandDAO.class);
+ List<HostRoleCommandEntity> commands = hrcDAO.findByRequest(upgradeEntity.getRequestId());
+
+ boolean foundConfigTask = false;
+ for (HostRoleCommandEntity command : commands) {
+ if (StringUtils.isNotBlank(command.getCustomCommandName()) &&
+ command.getCustomCommandName().equals(ConfigureAction.class.getName())) {
+ foundConfigTask = true;
+ break;
+ }
+ }
+ assertFalse(foundConfigTask);
+
+ // !!! test that a patch with a supported patch change gets picked up
+ cluster.setUpgradeEntity(null);
+ requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test_force_config_change");
+ request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+
+ status = upgradeResourceProvider.createResources(request);
+ resources = status.getAssociatedResources();
+ assertEquals(1, resources.size());
+ requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id");
+ assertNotNull(requestId);
+
+ upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId);
+ assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration());
+
+ commands = hrcDAO.findByRequest(upgradeEntity.getRequestId());
+
+ foundConfigTask = false;
+ for (HostRoleCommandEntity command : commands) {
+ if (StringUtils.isNotBlank(command.getCustomCommandName()) &&
+ command.getCustomCommandName().equals(ConfigureAction.class.getName())) {
+ foundConfigTask = true;
+ break;
+ }
+ }
+ assertTrue(foundConfigTask);
+
+
+
+ // !!! test that a regular upgrade will pick up the config change
+ cluster.setUpgradeEntity(null);
+ repoVersionEntity2112.setType(RepositoryType.STANDARD);
+ repoVersionDao.merge(repoVersionEntity2112);
+
+ requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
+ request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+
+ status = upgradeResourceProvider.createResources(request);
+ resources = status.getAssociatedResources();
+ assertEquals(1, resources.size());
+ requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id");
+ assertNotNull(requestId);
+
+ upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId);
+ assertEquals(RepositoryType.STANDARD, upgradeEntity.getOrchestration());
+
+ commands = hrcDAO.findByRequest(upgradeEntity.getRequestId());
+
+ foundConfigTask = false;
+ for (HostRoleCommandEntity command : commands) {
+ if (StringUtils.isNotBlank(command.getCustomCommandName()) &&
+ command.getCustomCommandName().equals(ConfigureAction.class.getName())) {
+ foundConfigTask = true;
+ break;
+ }
+ }
+ assertTrue(foundConfigTask);
+
+ }
+
+
+
private String parseSingleMessage(String msgStr){
JsonParser parser = new JsonParser();
JsonArray msgArray = (JsonArray) parser.parse(msgStr);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
index 616139c..0eac2be 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
@@ -173,6 +173,7 @@ public class UpgradePackTest {
ConfigureTask ct = (ConfigureTask) t;
// check that the Configure task successfully parsed id
assertEquals("hdp_2_1_1_nm_pre_upgrade", ct.getId());
+ assertFalse(ct.supportsPatch);
}
@Test
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_force_config_change.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_force_config_change.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_force_config_change.xml
new file mode 100644
index 0000000..a438afc
--- /dev/null
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_force_config_change.xml
@@ -0,0 +1,267 @@
+<?xml version="1.0"?>
+<!--
+ 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.
+-->
+<upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="upgrade-pack.xsd">
+ <target>2.2.*.*</target>
+ <target-stack>HDP-2.2.0</target-stack>
+ <type>ROLLING</type>
+ <prerequisite-checks>
+ <!-- List of additional pre-req checks to run in addition to the required pre-reqs -->
+ <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check>
+ <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check>
+ <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check>
+ <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check>
+ <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check>
+ </prerequisite-checks>
+
+ <order>
+ <group xsi:type="cluster" name="PRE_CLUSTER" title="Pre {{direction.text.proper}}">
+ <execute-stage title="Confirm 1">
+ <task xsi:type="manual">
+ <message>Foo</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Pre Upgrade HIVE">
+ <task xsi:type="manual">
+ <message>Back stuff up.</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Finalize HDFS">
+ <task xsi:type="execute">
+ <script>foo</script>
+ <function>list</function>
+ </task>
+ </execute-stage>
+ <execute-stage title="Confirm 2">
+ <task xsi:type="manual">
+ <message>Foo</message>
+ </task>
+ </execute-stage>
+ </group>
+
+ <group name="ZOOKEEPER" title="Zookeeper">
+ <skippable>true</skippable>
+ <allow-retry>false</allow-retry>
+ <service name="ZOOKEEPER">
+ <component>ZOOKEEPER_SERVER</component>
+ <component>ZOOKEEPER_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="CORE_MASTER" title="Core Masters">
+ <service name="HDFS">
+ <component>JOURNALNODE</component>
+ <component>NAMENODE</component>
+ </service>
+ <service name="YARN">
+ <component>RESOURCEMANAGER</component>
+ </service>
+ </group>
+
+ <group name="CORE_SLAVES" title="Core Slaves" xsi:type="colocated">
+ <skippable>true</skippable> <!-- set skippable for test -->
+ <allow-retry>false</allow-retry> <!-- set no retry for test -->
+ <service name="HDFS">
+ <component>DATANODE</component>
+ </service>
+ <service name="HBASE">
+ <component>REGIONSERVER</component>
+ </service>
+ <service name="YARN">
+ <component>NODEMANAGER</component>
+ </service>
+
+ <batch>
+ <percent>20</percent>
+ <message>Please run additional tests on {{components}}</message>
+ </batch>
+ </group>
+
+ <group name="HIVE" title="Hive">
+ <skippable>true</skippable>
+ <service name="HIVE">
+ <component>HIVE_METASTORE</component>
+ <component>HIVE_SERVER</component>
+ <component>WEBHCAT_SERVER</component>
+ </service>
+ </group>
+
+ <group name="OOZIE" title="Oozie">
+ <skippable>true</skippable>
+ <supports-auto-skip-failure>false</supports-auto-skip-failure>
+ <service-check>false</service-check>
+ <service name="OOZIE">
+ <component>OOZIE_SERVER</component>
+ <component>OOZIE_CLIENT</component>
+ </service>
+ </group>
+
+ <group xsi:type="cluster" name="POST_CLUSTER" title="Finalize {{direction.text.proper}}">
+ <execute-stage title="Confirm Finalize">
+ <task xsi:type="manual">
+ <message>Please confirm you are ready to finalize</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Execute HDFS Finalize">
+ <task xsi:type="execute">
+ <script>foo</script>
+ <function>list</function>
+ </task>
+ </execute-stage>
+ <execute-stage title="Save Cluster State">
+ <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction">
+ </task>
+ </execute-stage>
+ </group>
+
+ </order>
+
+
+ <processing>
+ <service name="ZOOKEEPER">
+ <component name="ZOOKEEPER_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>SUMMARY OF PREPARE</summary>
+ <message>This is a manual task with a placeholder of {{foo/bar}}</message>
+ </task>
+ </pre-upgrade>
+ <pre-downgrade copy-upgrade="true" />
+ <upgrade>
+ <task xsi:type="restart-task" timeout-config="upgrade.parameter.zk-server.timeout"/>
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="configure" id="hdp_2_1_1_zookeeper_new_config_type" supports-patch="true" />
+ </post-upgrade>
+ <post-downgrade copy-upgrade="true" />
+ </component>
+ </service>
+
+ <service name="HDFS">
+ <component name="NAMENODE">
+ <pre-upgrade>
+ <task xsi:type="execute" hosts="master">
+ <script>foo</script>
+ <function>list</function>
+ </task>
+ <task xsi:type="configure" id="hdp_2_1_1_nn_pre_upgrade" />
+ <task xsi:type="manual">
+ <message>{{direction.verb.proper}} your database</message>
+ </task>
+ </pre-upgrade>
+ <pre-downgrade copy-upgrade="true" />
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="execute">
+ <script>foo</script>
+ <function>list</function>
+ </task>
+ </post-upgrade>
+ <post-downgrade copy-upgrade="true" />
+ </component>
+ <component name="DATANODE">
+ <pre-downgrade />
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ <post-downgrade>
+ <task xsi:type="manual">
+ <message>Manual Downgrade</message>
+ </task>
+ </post-downgrade>
+ </component>
+ </service>
+
+ <service name="YARN">
+ <component name="RESOURCEMANAGER">
+ <pre-upgrade>
+ <task xsi:type="execute">
+ <script>foo</script>
+ <function>list</function>
+ </task>
+ </pre-upgrade>
+ <pre-downgrade copy-upgrade="true" />
+ <upgrade />
+ </component>
+ <component name="NODEMANAGER">
+ <pre-upgrade>
+ <task xsi:type="execute">
+ <script>foo</script>
+ <function>list</function>
+ </task>
+ <task xsi:type="configure" id="hdp_2_1_1_nm_pre_upgrade"/>
+ </pre-upgrade>
+ <pre-downgrade copy-upgrade="true" />
+ <upgrade />
+ </component>
+ </service>
+
+ <service name="HIVE">
+ <component name="HIVE_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>HiveServer Port Availability</summary>
+ <message>The HiveServer port will now change to 10010 if hive is using a binary transfer mode or 10011 if hive is using an http transport mode. You can use "netstat -anp | grep 1001[01]" to determine if the port is available on each of following HiveServer host(s): {{hosts.all}}. If the port is not available, the process using it must be terminated.</message>
+ </task>
+ <task xsi:type="configure" id="hdp_2_1_1_hive_server_foo"/>
+ <task xsi:type="configure" id="hdp_2_1_1_hive_server_conditions"/>
+ <task xsi:type="configure" id="hdp_2_1_1_hive_server_conditions_skip"/>
+ <task xsi:type="configure" id="hdp_2_1_1_no_conditions_met"/>
+ </pre-upgrade>
+ <pre-downgrade copy-upgrade="true" />
+ <upgrade />
+ </component>
+ </service>
+
+ <service name="OOZIE">
+ <component name="OOZIE_SERVER">
+ <pre-upgrade>
+ <!-- This is important, do not remove it since UpgradeHelperTest.java :
+ testUpgradeWithMultipleTasksWithMultipleHostTypes() asserts
+ that these tasks each run on their own stage. -->
+ <task xsi:type="execute" hosts="all" sequential="true">
+ <summary>Shut down all Oozie servers</summary>
+ <script>scripts/oozie_server.py</script>
+ <function>stop</function>
+ </task>
+
+ <task xsi:type="execute" hosts="any" sequential="true">
+ <summary>Upgrading the Oozie database and creating a new sharelib</summary>
+ <script>scripts/oozie_server_upgrade.py</script>
+ <function>upgrade_oozie_database_and_sharelib</function>
+ </task>
+ </pre-upgrade>
+ <pre-downgrade copy-upgrade="true" />
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ </component>
+
+ <component name="OOZIE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ </component>
+ </service>
+ </processing>
+</upgrade>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b238b367/ambari-server/src/test/resources/version_definition_test_patch_config.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/version_definition_test_patch_config.xml b/ambari-server/src/test/resources/version_definition_test_patch_config.xml
new file mode 100644
index 0000000..9260c5f
--- /dev/null
+++ b/ambari-server/src/test/resources/version_definition_test_patch_config.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!--
+ 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.
+-->
+
+<repository-version xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="version_definition.xsd">
+
+ <release>
+ <type>PATCH</type>
+ <stack-id>HDP-2.3</stack-id>
+ <version>2.3.4.1</version>
+ <build>1234</build>
+ <compatible-with>2.3.4.[1-9]</compatible-with>
+ <release-notes>http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/</release-notes>
+ </release>
+
+ <manifest>
+ <service id="ZOOKEEPER-346" name="ZOOKEEPER" version="3.4.6" />
+ </manifest>
+
+ <available-services>
+ <service idref="ZOOKEEPER-346" />
+ </available-services>
+
+ <repository-info>
+ <os family="redhat6">
+ <repo>
+ <baseurl>http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.3.0.0</baseurl>
+ <repoid>HDP-2.3</repoid>
+ <reponame>HDP</reponame>
+ <unique>true</unique>
+ </repo>
+ <repo>
+ <baseurl>http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6</baseurl>
+ <repoid>HDP-UTILS-1.1.0.20</repoid>
+ <reponame>HDP-UTILS</reponame>
+ <unique>false</unique>
+ </repo>
+ </os>
+ </repository-info>
+</repository-version>