Repository: ambari
Updated Branches:
  refs/heads/trunk 2c5073a43 -> f438398fd


AMBARI-12276. Ozzie running with pig fail to renew JHS delegation token when RU 
because JHS recovery is not enabled


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f438398f
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f438398f
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f438398f

Branch: refs/heads/trunk
Commit: f438398fd76741b01f39cbed3bba58aa1d9a4bc5
Parents: 2c5073a
Author: Sumit Mohanty <smoha...@hortonworks.com>
Authored: Fri Jul 10 06:26:31 2015 -0700
Committer: Sumit Mohanty <smoha...@hortonworks.com>
Committed: Fri Jul 10 06:26:31 2015 -0700

----------------------------------------------------------------------
 .../ambari/server/checks/CheckDescription.java  |  11 ++
 ...apReduce2JobHistoryStatePreservingCheck.java | 151 +++++++++++++++++
 .../2.1.0.2.0/package/scripts/params_linux.py   |   1 +
 .../YARN/2.1.0.2.0/package/scripts/yarn.py      |   6 +
 .../YARN/configuration-mapred/mapred-site.xml   |  50 ++++++
 ...duce2JobHistoryStatePreservingCheckTest.java | 163 +++++++++++++++++++
 .../stacks/2.0.6/YARN/test_historyserver.py     |  12 ++
 7 files changed, 394 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/f438398f/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
index 0cd5352..5cfbb47 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
@@ -152,6 +152,17 @@ public enum CheckDescription {
           "YARN should have state preserving restart enabled for the Timeline 
server. The yarn-site.xml property yarn.timeline-service.recovery.enabled 
should be set to true.");
       }}),
 
