You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2017/03/07 03:06:27 UTC

[6/7] asterixdb git commit: Configuration Revamp

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
index cc12f36..2061cda 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
@@ -58,7 +58,6 @@ import org.apache.asterix.transaction.management.resource.LSMBTreeLocalResourceM
 import org.apache.asterix.transaction.management.resource.PersistentLocalResourceFactoryProvider;
 import org.apache.asterix.transaction.management.runtime.CommitRuntime;
 import org.apache.asterix.transaction.management.service.logging.LogReader;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
 import org.apache.hyracks.algebricks.runtime.operators.std.EmptyTupleSourceRuntimeFactory;
@@ -93,6 +92,7 @@ import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
 import org.apache.hyracks.storage.common.file.ILocalResourceFactoryProvider;
 import org.apache.hyracks.storage.common.file.LocalResource;
 import org.apache.hyracks.test.support.TestUtils;
+import org.apache.hyracks.util.file.FileUtil;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -101,8 +101,7 @@ public class TestNodeController {
     protected static final Logger LOGGER = Logger.getLogger(TestNodeController.class.getName());
 
     protected static final String PATH_ACTUAL = "unittest" + File.separator;
-    protected static final String PATH_BASE =
-            StringUtils.join(new String[] { "src", "test", "resources", "nodetests" }, File.separator);
+    protected static final String PATH_BASE = FileUtil.joinPath("src", "test", "resources", "nodetests");
 
     protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
     protected static TransactionProperties txnProperties;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
new file mode 100644
index 0000000..b96b7fe
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.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.asterix.common.config;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.asterix.hyracks.bootstrap.CCApplicationEntryPoint;
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.Section;
+import org.apache.hyracks.control.common.config.ConfigManager;
+import org.apache.hyracks.util.file.FileUtil;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class ConfigUsageTest {
+
+    private static final String CSV_FILE = FileUtil.joinPath("target", "surefire-reports", "config-options.csv");
+
+    @Test
+    public void generateUsage() {
+        generateUsage("| ", " | ", " |", true, System.err);
+    }
+
+    @Test
+    public void generateUsageCSV() throws IOException {
+        new File(CSV_FILE).getParentFile().mkdirs();
+        try (final PrintStream output = new PrintStream(new FileOutputStream(CSV_FILE))) {
+            generateUsage("\"", "\",\"", "\"", false, output);
+            // TODO(mblow): add some validation (in addition to just ensuring no exceptions...)
+        }
+    }
+
+    public void generateUsage(String startDelim, String midDelim, String endDelim, boolean align, PrintStream output) {
+        ConfigManager configManager = new ConfigManager();
+        CCApplicationEntryPoint aep = new CCApplicationEntryPoint();
+        aep.registerConfig(configManager);
+        StringBuilder buf = new StringBuilder();
+        int maxSectionWidth = 0;
+        int maxNameWidth = 0;
+        int maxDescriptionWidth = 0;
+        int maxDefaultWidth = 0;
+        if (align) {
+            for (Section section : configManager.getSections()) {
+                maxSectionWidth = Math.max(maxSectionWidth, section.sectionName().length());
+                for (IOption option : configManager.getOptions(section)) {
+                    if (option.hidden()) {
+                        continue;
+                    }
+                    maxNameWidth = Math.max(maxNameWidth, option.ini().length());
+                    maxDescriptionWidth = Math.max(maxDescriptionWidth,
+                            option.description() == null ? 0 : option.description().length());
+                    maxDefaultWidth = Math.max(maxDefaultWidth, configManager.defaultTextForUsage(option, IOption::ini)
+                            .length());
+                }
+            }
+        }
+        maxDescriptionWidth = Math.min(80, maxDescriptionWidth);
+        for (Section section : configManager.getSections()) {
+            List<IOption> options = new ArrayList<>(configManager.getOptions(section));
+            options.sort(Comparator.comparing(IOption::ini));
+            for (IOption option : options) {
+                if (option.hidden()) {
+                    continue;
+                }
+                buf.append(startDelim);
+                center(buf, section.sectionName(), maxSectionWidth).append(midDelim);
+                pad(buf, option.ini(), maxNameWidth).append(midDelim);
+                String description = option.description() == null ? "" : option.description();
+                String defaultText = configManager.defaultTextForUsage(option, IOption::ini);
+                boolean extra = false;
+                while (align && description.length() > maxDescriptionWidth) {
+                    int cut = description.lastIndexOf(' ', maxDescriptionWidth);
+                    pad(buf, description.substring(0, cut), maxDescriptionWidth).append(midDelim);
+                    pad(buf, defaultText, maxDefaultWidth).append(endDelim).append('\n');
+                    defaultText = "";
+                    description = description.substring(cut + 1);
+                    buf.append(startDelim);
+                    pad(buf, "", maxSectionWidth).append(midDelim);
+                    pad(buf, "", maxNameWidth).append(midDelim);
+                }
+                pad(buf, description, maxDescriptionWidth).append(midDelim);
+                pad(buf, defaultText, maxDefaultWidth).append(endDelim).append('\n');
+                if (extra) {
+                    buf.append(startDelim);
+                    pad(buf, "", maxSectionWidth).append(midDelim);
+                    pad(buf, "", maxNameWidth).append(midDelim);
+                    pad(buf, "", maxDescriptionWidth).append(midDelim);
+                    pad(buf, "", maxDefaultWidth).append(endDelim).append('\n');
+                }
+            }
+        }
+        output.println(buf);
+    }
+
+    private StringBuilder center(StringBuilder buf, String string, int width) {
+        if (string == null) {
+            string = "";
+        }
+        int pad = width - string.length();
+        int leftPad = pad / 2;
+        for (int i = leftPad; i > 0; i--) {
+            buf.append(' ');
+        }
+        buf.append(string);
+        for (int i = pad - leftPad; i > 0; i--) {
+            buf.append(' ');
+        }
+        return buf;
+    }
+
+    private StringBuilder pad(StringBuilder buf, String string, int width) {
+        if (string == null) {
+            string = "";
+        }
+        buf.append(string);
+        for (int i = width - string.length(); i > 0; i--) {
+            buf.append(' ');
+        }
+        return buf;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index ae40827..7765572 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -1113,13 +1113,13 @@ public class TestExecutor {
 
     private void deleteNCTxnLogs(String nodeId, CompilationUnit cUnit) throws Exception {
         OutputFormat fmt = OutputFormat.forCompilationUnit(cUnit);
-        String endpoint = "/admin/cluster";
+        String endpoint = "/admin/cluster/node/" + nodeId + "/config";
         InputStream executeJSONGet = executeJSONGet(fmt, new URI("http://" + host + ":" + port + endpoint));
         StringWriter actual = new StringWriter();
         IOUtils.copy(executeJSONGet, actual, StandardCharsets.UTF_8);
         String config = actual.toString();
         ObjectMapper om = new ObjectMapper();
-        String logDir = om.readTree(config).findPath("transaction.log.dirs").get(nodeId).asText();
+        String logDir = om.readTree(config).findPath("txn.log.dir").asText();
         FileUtils.deleteQuietly(new File(logDir));
     }
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
index c1399fb..df9782a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
@@ -38,7 +38,7 @@ import org.apache.asterix.common.configuration.AsterixConfiguration;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.hyracks.util.file.FileUtil;
 
 public final class TestHelper {
 
@@ -54,10 +54,6 @@ public final class TestHelper {
         return false;
     }
 
-    public static String joinPath(String... pathElements) {
-        return StringUtils.join(pathElements, File.separatorChar);
-    }
-
     public static void unzip(String sourceFile, String outputDir) throws IOException {
         if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
             try (ZipFile zipFile = new ZipFile(sourceFile)) {
@@ -117,7 +113,7 @@ public final class TestHelper {
 
     public static void deleteExistingInstanceFiles() {
         for (String dirName : TEST_DIRS) {
-            File f = new File(joinPath(TEST_DIR_BASE_PATH, dirName));
+            File f = new File(FileUtil.joinPath(TEST_DIR_BASE_PATH, dirName));
             if (FileUtils.deleteQuietly(f)) {
                 System.out.println("Dir " + f.getName() + " deleted");
             }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java
index 10e8658..34bb9cf 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java
@@ -82,7 +82,7 @@ public class CheckpointingTest {
     private static final String DATASET_NAME = "TestDS";
     private static final String DATA_TYPE_NAME = "DUMMY";
     private static final String NODE_GROUP_NAME = "DEFAULT";
-    private static final int TXN_LOG_PARTITION_SIZE = StorageUtil.getSizeInBytes(2, StorageUnit.MEGABYTE);
+    private static final int TXN_LOG_PARTITION_SIZE = StorageUtil.getIntSizeInBytes(2, StorageUnit.MEGABYTE);
 
     @Before
     public void setUp() throws Exception {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java
index 545b2a1..86a9639 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java
@@ -65,7 +65,7 @@ public class ClusterStateDefaultParameterTest {
     @Test
     public void test() throws Exception {
         StringBuilder result = new StringBuilder();
-        URL url = new URL("http://localhost:19002/admin/cluster");
+        URL url = new URL("http://localhost:19002/admin/cluster/node/asterix_nc1/config");
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");
         BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java
index 31103a8..486a219 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java
@@ -24,7 +24,7 @@ import java.util.Collection;
 import java.util.logging.Logger;
 
 import org.apache.asterix.test.base.AsterixTestHelper;
-import org.apache.asterix.test.common.TestHelper;
+import org.apache.hyracks.util.file.FileUtil;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -41,10 +41,10 @@ public class OptimizerParserTest {
     private static final String EXTENSION_RESULT = "ast";
     private static final String FILENAME_IGNORE = "ignore.txt";
     private static final String FILENAME_ONLY = "only.txt";
-    private static final String PATH_BASE = TestHelper.joinPath("src", "test", "resources", "optimizerts");
-    private static final String PATH_QUERIES = TestHelper.joinPath(PATH_BASE, "queries_sqlpp");
-    private static final String PATH_EXPECTED = TestHelper.joinPath(PATH_BASE, "results_parser_sqlpp");
-    private static final String PATH_ACTUAL = TestHelper.joinPath("target", "opt_parserts", "results_parser_sqlpp");
+    private static final String PATH_BASE = FileUtil.joinPath("src", "test", "resources", "optimizerts");
+    private static final String PATH_QUERIES = FileUtil.joinPath(PATH_BASE, "queries_sqlpp");
+    private static final String PATH_EXPECTED = FileUtil.joinPath(PATH_BASE, "results_parser_sqlpp");
+    private static final String PATH_ACTUAL = FileUtil.joinPath("target", "opt_parserts", "results_parser_sqlpp");
 
     private static final ArrayList<String> ignore = AsterixTestHelper.readFile(FILENAME_IGNORE, PATH_BASE);
     private static final ArrayList<String> only = AsterixTestHelper.readFile(FILENAME_ONLY, PATH_BASE);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java
index 891e463..9c3c393 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java
@@ -25,6 +25,7 @@ import java.util.logging.Logger;
 
 import org.apache.asterix.test.base.AsterixTestHelper;
 import org.apache.asterix.test.common.TestHelper;
+import org.apache.hyracks.util.file.FileUtil;
 import org.junit.Assume;
 import org.junit.internal.AssumptionViolatedException;
 
@@ -34,15 +35,15 @@ class ParserTestUtil {
             String extensionQuery, String extensionResult, String pathExpected, String pathActual) {
         if (file.isDirectory() && !file.getName().startsWith(".")) {
             for (File innerfile : file.listFiles()) {
-                String subdir = innerfile.isDirectory() ? TestHelper.joinPath(path, innerfile.getName()) : path;
+                String subdir = innerfile.isDirectory() ? FileUtil.joinPath(path, innerfile.getName()) : path;
                 suiteBuild(innerfile, testArgs, subdir, separator, extensionQuery, extensionResult, pathExpected,
                         pathActual);
             }
         }
         if (file.isFile() && file.getName().endsWith(extensionQuery)) {
             String resultFileName = AsterixTestHelper.extToResExt(file.getName(), extensionResult);
-            File expectedFile = new File(TestHelper.joinPath(pathExpected, path, resultFileName));
-            File actualFile = new File(TestHelper.joinPath(pathActual, path, resultFileName));
+            File expectedFile = new File(FileUtil.joinPath(pathExpected, path, resultFileName));
+            File actualFile = new File(FileUtil.joinPath(pathActual, path, resultFileName));
             testArgs.add(new Object[] { file, expectedFile, actualFile });
         }
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java
index 8fe9370..3c856b5 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java
@@ -24,7 +24,7 @@ import java.util.Collection;
 import java.util.logging.Logger;
 
 import org.apache.asterix.test.base.AsterixTestHelper;
-import org.apache.asterix.test.common.TestHelper;
+import org.apache.hyracks.util.file.FileUtil;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -41,10 +41,10 @@ public class SmokeParserTest {
     private static final String EXTENSION_RESULT = "ast";
     private static final String FILENAME_IGNORE = "ignore.txt";
     private static final String FILENAME_ONLY = "only.txt";
-    private static final String PATH_BASE = TestHelper.joinPath("src", "test", "resources", "parserts");
-    private static final String PATH_QUERIES = TestHelper.joinPath(PATH_BASE, "queries_sqlpp");
-    private static final String PATH_EXPECTED = TestHelper.joinPath(PATH_BASE, "results_parser_sqlpp");
-    private static final String PATH_ACTUAL = TestHelper.joinPath("target", "parserts");
+    private static final String PATH_BASE = FileUtil.joinPath("src", "test", "resources", "parserts");
+    private static final String PATH_QUERIES = FileUtil.joinPath(PATH_BASE, "queries_sqlpp");
+    private static final String PATH_EXPECTED = FileUtil.joinPath(PATH_BASE, "results_parser_sqlpp");
+    private static final String PATH_ACTUAL = FileUtil.joinPath("target", "parserts");
 
     private static final ArrayList<String> ignore = AsterixTestHelper.readFile(FILENAME_IGNORE, PATH_BASE);
     private static final ArrayList<String> only = AsterixTestHelper.readFile(FILENAME_ONLY, PATH_BASE);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/resources/runtimets/api.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/api.xml b/asterixdb/asterix-app/src/test/resources/runtimets/api.xml
index 0fa83dd..372aa47 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/api.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/api.xml
@@ -66,11 +66,6 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="api">
-      <compilation-unit name="replication">
-        <output-dir compare="Text">replication</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="api">
       <compilation-unit name="query_status_1">
         <output-dir compare="Text">query_status_1</output-dir>
         <expected-error>HTTP/1.1 404 Not Found</expected-error>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/APIQueries.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/APIQueries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/APIQueries.xml
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/replication/replication.1.get.http
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/replication/replication.1.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/replication/replication.1.get.http
deleted file mode 100644
index 5976b5d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/replication/replication.1.get.http
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : replication
- * Description     : Replication
- * Expected Result : Positive
- * Date            : 28th October 2016
- */
-/admin/cluster/replication

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm
index 42fb7c3..03884bd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm
@@ -5,110 +5,32 @@
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/cc/threaddump"
   },
   "config" : {
-    "api.port" : 19002,
-    "cluster.partitions" : {
-      "0" : {
-        "partitionId" : 0,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 0
-      },
-      "1" : {
-        "partitionId" : 1,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 1
-      },
-      "2" : {
-        "partitionId" : 2,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 0
-      },
-      "3" : {
-        "partitionId" : 3,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 1
-      }
-    },
     "compiler.framesize" : 32768,
     "compiler.groupmemory" : 163840,
     "compiler.joinmemory" : 262144,
     "compiler.parallelism" : 0,
     "compiler.pregelix.home" : "~/pregelix",
     "compiler.sortmemory" : 327680,
-    "core.dump.paths" : { },
     "feed.central.manager.port" : 4500,
     "feed.max.threshold.period" : 5,
     "feed.memory.available.wait.timeout" : 10,
     "feed.memory.global.budget" : 67108864,
     "feed.pending.work.threshold" : 50,
-    "feed.port" : 19003,
-    "instance.name" : null,
-    "log.level" : "WARNING",
+    "instance.name" : "DEFAULT_INSTANCE",
+    "log.level" : "INFO",
     "max.wait.active.cluster" : 60,
+    "messaging.frame.count" : 512,
+    "messaging.frame.size" : 4096,
     "metadata.callback.port" : 0,
+    "metadata.listen.port" : 0,
     "metadata.node" : "asterix_nc1",
-    "metadata.partition" : {
-      "partitionId" : 0,
-      "nodeId" : "asterix_nc1",
-      "activeNodeId" : "asterix_nc1",
-      "active" : true,
-      "iodeviceNum" : 0
-    },
-    "metadata.port" : 0,
     "metadata.registration.timeout.secs" : 60,
-    "node.partitions" : {
-      "asterix_nc1" : [ {
-        "partitionId" : 0,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 0
-      }, {
-        "partitionId" : 1,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 1
-      } ],
-      "asterix_nc2" : [ {
-        "partitionId" : 2,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 0
-      }, {
-        "partitionId" : 3,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 1
-      } ]
-    },
-    "node.stores" : {
-      "asterix_nc1" : [ "iodevice0", "iodevice1" ],
-      "asterix_nc2" : [ "iodevice0", "iodevice1" ]
-    },
     "plot.activate" : false,
-    "storage.buffercache.maxopenfiles" : 2147483647,
-    "storage.buffercache.pagesize" : 32768,
-    "storage.buffercache.size" : 50331648,
-    "storage.lsm.bloomfilter.falsepositiverate" : 0.01,
-    "storage.memorycomponent.globalbudget" : 536870912,
-    "storage.memorycomponent.numcomponents" : 2,
-    "storage.memorycomponent.numpages" : 8,
-    "storage.memorycomponent.pagesize" : 131072,
-    "storage.metadata.memorycomponent.numpages" : 85,
-    "transaction.log.dirs" : {
-      "asterix_nc1" : "target/txnLogDir/asterix_nc1",
-      "asterix_nc2" : "target/txnLogDir/asterix_nc2"
-    },
+    "replication.log.batchsize" : 4096,
+    "replication.log.buffer.numpages" : 8,
+    "replication.log.buffer.pagesize" : 131072,
+    "replication.max.remote.recovery.attempts" : 5,
+    "replication.timeout" : 30,
     "txn.commitprofiler.reportinterval" : 5,
     "txn.job.recovery.memorysize" : 67108864,
     "txn.lock.escalationthreshold" : 1000,
@@ -120,10 +42,7 @@
     "txn.log.checkpoint.history" : 0,
     "txn.log.checkpoint.lsnthreshold" : 67108864,
     "txn.log.checkpoint.pollfrequency" : 120,
-    "txn.log.partitionsize" : 268435456,
-    "web.port" : 19001,
-    "web.queryinterface.port" : 19006,
-    "web.secondary.port" : 19005
+    "txn.log.partitionsize" : 268435456
   },
   "diagnosticsUri" : "http://127.0.0.1:19002/admin/diagnostics",
   "fullShutdownUri" : "http://127.0.0.1:19002/admin/shutdown?all=true",
@@ -155,7 +74,6 @@
     "statsUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/stats",
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/threaddump"
   } ],
-  "replicationUri" : "http://127.0.0.1:19002/admin/cluster/replication",
   "shutdownUri" : "http://127.0.0.1:19002/admin/shutdown",
   "state" : "ACTIVE",
   "versionUri" : "http://127.0.0.1:19002/admin/version"

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm
index 75c4d3e..372ac00 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm
@@ -5,110 +5,32 @@
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/cc/threaddump"
   },
   "config" : {
-    "api.port" : 19002,
-    "cluster.partitions" : {
-      "0" : {
-        "partitionId" : 0,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 0
-      },
-      "1" : {
-        "partitionId" : 1,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 1
-      },
-      "2" : {
-        "partitionId" : 2,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 0
-      },
-      "3" : {
-        "partitionId" : 3,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 1
-      }
-    },
     "compiler.framesize" : 32768,
     "compiler.groupmemory" : 163840,
     "compiler.joinmemory" : 262144,
     "compiler.parallelism" : -1,
     "compiler.pregelix.home" : "~/pregelix",
     "compiler.sortmemory" : 327680,
-    "core.dump.paths" : { },
     "feed.central.manager.port" : 4500,
     "feed.max.threshold.period" : 5,
     "feed.memory.available.wait.timeout" : 10,
     "feed.memory.global.budget" : 67108864,
     "feed.pending.work.threshold" : 50,
-    "feed.port" : 19003,
-    "instance.name" : null,
+    "instance.name" : "DEFAULT_INSTANCE",
     "log.level" : "WARNING",
     "max.wait.active.cluster" : 60,
+    "messaging.frame.count" : 512,
+    "messaging.frame.size" : 4096,
     "metadata.callback.port" : 0,
+    "metadata.listen.port" : 0,
     "metadata.node" : "asterix_nc1",
-    "metadata.partition" : {
-      "partitionId" : 0,
-      "nodeId" : "asterix_nc1",
-      "activeNodeId" : "asterix_nc1",
-      "active" : true,
-      "iodeviceNum" : 0
-    },
-    "metadata.port" : 0,
     "metadata.registration.timeout.secs" : 60,
-    "node.partitions" : {
-      "asterix_nc1" : [ {
-        "partitionId" : 0,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 0
-      }, {
-        "partitionId" : 1,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 1
-      } ],
-      "asterix_nc2" : [ {
-        "partitionId" : 2,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 0
-      }, {
-        "partitionId" : 3,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 1
-      } ]
-    },
-    "node.stores" : {
-      "asterix_nc1" : [ "iodevice0", "iodevice1" ],
-      "asterix_nc2" : [ "iodevice0", "iodevice1" ]
-    },
     "plot.activate" : false,
-    "storage.buffercache.maxopenfiles" : 2147483647,
-    "storage.buffercache.pagesize" : 32768,
-    "storage.buffercache.size" : 50331648,
-    "storage.lsm.bloomfilter.falsepositiverate" : 0.01,
-    "storage.memorycomponent.globalbudget" : 536870912,
-    "storage.memorycomponent.numcomponents" : 2,
-    "storage.memorycomponent.numpages" : 8,
-    "storage.memorycomponent.pagesize" : 131072,
-    "storage.metadata.memorycomponent.numpages" : 85,
-    "transaction.log.dirs" : {
-      "asterix_nc1" : "target/txnLogDir/asterix_nc1",
-      "asterix_nc2" : "target/txnLogDir/asterix_nc2"
-    },
+    "replication.log.batchsize" : 4096,
+    "replication.log.buffer.numpages" : 8,
+    "replication.log.buffer.pagesize" : 131072,
+    "replication.max.remote.recovery.attempts" : 5,
+    "replication.timeout" : 30,
     "txn.commitprofiler.reportinterval" : 5,
     "txn.job.recovery.memorysize" : 67108864,
     "txn.lock.escalationthreshold" : 1000,
@@ -120,10 +42,7 @@
     "txn.log.checkpoint.history" : 0,
     "txn.log.checkpoint.lsnthreshold" : 67108864,
     "txn.log.checkpoint.pollfrequency" : 120,
-    "txn.log.partitionsize" : 268435456,
-    "web.port" : 19001,
-    "web.queryinterface.port" : 19006,
-    "web.secondary.port" : 19005
+    "txn.log.partitionsize" : 268435456
   },
   "diagnosticsUri" : "http://127.0.0.1:19002/admin/diagnostics",
   "fullShutdownUri" : "http://127.0.0.1:19002/admin/shutdown?all=true",
@@ -155,7 +74,6 @@
     "statsUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/stats",
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/threaddump"
   } ],
-  "replicationUri" : "http://127.0.0.1:19002/admin/cluster/replication",
   "shutdownUri" : "http://127.0.0.1:19002/admin/shutdown",
   "state" : "ACTIVE",
   "versionUri" : "http://127.0.0.1:19002/admin/version"

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm
index 76219aa..9d1ba6e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm
@@ -5,110 +5,32 @@
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/cc/threaddump"
   },
   "config" : {
-    "api.port" : 19002,
-    "cluster.partitions" : {
-      "0" : {
-        "partitionId" : 0,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 0
-      },
-      "1" : {
-        "partitionId" : 1,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 1
-      },
-      "2" : {
-        "partitionId" : 2,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 0
-      },
-      "3" : {
-        "partitionId" : 3,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 1
-      }
-    },
     "compiler.framesize" : 32768,
     "compiler.groupmemory" : 163840,
     "compiler.joinmemory" : 262144,
     "compiler.parallelism" : 3,
     "compiler.pregelix.home" : "~/pregelix",
     "compiler.sortmemory" : 327680,
-    "core.dump.paths" : { },
     "feed.central.manager.port" : 4500,
     "feed.max.threshold.period" : 5,
     "feed.memory.available.wait.timeout" : 10,
     "feed.memory.global.budget" : 67108864,
     "feed.pending.work.threshold" : 50,
-    "feed.port" : 19003,
-    "instance.name" : null,
+    "instance.name" : "DEFAULT_INSTANCE",
     "log.level" : "WARNING",
     "max.wait.active.cluster" : 60,
+    "messaging.frame.count" : 512,
+    "messaging.frame.size" : 4096,
     "metadata.callback.port" : 0,
+    "metadata.listen.port" : 0,
     "metadata.node" : "asterix_nc1",
-    "metadata.partition" : {
-      "partitionId" : 0,
-      "nodeId" : "asterix_nc1",
-      "activeNodeId" : "asterix_nc1",
-      "active" : true,
-      "iodeviceNum" : 0
-    },
-    "metadata.port" : 0,
     "metadata.registration.timeout.secs" : 60,
-    "node.partitions" : {
-      "asterix_nc1" : [ {
-        "partitionId" : 0,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 0
-      }, {
-        "partitionId" : 1,
-        "nodeId" : "asterix_nc1",
-        "activeNodeId" : "asterix_nc1",
-        "active" : true,
-        "iodeviceNum" : 1
-      } ],
-      "asterix_nc2" : [ {
-        "partitionId" : 2,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 0
-      }, {
-        "partitionId" : 3,
-        "nodeId" : "asterix_nc2",
-        "activeNodeId" : "asterix_nc2",
-        "active" : true,
-        "iodeviceNum" : 1
-      } ]
-    },
-    "node.stores" : {
-      "asterix_nc1" : [ "iodevice0", "iodevice1" ],
-      "asterix_nc2" : [ "iodevice0", "iodevice1" ]
-    },
     "plot.activate" : false,
-    "storage.buffercache.maxopenfiles" : 2147483647,
-    "storage.buffercache.pagesize" : 32768,
-    "storage.buffercache.size" : 50331648,
-    "storage.lsm.bloomfilter.falsepositiverate" : 0.01,
-    "storage.memorycomponent.globalbudget" : 536870912,
-    "storage.memorycomponent.numcomponents" : 2,
-    "storage.memorycomponent.numpages" : 8,
-    "storage.memorycomponent.pagesize" : 131072,
-    "storage.metadata.memorycomponent.numpages" : 85,
-    "transaction.log.dirs" : {
-      "asterix_nc1" : "target/txnLogDir/asterix_nc1",
-      "asterix_nc2" : "target/txnLogDir/asterix_nc2"
-    },
+    "replication.log.batchsize" : 4096,
+    "replication.log.buffer.numpages" : 8,
+    "replication.log.buffer.pagesize" : 131072,
+    "replication.max.remote.recovery.attempts" : 5,
+    "replication.timeout" : 30,
     "txn.commitprofiler.reportinterval" : 5,
     "txn.job.recovery.memorysize" : 67108864,
     "txn.lock.escalationthreshold" : 1000,
@@ -120,10 +42,7 @@
     "txn.log.checkpoint.history" : 0,
     "txn.log.checkpoint.lsnthreshold" : 67108864,
     "txn.log.checkpoint.pollfrequency" : 120,
-    "txn.log.partitionsize" : 268435456,
-    "web.port" : 19001,
-    "web.queryinterface.port" : 19006,
-    "web.secondary.port" : 19005
+    "txn.log.partitionsize" : 268435456
   },
   "diagnosticsUri" : "http://127.0.0.1:19002/admin/diagnostics",
   "fullShutdownUri" : "http://127.0.0.1:19002/admin/shutdown?all=true",
@@ -155,7 +74,6 @@
     "statsUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/stats",
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/threaddump"
   } ],
-  "replicationUri" : "http://127.0.0.1:19002/admin/cluster/replication",
   "shutdownUri" : "http://127.0.0.1:19002/admin/shutdown",
   "state" : "ACTIVE",
   "versionUri" : "http://127.0.0.1:19002/admin/version"

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-app/src/test/resources/runtimets/results/api/replication/replication.1.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/replication/replication.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/replication/replication.1.adm
deleted file mode 100644
index a614faa..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/replication/replication.1.adm
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "config" : {
-    "log.batchsize" : 4096,
-    "log.buffer.numpages" : 8,
-    "log.buffer.pagesize" : 131072,
-    "max.remote.recovery.attempts" : 5,
-    "timeout" : 30
-  }
-}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-client-helper/pom.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-client-helper/pom.xml b/asterixdb/asterix-client-helper/pom.xml
index 726e8fa..bf8a51e 100644
--- a/asterixdb/asterix-client-helper/pom.xml
+++ b/asterixdb/asterix-client-helper/pom.xml
@@ -118,7 +118,7 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.10</version>
         <configuration>
-          <usedDependencies>
+          <usedDependencies combine.children="append">
             <usedDependency>org.codehaus.mojo.appassembler:appassembler-booter</usedDependency>
           </usedDependencies>
         </configuration>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/pom.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/pom.xml b/asterixdb/asterix-common/pom.xml
index 65e82a2..60f2af0 100644
--- a/asterixdb/asterix-common/pom.xml
+++ b/asterixdb/asterix-common/pom.xml
@@ -273,6 +273,10 @@
       <artifactId>hyracks-http</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-control-common</artifactId>
+    </dependency>
+    <dependency>
       <groupId>io.netty</groupId>
       <artifactId>netty-all</artifactId>
     </dependency>
@@ -288,5 +292,9 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
     </dependency>
+    <dependency>
+      <groupId>args4j</groupId>
+      <artifactId>args4j</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
index d971f48..bf03d54 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
@@ -21,6 +21,7 @@ package org.apache.asterix.common.cluster;
 import java.util.Map;
 
 import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
+import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface IClusterStateManager {
@@ -65,7 +66,7 @@ public interface IClusterStateManager {
     /**
      * @return a map of nodeId and NC Configuration for active nodes.
      */
-    Map<String, Map<String, String>> getActiveNcConfiguration();
+    Map<String, Map<IOption, Object>> getActiveNcConfiguration();
 
     /**
      * @return The current metadata node Id.

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AbstractProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AbstractProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AbstractProperties.java
index eccbff2..a5bb945 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AbstractProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AbstractProperties.java
@@ -18,63 +18,11 @@
  */
 package org.apache.asterix.common.config;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.UnaryOperator;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 public abstract class AbstractProperties {
-    private static final Logger LOGGER = Logger.getLogger(AbstractProperties.class.getName());
-    private static final List<AbstractProperties> IMPLS = Collections.synchronizedList(new ArrayList<>());
 
     protected final PropertiesAccessor accessor;
 
     public AbstractProperties(PropertiesAccessor accessor) {
         this.accessor = accessor;
-        IMPLS.add(this);
-    }
-
-    public Map<String, Object> getProperties() {
-        return getProperties(UnaryOperator.identity());
-    }
-
-    public Map<String, Object> getProperties(UnaryOperator<String> keyTransformer) {
-        Map<String, Object> properties = new HashMap<>();
-        for (Method m : getClass().getMethods()) {
-            PropertyKey key = m.getAnnotation(PropertyKey.class);
-            Stringify stringify = m.getAnnotation(Stringify.class);
-            if (key != null) {
-                try {
-                    if (stringify != null) {
-                        properties.put(keyTransformer.apply(key.value()), String.valueOf(m.invoke(this)));
-                    } else {
-                        properties.put(keyTransformer.apply(key.value()), m.invoke(this));
-                    }
-                } catch (Exception e) {
-                    LOGGER.log(Level.INFO, "Error accessing property: " + key.value(), e);
-                }
-            }
-        }
-        return properties;
-    }
-
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface PropertyKey {
-        String value();
-    }
-
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface Stringify {
-    }
-
-    public static List<AbstractProperties> getImplementations() {
-        return Collections.unmodifiableList(IMPLS);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
index 3ae2bd9..5f3a1aa 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
@@ -18,37 +18,40 @@
  */
 package org.apache.asterix.common.config;
 
-import java.io.File;
+import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.hyracks.api.config.IConfigManager;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public class AsterixProperties {
-    //---------------------------- Directories ---------------------------//
-    private static final String VAR = File.separator + "var";
-    private static final String LIB = VAR + File.separator + "lib";
-    private static final String ASTERIXDB = LIB + File.separator + "asterixdb";
-    //----------------------------- Sections -----------------------------//
-    public static final String SECTION_ASTERIX = "asterix";
+
     public static final String SECTION_PREFIX_EXTENSION = "extension/";
-    public static final String SECTION_CC = "cc";
-    public static final String SECTION_PREFIX_NC = "nc/";
-    //---------------------------- Properties ---=------------------------//
-    public static final String PROPERTY_CLUSTER_ADDRESS = "cluster.address";
-    public static final String PROPERTY_INSTANCE_NAME = "instance";
-    public static final String DEFAULT_INSTANCE_NAME = "DEFAULT_INSTANCE";
-    public static final String PROPERTY_METADATA_NODE = "metadata.node";
-    public static final String PROPERTY_COREDUMP_DIR = "coredumpdir";
-    public static final String DEFAULT_COREDUMP_DIR = String.join(File.separator, ASTERIXDB, "coredump");
-    public static final String PROPERTY_TXN_LOG_DIR = "txnlogdir";
-    public static final String DEFAULT_TXN_LOG_DIR = String.join(File.separator, ASTERIXDB, "txn-log");
-    public static final String PROPERTY_IO_DEV = "iodevices";
-    public static final String DEFAULT_IO_DEV = String.join(File.separator, ASTERIXDB, "iodevice");
-    public static final String PROPERTY_STORAGE_DIR = "storagedir";
-    public static final String DEFAULT_STORAGE_DIR = "storage";
-    public static final String PROPERTY_CLASS = "class";
 
     private AsterixProperties() {
     }
 
-    public static final String getSectionId(String prefix, String section) {
+    public static String getSectionId(String prefix, String section) {
         return section.substring(prefix.length());
     }
+
+    public static void registerConfigOptions(IConfigManager configManager) {
+        configManager.register(
+                NodeProperties.Option.class,
+                CompilerProperties.Option.class,
+                MetadataProperties.Option.class,
+                ExternalProperties.Option.class,
+                FeedProperties.Option.class,
+                MessagingProperties.Option.class,
+                ReplicationProperties.Option.class,
+                StorageProperties.Option.class,
+                TransactionProperties.Option.class);
+
+        // we need to process the old-style asterix config before we apply defaults!
+        configManager.addConfigurator(IConfigManager.APPLY_DEFAULTS_METRIC - 1, () -> {
+            try {
+                PropertiesAccessor.getInstance(configManager.getAppConfig());
+            } catch (AsterixException e) {
+                throw new HyracksDataException(e);
+            }
+        });
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/BuildProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/BuildProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/BuildProperties.java
index a1d4703..7a36dbe 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/BuildProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/BuildProperties.java
@@ -27,89 +27,6 @@ public class BuildProperties extends AbstractProperties {
         super(accessor);
     }
 
-    public String getUserEmail() {
-        return accessor.getProperty("git.build.user.email", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getBuildHost() {
-        return accessor.getProperty("git.build.host", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getDirty() {
-        return accessor.getProperty("git.dirty", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getRemoteOriginUrl() {
-        return accessor.getProperty("git.remote.origin.url", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getClosestTagName() {
-        return accessor.getProperty("git.closest.tag.name", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitIdDescribeShort() {
-        return accessor.getProperty("git.commit.id.describe-short", "",
-                PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitUserEmail() {
-        return accessor.getProperty("git.commit.user.email", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitTime() {
-        return accessor.getProperty("git.commit.time", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitMessage() {
-        return accessor.getProperty("git.commit.message.full", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getBuildVersion() {
-        return accessor.getProperty("git.build.version", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitMessageShort() {
-        return accessor.getProperty("git.commit.message.short", "",
-                PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getShortCommitId() {
-        return accessor.getProperty("git.commit.id.abbrev", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getBranch() {
-        return accessor.getProperty("git.branch", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getBuildUserName() {
-        return accessor.getProperty("git.build.user.name", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getClosestTagCommitCount() {
-        return accessor.getProperty("git.closest.tag.commit.count", "",
-                PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitIdDescribe() {
-        return accessor.getProperty("git.commit.id.describe", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitId() {
-        return accessor.getProperty("git.commit.id", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getTags() {
-        return accessor.getProperty("git.tags", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getBuildTime() {
-        return accessor.getProperty("git.build.time", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
-    public String getCommitUserName() {
-        return accessor.getProperty("git.commit.user.name", "", PropertyInterpreters.getStringPropertyInterpreter());
-    }
-
     public Map<String, String> getAllProps() {
         return accessor.getBuildProperties();
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
index 3710e54..f97c5a5 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
@@ -18,68 +18,91 @@
  */
 package org.apache.asterix.common.config;
 
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER_BYTE_UNIT;
+import static org.apache.hyracks.control.common.config.OptionTypes.LONG_BYTE_UNIT;
+import static org.apache.hyracks.control.common.config.OptionTypes.STRING;
 import static org.apache.hyracks.util.StorageUtil.StorageUnit.KILOBYTE;
 import static org.apache.hyracks.util.StorageUtil.StorageUnit.MEGABYTE;
 
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.IOptionType;
+import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.util.StorageUtil;
 
 public class CompilerProperties extends AbstractProperties {
 
-    public static final String COMPILER_SORTMEMORY_KEY = "compiler.sortmemory";
-    private static final long COMPILER_SORTMEMORY_DEFAULT = StorageUtil.getSizeInBytes(32, MEGABYTE);
+    public enum Option implements IOption {
+        COMPILER_SORTMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE)),
+        COMPILER_JOINMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE)),
+        COMPILER_GROUPMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE)),
+        COMPILER_FRAMESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(32, KILOBYTE)),
+        COMPILER_PARALLELISM(INTEGER, COMPILER_PARALLELISM_AS_STORAGE),
+        COMPILER_PREGELIX_HOME(STRING, "~/pregelix");
+
+        private final IOptionType type;
+        private final Object defaultValue;
+
+        Option(IOptionType type, Object defaultValue) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+        }
+
+        @Override
+        public Section section() {
+            return Section.COMMON;
+        }
+
+        @Override
+        public String description() {
+            return "";
+        }
+
+        @Override
+        public IOptionType type() {
+            return type;
+        }
+
+        @Override
+        public Object defaultValue() {
+            return defaultValue;
+        }
+    }
+    public static final String COMPILER_SORTMEMORY_KEY = Option.COMPILER_SORTMEMORY.ini();
 
-    public static final String COMPILER_GROUPMEMORY_KEY = "compiler.groupmemory";
-    private static final long COMPILER_GROUPMEMORY_DEFAULT = StorageUtil.getSizeInBytes(32, MEGABYTE);
+    public static final String COMPILER_GROUPMEMORY_KEY = Option.COMPILER_GROUPMEMORY.ini();
 
-    public static final String COMPILER_JOINMEMORY_KEY = "compiler.joinmemory";
-    private static final long COMPILER_JOINMEMORY_DEFAULT = StorageUtil.getSizeInBytes(32, MEGABYTE);
+    public static final String COMPILER_JOINMEMORY_KEY = Option.COMPILER_JOINMEMORY.ini();
 
-    private static final String COMPILER_FRAMESIZE_KEY = "compiler.framesize";
-    private static final int COMPILER_FRAMESIZE_DEFAULT = StorageUtil.getSizeInBytes(32, KILOBYTE);
+    public static final String COMPILER_PARALLELISM_KEY = Option.COMPILER_PARALLELISM.ini();
 
-    public static final String COMPILER_PARALLELISM_KEY = "compiler.parallelism";
     public static final int COMPILER_PARALLELISM_AS_STORAGE = 0;
 
-    private static final String COMPILER_PREGELIX_HOME = "compiler.pregelix.home";
-    private static final String COMPILER_PREGELIX_HOME_DEFAULT = "~/pregelix";
-
     public CompilerProperties(PropertiesAccessor accessor) {
         super(accessor);
     }
 
-    @PropertyKey(COMPILER_SORTMEMORY_KEY)
     public long getSortMemorySize() {
-        return accessor.getProperty(COMPILER_SORTMEMORY_KEY, COMPILER_SORTMEMORY_DEFAULT,
-                PropertyInterpreters.getLongBytePropertyInterpreter());
+        return accessor.getLong(Option.COMPILER_SORTMEMORY);
     }
 
-    @PropertyKey(COMPILER_JOINMEMORY_KEY)
     public long getJoinMemorySize() {
-        return accessor.getProperty(COMPILER_JOINMEMORY_KEY, COMPILER_JOINMEMORY_DEFAULT,
-                PropertyInterpreters.getLongBytePropertyInterpreter());
+        return accessor.getLong(Option.COMPILER_JOINMEMORY);
     }
 
-    @PropertyKey(COMPILER_GROUPMEMORY_KEY)
     public long getGroupMemorySize() {
-        return accessor.getProperty(COMPILER_GROUPMEMORY_KEY, COMPILER_GROUPMEMORY_DEFAULT,
-                PropertyInterpreters.getLongBytePropertyInterpreter());
+        return accessor.getLong(Option.COMPILER_GROUPMEMORY);
     }
 
-    @PropertyKey(COMPILER_FRAMESIZE_KEY)
     public int getFrameSize() {
-        return accessor.getProperty(COMPILER_FRAMESIZE_KEY, COMPILER_FRAMESIZE_DEFAULT,
-                PropertyInterpreters.getIntegerBytePropertyInterpreter());
+        return accessor.getInt(Option.COMPILER_FRAMESIZE);
     }
 
-    @PropertyKey(COMPILER_PARALLELISM_KEY)
     public int getParallelism() {
-        return accessor.getProperty(COMPILER_PARALLELISM_KEY, COMPILER_PARALLELISM_AS_STORAGE,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.COMPILER_PARALLELISM);
     }
 
-    @PropertyKey(COMPILER_PREGELIX_HOME)
     public String getPregelixHome() {
-        return accessor.getProperty(COMPILER_PREGELIX_HOME, COMPILER_PREGELIX_HOME_DEFAULT,
-                PropertyInterpreters.getStringPropertyInterpreter());
+        return accessor.getString(Option.COMPILER_PREGELIX_HOME);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
index eb6bda5..2f85221 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
@@ -18,101 +18,107 @@
  */
 package org.apache.asterix.common.config;
 
-import java.util.logging.Level;
+import static org.apache.hyracks.control.common.config.OptionTypes.*;
 
-public class ExternalProperties extends AbstractProperties {
-
-    public static final String EXTERNAL_WEBPORT_KEY = "web.port";
-    public static final int EXTERNAL_WEBPORT_DEFAULT = 19001;
-
-    public static final String EXTERNAL_SECONDARY_WEBPORT_KEY = "web.secondary.port";
-    public static final int EXTERNAL_SECONDARY_WEBPORT_DEFAULT = 19005;
-
-    public static final String QUERY_WEBPORT_KEY = "web.queryinterface.port";
-    public static final int QUERY_WEBPORT_DEFAULT = 19006;
-
-    public static final String EXTERNAL_LOGLEVEL_KEY = "log.level";
-    public static final Level EXTERNAL_LOGLEVEL_DEFAULT = Level.WARNING;
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.IOptionType;
+import org.apache.hyracks.api.config.Section;
 
-    public static final String EXTERNAL_APISERVER_KEY = "api.port";
-    public static final int EXTERNAL_APISERVER_DEFAULT = 19002;
-
-    public static final String EXTERNAL_FEEDSERVER_KEY = "feed.port";
-    public static final int EXTERNAL_FEEDSERVER_DEFAULT = 19003;
-
-    public static final String EXTERNAL_CC_JAVA_OPTS_KEY = "cc.java.opts";
-    public static final String EXTERNAL_CC_JAVA_OPTS_DEFAULT = "-Xmx1024m";
-
-    public static final String EXTERNAL_NC_JAVA_OPTS_KEY = "nc.java.opts";
-    public static final String EXTERNAL_NC_JAVA_OPTS_DEFAULT = "-Xmx1024m";
-
-    public static final String EXTERNAL_MAX_WAIT_FOR_ACTIVE_CLUSTER = "max.wait.active.cluster";
-    public static final int EXTERNAL_MAX_WAIT_FOR_ACTIVE_CLUSTER_DEFAULT = 60;
+public class ExternalProperties extends AbstractProperties {
 
-    public static final String EXTERNAL_PLOT_ACTIVATE = "plot.activate";
-    public static final boolean EXTERNAL_PLOT_ACTIVATE_DEFAULT = false;
+    public enum Option implements IOption {
+        WEB_PORT(INTEGER, 19001),
+        WEB_QUERYINTERFACE_PORT(INTEGER, 19006),
+        API_PORT(INTEGER, 19002),
+        FEED_PORT(INTEGER, 19003),
+        LOG_LEVEL(LEVEL, java.util.logging.Level.WARNING),
+        MAX_WAIT_ACTIVE_CLUSTER(INTEGER, 60),
+        PLOT_ACTIVATE(BOOLEAN, false),
+        CC_JAVA_OPTS(STRING, "-Xmx1024m"),
+        NC_JAVA_OPTS(STRING, "-Xmx1024m");
+
+        private final IOptionType type;
+        private final Object defaultValue;
+
+        Option(IOptionType type, Object defaultValue) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+        }
+
+        @Override
+        public Section section() {
+            switch (this) {
+                case WEB_PORT:
+                case WEB_QUERYINTERFACE_PORT:
+                case API_PORT:
+                case FEED_PORT:
+                    return Section.CC;
+                case LOG_LEVEL:
+                case MAX_WAIT_ACTIVE_CLUSTER:
+                case PLOT_ACTIVATE:
+                    return Section.COMMON;
+                case CC_JAVA_OPTS:
+                case NC_JAVA_OPTS:
+                    return Section.VIRTUAL;
+                default:
+                    throw new IllegalStateException("NYI: " + this);
+            }
+        }
+
+        @Override
+        public String description() {
+            // TODO(mblow): add descriptions
+            return null;
+        }
+
+        @Override
+        public IOptionType type() {
+            return type;
+        }
+
+        @Override
+        public Object defaultValue() {
+            return defaultValue;
+        }
+    }
 
     public ExternalProperties(PropertiesAccessor accessor) {
         super(accessor);
     }
 
-    @PropertyKey(EXTERNAL_WEBPORT_KEY)
     public int getWebInterfacePort() {
-        return accessor.getProperty(EXTERNAL_WEBPORT_KEY, EXTERNAL_WEBPORT_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
-    }
-
-    @PropertyKey(EXTERNAL_SECONDARY_WEBPORT_KEY)
-    public int getSecondaryWebInterfacePort() {
-        return accessor.getProperty(EXTERNAL_SECONDARY_WEBPORT_KEY, EXTERNAL_SECONDARY_WEBPORT_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.WEB_PORT);
     }
 
-    @PropertyKey(QUERY_WEBPORT_KEY)
     public int getQueryWebInterfacePort() {
-        return accessor.getProperty(QUERY_WEBPORT_KEY, QUERY_WEBPORT_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.WEB_QUERYINTERFACE_PORT);
     }
 
-    @PropertyKey(EXTERNAL_APISERVER_KEY)
     public int getAPIServerPort() {
-        return accessor.getProperty(EXTERNAL_APISERVER_KEY, EXTERNAL_APISERVER_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.API_PORT);
     }
 
-    @PropertyKey(EXTERNAL_FEEDSERVER_KEY)
     public int getFeedServerPort() {
-        return accessor.getProperty(EXTERNAL_FEEDSERVER_KEY, EXTERNAL_FEEDSERVER_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.FEED_PORT);
     }
 
-    @PropertyKey(EXTERNAL_LOGLEVEL_KEY)
-    @Stringify
-    public Level getLogLevel() {
-        return accessor.getProperty(EXTERNAL_LOGLEVEL_KEY, EXTERNAL_LOGLEVEL_DEFAULT,
-                PropertyInterpreters.getLevelPropertyInterpreter());
+    public java.util.logging.Level getLogLevel() {
+        return accessor.getLoggingLevel(Option.LOG_LEVEL);
     }
 
-    public String getNCJavaParams() {
-        return accessor.getProperty(EXTERNAL_NC_JAVA_OPTS_KEY, EXTERNAL_NC_JAVA_OPTS_DEFAULT,
-                PropertyInterpreters.getStringPropertyInterpreter());
+    public int getMaxWaitClusterActive() {
+        return accessor.getInt(Option.MAX_WAIT_ACTIVE_CLUSTER);
     }
 
-    public String getCCJavaParams() {
-        return accessor.getProperty(EXTERNAL_CC_JAVA_OPTS_KEY, EXTERNAL_CC_JAVA_OPTS_DEFAULT,
-                PropertyInterpreters.getStringPropertyInterpreter());
+    public boolean getIsPlottingEnabled() {
+        return accessor.getBoolean(Option.PLOT_ACTIVATE);
     }
 
-    @PropertyKey(EXTERNAL_MAX_WAIT_FOR_ACTIVE_CLUSTER)
-    public int getMaxWaitClusterActive() {
-        return accessor.getProperty(EXTERNAL_MAX_WAIT_FOR_ACTIVE_CLUSTER, EXTERNAL_MAX_WAIT_FOR_ACTIVE_CLUSTER_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+    public String getNCJavaParams() {
+        return accessor.getString(Option.NC_JAVA_OPTS);
     }
 
-    @PropertyKey(EXTERNAL_PLOT_ACTIVATE)
-    public Boolean getIsPlottingEnabled() {
-        return accessor.getProperty(EXTERNAL_PLOT_ACTIVATE, EXTERNAL_PLOT_ACTIVATE_DEFAULT,
-                PropertyInterpreters.getBooleanPropertyInterpreter());
+    public String getCCJavaParams() {
+        return accessor.getString(Option.CC_JAVA_OPTS);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java
index 0afbbd3..a96d746 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java
@@ -18,65 +18,84 @@
  */
 package org.apache.asterix.common.config;
 
-import org.apache.hyracks.util.StorageUtil;
-
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
+import static org.apache.hyracks.control.common.config.OptionTypes.LONG;
+import static org.apache.hyracks.control.common.config.OptionTypes.LONG_BYTE_UNIT;
 import static org.apache.hyracks.util.StorageUtil.StorageUnit.MEGABYTE;
 
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.IOptionType;
+import org.apache.hyracks.api.config.Section;
+import org.apache.hyracks.util.StorageUtil;
+
 public class FeedProperties extends AbstractProperties {
 
-    private static final String FEED_CENTRAL_MANAGER_PORT_KEY = "feed.central.manager.port";
-    private static final int FEED_CENTRAL_MANAGER_PORT_DEFAULT = 4500;
+    public enum Option implements IOption {
+        FEED_PENDING_WORK_THRESHOLD(INTEGER, 50),
+        FEED_MEMORY_GLOBAL_BUDGET(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(64L, MEGABYTE)),
+        FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT(LONG, 10L),
+        FEED_CENTRAL_MANAGER_PORT(INTEGER, 4500),
+        FEED_MAX_THRESHOLD_PERIOD(INTEGER, 5);
 
-    private static final String FEED_MEMORY_GLOBALBUDGET_KEY = "feed.memory.global.budget";
-    private static final long FEED_MEMORY_GLOBALBUDGET_DEFAULT = StorageUtil.getSizeInBytes(64, MEGABYTE);
-                                                                 // i.e. 2048 frames (assuming 32768 as frame size)
+        private final IOptionType type;
+        private final Object defaultValue;
 
-    private static final String FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT_KEY = "feed.memory.available.wait.timeout";
-    private static final long FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT_DEFAULT = 10; // 10 seconds
+        Option(IOptionType type, Object defaultValue) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+        }
 
-    private static final String FEED_PENDING_WORK_THRESHOLD_KEY = "feed.pending.work.threshold";
-    private static final int FEED_PENDING_WORK_THRESHOLD_DEFAULT = 50;
+        @Override
+        public Section section() {
+            return Section.COMMON;
+        }
 
-    private static final String FEED_MAX_SUCCESSIVE_THRESHOLD_PERIOD_KEY = "feed.max.threshold.period";
-    private static final int FEED_MAX_SUCCESSIVE_THRESHOLD_PERIOD_DEFAULT = 5;
+        @Override
+        public String description() {
+            // TODO(mblow): add missing descriptions
+            switch (this) {
+                case FEED_CENTRAL_MANAGER_PORT:
+                    return "port at which the Central Feed Manager listens for control messages from local Feed " +
+                            "Managers";
+                case FEED_MAX_THRESHOLD_PERIOD:
+                    return "maximum length of input queue before triggering corrective action";
+                default:
+                    return null;
+            }
+        }
+
+        @Override
+        public IOptionType type() {
+            return type;
+        }
+
+        @Override
+        public Object defaultValue() {
+            return defaultValue;
+        }
+    }
 
     public FeedProperties(PropertiesAccessor accessor) {
         super(accessor);
     }
 
-    @PropertyKey(FEED_MEMORY_GLOBALBUDGET_KEY)
+    public int getPendingWorkThreshold() {
+        return accessor.getInt(Option.FEED_PENDING_WORK_THRESHOLD);
+    }
+
     public long getMemoryComponentGlobalBudget() {
-        return accessor.getProperty(FEED_MEMORY_GLOBALBUDGET_KEY, FEED_MEMORY_GLOBALBUDGET_DEFAULT,
-                PropertyInterpreters.getLongBytePropertyInterpreter());
+        return accessor.getLong(Option.FEED_MEMORY_GLOBAL_BUDGET);
     }
 
-    @PropertyKey(FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT_KEY)
     public long getMemoryAvailableWaitTimeout() {
-        return accessor.getProperty(FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT_KEY, FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT_DEFAULT,
-                PropertyInterpreters.getLongPropertyInterpreter());
+        return accessor.getLong(Option.FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT);
     }
 
-    /**
-     * @return port at which the Central Feed Manager listens for control messages from local Feed Managers
-     */
-    @PropertyKey(FEED_CENTRAL_MANAGER_PORT_KEY)
     public int getFeedCentralManagerPort() {
-        return accessor.getProperty(FEED_CENTRAL_MANAGER_PORT_KEY, FEED_CENTRAL_MANAGER_PORT_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
-    }
-
-    /**
-     * @return maximum length of input queue before triggering corrective action
-     */
-    @PropertyKey(FEED_PENDING_WORK_THRESHOLD_KEY)
-    public int getPendingWorkThreshold() {
-        return accessor.getProperty(FEED_PENDING_WORK_THRESHOLD_KEY, FEED_PENDING_WORK_THRESHOLD_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.FEED_CENTRAL_MANAGER_PORT);
     }
 
-    @PropertyKey(FEED_MAX_SUCCESSIVE_THRESHOLD_PERIOD_KEY)
     public int getMaxSuccessiveThresholdPeriod() {
-        return accessor.getProperty(FEED_MAX_SUCCESSIVE_THRESHOLD_PERIOD_KEY,
-                FEED_MAX_SUCCESSIVE_THRESHOLD_PERIOD_DEFAULT, PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.FEED_MAX_THRESHOLD_PERIOD);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java
index 1de1523..4637437 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java
@@ -19,21 +19,23 @@
 package org.apache.asterix.common.config;
 
 public interface IPropertiesProvider {
-    public StorageProperties getStorageProperties();
+    StorageProperties getStorageProperties();
 
-    public TransactionProperties getTransactionProperties();
+    TransactionProperties getTransactionProperties();
 
-    public CompilerProperties getCompilerProperties();
+    CompilerProperties getCompilerProperties();
 
-    public MetadataProperties getMetadataProperties();
+    MetadataProperties getMetadataProperties();
 
-    public ExternalProperties getExternalProperties();
+    ExternalProperties getExternalProperties();
 
-    public FeedProperties getFeedProperties();
+    FeedProperties getFeedProperties();
 
     BuildProperties getBuildProperties();
 
-    public ReplicationProperties getReplicationProperties();
+    ReplicationProperties getReplicationProperties();
 
-    public MessagingProperties getMessagingProperties();
+    MessagingProperties getMessagingProperties();
+
+    NodeProperties getNodeProperties();
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertyInterpreter.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertyInterpreter.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertyInterpreter.java
deleted file mode 100644
index 36f5716..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertyInterpreter.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.config;
-
-public interface IPropertyInterpreter<T> {
-    public T interpret(String s) throws IllegalArgumentException;
-}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java
index 2e98e1e..8097b5f 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java
@@ -18,28 +18,60 @@
  */
 package org.apache.asterix.common.config;
 
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER_BYTE_UNIT;
+import static org.apache.hyracks.util.StorageUtil.StorageUnit.KILOBYTE;
+
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.IOptionType;
+import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.util.StorageUtil;
-import org.apache.hyracks.util.StorageUtil.StorageUnit;
 
 public class MessagingProperties extends AbstractProperties {
 
-    private static final String MESSAGING_FRAME_SIZE_KEY = "messaging.frame.size";
-    private static final int MESSAGING_FRAME_SIZE_DEFAULT = StorageUtil.getSizeInBytes(4, StorageUnit.KILOBYTE);
+    public enum Option implements IOption {
+        MESSAGING_FRAME_SIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(4, KILOBYTE)),
+        MESSAGING_FRAME_COUNT(INTEGER, 512);
+
+        private final IOptionType type;
+        private final Object defaultValue;
+
+        Option(IOptionType type, Object defaultValue) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+        }
+
+        @Override
+        public Section section() {
+            return Section.COMMON;
+        }
 
-    private static final String MESSAGING_FRAME_COUNT_KEY = "messaging.frame.count";
-    private static final int MESSAGING_BUFFER_COUNTE_DEFAULT = 512;
+        @Override
+        public String description() {
+            // TODO(mblow): add missing descriptions
+            return null;
+        }
+
+        @Override
+        public IOptionType type() {
+            return type;
+        }
+
+        @Override
+        public Object defaultValue() {
+            return defaultValue;
+        }
+    }
 
     public MessagingProperties(PropertiesAccessor accessor) {
         super(accessor);
     }
 
     public int getFrameSize() {
-        return accessor.getProperty(MESSAGING_FRAME_SIZE_KEY, MESSAGING_FRAME_SIZE_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.MESSAGING_FRAME_SIZE);
     }
 
     public int getFrameCount() {
-        return accessor.getProperty(MESSAGING_FRAME_COUNT_KEY, MESSAGING_BUFFER_COUNTE_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.MESSAGING_FRAME_COUNT);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/4c7b5bfa/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java
index ab65b71..948bdad 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java
@@ -18,90 +18,135 @@
  */
 package org.apache.asterix.common.config;
 
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
+import static org.apache.hyracks.control.common.config.OptionTypes.STRING;
+
 import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 
 import org.apache.asterix.common.cluster.ClusterPartition;
+import org.apache.hyracks.api.config.IApplicationConfig;
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.IOptionType;
+import org.apache.hyracks.api.config.Section;
 
 public class MetadataProperties extends AbstractProperties {
 
-    private static final String METADATA_REGISTRATION_TIMEOUT_KEY = "metadata.registration.timeout.secs";
-    private static final long METADATA_REGISTRATION_TIMEOUT_DEFAULT = 60;
-
-    private static final String METADATA_PORT_KEY = "metadata.port";
-    private static final int METADATA_PORT_DEFAULT = 0;
+    public enum Option implements IOption {
+        INSTANCE_NAME(STRING, "DEFAULT_INSTANCE"),
+        METADATA_NODE(STRING, null),
+        METADATA_REGISTRATION_TIMEOUT_SECS(INTEGER, 60),
+        METADATA_LISTEN_PORT(INTEGER, 0),
+        METADATA_CALLBACK_PORT(INTEGER, 0);
+
+        private final IOptionType type;
+        private final Object defaultValue;
+
+        <T> Option(IOptionType<T> type, T defaultValue) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+        }
+
+        @Override
+        public Section section() {
+            return Section.COMMON;
+        }
+
+        @Override
+        public String description() {
+            switch (this) {
+                case INSTANCE_NAME:
+                    return "The name of this cluster instance";
+                case METADATA_NODE:
+                    return "the node which should serve as the metadata node";
+                case METADATA_REGISTRATION_TIMEOUT_SECS:
+                    return "how long in seconds to wait for the metadata node to register with the CC";
+                case METADATA_LISTEN_PORT:
+                    return "IP port to bind metadata listener (0 = random port)";
+                case METADATA_CALLBACK_PORT:
+                    return "IP port to bind metadata callback listener (0 = random port)";
+                default:
+                    throw new IllegalStateException("NYI: " + this);
+            }
+        }
+
+        @Override
+        public IOptionType type() {
+            return type;
+        }
+
+        @Override
+        public Object defaultValue() {
+            return defaultValue;
+        }
+
+        @Override
+        public Object get(IApplicationConfig cfg) {
+            if (this == METADATA_NODE) {
+                Object value = cfg.getStatic(this);
+                return value != null ? value : cfg.getNCNames().isEmpty() ? null : cfg.getNCNames().get(0);
+            } else {
+                return cfg.getStatic(this);
+            }
+        }
 
-    private static final String METADATA_CALLBACK_PORT_KEY = "metadata.callback.port";
-    private static final int METADATA_CALLBACK_PORT_DEFAULT = 0;
+    }
 
     public MetadataProperties(PropertiesAccessor accessor) {
         super(accessor);
     }
 
-    @PropertyKey("instance.name")
     public String getInstanceName() {
-        return accessor.getInstanceName();
+        return accessor.getString(Option.INSTANCE_NAME);
     }
 
-    @PropertyKey("metadata.node")
     public String getMetadataNodeName() {
-        return accessor.getMetadataNodeName();
+        return accessor.getString(Option.METADATA_NODE);
     }
 
-    @PropertyKey("metadata.partition")
     public ClusterPartition getMetadataPartition() {
-        return accessor.getMetadataPartition();
+        // metadata partition is always the first partition on the metadata node
+        return accessor.getNodePartitions().get(getMetadataNodeName())[0];
     }
 
-    @PropertyKey("node.stores")
     public Map<String, String[]> getStores() {
         return accessor.getStores();
     }
 
     public List<String> getNodeNames() {
-        return accessor.getNodeNames();
+        return accessor.getNCNames();
     }
 
     public String getCoredumpPath(String nodeId) {
         return accessor.getCoredumpPath(nodeId);
     }
 
-    @PropertyKey("core.dump.paths")
     public Map<String, String> getCoredumpPaths() {
         return accessor.getCoredumpConfig();
     }
 
-    @PropertyKey("node.partitions")
     public Map<String, ClusterPartition[]> getNodePartitions() {
         return accessor.getNodePartitions();
     }
 
-    @PropertyKey("cluster.partitions")
     public SortedMap<Integer, ClusterPartition> getClusterPartitions() {
         return accessor.getClusterPartitions();
     }
 
-    @PropertyKey("transaction.log.dirs")
     public Map<String, String> getTransactionLogDirs() {
         return accessor.getTransactionLogDirs();
     }
 
-    @PropertyKey(METADATA_REGISTRATION_TIMEOUT_KEY)
-    public long getRegistrationTimeoutSecs() {
-        return accessor.getProperty(METADATA_REGISTRATION_TIMEOUT_KEY, METADATA_REGISTRATION_TIMEOUT_DEFAULT,
-                PropertyInterpreters.getLongPropertyInterpreter());
+    public int getRegistrationTimeoutSecs() {
+        return accessor.getInt(Option.METADATA_REGISTRATION_TIMEOUT_SECS);
     }
 
-    @PropertyKey(METADATA_PORT_KEY)
     public int getMetadataPort() {
-        return accessor.getProperty(METADATA_PORT_KEY, METADATA_PORT_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.METADATA_LISTEN_PORT);
     }
 
-    @PropertyKey(METADATA_CALLBACK_PORT_KEY)
     public int getMetadataCallbackPort() {
-        return accessor.getProperty(METADATA_CALLBACK_PORT_KEY, METADATA_CALLBACK_PORT_DEFAULT,
-                PropertyInterpreters.getIntegerPropertyInterpreter());
+        return accessor.getInt(Option.METADATA_CALLBACK_PORT);
     }
 }