|
|
@@ -27,6 +27,11 @@ import time
|
|
|
import traceback
|
|
|
import zipfile
|
|
|
|
|
|
+try:
|
|
|
+ from collections import OrderedDict
|
|
|
+except ImportError:
|
|
|
+ from ordereddict import OrderedDict # Python 2.6
|
|
|
+
|
|
|
from django.conf import settings
|
|
|
from django.shortcuts import render_to_response
|
|
|
from django.http import HttpResponse
|
|
|
@@ -39,6 +44,7 @@ from django.views.decorators.http import require_http_methods, require_POST
|
|
|
import django.views.debug
|
|
|
|
|
|
from aws.conf import is_enabled as is_s3_enabled, has_s3_access
|
|
|
+from dashboard.conf import IS_ENABLED as IS_DASHBOARD_ENABLED
|
|
|
from notebook.conf import get_ordered_interpreters
|
|
|
|
|
|
import desktop.conf
|
|
|
@@ -67,6 +73,154 @@ def is_alive(request):
|
|
|
return HttpResponse('')
|
|
|
|
|
|
|
|
|
+class ClusterConfig():
|
|
|
+
|
|
|
+ def __init__(self, user, apps=None):
|
|
|
+ self.user = user
|
|
|
+ self.apps = appmanager.get_apps_dict(self.user) if apps is None else apps
|
|
|
+
|
|
|
+ def setConfig(self):
|
|
|
+ # dataeng Execute in Hive by default
|
|
|
+ # JB: hide yarn, show dataeng
|
|
|
+ # Nav, NavOpt?
|
|
|
+ # reload "some ini sections"
|
|
|
+ pass
|
|
|
+
|
|
|
+ @property
|
|
|
+ def main_quick_action(self):
|
|
|
+ return self._get_editor()['interpreters'][0]
|
|
|
+
|
|
|
+
|
|
|
+ def _get_editor(self):
|
|
|
+ interpreters = []
|
|
|
+
|
|
|
+ for interpreter in get_ordered_interpreters(self.user):
|
|
|
+ interpreters.append({
|
|
|
+ 'name': interpreter['name'],
|
|
|
+ 'type': interpreter['type'],
|
|
|
+ 'displayName': interpreter['type'].title(),
|
|
|
+ 'tooltip': _('%s Query') % interpreter['type'].title(),
|
|
|
+ 'page': '/editor/?type=%(type)s' % interpreter,
|
|
|
+ })
|
|
|
+
|
|
|
+ return {
|
|
|
+ 'name': 'editor',
|
|
|
+ 'displayName': _('Editor'),
|
|
|
+ 'interpreters': interpreters
|
|
|
+ }
|
|
|
+
|
|
|
+ def _get_dashboard(self):
|
|
|
+ interpreters = [] # TODO Integrate SQL Dashboards and Solr 6 configs
|
|
|
+# 'interpreters': [
|
|
|
+# {'solr': {}},
|
|
|
+# {'impala': {}}
|
|
|
+# ]
|
|
|
+
|
|
|
+ if IS_DASHBOARD_ENABLED.get():
|
|
|
+ return {
|
|
|
+ 'name': 'dashboard',
|
|
|
+ 'displayName': _('Dashboard'),
|
|
|
+ 'interpreters': interpreters,
|
|
|
+ 'page': '/dashboard/new_search'
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ return {}
|
|
|
+
|
|
|
+ def _get_scheduler(self):
|
|
|
+ interpreters = [{
|
|
|
+ 'type': 'oozie-workflow',
|
|
|
+ 'displayName': _('Workflow'),
|
|
|
+ 'tooltip': _('Workflow'),
|
|
|
+ 'page': '/oozie/editor/workflow/new/'
|
|
|
+ }, {
|
|
|
+ 'type': 'oozie-coordinator',
|
|
|
+ 'displayName': _('Schedule'),
|
|
|
+ 'tooltip': _('Schedule'),
|
|
|
+ 'page': '/oozie/editor/coordinator/new/'
|
|
|
+ }, {
|
|
|
+ 'type': 'oozie-bundle',
|
|
|
+ 'displayName': _('Bundle'),
|
|
|
+ 'tooltip': _('Bundle'),
|
|
|
+ 'page': '/oozie/editor/bundle/new/'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+
|
|
|
+ if 'oozie' in self.apps and not self.user.has_hue_permission(action="disable_editor_access", app="oozie") or self.user.is_superuser:
|
|
|
+ return {
|
|
|
+ 'name': 'oozie',
|
|
|
+ 'displayName': _('Scheduler'),
|
|
|
+ 'interpreters': interpreters,
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ return {}
|
|
|
+
|
|
|
+ def get_apps(self):
|
|
|
+ apps = OrderedDict([
|
|
|
+ ('editor', self._get_editor()
|
|
|
+# 'interpreters': get_ordered_interpreters(self.user)
|
|
|
+# [
|
|
|
+# {'hive': {}},
|
|
|
+# {'impala': {}, 'isDefault': True},
|
|
|
+# {'pig': {}},
|
|
|
+# {'notebook': {}}
|
|
|
+# ]
|
|
|
+ ),
|
|
|
+ ('dashboard', self._get_dashboard()
|
|
|
+ ),
|
|
|
+ ('browser', {
|
|
|
+ 'name': 'browser',
|
|
|
+ 'displayName': _('Browsers'),
|
|
|
+ 'interpreters': [{
|
|
|
+ 'type': 'hdfs',
|
|
|
+ 'displayName': _('Jobs'),
|
|
|
+ 'page': '/jobbrowser/',
|
|
|
+ }, {
|
|
|
+ 'type': 'metastore',
|
|
|
+ 'displayName': _('Jobs'),
|
|
|
+ 'page': '/jobbrowser/',
|
|
|
+ }, {
|
|
|
+ 'type': 's3',
|
|
|
+ 'displayName': _('Jobs'),
|
|
|
+ 'page': '/jobbrowser/',
|
|
|
+ }, {
|
|
|
+ 'type': 'jobbrowser',
|
|
|
+ 'displayName': _('Jobs'),
|
|
|
+ 'page': '/jobbrowser/',
|
|
|
+ 'interpreters': [
|
|
|
+ 'yarn',
|
|
|
+ 'oozie',
|
|
|
+ 'dataeng'
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }),
|
|
|
+ ('scheduler', self._get_scheduler())
|
|
|
+ ])
|
|
|
+
|
|
|
+ # Default action
|
|
|
+ # If not in user setting, first interpreter in apps
|
|
|
+# default_app = None
|
|
|
+# if apps['editor'] and apps['editor']['interpreters']:
|
|
|
+# if 'impala' in apps['editor']['interpreters']:
|
|
|
+# default_app = apps['editor']['interpreters']['impala']
|
|
|
+# elif 'hive' in apps['editor']['interpreters']:
|
|
|
+# default_app = apps['editor']['interpreters']['hive']
|
|
|
+# elif 'notebook' in apps['editor']['interpreters']:
|
|
|
+# default_app = apps['editor']['interpreters']['notebook']
|
|
|
+# elif apps['dashboard'] and apps['dashboard']['interpreters']:
|
|
|
+# default_app = apps['dashboard']['interpreters'][0]
|
|
|
+# elif apps['browser'] and apps['browser']['interpreters']:
|
|
|
+# default_app = apps['browser']['interpreters'][0]
|
|
|
+# elif apps['scheduler'] and apps['scheduler']['interpreters']:
|
|
|
+# default_app = apps['scheduler']['interpreters'][0]
|
|
|
+#
|
|
|
+#
|
|
|
+#
|
|
|
+# default_app['isDefault'] = True
|
|
|
+
|
|
|
+ return apps
|
|
|
+
|
|
|
+
|
|
|
def hue(request):
|
|
|
apps = appmanager.get_apps_dict(request.user)
|
|
|
|
|
|
@@ -81,7 +235,8 @@ def hue(request):
|
|
|
'attribution': desktop.conf.LEAFLET_TILE_LAYER_ATTRIBUTION.get()
|
|
|
},
|
|
|
'is_demo': desktop.conf.DEMO_ENABLED.get(),
|
|
|
- 'banner_message': get_banner_message(request)
|
|
|
+ 'banner_message': get_banner_message(request),
|
|
|
+ 'cluster_config': ClusterConfig(request.user)
|
|
|
})
|
|
|
|
|
|
def ko_editor(request):
|
|
|
@@ -122,14 +277,17 @@ def home2(request, is_embeddable=False):
|
|
|
'is_embeddable': request.GET.get('is_embeddable', False)
|
|
|
})
|
|
|
|
|
|
+
|
|
|
def home_embeddable(request):
|
|
|
return home2(request, True)
|
|
|
|
|
|
+
|
|
|
def not_found(request):
|
|
|
return render('404.mako', request, {
|
|
|
'is_embeddable': request.GET.get('is_embeddable', False)
|
|
|
})
|
|
|
|
|
|
+
|
|
|
def server_error(request):
|
|
|
return render('500.mako', request, {
|
|
|
'is_embeddable': request.GET.get('is_embeddable', False)
|