Forráskód Böngészése

[notebook] Do not lose Hive/Impala when adding sqlalchemy connectors

Romain 5 éve
szülő
commit
33d69b024f

+ 4 - 0
desktop/core/src/desktop/conf.py

@@ -2309,6 +2309,10 @@ GC_ACCOUNTS = UnspecifiedConfigSection(
   )
 )
 
+def is_cm_managed():
+  return 'cloudera-scm-agent' in os.path.realpath(os.getenv("HUE_CONF_DIR", get_desktop_root("conf")))
+
+
 def is_gs_enabled():
   from desktop.lib.idbroker import conf as conf_idbroker # Circular dependencies  desktop.conf -> idbroker.conf -> desktop.conf
   return ('default' in list(GC_ACCOUNTS.keys()) and GC_ACCOUNTS['default'].JSON_CREDENTIALS.get()) or conf_idbroker.is_idbroker_enabled('gs')

+ 78 - 0
desktop/libs/notebook/src/notebook/api_tests.py

@@ -670,6 +670,84 @@ def test_get_interpreters_to_show():
     appmanager.load_apps(APP_BLACKLIST.get())
 
 
+def test_get_ordered_interpreters():
+  default_interpreters = OrderedDict((
+    ('hive', {
+        'name': 'Hive', 'interface': 'hiveserver2', 'type': 'hive', 'is_sql': True, 'options': {}, 'dialect_properties': None, 'is_catalog': False, 'category': 'editor', 'dialect': 'hive'
+    }),
+    ('impala', {
+        'name': 'Impala', 'interface': 'hiveserver2', 'type': 'impala', 'is_sql': True, 'options': {}, 'dialect_properties': None, 'is_catalog': False, 'category': 'editor', 'dialect': 'impala'
+    }),
+    ('spark', {
+        'name': 'Scala', 'interface': 'livy', 'type': 'spark', 'is_sql': False, 'options': {}, 'dialect_properties': None, 'is_catalog': False, 'category': 'editor', 'dialect': 'scala'
+    }),
+    ('pig', {
+        'name': 'Pig', 'interface': 'pig', 'type': 'pig', 'is_sql': False, 'options': {}, 'dialect_properties': None, 'is_catalog': False, 'category': 'editor', 'dialect': 'pig'
+    }),
+    ('java', {
+        'name': 'Java', 'interface': 'oozie', 'type': 'java', 'is_sql': False, 'options': {}, 'dialect_properties': None, 'is_catalog': False, 'category': 'editor', 'dialect': 'java'
+    })
+  ))
+
+  try:
+    resets = [APP_BLACKLIST.set_for_testing('')]
+    appmanager.DESKTOP_MODULES = []
+    appmanager.DESKTOP_APPS = None
+    appmanager.load_apps(APP_BLACKLIST.get())
+
+    with patch('notebook.conf.is_cm_managed') as is_cm_managed:
+      with patch('notebook.conf.appmanager.get_apps_dict') as get_apps_dict:
+        with patch('notebook.conf.has_connectors') as has_connectors:
+          get_apps_dict.return_value = {'hive': {}}
+          has_connectors.return_value = False
+
+          is_cm_managed.return_value = False
+
+          # No CM --> Verbatim
+          INTERPRETERS.set_for_testing(
+            OrderedDict((
+              ('phoenix', {
+                  'name': 'Phoenix', 'interface': 'sqlalchemy', 'dialect': 'phoenix'
+              }),)
+            )
+          )
+          assert_equal(
+            [interpreter['dialect'] for interpreter in get_ordered_interpreters()],
+            ['phoenix']
+          )
+
+          is_cm_managed.return_value = True
+
+          # CM --> Append []
+          INTERPRETERS.set_for_testing(
+            OrderedDict(()
+            )
+          )
+          assert_equal(
+            [interpreter['dialect'] for interpreter in get_ordered_interpreters()],
+            ['hive']
+          )
+
+          # CM --> Append [Phoenix]
+          INTERPRETERS.set_for_testing(
+            OrderedDict((
+              ('phoenix', {
+                  'name': 'Phoenix', 'interface': 'sqlalchemy', 'dialect': 'phoenix'
+              }),)
+            )
+          )
+          assert_equal(
+            [interpreter['dialect'] for interpreter in get_ordered_interpreters()],
+            ['hive', 'phoenix']
+          )
+  finally:
+    for reset in resets:
+      reset()
+    appmanager.DESKTOP_MODULES = []
+    appmanager.DESKTOP_APPS = None
+    appmanager.load_apps(APP_BLACKLIST.get())
+
+
 class TestQueriesMetrics(object):
 
   def test_queries_num(self):

+ 9 - 1
desktop/libs/notebook/src/notebook/conf.py

@@ -25,7 +25,7 @@ from django.urls import reverse
 from django.utils.translation import ugettext_lazy as _t, ugettext as _
 
 from desktop import appmanager
-from desktop.conf import is_oozie_enabled, has_connectors
+from desktop.conf import is_oozie_enabled, has_connectors, is_cm_managed
 from desktop.lib.conf import Config, UnspecifiedConfigSection, ConfigSection, coerce_json_dict, coerce_bool, coerce_csv
 
 
@@ -77,9 +77,17 @@ def get_ordered_interpreters(user=None):
       for connector in _get_installed_connectors(categories=['editor', 'catalogs'], user=user)
     ]
   else:
+    if is_cm_managed() and INTERPRETERS.get():
+      extra_interpreters = INTERPRETERS.get()
+      _default_interpreters(user)
+    else:
+      extra_interpreters = {}
+
     if not INTERPRETERS.get():
       _default_interpreters(user)
+
     interpreters = INTERPRETERS.get()
+    interpreters.update(extra_interpreters)
 
     user_apps = appmanager.get_apps_dict(user)
     user_interpreters = []