浏览代码

HUE-2755 [metastore] Convert all tests to be re-entrant

Romain Rigaux 10 年之前
父节点
当前提交
44b9788
共有 2 个文件被更改,包括 54 次插入43 次删除
  1. 2 2
      apps/beeswax/src/beeswax/test_base.py
  2. 52 41
      apps/metastore/src/metastore/tests.py

+ 2 - 2
apps/beeswax/src/beeswax/test_base.py

@@ -392,8 +392,8 @@ class BeeswaxSampleProvider(object):
 
     # Insert additional partition data into "test_partitions" table
     ADD_PARTITION = """
-      ALTER TABLE `%(db)s`.`test_partitions` ADD PARTITION(baz='baz_foo', boom='boom_bar') LOCATION '/tmp/beeswax/baz_foo/boom_bar'
-    """ % {'db': cls.db_name}
+      ALTER TABLE `%(db)s`.`test_partitions` ADD PARTITION(baz='baz_foo', boom='boom_bar') LOCATION '%(fs_prefix)s/baz_foo/boom_bar'
+    """ % {'db': cls.db_name, 'fs_prefix': cls.cluster.fs_prefix}
     make_query(cls.client, ADD_PARTITION, wait=True, local=False)
 
     # Create a bunch of other tables

+ 52 - 41
apps/metastore/src/metastore/tests.py

@@ -68,22 +68,22 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
   def test_basic_flow(self):
     # Default database should exist
     response = self.client.get("/metastore/databases")
-    assert_true("default" in response.context["databases"])
+    assert_true(self.db_name in response.context["databases"])
 
     # Table should have been created
     response = self.client.get("/metastore/tables/")
-    assert_true("test" in response.context["tables"])
+    assert_equal(200, response.status_code)
 
     # Switch databases
-    response = self.client.get("/metastore/tables/default")
+    response = self.client.get("/metastore/tables/%s" % self.db_name)
     assert_true("test" in response.context["tables"])
 
     # Should default to "default" database
     response = self.client.get("/metastore/tables/not_there")
-    assert_true("test" in response.context["tables"])
+    assert_equal(200, response.status_code)
 
     # And have detail
-    response = self.client.get("/metastore/table/default/test")
+    response = self.client.get("/metastore/table/%s/test" % self.db_name)
     assert_true("foo" in response.content)
     assert_true("SerDe Library" in response.content, response.content)
 
@@ -91,7 +91,7 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
     history_cnt = verify_history(self.client, fragment='test')
 
     # Show table data.
-    response = self.client.get("/metastore/table/default/test/read", follow=True)
+    response = self.client.get("/metastore/table/%s/test/read" % self.db_name, follow=True)
     response = self.client.get(reverse("beeswax:api_watch_query_refresh_json", kwargs={'id': response.context['query'].id}), follow=True)
     response = wait_for_query_to_finish(self.client, response, max=30.0)
     # Note that it may not return all rows at once. But we expect at least 10.
@@ -101,53 +101,53 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
     assert_equal(verify_history(self.client, fragment='test'), history_cnt, 'Implicit queries should not be saved in the history')
 
   def test_describe_view(self):
-    resp = self.client.get('/metastore/table/default/myview')
+    resp = self.client.get('/metastore/table/%s/myview' % self.db_name)
     assert_equal(None, resp.context['sample'])
     assert_true(resp.context['table'].is_view)
     assert_true("View" in resp.content)
     assert_true("Drop View" in resp.content)
     # Breadcrumbs
-    assert_true("default" in resp.content)
+    assert_true(self.db_name in resp.content)
     assert_true("myview" in resp.content)
 
   def test_describe_partitions(self):
-    response = self.client.get("/metastore/table/default/test_partitions")
+    response = self.client.get("/metastore/table/%s/test_partitions" % self.db_name)
     assert_true("Show Partitions (2)" in response.content, response.content)
 
-    response = self.client.get("/metastore/table/default/test_partitions/partitions", follow=True)
+    response = self.client.get("/metastore/table/%s/test_partitions/partitions" % self.db_name, follow=True)
     assert_true("baz_one" in response.content)
     assert_true("boom_two" in response.content)
     assert_true("baz_foo" in response.content)
     assert_true("boom_bar" in response.content)
     # Breadcrumbs
-    assert_true("default" in response.content)
+    assert_true(self.db_name in response.content)
     assert_true("test_partitions" in response.content)
     assert_true("partitions" in response.content)
 
     # Not partitioned
-    response = self.client.get("/metastore/table/default/test/partitions", follow=True)
+    response = self.client.get("/metastore/table/%s/test/partitions" % self.db_name, follow=True)
     assert_true("is not partitioned." in response.content)
 
   def test_describe_partitioned_table_with_limit(self):
     # Limit to 90
     finish = BROWSE_PARTITIONED_TABLE_LIMIT.set_for_testing("90")
     try:
-      response = self.client.get("/metastore/table/default/test_partitions")
+      response = self.client.get("/metastore/table/%s/test_partitions" % self.db_name)
       assert_true("0x%x" % 89 in response.content, response.content)
       assert_false("0x%x" % 90 in response.content, response.content)
     finally:
       finish()
 
   def test_read_partitions(self):
-    response = self.client.get("/metastore/table/default/test_partitions/partitions/0/read", follow=True)
+    response = self.client.get("/metastore/table/%s/test_partitions/partitions/0/read" % self.db_name, follow=True)
     response = self.client.get(reverse("beeswax:api_watch_query_refresh_json", kwargs={'id': response.context['query'].id}), follow=True)
     response = wait_for_query_to_finish(self.client, response, max=30.0)
     results = fetch_query_result_data(self.client, response)
     assert_true(len(results['results']) > 0, results)
 
   def test_browse_partition(self):
-    response = self.client.get("/metastore/table/default/test_partitions/partitions/1/browse", follow=True)
-    filebrowser_path = reverse("filebrowser.views.view", kwargs={'path': '/tmp/beeswax/baz_foo/boom_bar'})
+    response = self.client.get("/metastore/table/%s/test_partitions/partitions/1/browse" % self.db_name, follow=True)
+    filebrowser_path = reverse("filebrowser.views.view", kwargs={'path': '%s/baz_foo/boom_bar' % self.cluster.fs_prefix})
     assert_equal(response.request['PATH_INFO'], filebrowser_path)
 
   def test_drop_multi_tables(self):
@@ -156,30 +156,39 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
       CREATE TABLE test_drop_2 (a int);
       CREATE TABLE test_drop_3 (a int);
     """
