hive-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From da...@apache.org
Subject [10/50] [abbrv] hive git commit: HIVE-10950: Unit test against HBase Metastore (Daniel Dai, Vaibhav Gumashta)
Date Tue, 22 Sep 2015 05:03:41 GMT
HIVE-10950: Unit test against HBase Metastore (Daniel Dai, Vaibhav Gumashta)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/5acf458c
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/5acf458c
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/5acf458c

Branch: refs/heads/master
Commit: 5acf458c449bd2464076c243150760797ae57092
Parents: cb37021
Author: Vaibhav Gumashta <vgumashta@apache.org>
Authored: Fri Jul 24 09:13:02 2015 -0700
Committer: Vaibhav Gumashta <vgumashta@apache.org>
Committed: Fri Jul 24 09:13:02 2015 -0700

----------------------------------------------------------------------
 data/conf/hbase/hive-site.xml                   | 263 +++++++++++++++++++
 itests/qtest/pom.xml                            |  19 ++
 .../test/resources/testconfiguration.properties |  46 ++++
 itests/util/pom.xml                             |  12 +
 .../org/apache/hadoop/hive/ql/QTestUtil.java    |  72 ++++-
 .../hive/metastore/hbase/HBaseReadWrite.java    |   8 +-
 6 files changed, 411 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/5acf458c/data/conf/hbase/hive-site.xml
----------------------------------------------------------------------
diff --git a/data/conf/hbase/hive-site.xml b/data/conf/hbase/hive-site.xml
new file mode 100644
index 0000000..2cde40f
--- /dev/null
+++ b/data/conf/hbase/hive-site.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+   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.
+-->
+
+<configuration>
+
+<property>
+  <name>hive.in.test</name>
+  <value>true</value>
+  <description>Internal marker for test. Used for masking env-dependent values</description>
+</property>
+
+<!-- Hive Configuration can either be stored in this file or in the hadoop configuration
files  -->
+<!-- that are implied by Hadoop setup variables.                                     
          -->
+<!-- Aside from Hadoop setup variables - this file is provided as a convenience so that
Hive    -->
+<!-- users do not have to edit hadoop configuration files (that may be managed as a centralized
-->
+<!-- resource).                                                                      
          -->
