WHIRR-751. Improve Kerberos service
diff --git a/services/kerberos/src/main/java/org/apache/whirr/service/kerberos/KerberosBaseHandler.java b/services/kerberos/src/main/java/org/apache/whirr/service/kerberos/KerberosBaseHandler.java
index e86555c..b23f3da 100644
--- a/services/kerberos/src/main/java/org/apache/whirr/service/kerberos/KerberosBaseHandler.java
+++ b/services/kerberos/src/main/java/org/apache/whirr/service/kerberos/KerberosBaseHandler.java
@@ -39,7 +39,12 @@
   protected void beforeBootstrap(ClusterActionEvent event) throws IOException {
     addStatement(event, call("configure_hostnames"));
     addStatement(event, call("retry_helpers"));
-    addStatement(event, call(getInstallFunction(event.getClusterSpec().getConfiguration(), "java", "install_openjdk")));
+    if (!(event.getClusterSpec().getConfiguration().containsKey("whirr.env.jdk_installed")
+        && event.getClusterSpec()
+        .getConfiguration().getBoolean("whirr.env.jdk_installed"))) {
+      addStatement(event,
+          call(getInstallFunction(event.getClusterSpec().getConfiguration(), "java", "install_openjdk")));
+    }
     addStatement(event, call("install_kerberos_client"));
   }
 
diff --git a/services/kerberos/src/main/resources/functions/configure_kerberos_server.sh b/services/kerberos/src/main/resources/functions/configure_kerberos_server.sh
index 6b78a95..6f002b2 100644
--- a/services/kerberos/src/main/resources/functions/configure_kerberos_server.sh
+++ b/services/kerberos/src/main/resources/functions/configure_kerberos_server.sh
@@ -20,10 +20,22 @@
 function configure_kerberos_server() {
   KERBEROS_USER=${KERBEROS_USER:-$CLUSTER_USER}
   KERBEROS_REALM_REGEX=$(echo $KERBEROS_REALM | sed s/\\\./\\\\\./g)
-  service krb5kdc stop
-  service kadmin stop
-  sed -i -e "s/EXAMPLE\.COM/$KERBEROS_REALM_REGEX/" /var/kerberos/krb5kdc/kdc.conf
-  yum install -y expect
+  if which dpkg &> /dev/null; then
+    KERBEROS_HOME=/etc/krb5kdc
+    KERBEROS_SERVICE_KDC=krb5-kdc
+    KERBEROS_SERVICE_ADMIN=krb5-admin-server
+    export DEBIAN_FRONTEND=noninteractive
+    retry_apt_get update
+    retry_apt_get -q -y install expect
+  elif which rpm &> /dev/null; then
+    KERBEROS_HOME=/var/kerberos/krb5kdc
+    KERBEROS_SERVICE_KDC=krb5kdc
+    KERBEROS_SERVICE_ADMIN=kadmin
+    retry_yum install -y expect
+  fi
+  service $KERBEROS_SERVICE_KDC stop
+  service $KERBEROS_SERVICE_ADMIN stop
+  sed -i -e "s/EXAMPLE\.COM/$KERBEROS_REALM_REGEX/" $KERBEROS_HOME/kdc.conf
   cat >> run_kdb5_util <<END
 #!/usr/bin/expect -f
 set timeout 5000
@@ -35,7 +47,11 @@
   chmod +x run_kdb5_util
   ./run_kdb5_util
   rm -rf run_kdb5_util
-  sed -i -e "s/EXAMPLE\.COM/$KERBEROS_REALM_REGEX/" /var/kerberos/krb5kdc/kadm5.acl
+  if [ -f $KERBEROS_HOME/kadm5.acl ]; then
+    sed -i -e "s/EXAMPLE\.COM/$KERBEROS_REALM_REGEX/" $KERBEROS_HOME/kadm5.acl
+  else
+    echo "*/admin@$KERBEROS_REALM	*" > $KERBEROS_HOME/kadm5.acl
+  fi
   cat >> run_addpinc <<END
 #!/usr/bin/expect -f
 set timeout 5000
@@ -52,9 +68,7 @@
   ./run_addpinc $KERBEROS_USER $KERBEROS_USER $KERBEROS_REALM
   ./run_addpinc hdfs hdfs $KERBEROS_REALM
   rm -rf ./run_addpinc
-  service krb5kdc start
-  service kadmin start
-  chkconfig krb5kdc on
-  chkconfig kadmin on
+  service $KERBEROS_SERVICE_KDC start
+  service $KERBEROS_SERVICE_ADMIN start
   CONFIGURE_KERBEROS_DONE=1
 }