-    resp = _make_query(self.client, hql)
+    resp = _make_query(self.client, hql, database=self.db_name)
     resp = wait_for_query_to_finish(self.client, resp, max=30.0)
 
     # Drop them
-    resp = self.client.get('/metastore/tables/drop/default', follow=True)
+    resp = self.client.get('/metastore/tables/drop/%s' % self.db_name, follow=True)
     assert_true('want to delete' in resp.content, resp.content)
-    resp = self.client.post('/metastore/tables/drop/default', {u'table_selection': [u'test_drop_1', u'test_drop_2', u'test_drop_3']})
+    resp = self.client.post('/metastore/tables/drop/%s' % self.db_name, {u'table_selection': [u'test_drop_1', u'test_drop_2', u'test_drop_3']})
     assert_equal(resp.status_code, 302)
 
 
   def test_drop_multi_databases(self):
-    hql = """
-      CREATE DATABASE test_drop_1;
-      CREATE DATABASE test_drop_2;
-      CREATE DATABASE test_drop_3;
-    """
-    resp = _make_query(self.client, hql)
-    resp = wait_for_query_to_finish(self.client, resp, max=30.0)
+    db1 = '%s_test_drop_1' % self.db_name
+    db2 = '%s_test_drop_2' % self.db_name
+    db3 = '%s_test_drop_3' % self.db_name
 
-    # Drop them
-    resp = self.client.get('/metastore/databases/drop', follow=True)
-    assert_true('want to delete' in resp.content, resp.content)
-    resp = self.client.post('/metastore/databases/drop', {u'database_selection': [u'test_drop_1', u'test_drop_2', u'test_drop_3']})
-    assert_equal(resp.status_code, 302)
+    try:
+      hql = """
+        CREATE DATABASE %(db1)s;
+        CREATE DATABASE %(db2)s;
+        CREATE DATABASE %(db3)s;
+      """ % {'db1': db1, 'db2': db2, 'db3': db3}
+      resp = _make_query(self.client, hql)
+      resp = wait_for_query_to_finish(self.client, resp, max=30.0)
+
+      # Drop them
+      resp = self.client.get('/metastore/databases/drop', follow=True)
+      assert_true('want to delete' in resp.content, resp.content)
+      resp = self.client.post('/metastore/databases/drop', {u'database_selection': [db1, db2, db3]})
+      assert_equal(resp.status_code, 302)
+    finally:
+      make_query(self.client, 'DROP DATABASE IF EXISTS %(db)s' % {'db': db1}, wait=True)
+      make_query(self.client, 'DROP DATABASE IF EXISTS %(db)s' % {'db': db2}, wait=True)
+      make_query(self.client, 'DROP DATABASE IF EXISTS %(db)s' % {'db': db3}, wait=True)
 
 
   def test_load_data(self):