+
+<!-- Hive Execution Parameters -->
+<property>
+  <name>hadoop.tmp.dir</name>
+  <value>${test.tmp.dir}/hadoop-tmp</value>
+  <description>A base for other temporary directories.</description>
+</property>
+
+<!--
+<property>
+  <name>hive.exec.reducers.max</name>
+  <value>1</value>
+  <description>maximum number of reducers</description>
+</property>
+-->
+
+<property>
+  <name>hive.exec.scratchdir</name>
+  <value>${test.tmp.dir}/scratchdir</value>
+  <description>Scratch space for Hive jobs</description>
+</property>
+
+<property>
+  <name>hive.exec.local.scratchdir</name>
+  <value>${test.tmp.dir}/localscratchdir/</value>
+  <description>Local scratch space for Hive jobs</description>
+</property>
+
+<property>
+  <name>javax.jdo.option.ConnectionURL</name>
+  <value>jdbc:derby:;databaseName=${test.tmp.dir}/junit_metastore_db;create=true</value>
+</property>
+
+<property>
+  <name>hive.stats.dbconnectionstring</name>
+  <value>jdbc:derby:;databaseName=${test.tmp.dir}/TempStatsStore;create=true</value>
+</property>
+
+
+<property>
+  <name>javax.jdo.option.ConnectionDriverName</name>
+  <value>org.apache.derby.jdbc.EmbeddedDriver</value>
+</property>
+
+<property>
+  <name>javax.jdo.option.ConnectionUserName</name>
+  <value>APP</value>
+</property>
+
+<property>
+  <name>javax.jdo.option.ConnectionPassword</name>
+  <value>mine</value>
+</property>
+
+<property>
+  <!--  this should eventually be deprecated since the metastore should supply this -->
+  <name>hive.metastore.warehouse.dir</name>
+  <value>${test.warehouse.dir}</value>
+  <description></description>
+</property>
+
+<property>
+  <name>hive.metastore.metadb.dir</name>
+  <value>file://${test.tmp.dir}/metadb/</value>
+  <description>
+  Required by metastore server or if the uris argument below is not supplied
+  </description>
+</property>
+
+<property>
+  <name>test.log.dir</name>
+  <value>${test.tmp.dir}/log/</value>
+  <description></description>
+</property>
+
+<property>
+  <name>test.data.files</name>
+  <value>${hive.root}/data/files</value>
+  <description></description>
+</property>
+
+<property>
+  <name>test.data.scripts</name>
+  <value>${hive.root}/data/scripts</value>
+  <description></description>
+</property>
+
+<property>
+  <name>hive.jar.path</name>
+  <value>${maven.local.repository}/org/apache/hive/hive-exec/${hive.version}/hive-exec-${hive.version}.jar</value>
+  <description></description>
+</property>
+
+<property>
+  <name>hive.querylog.location</name>
+  <value>${test.tmp.dir}/tmp</value>
+  <description>Location of the structured hive logs</description>
+</property>
+
+<property>
+  <name>hive.exec.pre.hooks</name>
+  <value>org.apache.hadoop.hive.ql.hooks.PreExecutePrinter, org.apache.hadoop.hive.ql.hooks.EnforceReadOnlyTables</value>
+  <description>Pre Execute Hook for Tests</description>
+</property>
+
+<property>
+  <name>hive.exec.post.hooks</name>
+  <value>org.apache.hadoop.hive.ql.hooks.PostExecutePrinter</value>
+  <description>Post Execute Hook for Tests</description>
+</property>
+
+<property>
+  <name>hive.support.concurrency</name>
+  <value>false</value>
+  <description>Whether hive supports concurrency or not. A zookeeper instance must
be up and running for the default hive lock manager to support read-write locks.</description>
+</property>
+
+<property>
+  <key>hive.unlock.numretries</key>
+  <value>2</value>
+  <description>The number of times you want to retry to do one unlock</description>
+</property>
+
+<property>
+  <key>hive.lock.sleep.between.retries</key>
+  <value>2</value>
+  <description>The sleep time (in seconds) between various retries</description>
+</property>
+
+
+<property>
+  <name>fs.pfile.impl</name>
+  <value>org.apache.hadoop.fs.ProxyLocalFileSystem</value>
+  <description>A proxy for local file system used for cross file system testing</description>
+</property>
+
+<property>
+  <name>hive.exec.mode.local.auto</name>
+  <value>false</value>
+  <description>
+    Let hive determine whether to run in local mode automatically
+    Disabling this for tests so that minimr is not affected
+  </description>
+</property>
+
+<property>
+  <name>hive.auto.convert.join</name>
+  <value>false</value>
+  <description>Whether Hive enable the optimization about converting common join into
mapjoin based on the input file size</description>
+</property>
+
+<property>
+  <name>hive.ignore.mapjoin.hint</name>
+  <value>false</value>
+  <description>Whether Hive ignores the mapjoin hint</description>
+</property>
+
+<property>
+  <name>hive.input.format</name>
+  <value>org.apache.hadoop.hive.ql.io.CombineHiveInputFormat</value>
+  <description>The default input format, if it is not specified, the system assigns
it. It is set to HiveInputFormat for hadoop versions 17, 18 and 19, whereas it is set to CombineHiveInputFormat
for hadoop 20. The user can always overwrite it - if there is a bug in CombineHiveInputFormat,
it can always be manually set to HiveInputFormat. </description>
+</property>
+
+<property>
+  <name>hive.default.rcfile.serde</name>
+  <value>org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe</value>
+  <description>The default SerDe hive will use for the rcfile format</description>
+</property>
+
+<property>
+  <name>hive.stats.dbclass</name>
+  <value>jdbc:derby</value>
+  <description>The storage for temporary stats generated by tasks. Currently, jdbc,
hbase and counter types are supported</description>
+</property>
+
+<property>
+  <name>hive.stats.key.prefix.reserve.length</name>
+  <value>0</value>
+</property>
+
+<property>
+  <name>hive.conf.restricted.list</name>
+  <value>dummy.config.value</value>
+  <description>Using dummy config value above because you cannot override config with
empty value</description>
+</property>
+
+<property>
+  <name>hive.exec.submit.local.task.via.child</name>
+  <value>false</value>
+</property>
+
+
+<property>
+  <name>hive.dummyparam.test.server.specific.config.override</name>
+  <value>from.hive-site.xml</value>
+  <description>Using dummy param to test server specific configuration</description>
+</property>
+
+<property>
+  <name>hive.dummyparam.test.server.specific.config.hivesite</name>
+  <value>from.hive-site.xml</value>
+  <description>Using dummy param to test server specific configuration</description>
+</property>
+
+<property>
+  <name>hive.ql.log.PerfLogger.level</name>
+  <value>WARN,DRFA</value>
+  <description>Used to change the perflogger level</description>
+</property>
+
+<property>
+  <name>hive.fetch.task.conversion</name>
+  <value>minimal</value>
+</property>
+
+<property>
+  <name>hive.users.in.admin.role</name>
+  <value>hive_admin_user</value>
+</property>
+
+<property>
+  <name>hive.metastore.fastpath</name>
+  <value>true</value>
+</property>
+
+<property>
+  <name>hive.metastore.rawstore.impl</name>
+  <value>org.apache.hadoop.hive.metastore.hbase.HBaseStore</value>
+</property>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/hive/blob/5acf458c/itests/qtest/pom.xml
----------------------------------------------------------------------
diff --git a/itests/qtest/pom.xml b/itests/qtest/pom.xml
index e195bee..a48772e 100644
--- a/itests/qtest/pom.xml
+++ b/itests/qtest/pom.xml
@@ -532,6 +532,25 @@
                   <else>
                   </else>
                 </if>
