浏览代码

HUE-5000 [metastore] ALTER database properties API

spaztic1215 9 年之前
父节点
当前提交
33130398fd

+ 18 - 0
apps/beeswax/src/beeswax/server/dbms.py

@@ -158,6 +158,24 @@ class HiveServer2Dbms(object):
     return self.client.get_database(database)
 
 
+  def alter_database(self, database, properties):
+    hql = 'ALTER database `%s` SET DBPROPERTIES (' % database
+    hql += ', '.join(["'%s'='%s'" % (k, v) for k, v in properties.items()])
+    hql += ');'
+
+    timeout = SERVER_CONN_TIMEOUT.get()
+    query = hql_query(hql)
+    handle = self.execute_and_wait(query, timeout_sec=timeout)
+
+    if handle:
+      self.close(handle)
+    else:
+      msg = _("Failed to execute alter database statement: %s") % hql
+      raise QueryServerException(msg)
+
+    return self.client.get_database(database)
+
+
   def get_tables_meta(self, database='default', table_names='*', table_types=None):
     if self.server_name == 'beeswax':
       identifier = self.to_matching_wildcard(table_names)

+ 15 - 0
apps/metastore/src/metastore/tests.py

@@ -355,6 +355,21 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
     check(client, [200, 302]) # Ok
 
 
+  def test_alter_database(self):
+    resp = self.client.post(reverse("metastore:get_database_metadata", kwargs={'database': self.db_name}))
+    json_resp = json.loads(resp.content)
+    assert_true('data' in json_resp, json_resp)
+    assert_true('parameters' in json_resp['data'], json_resp)
+    assert_false('message=After Alter' in json_resp['data']['parameters'], json_resp)
+
+    # Alter message
+    resp = self.client.post(reverse("metastore:alter_database", kwargs={'database': self.db_name}),
+                            {'properties': json.dumps({'message': 'After Alter'})})
+    json_resp = json.loads(resp.content)
+    assert_equal(0, json_resp['status'], json_resp)
+    assert_equal('{message=After Alter}', json_resp['data']['parameters'], json_resp)
+
+
   def test_alter_table(self):
     resp = _make_query(self.client, "CREATE TABLE test_alter_table (a int) COMMENT 'Before Alter';", database=self.db_name)
     resp = wait_for_query_to_finish(self.client, resp, max=30.0)

+ 1 - 0
apps/metastore/src/metastore/urls.py

@@ -22,6 +22,7 @@ urlpatterns = patterns('metastore.views',
 
   url(r'^databases/?$', 'databases', name='databases'),
   url(r'^databases/drop/?$', 'drop_database', name='drop_database'),
+  url(r'^databases/(?P<database>\w+)/alter$', 'alter_database', name='alter_database'),
   url(r'^databases/(?P<database>\w+)/metadata$', 'get_database_metadata', name='get_database_metadata'),
 
   url(r'^tables/(?P<database>\w+)?$', 'show_tables', name='show_tables'),

+ 25 - 0
apps/metastore/src/metastore/views.py

@@ -109,6 +109,31 @@ def drop_database(request):
     return render('confirm.mako', request, {'url': request.path, 'title': title})
 
 
+@check_has_write_access_permission
+@require_http_methods(["POST"])
+def alter_database(request, database):
+  db = dbms.get(request.user)
+  response = {'status': -1, 'data': ''}
+  try:
+    properties = request.POST.get('properties')
+
+    if not properties:
+      raise PopupException(_("Alter database requires a properties value of key-value pairs."))
+
+    properties = json.loads(properties)
+    db.alter_database(database, properties=properties)
+
+    db_metadata = db.get_database(database)
+    db_metadata['hdfs_link'] = location_to_url(db_metadata['location'])
+    response['status'] = 0
+    response['data'] = db_metadata
+  except Exception, ex:
+    response['status'] = 1
+    response['data'] = _("Failed to alter database `%s`: %s") % (database, ex)
+
+  return JsonResponse(response)
+
+
 def get_database_metadata(request, database):
   db = dbms.get(request.user)
   response = {'status': -1, 'data': ''}