# 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.

<% def shell_config(shell_var, *puppet_var)
     puppet_var = puppet_var[0] || shell_var.downcase
     puppet_vars = scope.to_hash
     if puppet_vars[puppet_var]
        return "export #{shell_var}=#{puppet_vars[puppet_var]}"
     end
     return "#export #{shell_var}="
   end %>
# WARNING: Heavy puppet machinery is involved managing this file,
#          your edits stand no chance
#
# Set Hadoop-specific environment variables here.

# The only required environment variable is JAVA_HOME.  All others are
# optional.  When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.

# The java implementation to use.  Required.
<%= shell_config("JAVA_HOME", "hadoop_java_home") %>

# Extra Java CLASSPATH elements.  Optional.
<%= shell_config("HADOOP_CLASSPATH") %>

# The maximum amount of heap to use, in MB. Default is 1000.
<%= shell_config("HADOOP_HEAPSIZE") %>

# Extra Java runtime options.  Empty by default.
<%= shell_config("HADOOP_OPTS") %>

# Command specific options appended to HADOOP_OPTS when specified
<%= shell_config("HADOOP_NAMENODE_OPTS") %>
<%= shell_config("HADOOP_SECONDARYNAMENODE_OPTS") %>
<%= shell_config("HADOOP_DATANODE_OPTS") %>
<%= shell_config("HADOOP_BALANCER_OPTS") %>
<%= shell_config("HADOOP_JOBTRACKER_OPTS") %>
<%= shell_config("HADOOP_TASKTRACKER_OPTS") %>

# The following applies to multiple commands (fs, dfs, fsck, distcp etc)
<%= shell_config("HADOOP_CLIENT_OPTS") %>

# Extra ssh options.  Empty by default.
<%= shell_config("HADOOP_SSH_OPTS") %>

# Where log files are stored.  $HADOOP_HOME/logs by default.
<%= shell_config("HADOOP_LOG_DIR") %>

# File naming remote slave hosts.  $HADOOP_HOME/conf/slaves by default.
<%= shell_config("HADOOP_SLAVES") %>

# host:path where hadoop code should be rsync'd from.  Unset by default.
<%= shell_config("HADOOP_MASTER") %>

# Seconds to sleep between slave commands.  Unset by default.  This
# can be useful in large clusters, where, e.g., slave rsyncs can
# otherwise arrive faster than the master can service them.
<%= shell_config("HADOOP_SLAVE_SLEEP") %>

# The directory where pid files are stored. /tmp by default.
<%= shell_config("HADOOP_PID_DIR") %>

# A string representing this instance of hadoop. $USER by default.
<%= shell_config("HADOOP_IDENT_STRING") %>

# The scheduling priority for daemon processes.  See 'man nice'.
<%= shell_config("HADOOP_NICENESS") %>

<% if (@use_tez) -%>
# tez environment, needed to enable tez
<%= shell_config("TEZ_CONF_DIR") %>
<%= shell_config("TEZ_JARS") %>
# Add tez into HADOOP_CLASSPATH
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*

<% end -%>
### WARNING: the following is NOT really optional. It is a shame that stock Hadoop
### hadoop_env.sh doesn't make it clear -- you can NOT turn  com.sun.management.jmxremote off
### and have a working Hadoop cluster.
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