+  SERVICES_MR2_JOBHISTORY_ST(PrereqCheckType.SERVICE,
+      "MapReduce2 JobHistory recovery should be enabled",
+      new HashMap<String, String>() {{
+        
put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_ENABLE_KEY,
+          "MapReduce2 should have recovery enabled for the JobHistory server. 
The mapred-site.xml property mapreduce.jobhistory.recovery.enable should be set 
to true.");
+        
put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_KEY,
+          "MapReduce2 should have recovery enabled for the JobHistory server. 
The mapred-site.xml property mapreduce.jobhistory.recovery.store.class should 
be set to 
org.apache.hadoop.mapreduce.v2.hs.HistoryServerLeveldbStateStoreService.");
+        
put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_LEVELDB_PATH_KEY,
+          "MapReduce2 should have recovery enabled for the JobHistory server. 
The mapred-site.xml property mapreduce.jobhistory.recovery.store.leveldb.path 
should be set. Please note that 
\"mapreduce.jobhistory.recovery.store.leveldb.path\" should be on a mount with 
~3 GB of free space.");
+      }}),
+
   SERVICES_HIVE_DYNAMIC_SERVICE_DISCOVERY(PrereqCheckType.SERVICE,
       "Hive Dynamic Service Discovery",
       new HashMap<String, String>() {{

http://git-wip-us.apache.org/repos/asf/ambari/blob/f438398f/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
new file mode 100644
index 0000000..5f02c4f
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
@@ -0,0 +1,151 @@
+/*
+ * 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.ambari.server.checks;
+
+import com.google.inject.Singleton;
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.stack.PrereqCheckStatus;
+import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.utils.VersionUtils;
+import org.apache.commons.lang.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The {@link MapReduce2JobHistoryStatePreservingCheck}
+ * is used to check that the MR2 History server has state preserving mode 
enabled.
+ */
+@Singleton
+@UpgradeCheck(group = UpgradeCheckGroup.CONFIGURATION_WARNING, order = 1.0f)
+public class MapReduce2JobHistoryStatePreservingCheck extends 
AbstractCheckDescriptor {
+
+  final static String MAPREDUCE2_JOBHISTORY_RECOVERY_ENABLE_KEY =
+    "mapreduce.jobhistory.recovery.enable";
+  final static String MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_KEY =
+    "mapreduce.jobhistory.recovery.store.class";
+  final static String MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_LEVELDB_PATH_KEY =
+    "mapreduce.jobhistory.recovery.store.leveldb.path";
+  final static String YARN_TIMELINE_SERVICE_LEVELDB_STATE_STORE_PATH_KEY =
+    "yarn.timeline-service.leveldb-state-store.path";
+  /**
+   * Due to the introduction of MapReduce2 JobHistory state recovery only from 
certain
+   * stack-versions onwards, this check is not applicable to earlier versions
+   * of the stack.
+   *
+   * This enumeration lists the minimum stack-versions for which this check is 
applicable.
+   * If a stack is not specified in this enumeration, this check will be 
applicable.
+   */
+  private enum MinimumApplicableStackVersion {
+    HDP_STACK("HDP", "2.3.0.0");
+
+    private String stackName;
+    private String stackVersion;
+
+    private MinimumApplicableStackVersion(String stackName, String 
stackVersion) {
+      this.stackName = stackName;
+      this.stackVersion = stackVersion;
+    }
+
+    public String getStackName() {
+      return stackName;
+    }
+
+    public String getStackVersion() {
+      return stackVersion;
+    }
+  }
+
+  /**
+   * Constructor.
+   */
+  public MapReduce2JobHistoryStatePreservingCheck() {
+    super(CheckDescription.SERVICES_MR2_JOBHISTORY_ST);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
+    if (!super.isApplicable(request)) {
+      return false;
+    }
+
+    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
+    Map<String, Service> services = cluster.getServices();
+    if (!services.containsKey("MAPREDUCE2")) {
+      return false;
+    }
+
+    // Applicable only if stack not defined in MinimumApplicableStackVersion, 
or
+    // version equals or exceeds the enumerated version.
+    for (MinimumApplicableStackVersion minimumStackVersion : 
MinimumApplicableStackVersion.values()) {
+      String stackName = cluster.getCurrentStackVersion().getStackName();
+      if (minimumStackVersion.getStackName().equals(stackName)){
+        String targetVersion = request.getTargetStackId().getStackVersion();
+        String sourceVersion = request.getSourceStackId().getStackVersion();
+        return VersionUtils.compareVersions(targetVersion, 
minimumStackVersion.getStackVersion()) >= 0 &&
+               VersionUtils.compareVersions(sourceVersion, 
minimumStackVersion.getStackVersion()) >= 0;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
+    List<String> errorMessages = new ArrayList<String>();
+    PrereqCheckStatus checkStatus = PrereqCheckStatus.FAIL;
+
+    String enabled =
+      getProperty(request, "mapred-site", 
MAPREDUCE2_JOBHISTORY_RECOVERY_ENABLE_KEY);
+    String storeClass =
+      getProperty(request, "mapred-site", 
MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_KEY);
+    String storeLevelDbPath =
+      getProperty(request, "mapred-site", 
MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_LEVELDB_PATH_KEY);
+
+    if (null == enabled || !Boolean.parseBoolean(enabled)) {
+      
errorMessages.add(getFailReason(MAPREDUCE2_JOBHISTORY_RECOVERY_ENABLE_KEY, 
prerequisiteCheck, request));
+    }
+
+    if (StringUtils.isBlank(storeClass)) {
+      
errorMessages.add(getFailReason(MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_KEY, 
prerequisiteCheck,
+        request));
+    }
+
+    if (StringUtils.isBlank(storeLevelDbPath)) {
+      
errorMessages.add(getFailReason(MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_LEVELDB_PATH_KEY,
 prerequisiteCheck,
+        request));
+
+    }
+
+    if (!errorMessages.isEmpty()) {
+      prerequisiteCheck.setFailReason(StringUtils.join(errorMessages, "\n"));
+      prerequisiteCheck.getFailedOn().add("MAPREDUCE2");
+      prerequisiteCheck.setStatus(checkStatus);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/f438398f/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
 
b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
index 77092c1..4443476 100644
--- 
a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
+++ 
b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
@@ -214,6 +214,7 @@ yarn_nm_app_log_dir =  
config['configurations']['yarn-site']['yarn.nodemanager.r
 mapreduce_jobhistory_intermediate_done_dir = 
config['configurations']['mapred-site']['mapreduce.jobhistory.intermediate-done-dir']
 mapreduce_jobhistory_done_dir = 
config['configurations']['mapred-site']['mapreduce.jobhistory.done-dir']
 jobhistory_heapsize = 
default("/configurations/mapred-env/jobhistory_heapsize", "900")
+jhs_leveldb_state_store_dir = 
default('/configurations/mapred-site/mapreduce.jobhistory.recovery.store.leveldb.path',
 "/hadoop/mapreduce/jhs")
 
 # Tez-related properties
 tez_user = config['configurations']['tez-env']['tez_user']

http://git-wip-us.apache.org/repos/asf/ambari/blob/f438398f/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py
 
b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py
index df8d7ce..30629be 100644
--- 
a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py
+++ 
b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py
@@ -90,6 +90,12 @@ def yarn(name = None):
                          mode=0777
     )
     params.HdfsResource(None, action="execute")
+    Directory(params.jhs_leveldb_state_store_dir,
+              owner=params.mapred_user,
+              group=params.user_group,
+              recursive=True,
+              cd_access="a",
+              )
 
   if name == "nodemanager":
     Directory(params.nm_local_dirs.split(',') + params.nm_log_dirs.split(','),

http://git-wip-us.apache.org/repos/asf/ambari/blob/f438398f/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration-mapred/mapred-site.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration-mapred/mapred-site.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration-mapred/mapred-site.xml
new file mode 100644
index 0000000..bd5a911
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration-mapred/mapred-site.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+
+<!--
+   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.
+-->
+
+<!-- Put site-specific property overrides in this file. -->
+
+<configuration supports_final="true" 
xmlns:xi="http://www.w3.org/2001/XInclude";>
+
+  <property>
+    <name>mapreduce.jobhistory.recovery.enable</name>
+    <value>true</value>
+    <description>Enable the history server to store server state and recover
+      server state upon startup.  If enabled then
+      mapreduce.jobhistory.recovery.store.class must be specified.
+    </description>
+  </property>
+
+  <property>
+    <name>mapreduce.jobhistory.recovery.store.class</name>
+    
<value>org.apache.hadoop.mapreduce.v2.hs.HistoryServerLeveldbStateStoreService</value>
+    <description>The HistoryServerStateStoreService class to store history 
server
+      state for recovery.
+    </description>
+  </property>
+
+  <property>
+    <name>mapreduce.jobhistory.recovery.store.leveldb.path</name>
+    <value>/hadoop/mapreduce/jhs</value>
+    <description>The URI where history server state will be stored if 
HistoryServerLeveldbSystemStateStoreService
+      is configured as the recovery storage class.
+    </description>
+  </property>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/ambari/blob/f438398f/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
new file mode 100644
index 0000000..7ec3a3a
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.ambari.server.checks;
+
+import com.google.inject.Provider;
+import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.stack.PrereqCheckStatus;
+import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Tests for {@link 
org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheckTest}
+ */
+public class MapReduce2JobHistoryStatePreservingCheckTest {
+  private final Clusters m_clusters = Mockito.mock(Clusters.class);
+
+  private final MapReduce2JobHistoryStatePreservingCheck m_check = new 
MapReduce2JobHistoryStatePreservingCheck();
+
+  /**
+   *
+   */
+  @Before
+  public void setup() {
+    m_check.clustersProvider = new Provider<Clusters>() {
+
+      @Override
+      public Clusters get() {
+        return m_clusters;
+      }
+    };
+  }
+
+  /**
+   * @throws Exception
+   */
+  @Test
+  public void testIsApplicable() throws Exception {
+    final Cluster cluster = Mockito.mock(Cluster.class);
+    Mockito.when(cluster.getClusterId()).thenReturn(1L);
+    Mockito.when(m_clusters.getCluster("cluster")).thenReturn(cluster);
+    Mockito.when(cluster.getCurrentStackVersion()).thenReturn(new 
StackId("HDP-2.3"));
+
+    Map<String, Service> services = new HashMap<String, Service>();
+    Mockito.when(cluster.getServices()).thenReturn(services);
+
+    ClusterVersionEntity clusterVersionEntity = 
Mockito.mock(ClusterVersionEntity.class);
+    
Mockito.when(cluster.getCurrentClusterVersion()).thenReturn(clusterVersionEntity);
+
+    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setTargetStackId(new StackId("HDP", "2.3.1.1"));
+    request.setSourceStackId(new StackId("HDP", "2.3.0.0"));
+
+    // MAPREDUCE2 not installed
+    Assert.assertFalse(m_check.isApplicable(request));
+
+    // MAPREDUCE2 installed
+    services.put("MAPREDUCE2", Mockito.mock(Service.class));
+    Assert.assertTrue(m_check.isApplicable(request));
+
+    // Should not be supported for any upgrade from version less than 2.3.0.0
+    request.setTargetStackId(new StackId("HDP", "2.2.0.1"));
+    Assert.assertFalse(m_check.isApplicable(request));
+
+    request.setSourceStackId(new StackId("HDP", "2.2.0.1"));
+    request.setTargetStackId(new StackId("HDP", "2.3.0.0"));
+    Assert.assertFalse(m_check.isApplicable(request));
+
+    request.setSourceStackId(new StackId("HDP", "2.2.0.1"));
+    request.setTargetStackId(new StackId("HDP", "2.2.1.0"));
+    Assert.assertFalse(m_check.isApplicable(request));
+  }
+
+  @Test
+  public void testPerform() throws Exception {
+    final Cluster cluster = Mockito.mock(Cluster.class);
+    Mockito.when(cluster.getClusterId()).thenReturn(1L);
+    Mockito.when(m_clusters.getCluster("cluster")).thenReturn(cluster);
+
+    final DesiredConfig desiredConfig = Mockito.mock(DesiredConfig.class);
+    Mockito.when(desiredConfig.getTag()).thenReturn("tag");
+    Map<String, DesiredConfig> configMap = new HashMap<String, 
DesiredConfig>();
+    configMap.put("mapred-site", desiredConfig);
+    configMap.put("yarn-site", desiredConfig);
+
+    Mockito.when(cluster.getDesiredConfigs()).thenReturn(configMap);
+    final Config config = Mockito.mock(Config.class);
+    Mockito.when(cluster.getConfig(Mockito.anyString(), 
Mockito.anyString())).thenReturn(config);
+    final Map<String, String> properties = new HashMap<String, String>();
+    Mockito.when(config.getProperties()).thenReturn(properties);
+
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
+    m_check.perform(check, new PrereqCheckRequest("cluster"));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
+    
properties.put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_ENABLE_KEY,
 "true");
+    
properties.put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_KEY,
 "org.apache.hadoop.mapreduce.v2.hs.HistoryServerLeveldbStateStoreService");
+    
properties.put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_LEVELDB_PATH_KEY,
 "");
+    check = new PrerequisiteCheck(null, null);
+    m_check.perform(check, new PrereqCheckRequest("cluster"));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    check = new PrerequisiteCheck(null, null);
+    
properties.put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_LEVELDB_PATH_KEY,
 "/hadoop/yarn/timeline");
+    
properties.put(MapReduce2JobHistoryStatePreservingCheck.YARN_TIMELINE_SERVICE_LEVELDB_STATE_STORE_PATH_KEY,
 "not /hadoop/yarn/timeline");
+    m_check.perform(check, new PrereqCheckRequest("cluster"));
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+    check = new PrerequisiteCheck(null, null);
+    
properties.put(MapReduce2JobHistoryStatePreservingCheck.YARN_TIMELINE_SERVICE_LEVELDB_STATE_STORE_PATH_KEY,
 "/hadoop/yarn/timeline");
+    m_check.perform(check, new PrereqCheckRequest("cluster"));
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+  }
+
+  @SuppressWarnings("serial")
+  @Test
+  public void testIsApplicableMinimumStackVersion() throws Exception {
+    final Cluster cluster = Mockito.mock(Cluster.class);
+    Mockito.when(cluster.getClusterId()).thenReturn(1L);
+    Mockito.when(cluster.getServices()).thenReturn(new HashMap<String, 
Service>() {
+      {
+        put("MAPREDUCE2", null);
+      }
+    });
+    Mockito.when(cluster.getCurrentStackVersion()).thenReturn(new 
StackId("MYSTACK-12.2"));
+    ClusterVersionEntity clusterVersionEntity = 
Mockito.mock(ClusterVersionEntity.class);
+    
Mockito.when(cluster.getCurrentClusterVersion()).thenReturn(clusterVersionEntity);
+    RepositoryVersionEntity repositoryVersionEntity = 
Mockito.mock(RepositoryVersionEntity.class);
+    
Mockito.when(clusterVersionEntity.getRepositoryVersion()).thenReturn(repositoryVersionEntity);
+    Mockito.when(m_clusters.getCluster("c1")).thenReturn(cluster);
+    PrereqCheckRequest request = new PrereqCheckRequest("c1");
+
+    Mockito.when(repositoryVersionEntity.getVersion()).thenReturn("2.2.0.1");
+    boolean isApplicable = m_check.isApplicable(request);
+    Assert.assertTrue(isApplicable);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/f438398f/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py 
b/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
index 13d9ea9..6cf0f88 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
@@ -247,6 +247,12 @@ class TestHistoryServer(RMFTestCase):
         action = ['execute'], 
hdfs_site=self.getConfig()['configurations']['hdfs-site'], 
principal_name=UnknownConfigurationMock(), 
default_fs='hdfs://c6401.ambari.apache.org:8020',
         hadoop_conf_dir = '/etc/hadoop/conf',
     )
+    self.assertResourceCalled('Directory', '/hadoop/mapreduce/jhs',
+      owner = 'mapred',
+      group = 'hadoop',
+      recursive = True,
+      cd_access = 'a',
+    )
     self.assertResourceCalled('Directory', '/var/run/hadoop-yarn',
       owner = 'yarn',
       group = 'hadoop',
@@ -464,6 +470,12 @@ class TestHistoryServer(RMFTestCase):
         action = ['execute'], 
hdfs_site=self.getConfig()['configurations']['hdfs-site'], 
principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020',
         hadoop_conf_dir = '/etc/hadoop/conf',
     )
+    self.assertResourceCalled('Directory', '/hadoop/mapreduce/jhs',
+      owner = 'mapred',
+      group = 'hadoop',
+      recursive = True,
+      cd_access = 'a',
+    )
     self.assertResourceCalled('Directory', '/var/run/hadoop-yarn',
       owner = 'yarn',
       group = 'hadoop',

Reply via email to