You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by js...@apache.org on 2014/12/13 05:25:16 UTC

ambari git commit: AMBARI-8657. Add Kerberos Configuration Metadata File Builder and Reader

Repository: ambari
Updated Branches:
  refs/heads/trunk b62846d25 -> 3c08f6f7d


AMBARI-8657. Add Kerberos Configuration Metadata File Builder and Reader


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

Branch: refs/heads/trunk
Commit: 3c08f6f7d724dd566ebfb684fcf6e8acb598d27e
Parents: b62846d
Author: Robert Levas <rl...@hortonworks.com>
Authored: Fri Dec 12 23:24:01 2014 -0500
Committer: John Speidel <js...@hortonworks.com>
Committed: Fri Dec 12 23:24:01 2014 -0500

----------------------------------------------------------------------
 .../AbstractKerberosDataFileBuilder.java        | 124 ++++++++
 .../AbstractKerberosDataFileReader.java         | 116 ++++++++
 .../kerberos/CreateKeytabFilesServerAction.java |  11 +-
 .../kerberos/KerberosActionDataFile.java        |   5 +-
 .../kerberos/KerberosActionDataFileBuilder.java |  91 ++----
 .../kerberos/KerberosActionDataFileReader.java  |  75 +----
 .../kerberos/KerberosConfigDataFile.java        |  31 ++
 .../kerberos/KerberosConfigDataFileBuilder.java |  65 +++++
 .../kerberos/KerberosConfigDataFileReader.java  |  44 +++
 .../kerberos/KerberosServerAction.java          |   4 +-
 .../kerberos/KerberosActionDataFileTest.java    | 286 ++++++++++---------
 .../kerberos/KerberosConfigDataFileTest.java    | 146 ++++++++++
 12 files changed, 705 insertions(+), 293 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileBuilder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileBuilder.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileBuilder.java
