Merge commit '627b31f8141c9789ca44a5dc384c8c6ac30ecefc' from 'release-0.9.4-pre-rc' into 'stabilization-f69489'

Change-Id: I6a1257029f8aa12ec3fb4e3ce86ee3d42e40a131
diff --git a/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE b/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE
index 4ad6d94..7e6690d 100644
--- a/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE
+++ b/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE
@@ -6,9 +6,7 @@
    Portions of the AsterixDB WebUI
        located at:
          webui/static/js/jquery.min.js,
-         webui/static/js/jquery.autosize-min.js,
-       and
-         queryui/js/jquery-1.12.4.min.js
+         webui/static/js/jquery.autosize-min.js
 
    are available under an MIT-style license:
 ---
@@ -44,6 +42,7 @@
 
    ====
 
+
    All files located in the node_modules and external directories are
    externally maintained libraries used by this software which have their
    own licenses; we recommend you read them, as their terms may differ from
@@ -470,4 +469,4 @@
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
----
\ No newline at end of file
+---
diff --git a/asterixdb/asterix-docker/pom.xml b/asterixdb/asterix-docker/pom.xml
index fd4a61f..0da3620 100644
--- a/asterixdb/asterix-docker/pom.xml
+++ b/asterixdb/asterix-docker/pom.xml
@@ -39,25 +39,30 @@
     </license>
   </licenses>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>com.spotify</groupId>
-        <artifactId>docker-maven-plugin</artifactId>
-        <version>0.2.11</version>
-        <configuration>
-          <imageName>asterixdb/demo</imageName>
-          <dockerDirectory>docker</dockerDirectory>
-          <resources>
-            <resource>
-              <targetPath>/</targetPath>
-              <directory>../asterix-server/target/</directory>
-              <include>asterix-server-${project.version}-binary-assembly.zip</include>
-            </resource>
-          </resources>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
+  <profiles>
+    <profile>
+        <id>docker</id>
+        <build>
+          <plugins>
+            <plugin>
+              <groupId>com.spotify</groupId>
+              <artifactId>docker-maven-plugin</artifactId>
+              <version>0.2.11</version>
+              <configuration>
+                <imageName>asterixdb/demo</imageName>
+                <dockerDirectory>docker</dockerDirectory>
+                <resources>
+                  <resource>
+                    <targetPath>/</targetPath>
+                    <directory>../asterix-server/target/</directory>
+                    <include>asterix-server-${project.version}-binary-assembly.zip</include>
+                  </resource>
+                </resources>
+              </configuration>
+            </plugin>
+          </plugins>
+        </build>
+    </profile>
+  </profiles>
 
 </project>
diff --git a/asterixdb/asterix-server/pom.xml b/asterixdb/asterix-server/pom.xml
index da6f097..7049475 100644
--- a/asterixdb/asterix-server/pom.xml
+++ b/asterixdb/asterix-server/pom.xml
@@ -484,23 +484,23 @@
                 <configuration>
                   <dataSet>
                     <data>
-                      <src>${project.build.directory}/${project.build.finalName}-binary-assembly/</src>
+                      <src>${project.build.directory}/${project.build.finalName}-binary-assembly/apache-asterixdb-${project.version}/</src>
                       <excludes>bin/**</excludes>
                       <type>directory</type>
                       <mapper>
                         <type>perm</type>
-                        <prefix>/opt/apache-asterixdb/</prefix>
+                        <prefix>/opt/apache-asterixdb-${project.version}/</prefix>
                         <user>asterixdb</user>
                         <group>asterixdb</group>
                         <filemode>644</filemode>
                       </mapper>
                     </data>
                     <data>
-                      <src>${project.build.directory}/${project.build.finalName}-binary-assembly/bin</src>
+                      <src>${project.build.directory}/${project.build.finalName}-binary-assembly/apache-asterixdb-${project.version}/bin</src>
                       <type>directory</type>
                       <mapper>
                         <type>perm</type>
-                        <prefix>/opt/apache-asterixdb/bin</prefix>
+                        <prefix>/opt/apache-asterixdb-${project.version}/bin</prefix>
                         <user>asterixdb</user>
                         <group>asterixdb</group>
                         <filemode>754</filemode>
diff --git a/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml b/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml
index 37f0e00..c84cec0 100644
--- a/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml
+++ b/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml
@@ -28,7 +28,7 @@
   <fileSets>
     <fileSet>
       <directory>target/generated-sources</directory>
-      <outputDirectory>.</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/</outputDirectory>
       <includes>
         <include>LICENSE*</include>
         <include>NOTICE*</include>
@@ -36,7 +36,7 @@
     </fileSet>
     <fileSet>
       <directory>src/main/opt</directory>
-      <outputDirectory>opt</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/opt</outputDirectory>
       <excludes>
         <exclude>**/*.sh</exclude>
       </excludes>