+                <!-- HBase Metastore -->
+                <qtestgen hiveRootDirectory="${basedir}/${hive.path.to.root}/"
+                          outputDirectory="${project.build.directory}/generated-test-sources/java/org/apache/hadoop/hive/cli/"
+                          templatePath="${basedir}/${hive.path.to.root}/ql/src/test/templates/"
template="TestCliDriver.vm"
+                          queryDirectory="${basedir}/${hive.path.to.root}/ql/src/test/queries/clientpositive/"
+                          queryFile="${qfile}"
+                          excludeQueryFile="${minimr.query.files},${minitez.query.files},${encrypted.query.files}"
+                          includeQueryFile="${miniHbaseMetastore.query.files}"
+                          queryFileRegex="${qfile_regex}"
+                          clusterMode="${clustermode}"
+                          runDisabled="${run_disabled}"
+                          hiveConfDir="${basedir}/${hive.path.to.root}/data/conf/hbase"
+                          resultsDirectory="${basedir}/${hive.path.to.root}/ql/src/test/results/clientpositive/"

+                          className="TestMiniHBaseMetastoreCliDriver"
+                          logFile="${project.build.directory}/testminihbasemetastoreclidrivergen.log"
+                          logDirectory="${project.build.directory}/qfile-results/clientpositive/"
+                          hadoopVersion="${active.hadoop.version}"
+                          initScript="q_test_init.sql"
+                          cleanupScript="q_test_cleanup.sql"/>
 
                 <!-- Negative Minimr -->
                 <qtestgen hiveRootDirectory="${basedir}/${hive.path.to.root}/"

http://git-wip-us.apache.org/repos/asf/hive/blob/5acf458c/itests/src/test/resources/testconfiguration.properties
----------------------------------------------------------------------
diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index fbde465..eb986db 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -1141,3 +1141,49 @@ miniSparkOnYarn.query.files=auto_sortmerge_join_16.q,\
   temp_table_external.q,\
   truncate_column_buckets.q,\
   uber_reduce.q
+
+miniHbaseMetastore.query.files=join1.q,\
+join2.q,\
+mapjoin1.q,\
+add_part_multiple.q,\
+annotate_stats_join.q,\
+authorization_parts.q,\
+auto_join1.q,\
+bucket1.q,\
+compute_stats_string.q,\
+create_1.q,\
+groupby1.q,\
+groupby12.q,\
+having.q,\
+innerjoin.q,\
+input_part10.q,\
+input20.q,\
+join1.q,\
+join20.q,\
+leftsemijoin.q,\
+mapjoin1.q,\
+multi_insert_gby.q,\
+orc_create.q,\
+orc_merge1.q,\
+show_roles.q,\
+stats0.q,\
+statsfs.q,\
+temp_table.q,\
+union.q,\
+union10.q,\
+alter_partition_change_col,\
+alter1.q,\
+analyze_tbl_part.q,\
+authorization_1.q,\
+columnstats_part_coltype.q,\
+ctas.q,\
+database.q,\
+drop_partition_with_stats.q,\
+drop_table_with_stats.q,\
+inputddl8.q,\
+order2.q,\
+partition_date.q,\
+partition_multilevels.q,\
+show_partitions.q,\
+sort.q,\
+view.q