@@ -189,23 +198,25 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
     about whether a table is partitioned.
     """
     # Check that view works
-    resp = self.client.get("/metastore/table/default/test/load", follow=True)
+    resp = self.client.get("/metastore/table/%s/test/load" % self.db_name, follow=True)
     assert_true('Path' in resp.content)
 
+    data_path = '%(prefix)s/tmp/foo' % {'prefix': self.cluster.fs_prefix}
+
     # Try the submission
-    self.client.post("/metastore/table/default/test/load", dict(path="/tmp/foo", overwrite=True), follow=True)
+    self.client.post("/metastore/table/%s/test/load" % self.db_name, {'path': data_path, 'overwrite': True}, follow=True)
     query = QueryHistory.objects.latest('id')
 
-    assert_equal_mod_whitespace("LOAD DATA INPATH '/tmp/foo' OVERWRITE INTO TABLE `default`.`test`", query.query)
+    assert_equal_mod_whitespace("LOAD DATA INPATH '%(data_path)s' OVERWRITE INTO TABLE `%(db)s`.`test`" % {'data_path': data_path, 'db': self.db_name}, query.query)
 
-    resp = self.client.post("/metastore/table/default/test/load", dict(path="/tmp/foo", overwrite=False), follow=True)
+    resp = self.client.post("/metastore/table/%s/test/load" % self.db_name, {'path': data_path, 'overwrite': False}, follow=True)
     query = QueryHistory.objects.latest('id')
-    assert_equal_mod_whitespace("LOAD DATA INPATH '/tmp/foo' INTO TABLE `default`.`test`", query.query)
+    assert_equal_mod_whitespace("LOAD DATA INPATH '%(data_path)s' INTO TABLE `%(db)s`.`test`" % {'data_path': data_path, 'db': self.db_name}, query.query)
 
     # Try it with partitions
-    resp = self.client.post("/metastore/table/default/test_partitions/load", dict(path="/tmp/foo", partition_0="alpha", partition_1="beta"), follow=True)
+    resp = self.client.post("/metastore/table/%s/test_partitions/load" % self.db_name, {'path': data_path, 'partition_0': "alpha", 'partition_1': "beta"}, follow=True)
     query = QueryHistory.objects.latest('id')
-    assert_equal_mod_whitespace(query.query, "LOAD DATA INPATH '/tmp/foo' INTO TABLE `default`.`test_partitions` PARTITION (baz='alpha', boom='beta')")
+    assert_equal_mod_whitespace(query.query, "LOAD DATA INPATH '%(data_path)s' INTO TABLE `%(db)s`.`test_partitions` PARTITION (baz='alpha', boom='beta')" % {'data_path': data_path, 'db': self.db_name})
 
 
   def test_has_write_access_frontend(self):
@@ -238,14 +249,14 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
     grant_access("write_access_backend", "write_access_backend", "beeswax")
     user = User.objects.get(username='write_access_backend')
 
-    resp = _make_query(client, 'CREATE TABLE test_perm_1 (a int);') # Only fails if we were using Sentry and won't allow SELECT to user
+    resp = _make_query(client, 'CREATE TABLE test_perm_1 (a int);', database=self.db_name) # Only fails if we were using Sentry and won't allow SELECT to user
     resp = wait_for_query_to_finish(client, resp, max=30.0)
 
     def check(client, http_codes):
-      resp = client.get('/metastore/tables/drop/default')
+      resp = client.get('/metastore/tables/drop/%s' % self.db_name)
       assert_true(resp.status_code in http_codes, resp.content)
 
-      resp = client.post('/metastore/tables/drop/default', {u'table_selection': [u'test_perm_1']})
+      resp = client.post('/metastore/tables/drop/%s' % self.db_name, {u'table_selection': [u'test_perm_1']})
       assert_true(resp.status_code in http_codes, resp.content)
 
     check(client, [301]) # Denied