@@ -44,7 +44,7 @@
     </fileSet>
     <fileSet>
       <directory>src/main/opt</directory>
-      <outputDirectory>opt</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/opt</outputDirectory>
       <includes>
         <include>**/*.sh</include>
       </includes>
@@ -53,7 +53,7 @@
     </fileSet>
     <fileSet>
       <directory>src/main/opt/ansible/yaml</directory>
-      <outputDirectory>opt/aws/yaml</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/opt/aws/yaml</outputDirectory>
       <includes>
         <include>**/*.yml</include>
       </includes>
@@ -61,7 +61,7 @@
     </fileSet>
     <fileSet>
       <directory>src/main/opt/ansible/conf</directory>
-      <outputDirectory>opt/aws/conf</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/opt/aws/conf</outputDirectory>
       <includes>
         <include>**/instance_settings.yml</include>
       </includes>
@@ -69,16 +69,16 @@
     </fileSet>
     <fileSet>
       <directory>target/appassembler/repo</directory>
-      <outputDirectory>repo</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/repo</outputDirectory>
     </fileSet>
     <fileSet>
       <directory>target/appassembler/bin</directory>
-      <outputDirectory>bin</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/bin</outputDirectory>
       <fileMode>0755</fileMode>
     </fileSet>
     <fileSet>
       <directory>target/generated-resources/appassembler/booter-windows/etc</directory>
-      <outputDirectory>etc</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/etc</outputDirectory>
       <includes>
         <include>*.xml</include>
       </includes>
@@ -86,7 +86,7 @@
 
     <fileSet>
       <directory>target/generated-resources/appassembler/booter-windows/bin</directory>
-      <outputDirectory>bin</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}/bin</outputDirectory>
       <fileMode>0755</fileMode>
     </fileSet>
   </fileSets>
@@ -94,7 +94,7 @@
     <dependencySet>
       <useStrictFiltering>true</useStrictFiltering>
       <unpack>true</unpack>
-      <outputDirectory>.</outputDirectory>
+      <outputDirectory>apache-asterixdb-${project.version}</outputDirectory>
       <includes>
         <include>org.apache.asterix:asterix-client-helper:zip:assembly:*</include>
       </includes>
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
index 60406b8..0c8df08 100644
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
@@ -46,6 +46,11 @@
     }
 
     @Override
+    protected String getTopLevelDirPattern() {
+        return "apache-asterixdb.*";
+    }
+
+    @Override
     protected String pathToLicensingFiles() {
         return "";
     }
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/RecoveryIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/RecoveryIT.java
index ba367a7..308920b 100644
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/RecoveryIT.java
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/RecoveryIT.java
@@ -53,6 +53,8 @@
     private static File installerTargetPath;
     private static String ncServiceHomeDirName;
     private static String ncServiceHomePath;
+    private static String ncServiceSubDirName;
+    private static String ncServiceSubPath;
     private static String scriptHomePath;
     private static String reportPath;
     private static ProcessBuilder pb;
@@ -74,14 +76,11 @@
         asterixInstallerPath = new File(System.getProperty("user.dir"));
         installerTargetPath = new File(new File(asterixInstallerPath.getParentFile(), "asterix-server"), "target");
         reportPath = new File(installerTargetPath, "failsafe-reports").getAbsolutePath();
-        ncServiceHomeDirName = installerTargetPath.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return new File(dir, name).isDirectory() && name.startsWith("asterix-server")
-                        && name.endsWith("binary-assembly");
-            }
-        })[0];
-        ncServiceHomePath = new File(installerTargetPath, ncServiceHomeDirName).getAbsolutePath();
+        ncServiceSubDirName =
+                installerTargetPath.list((dir, name) -> name.matches("asterix-server.*binary-assembly"))[0];
+        ncServiceSubPath = new File(installerTargetPath, ncServiceSubDirName).getAbsolutePath();
+        ncServiceHomeDirName = new File(ncServiceSubPath).list(((dir, name) -> name.matches("apache-asterixdb.*")))[0];
+        ncServiceHomePath = new File(ncServiceSubPath, ncServiceHomeDirName).getAbsolutePath();
 
         LOGGER.info("NCSERVICE_HOME=" + ncServiceHomePath);
 
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
index defd378..0479bb2 100644
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
@@ -58,7 +58,7 @@
     // src/test/resources/NCServiceExecutionIT/cc.conf.
     private static final String OUTPUT_DIR = joinPath(TARGET_DIR, "sample local cluster");
 
-    private static final String LOCAL_SAMPLES_DIR = joinPath(OUTPUT_DIR, "opt", "local");
+    private static String localSamplesDir;
 
     @Rule
     public TestRule watcher = new TestMethodTracer();
@@ -79,6 +79,8 @@
         String installerZip = joinPath(pathElements);
 
         TestHelper.unzip(installerZip, OUTPUT_DIR);