http://git-wip-us.apache.org/repos/asf/hive/blob/5acf458c/itests/util/pom.xml
----------------------------------------------------------------------
diff --git a/itests/util/pom.xml b/itests/util/pom.xml
index 0743f01..b0818d6 100644
--- a/itests/util/pom.xml
+++ b/itests/util/pom.xml
@@ -170,6 +170,18 @@
           <groupId>org.apache.hbase</groupId>
           <artifactId>hbase-server</artifactId>
           <version>${hbase.hadoop2.version}</version>
+          <type>test-jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.hbase</groupId>
+          <artifactId>hbase-common</artifactId>
+          <version>${hbase.hadoop2.version}</version>
+          <type>test-jar</type>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.hbase</groupId>
+          <artifactId>hbase-server</artifactId>
+          <version>${hbase.hadoop2.version}</version>
         </dependency>
         <dependency>
           <groupId>org.apache.hbase</groupId>

http://git-wip-us.apache.org/repos/asf/hive/blob/5acf458c/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java b/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java
index 39d5d9e..efdebd7 100644
--- a/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.hive.ql;
 
+import static org.apache.hadoop.hive.metastore.MetaStoreUtils.DEFAULT_DATABASE_COMMENT;
 import static org.apache.hadoop.hive.metastore.MetaStoreUtils.DEFAULT_DATABASE_NAME;
 
 import java.io.BufferedInputStream;
@@ -65,6 +66,11 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.zookeeper.MiniZooKeeperCluster;
 import org.apache.hadoop.hive.cli.CliDriver;
 import org.apache.hadoop.hive.cli.CliSessionState;
@@ -75,7 +81,10 @@ import org.apache.hadoop.hive.common.io.SortPrintStream;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
 import org.apache.hadoop.hive.metastore.MetaStoreUtils;
+import org.apache.hadoop.hive.metastore.Warehouse;
 import org.apache.hadoop.hive.metastore.api.Index;
+import org.apache.hadoop.hive.metastore.hbase.HBaseReadWrite;
+import org.apache.hadoop.hive.metastore.hbase.TephraHBaseConnection;
 import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.Task;
 import org.apache.hadoop.hive.ql.exec.Utilities;