diff --git a/services/kerberos/src/main/resources/functions/install_kerberos_client.sh b/services/kerberos/src/main/resources/functions/install_kerberos_client.sh
index 74a4189..9a21ef1 100644
--- a/services/kerberos/src/main/resources/functions/install_kerberos_client.sh
+++ b/services/kerberos/src/main/resources/functions/install_kerberos_client.sh
@@ -19,18 +19,32 @@
 
 function install_kerberos_client() {
   if which dpkg &> /dev/null; then
-    retry_apt_get -y install krb5-libs krb5-workstation unzip
+    export DEBIAN_FRONTEND=noninteractive
+    retry_apt_get update
+    retry_apt_get -q -y install krb5-user krb5-config unzip
   elif which rpm &> /dev/null; then
     retry_yum install -y krb5-libs krb5-workstation unzip
   fi
-  if [ ! -z "${JDK_INSTALL_URL+xxx}" ]; then
-    JCE_POLICY_URL=$(dirname $JDK_INSTALL_URL)"/jce_policy-6.zip"
-    wget $JCE_POLICY_URL
-    if [ -f jce_policy-6.zip ]; then
-	    unzip jce_policy-6.zip
-	    mkdir -p /tmp/java_security_old
-	    mv /usr/java/default/jre/lib/security/US_export_policy.jar /usr/java/default/jre/lib/security/local_policy.jar /tmp/java_security_old
-	    mv jce/*.jar /usr/java/default/jre/lib/security
+  if [ -z "${JAVA_HOME+xxx}" ]; then
+    if which java &> /dev/null; then
+      JAVA_HOME=$(readlink -f $(which java) | sed "s:/bin/java::")
+    fi
+  fi
+  if [ ! -z "${JAVA_HOME+xxx}" ]; then
+    JAVA_VERSION_MAJOR=$($JAVA_HOME/bin/java -version 2>&1 | grep "java version" | sed 's/java version \"1\.\([0-9]*\)\..*/\1/')
+    if [ "$JAVA_VERSION_MAJOR" == "6" ]; then
+        JAVA_JCE=jce_policy-6.zip
+    elif [ "$JAVA_VERSION_MAJOR" == "7" ]; then
+        JAVA_JCE=UnlimitedJCEPolicyJDK7.zip
+    fi
+    if [ ! -z "${JAVA_JCE+xxx}" ]; then
+      if [ ! -z "${JDK_INSTALL_URL+xxx}" ]; then
+        wget -nv $(dirname $JDK_INSTALL_URL)"/"$JAVA_JCE
+        if [ -f $JAVA_JCE ]; then
+        unzip -q -o -j $JAVA_JCE -d $JAVA_HOME/jre/lib/security
+          rm $JAVA_JCE
+        fi
+      fi
     fi
   fi
 }
diff --git a/services/kerberos/src/main/resources/functions/install_kerberos_server.sh b/services/kerberos/src/main/resources/functions/install_kerberos_server.sh
index 7a9b86c..0cf22ab 100644
--- a/services/kerberos/src/main/resources/functions/install_kerberos_server.sh
+++ b/services/kerberos/src/main/resources/functions/install_kerberos_server.sh
@@ -19,7 +19,9 @@
 
 function install_kerberos_server() {
   if which dpkg &> /dev/null; then
-    retry_apt_get -y install krb5-server
+    export DEBIAN_FRONTEND=noninteractive
+    retry_apt_get update
+    retry_apt_get -q -y install krb5-kdc krb5-admin-server
   elif which rpm &> /dev/null; then
     retry_yum install -y krb5-server
   fi
diff --git a/services/kerberos/src/test/java/org/apache/whirr/service/kerberos/KerberosServerDryRunTest.java b/services/kerberos/src/test/java/org/apache/whirr/service/kerberos/KerberosServerDryRunTest.java
index 5a80478..21b8531 100644
--- a/services/kerberos/src/test/java/org/apache/whirr/service/kerberos/KerberosServerDryRunTest.java
+++ b/services/kerberos/src/test/java/org/apache/whirr/service/kerberos/KerberosServerDryRunTest.java
@@ -23,8 +23,11 @@
 
 import java.util.Set;
 
+import junit.framework.AssertionFailedError;
+
 import org.apache.whirr.service.BaseServiceDryRunTest;
 import org.apache.whirr.service.DryRunModule.DryRun;
+import org.junit.Assert;
 import org.junit.Test;
 
 import com.google.common.base.Predicate;
@@ -57,4 +60,34 @@
     assertScriptPredicateOnPhase(dryRun, "configure", configurePredicate());
   }
 
+  @Test
+  public void testJavaInstalled() throws Exception {
+    DryRun dryRun = launchWithClusterSpec(newClusterSpecForProperties(ImmutableMap.of("whirr.instance-templates", "1 "
+        + KerberosServerHandler.ROLE + "+" + KerberosClientHandler.ROLE)));
+    assertScriptPredicateOnPhase(dryRun, "bootstrap", bootstrapPredicate());
+    assertScriptPredicateOnPhase(dryRun, "bootstrap", containsPattern("install_openjdk"));
+  }
+
+  @Test
+  public void testJavaInstalledFalse() throws Exception {
+    DryRun dryRun = launchWithClusterSpec(newClusterSpecForProperties(ImmutableMap.of("whirr.instance-templates", "1 "
+        + KerberosServerHandler.ROLE + "+" + KerberosClientHandler.ROLE, "whirr.env.jdk_installed", "false")));
+    assertScriptPredicateOnPhase(dryRun, "bootstrap", bootstrapPredicate());
+    assertScriptPredicateOnPhase(dryRun, "bootstrap", containsPattern("install_openjdk"));
+  }
+
+  @Test
+  public void testJavaInstalledTrue() throws Exception {
+    DryRun dryRun = launchWithClusterSpec(newClusterSpecForProperties(ImmutableMap.of("whirr.instance-templates", "1 "
+        + KerberosServerHandler.ROLE + "+" + KerberosClientHandler.ROLE, "whirr.env.jdk_installed", "true")));
+    assertScriptPredicateOnPhase(dryRun, "bootstrap", bootstrapPredicate());
+    boolean assertFailed = false;
+    try {
+      assertScriptPredicateOnPhase(dryRun, "bootstrap", containsPattern("install_openjdk"));
+    } catch (AssertionFailedError assertionFailedError) {
+      assertFailed = true;
+    }
+    Assert.assertTrue(assertFailed);
+  }
+
 }