+        String tlpName = new File(OUTPUT_DIR).list((dir, name) -> name.matches("apache-asterixdb.*"))[0];
+        localSamplesDir = joinPath(OUTPUT_DIR, tlpName, "opt", "local");
 
     }
 
@@ -109,9 +111,9 @@
     @Test
     public void test0_startCluster() throws Exception {
         Process process =
-                new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh"), "-f").inheritIO().start();
+                new ProcessBuilder(joinPath(localSamplesDir, "bin/stop-sample-cluster.sh"), "-f").inheritIO().start();
         Assert.assertEquals(0, process.waitFor());
-        process = new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/start-sample-cluster.sh")).inheritIO().start();
+        process = new ProcessBuilder(joinPath(localSamplesDir, "bin/start-sample-cluster.sh")).inheritIO().start();
         Assert.assertEquals(0, process.waitFor());
     }
 
@@ -130,7 +132,7 @@
     @Test
     public void test2_stopCluster() throws Exception {
         Process process =
-                new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh")).inheritIO().start();
+                new ProcessBuilder(joinPath(localSamplesDir, "bin/stop-sample-cluster.sh")).inheritIO().start();
         Assert.assertEquals(0, process.waitFor());
         try {
             new URL("http://127.0.0.1:19002").openConnection().connect();
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql
index 9b2960d..b99ccdc 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql
@@ -29,4 +29,4 @@
 
 load dataset testds
 using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/target/data/big-object/big_object_20M.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/target/data/big-object/big_object_20M.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql
index 31fd5e3..ab07679 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql
index a44f3f1..cb8afd6 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql
index f55701e..5558005 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql
@@ -20,4 +20,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql
index 9b0e47d..f48ccd5 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql
@@ -21,4 +21,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql
index 7c99165..6a18e6e 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
index e286a80..9bbef93 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql
index e286a80..9bbef93 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql
index 9b0e47d..f48ccd5 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql
@@ -21,4 +21,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
index e286a80..9bbef93 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql
index d52fe3e..0f245b5 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql
@@ -27,4 +27,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql
index 9b0e47d..f48ccd5 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql
@@ -21,4 +21,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
index cc626b5..66adcef 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
@@ -27,4 +27,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql
index d52fe3e..0f245b5 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql
@@ -27,4 +27,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
index eef562a..ce01110 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql
index e286a80..9bbef93 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
index e286a80..9bbef93 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql
index d52fe3e..0f245b5 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql
@@ -27,4 +27,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql
index ef59319..1d24079 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql
@@ -26,4 +26,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql
index ef59319..1d24079 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql
@@ -26,4 +26,4 @@
 
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql
index 31fd5e3..ab07679 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql
index 31fd5e3..ab07679 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql
index 31fd5e3..ab07679 100644
--- a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql
@@ -26,4 +26,4 @@
 use dataverse recovery;
 
 load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
+(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml
index f7ddb58..fbf17c1 100644
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@ -848,6 +848,7 @@
     <module>asterix-test-framework</module>
     <module>asterix-maven-plugins</module>
     <module>asterix-server</module>
+    <module>asterix-docker</module>
     <module>asterix-doc</module>
     <module>asterix-fuzzyjoin</module>
     <module>asterix-replication</module>
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java
index e2ab3a3..9e52785 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/LicensingTestBase.java
@@ -37,10 +37,19 @@
             final String pattern = getInstallerDirPattern();
             final String targetDir = getTargetDir();
             final String[] list = new File(targetDir).list((dir, name) -> name.matches(pattern));
+            final String topLevelPattern = getTopLevelDirPattern();
+            String[] topLevel;
+            if (topLevelPattern == null) {
+                topLevel = new String[] { "" };
+            } else {
+                topLevel = new File(FileUtil.joinPath(targetDir, list[0]))
+                        .list((dir, name) -> name.matches(topLevelPattern));
+            }
+            installerDir = FileUtil.joinPath(targetDir, list[0], topLevel[0]);
             Assert.assertNotNull("installerDir", list);
-            Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + Arrays.toString(list), list.length > 1);
-            Assert.assertEquals("Can't find install dir (" + pattern + ")", 1, list.length);
-            installerDir = FileUtil.joinPath(targetDir, list[0]);
+            Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + Arrays.toString(topLevel),
+                    list.length > 1);
+            Assert.assertEquals("Can't find install dir (" + pattern + ")", 1, topLevel.length);
         }
     }
 
@@ -48,6 +57,8 @@
 
     protected abstract String getInstallerDirPattern();
 
+    protected abstract String getTopLevelDirPattern();
+
     protected abstract String pathToLicensingFiles();
 
     protected abstract String[] getRequiredArtifactNames();