@@ -162,6 +171,8 @@ public class QTestUtil {
   public interface SuiteAddTestFunctor {
     public void addTestToSuite(TestSuite suite, Object setup, String tName);
   }
+  private HBaseTestingUtility utility;
+  private boolean snapshotTaken = false;
 
   static {
     for (String srcTable : System.getProperty("test.src.tables", "").trim().split(",")) {
@@ -277,10 +288,6 @@ public class QTestUtil {
       conf.setBoolVar(ConfVars.HIVE_VECTORIZATION_ENABLED, true);
     }
 
-    // Plug verifying metastore in for testing.
-    conf.setVar(HiveConf.ConfVars.METASTORE_RAW_STORE_IMPL,
-      "org.apache.hadoop.hive.metastore.VerifyingObjectStore");
-
     if (mr != null) {
       assert dfs != null;
 
@@ -342,6 +349,51 @@ public class QTestUtil {
     return "jceks://file" + new Path(keyDir, "test.jks").toUri();
   }
 
+  private void rebuildHBase() throws Exception {
+    HBaseAdmin admin = utility.getHBaseAdmin();
+    if (!snapshotTaken) {
+      for (String tableName : HBaseReadWrite.tableNames) {
+        List<byte[]> families = HBaseReadWrite.columnFamilies.get(tableName);
+        HTableDescriptor desc = new HTableDescriptor(
+            TableName.valueOf(tableName));
+        for (byte[] family : families) {
+          HColumnDescriptor columnDesc = new HColumnDescriptor(family);
+          desc.addFamily(columnDesc);
+        }
+        try {
+          admin.disableTable(tableName);
+          admin.deleteTable(tableName);
+        } catch (IOException e) {
+          System.out.println(e.getMessage());
+        }
+        admin.createTable(desc);
+      }
+    } else {
+      for (String tableName : HBaseReadWrite.tableNames) {
+        admin.disableTable(tableName);
+        admin.restoreSnapshot("snapshot_" + tableName);
+        admin.enableTable(tableName);
+      }
+      try {
+        db.createDatabase(new org.apache.hadoop.hive.metastore.api.Database(
+            DEFAULT_DATABASE_NAME, DEFAULT_DATABASE_COMMENT, new Warehouse(conf)
+                .getDefaultDatabasePath(DEFAULT_DATABASE_NAME).toString(), null));
+      } catch (Exception e) {
+        // Ignore if default database already exist
+      }
+      SessionState.get().setCurrentDatabase(DEFAULT_DATABASE_NAME);
+    }
+    admin.close();
+  }
+
+  private void startMiniHBaseCluster() throws Exception {
+    utility = new HBaseTestingUtility();
+    utility.startMiniCluster();
+    conf = new HiveConf(utility.getConfiguration(), Driver.class);
+    rebuildHBase();
+    HBaseReadWrite.getInstance(conf);
+  }
+
   public QTestUtil(String outDir, String logDir, MiniClusterType clusterType,
       String confDir, String hadoopVer, String initScript, String cleanupScript)
     throws Exception {
@@ -351,6 +403,7 @@ public class QTestUtil {
       HiveConf.setHiveSiteLocation(new URL("file://"+ new File(confDir).toURI().getPath()
+ "/hive-site.xml"));
       System.out.println("Setting hive-site: "+HiveConf.getHiveSiteLocation());
     }
+    startMiniHBaseCluster();
     conf = new HiveConf(Driver.class);
     this.hadoopVer = getHadoopMainVersion(hadoopVer);
     qMap = new TreeMap<String, String>();
@@ -444,6 +497,7 @@ public class QTestUtil {
         sparkSession = null;
       }
     }
+    utility.shutdownMiniCluster();
     if (mr != null) {
       mr.shutdown();
       mr = null;
@@ -731,6 +785,8 @@ public class QTestUtil {
       return;
     }
 
+    rebuildHBase();
+
     clearTablesCreatedDuringTests();
     clearKeysCreatedInTests();
 
@@ -820,6 +876,12 @@ public class QTestUtil {
     cliDriver.processLine(initCommands);
 
     conf.setBoolean("hive.test.init.phase", false);
+
+    HBaseAdmin admin = utility.getHBaseAdmin();
+    for (String tableName : HBaseReadWrite.tableNames) {
+      admin.snapshot("snapshot_" + tableName, tableName);
+    }
+    snapshotTaken = true;
   }
 
   public void init() throws Exception {
@@ -1571,7 +1633,7 @@ public class QTestUtil {
       // close it first.
       SessionState ss = SessionState.get();
       if (ss != null && ss.out != null && ss.out != System.out) {
-	ss.out.close();
+  ss.out.close();
       }
 
       String inSorted = inFileName + SORT_SUFFIX;

http://git-wip-us.apache.org/repos/asf/hive/blob/5acf458c/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseReadWrite.java
----------------------------------------------------------------------
diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseReadWrite.java
b/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseReadWrite.java
index ae73feb..ca1582e 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseReadWrite.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseReadWrite.java
@@ -71,7 +71,7 @@ import java.util.Set;
 /**
  * Class to manage storing object in and reading them from HBase.
  */
-class HBaseReadWrite {
+public class HBaseReadWrite {
 
   @VisibleForTesting final static String AGGR_STATS_TABLE = "HBMS_AGGR_STATS";
   @VisibleForTesting final static String DB_TABLE = "HBMS_DBS";
@@ -90,10 +90,10 @@ class HBaseReadWrite {
   /**
    * List of tables in HBase
    */
-  final static String[] tableNames = { AGGR_STATS_TABLE, DB_TABLE, FUNC_TABLE, GLOBAL_PRIVS_TABLE,
+  public final static String[] tableNames = { AGGR_STATS_TABLE, DB_TABLE, FUNC_TABLE, GLOBAL_PRIVS_TABLE,
                                        PART_TABLE, USER_TO_ROLE_TABLE, ROLE_TABLE, SD_TABLE,
                                        SECURITY_TABLE, SEQUENCES_TABLE, TABLE_TABLE};
-  final static Map<String, List<byte[]>> columnFamilies =
+  public final static Map<String, List<byte[]>> columnFamilies =
       new HashMap<String, List<byte[]>> (tableNames.length);
 
   static {
@@ -178,7 +178,7 @@ class HBaseReadWrite {
    * @param configuration Configuration object
    * @return thread's instance of HBaseReadWrite
    */
-  static HBaseReadWrite getInstance(Configuration configuration) {
+  public static HBaseReadWrite getInstance(Configuration configuration) {
     staticConf = configuration;
     return self.get();
   }


Mime
View raw message