new file mode 100644
index 0000000..cc2e2ff
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileBuilder.java
@@ -0,0 +1,124 @@
+/*
+ * 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.serveraction.kerberos;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVPrinter;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * AbstractKerberosDataFileBuilder provides a generic facility to write a data file using some
+ * underlying record-based file writer.
+ * <p/>
+ * This class encapsulates a {@link org.apache.commons.csv.CSVPrinter} to create a CSV-formatted file.
+ */
+public abstract class AbstractKerberosDataFileBuilder {
+
+  private File file;
+  private CSVPrinter csvPrinter;
+
+  /**
+   * Creates a new KerberosConfigDataFileBuilder
+   * <p/>
+   * The file is opened upon creation, so there is no need to manually open it unless manually
+   * closed before using.
+   *
+   * @param file a File declaring where to write the data
+   * @throws java.io.IOException
+   */
+  public AbstractKerberosDataFileBuilder(File file) throws IOException {
+    this.file = file;
+    open();
+  }
+
+
+  /**
+   * Opens the data file for writing.
+   * <p/>
+   * This may be called multiple times and the appropriate action will occur depending on if the
+   * file has been previously opened or closed.
+   *
+   * @throws java.io.IOException
+   */
+  public void open() throws IOException {
+    if (isClosed()) {
+      if (file == null) {
+        throw new IOException("Missing file path");
+      } else {
+        csvPrinter = new CSVPrinter(new FileWriter(file, true), CSVFormat.DEFAULT);
+
+        // If the file is empty, write the header; else don't write the header.
+        if (file.length() == 0) {
+          // Write the header....
+          Iterable<?> headerRecord = getHeaderRecord();
+          csvPrinter.printRecord(headerRecord);
+        }
+      }
+    }
+  }
+
+  /**
+   * Tests this KerberosConfigDataFileBuilder to see if the data file is closed.
+   *
+   * @return true if closed; otherwise false
+   */
+  public boolean isClosed() {
+    return csvPrinter == null;
+  }
+
+  /**
+   * Closes the data file
+   *
+   * @throws java.io.IOException
+   */
+  public void close() throws IOException {
+    if (csvPrinter != null) {
+      csvPrinter.close();
+      csvPrinter = null;
+    }
+  }
+
+  /**
+   * Appends a new record to the data file
+   *
+   * @param record a collection of Strings declaring values for the columns of the file
+   * @throws java.io.IOException
+   */
+  protected void appendRecord(String... record) throws IOException {
+
+    if (csvPrinter == null) {
+      throw new IOException("Data file is not open");
+    }
+
+    csvPrinter.printRecord(record);
+  }
+
+
+  /**
+   * Gets the header record for the CSV file
+   *
+   * @return an Iterable containing the (ordered) list of Strings declaring the columns names
+   */
+  protected abstract Iterable<String> getHeaderRecord();
+
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileReader.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileReader.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileReader.java
new file mode 100644
index 0000000..2d9f98a
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractKerberosDataFileReader.java
@@ -0,0 +1,116 @@
+/*
+ * 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.serveraction.kerberos;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVRecord;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * AbstractKerberosDataFileReader implements common code to read existing Kerberos data files.
+ * <p/>
+ * This class encapsulates a {@link org.apache.commons.csv.CSVParser} to read a CSV-formatted file.
+ */
+public abstract class AbstractKerberosDataFileReader implements Iterable<Map<String, String>> {
+
+  private File file;
+  private CSVParser csvParser = null;
+
+  /**
+   * Creates a new AbstractKerberosDataFileReader
+   * <p/>
+   * The file is opened upon creation, so there is no need to manually open it unless manually
+   * closed before using.
+   *
+   * @param file a File declaring where to write the data
+   * @throws java.io.IOException
+   */
+  protected AbstractKerberosDataFileReader(File file) throws IOException {
+    this.file = file;
+    open();
+  }
+
+  /**
+   * Opens the data file for reading.
+   * <p/>
+   * This may be called multiple times and the appropriate action will occur depending on if the
+   * file has been previously opened or closed.
+   *
+   * @throws java.io.IOException
+   */
+  public void open() throws IOException {
+    if (isClosed()) {
+      csvParser = CSVParser.parse(file, Charset.defaultCharset(), CSVFormat.DEFAULT.withHeader());
+    }
+  }
+
+  /**
+   * Tests this AbstractKerberosDataFileReader to see if the data file is closed.
+   *
+   * @return true if closed; otherwise false
+   */
+  public boolean isClosed() {
+    return csvParser == null;
+  }
+
+  public void close() throws IOException {
+    if (csvParser != null) {
+      csvParser.close();
+      csvParser = null;
+    }
+  }
+
+  /**
+   * Gets an iterator to use to access the records in the data file.
+   * <p/>
+   * Each item is a Map of column names to values.
+   *
+   * @return an Iterator of records from the data file, each record is represented as a Map of
+   * column name (String) to column value (String)
+   */
+  @Override
+  public Iterator<Map<String, String>> iterator() {
+    return new Iterator<Map<String, String>>() {
+      Iterator<CSVRecord> iterator = (csvParser == null) ? null : csvParser.iterator();
+
+      @Override
+      public boolean hasNext() {
+        return (iterator != null) && iterator.hasNext();
+      }
+
+      @Override
+      public Map<String, String> next() {
+        return (iterator == null) ? null : iterator.next().toMap();
+      }
+
+      @Override
+      public void remove() {
+        if (iterator != null) {
+          iterator.remove();
+        }
+      }
+    };
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
index 057bf18..e8e3a2e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
@@ -29,6 +29,9 @@ import java.io.File;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
 
+import static org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFile.HOSTNAME;
+import static org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFile.KEYTAB_FILE_PATH;
+
 /**
  * CreateKeytabFilesServerAction is a ServerAction implementation that creates keytab files as
  * instructed.
@@ -73,9 +76,9 @@ public class CreateKeytabFilesServerAction extends KerberosServerAction {
    * {@link org.apache.ambari.server.serveraction.kerberos.KerberosOperationHandler} to generate
    * the keytab file. To help avoid filename collisions and to build a structure that is easy to
    * discover, each keytab file is stored in host-specific
-   * ({@link org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFileReader#HOSTNAME})
+   * ({@link org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFile#HOSTNAME})
    * directory using the SHA1 hash of its destination file path
-   * ({@link org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFileReader#KEYTAB_FILE_PATH})
+   * ({@link org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFile#KEYTAB_FILE_PATH})
    * <p/>
    * <pre>
    *   data_directory
@@ -114,8 +117,8 @@ public class CreateKeytabFilesServerAction extends KerberosServerAction {
         Map<String, String> principalPasswordMap = getPrincipalPasswordMap(requestSharedDataContext);
 
         if (principalPasswordMap != null) {
-          String host = identityRecord.get(KerberosActionDataFileBuilder.HOSTNAME);
-          String keytabFilePath = identityRecord.get(KerberosActionDataFileBuilder.KEYTAB_FILE_PATH);
+          String host = identityRecord.get(HOSTNAME);
+          String keytabFilePath = identityRecord.get(KEYTAB_FILE_PATH);
 
           if ((host != null) && !host.isEmpty() && (keytabFilePath != null) && !keytabFilePath.isEmpty()) {
             // Look up the current evaluatedPrincipal's password.

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFile.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFile.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFile.java
index f2a0f06..5f5d708 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFile.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFile.java
@@ -19,9 +19,10 @@
 package org.apache.ambari.server.serveraction.kerberos;
 
 /**
- * An interface to contain common record column names for KerberosActionDataFile classes.
+ * KerberosActionDataFile declares the default data file name and the common record column names
+ * for the Kerberos action (metadata) data files.
  */
-public interface KerberosActionDataFile {
+public class KerberosActionDataFile {
   public static final String DATA_FILE_NAME = "index.dat";
 
   public static final String HOSTNAME = "hostname";

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileBuilder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileBuilder.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileBuilder.java
index b19e6f4..60bdea8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileBuilder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileBuilder.java
@@ -18,12 +18,11 @@
 
 package org.apache.ambari.server.serveraction.kerberos;
 
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVPrinter;
+import static org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFile.*;
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
+import java.util.Arrays;
 
 /**
  * KerberosActionDataFileBuilder is an implementation of a KerberosActionDataFile that is used to
@@ -31,10 +30,7 @@ import java.io.IOException;
  * <p/>
  * This class encapsulates a {@link org.apache.commons.csv.CSVPrinter} to create a CSV-formatted file.
  */
-public class KerberosActionDataFileBuilder implements KerberosActionDataFile {
-
-  private File file;
-  private CSVPrinter csvPrinter;
+public class KerberosActionDataFileBuilder extends AbstractKerberosDataFileBuilder {
 
   /**
    * Creates a new KerberosActionDataFileBuilder
@@ -46,67 +42,9 @@ public class KerberosActionDataFileBuilder implements KerberosActionDataFile {
    * @throws IOException
    */
   public KerberosActionDataFileBuilder(File file) throws IOException {
-    this.file = file;
-    open();
-  }
-
-
-  /**
-   * Opens the data file for writing.
-   * <p/>
-   * This may be called multiple times and the appropriate action will occur depending on if the
-   * file has been previously opened or closed.
-   *
-   * @throws IOException
-   */
-  public void open() throws IOException {
-    if (isClosed()) {
-      if (file == null) {
-        throw new IOException("Missing file path");
-      } else {
-        // If the file is empty, write the header; else don't write the header.
-        boolean writeHeader = file.length() == 0;
-
-        csvPrinter = new CSVPrinter(new FileWriter(file, true), CSVFormat.DEFAULT);
-
-        if (writeHeader) {
-          // Write the header....
-          csvPrinter.printRecord(HOSTNAME,
-              SERVICE,
-              COMPONENT,
-              PRINCIPAL,
-              PRINCIPAL_CONFIGURATION,
-              KEYTAB_FILE_PATH,
-              KEYTAB_FILE_OWNER_NAME,
-              KEYTAB_FILE_OWNER_ACCESS,
-              KEYTAB_FILE_GROUP_NAME,
-              KEYTAB_FILE_GROUP_ACCESS,
-              KEYTAB_FILE_CONFIGURATION);
-        }
-      }
-    }
-  }
-
-  /**
-   * Tests this KerberosActionDataFileBuilder to see if the data file is closed.
-   *
-   * @return true if closed; otherwise false
-   */
-  public boolean isClosed() {
-    return csvPrinter == null;
+    super(file);
   }
 
-  /**
-   * Closes the data file
-   *
-   * @throws IOException
-   */
-  public void close() throws IOException {
-    if (csvPrinter != null) {
-      csvPrinter.close();
-      csvPrinter = null;
-    }
-  }
 
   /**
    * Appends a new record to the data file
@@ -138,12 +76,7 @@ public class KerberosActionDataFileBuilder implements KerberosActionDataFile {
                         String keytabFileOwnerName, String keytabFileOwnerAccess,
                         String keytabFileGroupName, String keytabFileGroupAccess,
                         String keytabFileConfiguration) throws IOException {
-
-    if (csvPrinter == null) {
-      throw new IOException("Data file is not open");
-    }
-
-    csvPrinter.printRecord(hostName,
+    super.appendRecord(hostName,
         serviceName,
         serviceComponentName,
         principal,
@@ -156,4 +89,18 @@ public class KerberosActionDataFileBuilder implements KerberosActionDataFile {
         keytabFileConfiguration);
   }
 
+  @Override
+  protected Iterable<String> getHeaderRecord() {
+    return Arrays.asList(HOSTNAME,
+        SERVICE,
+        COMPONENT,
+        PRINCIPAL,
+        PRINCIPAL_CONFIGURATION,
+        KEYTAB_FILE_PATH,
+        KEYTAB_FILE_OWNER_NAME,
+        KEYTAB_FILE_OWNER_ACCESS,
+        KEYTAB_FILE_GROUP_NAME,
+        KEYTAB_FILE_GROUP_ACCESS,
+        KEYTAB_FILE_CONFIGURATION);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileReader.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileReader.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileReader.java
index f3d93f5..cf872ca 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileReader.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileReader.java
@@ -18,15 +18,8 @@
 
 package org.apache.ambari.server.serveraction.kerberos;
 
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVParser;
-import org.apache.commons.csv.CSVRecord;
-
 import java.io.File;
 import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.Iterator;
-import java.util.Map;
 
 /**
  * KerberosActionDataFileReader is an implementation of a KerberosActionDataFile that is used to
@@ -34,11 +27,7 @@ import java.util.Map;
  * <p/>
  * This class encapsulates a {@link org.apache.commons.csv.CSVParser} to read a CSV-formatted file.
  */
-public class KerberosActionDataFileReader implements KerberosActionDataFile, Iterable<Map<String, String>> {
-
-  private File file;
-  private CSVParser csvParser = null;
-
+public class KerberosActionDataFileReader extends AbstractKerberosDataFileReader {
 
   /**
    * Creates a new KerberosActionDataFileReader
@@ -50,66 +39,6 @@ public class KerberosActionDataFileReader implements KerberosActionDataFile, Ite
    * @throws IOException
    */
   public KerberosActionDataFileReader(File file) throws IOException {
-    this.file = file;
-    open();
-  }
-
-
-  /**
-   * Opens the data file for reading.
-   * <p/>
-   * This may be called multiple times and the appropriate action will occur depending on if the
-   * file has been previously opened or closed.
-   *
-   * @throws IOException
-   */
-  public void open() throws IOException {
-    if (isClosed()) {
-      csvParser = CSVParser.parse(file, Charset.defaultCharset(), CSVFormat.DEFAULT.withHeader());
-    }
-  }
-
-
-  /**
-   * Tests this KerberosActionDataFileReader  to see if the data file is closed.
-   *
-   * @return true if closed; otherwise false
-   */
-  public boolean isClosed() {
-    return csvParser == null;
-  }
-
-  public void close() throws IOException {
-    csvParser.close();
-    csvParser = null;
-  }
-
-  /**
-   * Gets an iterator to use to access the records in the data file.
-   * <p/>
-   * Each item is a Map of column names to values.
-   *
-   * @return an Iterator
-   */
-  @Override
-  public Iterator<Map<String, String>> iterator() {
-    return new Iterator<Map<String, String>>() {
-      Iterator<CSVRecord> iterator = csvParser.iterator();
-
-      @Override
-      public boolean hasNext() {
-        return iterator.hasNext();
-      }
-
-      @Override
-      public Map<String, String> next() {
-        return iterator.next().toMap();
-      }
-
-      @Override
-      public void remove() {
-        iterator.remove();
-      }
-    };
+    super(file);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFile.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFile.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFile.java
new file mode 100644
index 0000000..db1a1d1
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFile.java
@@ -0,0 +1,31 @@
+/*
+ * 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.serveraction.kerberos;
+
+/**
+ * KerberosConfigDataFile declares the default data file name and the common record column names
+ * for the Kerberos configuration data files.
+ */
+public class KerberosConfigDataFile {
+  public static final String DATA_FILE_NAME = "configs.dat";
+
+  public static final String CONFIGURATION_TYPE = "config";
+  public static final String KEY = "key";
+  public static final String VALUE = "value";
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileBuilder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileBuilder.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileBuilder.java
new file mode 100644
index 0000000..20027bc
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileBuilder.java
@@ -0,0 +1,65 @@
+/*
+ * 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.serveraction.kerberos;
+
+import static org.apache.ambari.server.serveraction.kerberos.KerberosConfigDataFile.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+
+/**
+ * KerberosConfigDataFileBuilder is an implementation of a KerberosConfigDataFile that is used to
+ * create a new KerberosConfigDataFile.
+ * <p/>
+ * This class encapsulates a {@link org.apache.commons.csv.CSVPrinter} to create a CSV-formatted file.
+ */
+public class KerberosConfigDataFileBuilder extends AbstractKerberosDataFileBuilder {
+
+  /**
+   * Creates a new KerberosConfigDataFileBuilder
+   * <p/>
+   * The file is opened upon creation, so there is no need to manually open it unless manually
+   * closed before using.
+   *
+   * @param file a File declaring where to write the data
+   * @throws java.io.IOException
+   */
+  public KerberosConfigDataFileBuilder(File file) throws IOException {
+    super(file);
+  }
+
+
+  /**
+   * Appends a new record to the data file
+   *
+   * @param config a String declaring the relevant configuration type for the key and value
+   * @param key    a String declaring the key (or property name) with in the relevant configuration type
+   * @param value  a String containing the value of the configuration property
+   * @throws java.io.IOException
+   */
+  public void addRecord(String config, String key, String value) throws IOException {
+    super.appendRecord(config, key, value);
+  }
+
+  @Override
+  protected Iterable<String> getHeaderRecord() {
+    return Arrays.asList(CONFIGURATION_TYPE, KEY, VALUE);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileReader.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileReader.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileReader.java
new file mode 100644
index 0000000..a230814
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileReader.java
@@ -0,0 +1,44 @@
+/*
+ * 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.serveraction.kerberos;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * KerberosConfigDataFileReader is an implementation of a KerberosConfigDataFile that is used to
+ * read existing KerberosConfigDataFiles.
+ * <p/>
+ * This class encapsulates a {@link org.apache.commons.csv.CSVParser} to read a CSV-formatted file.
+ */
+public class KerberosConfigDataFileReader extends AbstractKerberosDataFileReader {
+
+  /**
+   * Creates a new KerberosConfigDataFileReader
+   * <p/>
+   * The file is opened upon creation, so there is no need to manually open it unless manually
+   * closed before using.
+   *
+   * @param file a File declaring where to write the data
+   * @throws java.io.IOException
+   */
+  public KerberosConfigDataFileReader(File file) throws IOException {
+    super(file);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerAction.java
index 788e087..7a2412c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/KerberosServerAction.java
@@ -25,6 +25,8 @@ import org.apache.ambari.server.serveraction.AbstractServerAction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.ambari.server.serveraction.kerberos.KerberosActionDataFile.DATA_FILE_NAME;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
@@ -250,7 +252,7 @@ public abstract class KerberosServerAction extends AbstractServerAction {
           throw new AmbariException(message);
         }
         // The "index" file is expected to be in the specified data directory and named "index.dat"
-        File indexFile = new File(dataDirectory, KerberosActionDataFileBuilder.DATA_FILE_NAME);
+        File indexFile = new File(dataDirectory, DATA_FILE_NAME);
 
         if (!indexFile.canRead()) {
           String message = String.format("Failed to process the identities, cannot read the index file: %s",

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileTest.java
index 71b3084..7958b6e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosActionDataFileTest.java
@@ -19,7 +19,9 @@
 package org.apache.ambari.server.serveraction.kerberos;
 
 import junit.framework.Assert;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
 import java.io.File;
 import java.util.Iterator;
@@ -31,172 +33,174 @@ import java.util.Map;
  */
 public class KerberosActionDataFileTest {
 
+  @Rule
+  public TemporaryFolder folder = new TemporaryFolder();
+
   @Test
   public void testKerberosActionDataFile() throws Exception {
-    File file = File.createTempFile("ambari_ut_", "dat");
+    File file = folder.newFile();
     Assert.assertNotNull(file);
 
-    try {
-      // Write the data
-      KerberosActionDataFileBuilder builder = new KerberosActionDataFileBuilder(file);
-      Assert.assertFalse(builder.isClosed());
-
-      for (int i = 0; i < 10; i++) {
-        builder.addRecord("hostName" + i, "serviceName" + i, "serviceComponentName" + i,
-            "principal" + i, "principalConfiguration" + i, "keytabFilePath" + i,
-            "keytabFileOwnerName" + i, "keytabFileOwnerAccess" + i,
-            "keytabFileGroupName" + i, "keytabFileGroupAccess" + i,
-            "keytabFileConfiguration" + i);
-      }
+    // Write the data
+    KerberosActionDataFileBuilder builder = new KerberosActionDataFileBuilder(file);
+    Assert.assertFalse(builder.isClosed());
+
+    for (int i = 0; i < 10; i++) {
+      builder.addRecord("hostName" + i, "serviceName" + i, "serviceComponentName" + i,
+          "principal" + i, "principalConfiguration" + i, "keytabFilePath" + i,
+          "keytabFileOwnerName" + i, "keytabFileOwnerAccess" + i,
+          "keytabFileGroupName" + i, "keytabFileGroupAccess" + i,
+          "keytabFileConfiguration" + i);
+    }
 
-      // Add some odd characters
-      builder.addRecord("hostName's", "serviceName#", "serviceComponentName\"",
-          "principal", "principalConfiguration", "keytabFilePath",
-          "'keytabFileOwnerName'", "<keytabFileOwnerAccess>",
-          "\"keytabFileGroupName\"", "keytab,File,Group,Access",
-          "\"keytab,'File',Configuration\"");
-
-      builder.close();
-      Assert.assertTrue(builder.isClosed());
-
-      // Read the data...
-      KerberosActionDataFileReader reader = new KerberosActionDataFileReader(file);
-      Assert.assertFalse(reader.isClosed());
-
-      Iterator<Map<String, String>> iterator = reader.iterator();
-      Assert.assertNotNull(iterator);
-
-      // Test iterator
-      int i = 0;
-      while (iterator.hasNext()) {
-        Map<String, String> record = iterator.next();
-
-        if (i < 10) {
-          Assert.assertEquals("hostName" + i, record.get(KerberosActionDataFile.HOSTNAME));
-          Assert.assertEquals("serviceName" + i, record.get(KerberosActionDataFile.SERVICE));
-          Assert.assertEquals("serviceComponentName" + i, record.get(KerberosActionDataFile.COMPONENT));
-          Assert.assertEquals("principal" + i, record.get(KerberosActionDataFile.PRINCIPAL));
-          Assert.assertEquals("principalConfiguration" + i, record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
-          Assert.assertEquals("keytabFilePath" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
-          Assert.assertEquals("keytabFileOwnerName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
-          Assert.assertEquals("keytabFileOwnerAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
-          Assert.assertEquals("keytabFileGroupName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
-          Assert.assertEquals("keytabFileGroupAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
-          Assert.assertEquals("keytabFileConfiguration" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
-        } else {
-          Assert.assertEquals("hostName's", record.get(KerberosActionDataFile.HOSTNAME));
-          Assert.assertEquals("serviceName#", record.get(KerberosActionDataFile.SERVICE));
-          Assert.assertEquals("serviceComponentName\"", record.get(KerberosActionDataFile.COMPONENT));
-          Assert.assertEquals("principal", record.get(KerberosActionDataFile.PRINCIPAL));
-          Assert.assertEquals("principalConfiguration", record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
-          Assert.assertEquals("keytabFilePath", record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
-          Assert.assertEquals("'keytabFileOwnerName'", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
-          Assert.assertEquals("<keytabFileOwnerAccess>", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
-          Assert.assertEquals("\"keytabFileGroupName\"", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
-          Assert.assertEquals("keytab,File,Group,Access", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
-          Assert.assertEquals("\"keytab,'File',Configuration\"", record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
-        }
-
-        i++;
+    // Add some odd characters
+    builder.addRecord("hostName's", "serviceName#", "serviceComponentName\"",
+        "principal", "principalConfiguration", "keytabFilePath",
+        "'keytabFileOwnerName'", "<keytabFileOwnerAccess>",
+        "\"keytabFileGroupName\"", "keytab,File,Group,Access",
+        "\"keytab,'File',Configuration\"");
+
+    builder.close();
+    Assert.assertTrue(builder.isClosed());
+
+    // Read the data...
+    KerberosActionDataFileReader reader = new KerberosActionDataFileReader(file);
+    Assert.assertFalse(reader.isClosed());
+
+    Iterator<Map<String, String>> iterator = reader.iterator();
+    Assert.assertNotNull(iterator);
+
+    // Test iterator
+    int i = 0;
+    while (iterator.hasNext()) {
+      Map<String, String> record = iterator.next();
+
+      if (i < 10) {
+        Assert.assertEquals("hostName" + i, record.get(KerberosActionDataFile.HOSTNAME));
+        Assert.assertEquals("serviceName" + i, record.get(KerberosActionDataFile.SERVICE));
+        Assert.assertEquals("serviceComponentName" + i, record.get(KerberosActionDataFile.COMPONENT));
+        Assert.assertEquals("principal" + i, record.get(KerberosActionDataFile.PRINCIPAL));
+        Assert.assertEquals("principalConfiguration" + i, record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
+        Assert.assertEquals("keytabFilePath" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
+        Assert.assertEquals("keytabFileOwnerName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
+        Assert.assertEquals("keytabFileOwnerAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
+        Assert.assertEquals("keytabFileGroupName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
+        Assert.assertEquals("keytabFileGroupAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
+        Assert.assertEquals("keytabFileConfiguration" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
+      } else {
+        Assert.assertEquals("hostName's", record.get(KerberosActionDataFile.HOSTNAME));
+        Assert.assertEquals("serviceName#", record.get(KerberosActionDataFile.SERVICE));
+        Assert.assertEquals("serviceComponentName\"", record.get(KerberosActionDataFile.COMPONENT));
+        Assert.assertEquals("principal", record.get(KerberosActionDataFile.PRINCIPAL));
+        Assert.assertEquals("principalConfiguration", record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
+        Assert.assertEquals("keytabFilePath", record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
+        Assert.assertEquals("'keytabFileOwnerName'", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
+        Assert.assertEquals("<keytabFileOwnerAccess>", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
+        Assert.assertEquals("\"keytabFileGroupName\"", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
+        Assert.assertEquals("keytab,File,Group,Access", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
+        Assert.assertEquals("\"keytab,'File',Configuration\"", record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
       }
 
-      reader.close();
-      Assert.assertTrue(reader.isClosed());
-      reader.open();
-      Assert.assertFalse(reader.isClosed());
-
-      i = 0;
-      for (Map<String, String> record : reader) {
-        if (i < 10) {
-          Assert.assertEquals("hostName" + i, record.get(KerberosActionDataFile.HOSTNAME));
-          Assert.assertEquals("serviceName" + i, record.get(KerberosActionDataFile.SERVICE));
-          Assert.assertEquals("serviceComponentName" + i, record.get(KerberosActionDataFile.COMPONENT));
-          Assert.assertEquals("principal" + i, record.get(KerberosActionDataFile.PRINCIPAL));
-          Assert.assertEquals("principalConfiguration" + i, record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
-          Assert.assertEquals("keytabFilePath" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
-          Assert.assertEquals("keytabFileOwnerName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
-          Assert.assertEquals("keytabFileOwnerAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
-          Assert.assertEquals("keytabFileGroupName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
-          Assert.assertEquals("keytabFileGroupAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
-          Assert.assertEquals("keytabFileConfiguration" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
-        } else {
-          Assert.assertEquals("hostName's", record.get(KerberosActionDataFile.HOSTNAME));
-          Assert.assertEquals("serviceName#", record.get(KerberosActionDataFile.SERVICE));
-          Assert.assertEquals("serviceComponentName\"", record.get(KerberosActionDataFile.COMPONENT));
-          Assert.assertEquals("principal", record.get(KerberosActionDataFile.PRINCIPAL));
-          Assert.assertEquals("principalConfiguration", record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
-          Assert.assertEquals("keytabFilePath", record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
-          Assert.assertEquals("'keytabFileOwnerName'", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
-          Assert.assertEquals("<keytabFileOwnerAccess>", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
-          Assert.assertEquals("\"keytabFileGroupName\"", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
-          Assert.assertEquals("keytab,File,Group,Access", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
-          Assert.assertEquals("\"keytab,'File',Configuration\"", record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
-        }
-
-        i++;
+      i++;
+    }
+
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
+    reader.open();
+    Assert.assertFalse(reader.isClosed());
+
+    i = 0;
+    for (Map<String, String> record : reader) {
+      if (i < 10) {
+        Assert.assertEquals("hostName" + i, record.get(KerberosActionDataFile.HOSTNAME));
+        Assert.assertEquals("serviceName" + i, record.get(KerberosActionDataFile.SERVICE));
+        Assert.assertEquals("serviceComponentName" + i, record.get(KerberosActionDataFile.COMPONENT));
+        Assert.assertEquals("principal" + i, record.get(KerberosActionDataFile.PRINCIPAL));
+        Assert.assertEquals("principalConfiguration" + i, record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
+        Assert.assertEquals("keytabFilePath" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
+        Assert.assertEquals("keytabFileOwnerName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
+        Assert.assertEquals("keytabFileOwnerAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
+        Assert.assertEquals("keytabFileGroupName" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
+        Assert.assertEquals("keytabFileGroupAccess" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
+        Assert.assertEquals("keytabFileConfiguration" + i, record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
+      } else {
+        Assert.assertEquals("hostName's", record.get(KerberosActionDataFile.HOSTNAME));
+        Assert.assertEquals("serviceName#", record.get(KerberosActionDataFile.SERVICE));
+        Assert.assertEquals("serviceComponentName\"", record.get(KerberosActionDataFile.COMPONENT));
+        Assert.assertEquals("principal", record.get(KerberosActionDataFile.PRINCIPAL));
+        Assert.assertEquals("principalConfiguration", record.get(KerberosActionDataFile.PRINCIPAL_CONFIGURATION));
+        Assert.assertEquals("keytabFilePath", record.get(KerberosActionDataFile.KEYTAB_FILE_PATH));
+        Assert.assertEquals("'keytabFileOwnerName'", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_NAME));
+        Assert.assertEquals("<keytabFileOwnerAccess>", record.get(KerberosActionDataFile.KEYTAB_FILE_OWNER_ACCESS));
+        Assert.assertEquals("\"keytabFileGroupName\"", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_NAME));
+        Assert.assertEquals("keytab,File,Group,Access", record.get(KerberosActionDataFile.KEYTAB_FILE_GROUP_ACCESS));
+        Assert.assertEquals("\"keytab,'File',Configuration\"", record.get(KerberosActionDataFile.KEYTAB_FILE_CONFIGURATION));
       }
 
-      reader.close();
-      Assert.assertTrue(reader.isClosed());
+      i++;
+    }
 
-      // Add an additional record
-      builder.open();
-      Assert.assertFalse(builder.isClosed());
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
 
-      builder.addRecord("hostName", "serviceName", "serviceComponentName",
-          "principal", "principalConfiguration", "keytabFilePath",
-          "keytabFileOwnerName", "keytabFileOwnerAccess",
-          "keytabFileGroupName", "keytabFileGroupAccess",
-          "keytabFileConfiguration");
+    // Add an additional record
+    builder.open();
+    Assert.assertFalse(builder.isClosed());
 
-      builder.close();
-      Assert.assertTrue(builder.isClosed());
+    builder.addRecord("hostName", "serviceName", "serviceComponentName",
+        "principal", "principalConfiguration", "keytabFilePath",
+        "keytabFileOwnerName", "keytabFileOwnerAccess",
+        "keytabFileGroupName", "keytabFileGroupAccess",
+        "keytabFileConfiguration");
 
-      reader = new KerberosActionDataFileReader(file);
-      Assert.assertFalse(reader.isClosed());
+    builder.close();
+    Assert.assertTrue(builder.isClosed());
 
-      i = 0;
-      for (Map<String, String> record : reader) {
-        i++;
-      }
+    reader = new KerberosActionDataFileReader(file);
+    Assert.assertFalse(reader.isClosed());
 
-      Assert.assertEquals(12, i);
+    i = 0;
+    for (Map<String, String> record : reader) {
+      i++;
+    }
 
-      reader.close();
-      Assert.assertTrue(reader.isClosed());
+    Assert.assertEquals(12, i);
 
-      // Add an additional record
-      builder = new KerberosActionDataFileBuilder(file);
-      Assert.assertFalse(builder.isClosed());
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
 
-      builder.addRecord("hostName", "serviceName", "serviceComponentName",
-          "principal", "principalConfiguration", "keytabFilePath",
-          "keytabFileOwnerName", "keytabFileOwnerAccess",
-          "keytabFileGroupName", "keytabFileGroupAccess",
-          "keytabFileConfiguration");
+    // Add an additional record
+    builder = new KerberosActionDataFileBuilder(file);
+    Assert.assertFalse(builder.isClosed());
 
-      builder.close();
-      Assert.assertTrue(builder.isClosed());
+    builder.addRecord("hostName", "serviceName", "serviceComponentName",
+        "principal", "principalConfiguration", "keytabFilePath",
+        "keytabFileOwnerName", "keytabFileOwnerAccess",
+        "keytabFileGroupName", "keytabFileGroupAccess",
+        "keytabFileConfiguration");
 
-      reader.open();
-      Assert.assertFalse(reader.isClosed());
+    builder.close();
+    Assert.assertTrue(builder.isClosed());
 
-      i = 0;
-      for (Map<String, String> record : reader) {
-        i++;
-      }
+    reader.open();
+    Assert.assertFalse(reader.isClosed());
 
-      Assert.assertEquals(13, i);
+    i = 0;
+    for (Map<String, String> record : reader) {
+      i++;
+    }
 
-      reader.close();
-      Assert.assertTrue(reader.isClosed());
+    Assert.assertEquals(13, i);
 
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
 
-    } finally {
-      if (!file.delete()) {
-        file.deleteOnExit();
-      }
+    // trying to iterate over a closed reader...
+    i = 0;
+    for (Map<String, String> record : reader) {
+      i++;
     }
-  }
+    Assert.assertEquals(0, i);
 
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c08f6f7/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileTest.java
new file mode 100644
index 0000000..51822cb
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/KerberosConfigDataFileTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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.serveraction.kerberos;
+
+import junit.framework.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * This is a test to see how well the KerberosConfigDataFileBuilder and KerberosConfigDataFileReader
+ * work when the data temporaryDirectory is opened, close, reopened, and appended to.
+ */
+public class KerberosConfigDataFileTest {
+
+  @Rule
+  public TemporaryFolder folder = new TemporaryFolder();
+
+  @Test
+  public void testKerberosConfigDataFile() throws Exception {
+    File file = folder.newFile();
+    Assert.assertNotNull(file);
+
+    // Write the data
+    KerberosConfigDataFileBuilder builder = new KerberosConfigDataFileBuilder(file);
+    Assert.assertFalse(builder.isClosed());
+
+    for (int i = 0; i < 10; i++) {
+      builder.addRecord("config-type" + i, "key" + i, "value" + i);
+    }
+
+    builder.close();
+    Assert.assertTrue(builder.isClosed());
+
+    // Read the data...
+    KerberosConfigDataFileReader reader = new KerberosConfigDataFileReader(file);
+    Assert.assertFalse(reader.isClosed());
+
+    Iterator<Map<String, String>> iterator = reader.iterator();
+    Assert.assertNotNull(iterator);
+
+    // Test iterator
+    int i = 0;
+    while (iterator.hasNext()) {
+      Map<String, String> record = iterator.next();
+
+      if (i < 10) {
+        Assert.assertEquals("config-type" + i, record.get(KerberosConfigDataFile.CONFIGURATION_TYPE));
+        Assert.assertEquals("key" + i, record.get(KerberosConfigDataFile.KEY));
+        Assert.assertEquals("value" + i, record.get(KerberosConfigDataFile.VALUE));
+      }
+
+      i++;
+    }
+
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
+    reader.open();
+    Assert.assertFalse(reader.isClosed());
+
+    i = 0;
+    for (Map<String, String> record : reader) {
+      if (i < 10) {
+        Assert.assertEquals("config-type" + i, record.get(KerberosConfigDataFile.CONFIGURATION_TYPE));
+        Assert.assertEquals("key" + i, record.get(KerberosConfigDataFile.KEY));
+        Assert.assertEquals("value" + i, record.get(KerberosConfigDataFile.VALUE));
+      }
+
+      i++;
+    }
+
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
+
+    // Add an additional record
+    builder.open();
+    Assert.assertFalse(builder.isClosed());
+
+    builder.addRecord("config-type", "key", "value");
+
+    builder.close();
+    Assert.assertTrue(builder.isClosed());
+
+    reader = new KerberosConfigDataFileReader(file);
+    Assert.assertFalse(reader.isClosed());
+
+    i = 0;
+    for (Map<String, String> record : reader) {
+      i++;
+    }
+
+    Assert.assertEquals(11, i);
+
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
+
+    // Add an additional record
+    builder = new KerberosConfigDataFileBuilder(file);
+    Assert.assertFalse(builder.isClosed());
+
+    builder.addRecord("config-type", "key", "value");
+
+    builder.close();
+    Assert.assertTrue(builder.isClosed());
+
+    reader.open();
+    Assert.assertFalse(reader.isClosed());
+
+    i = 0;
+    for (Map<String, String> record : reader) {
+      i++;
+    }
+
+    Assert.assertEquals(12, i);
+
+    reader.close();
+    Assert.assertTrue(reader.isClosed());
+
+    // trying to iterate over a closed reader...
+    i = 0;
+    for (Map<String, String> record : reader) {
+      i++;
+    }
+    Assert.assertEquals(0, i);
+  }
+}
\ No newline at end of file