فهرست منبع

[connector] Support connector to same dialect but different interface

Could have introduced a connector type id instead, but adding the
interface name is more explicit and not really an overhead.
Romain 5 سال پیش
والد
کامیت
50abf47fca

+ 3 - 3
desktop/core/src/desktop/js/apps/about/components/ko.connectorsConfig.js

@@ -302,14 +302,14 @@ class ConnectorsConfig extends DisposableComponent {
     if (this.section() === 'installed-connectors-page') {
       this.instance(data);
     } else {
-      this.newConnector(data.dialect);
+      this.newConnector(data.dialect, data.interface);
     }
     this.section('connector-page');
   }
 
-  newConnector(dialect) {
+  newConnector(dialect, con_interface) {
     simpleGet(
-      '/desktop/connectors/api/instance/new/' + dialect,
+      '/desktop/connectors/api/instance/new/' + dialect + '/' + con_interface,
       {},
       {
         successCallback: data => {

+ 3 - 2
desktop/core/src/desktop/lib/connectors/api.py

@@ -52,8 +52,8 @@ def get_connectors_instances(request):
   })
 
 
-def new_connector(request, dialect):
-  instance = get_connector_by_type(dialect)
+def new_connector(request, dialect, interface):
+  instance = get_connector_by_type(dialect, interface)
 
   instance['id'] = None
 
@@ -89,6 +89,7 @@ def update_connector(request):
       name=connector['nice_name'],
       description='',
       dialect=connector['dialect'],
+      interface=connector['interface'],
       settings=json.dumps(connector['settings'])
     )
     connector['id'] = instance.id

+ 9 - 2
desktop/core/src/desktop/lib/connectors/models.py

@@ -41,6 +41,7 @@ class BaseConnector(models.Model):
   name = models.CharField(default='', max_length=255)
   description = models.TextField(default='')
   dialect = models.CharField(max_length=32, db_index=True, help_text=_t('Type of connector, e.g. hive, mysql... '))
+  interface = models.CharField(max_length=32, db_index=True, help_text=_t('Type of interface, e.g. sqlalchemy, hiveserver2... '), default='sqlalchemy')
   settings = models.TextField(default='{}')
   last_modified = models.DateTimeField(auto_now=True, db_index=True, verbose_name=_t('Time last modified'))
 
@@ -60,6 +61,7 @@ class BaseConnector(models.Model):
       'name': self.name,
       'description': self.description,
       'dialect': self.dialect,
+      'interface': self.interface,
       'settings': self.settings,
       'last_modified': self.last_modified
     }
@@ -110,7 +112,7 @@ def _get_installed_connectors(category=None, categories=None, dialect=None, inte
         'nice_name': connector.name,
         'description': connector.description,
         'dialect': connector.dialect,
-        'interface': None,
+        'interface': connector.interface,
         'settings': json.loads(connector.settings),
         'is_demo': False,
       }
@@ -145,13 +147,18 @@ def _get_installed_connectors(category=None, categories=None, dialect=None, inte
 
 def _augment_connector_properties(connector):
   '''
-  Add the connector properties based on the dialect type to each connector.
+  Add the connector properties based on the dialect + interface matching to each connector.
   The connector type must exist in desktop/core/src/desktop/lib/connectors/types.py.
   '''
 
   connector_types = []
+  connector_type = None
 
   for connector_type in get_connectors_types():
+    if connector_type['dialect'] == connector['dialect'] and connector['interface'] and \
+          connector_type.get('interface') == connector.get('interface'):
+      connector_types.insert(0, connector_type)
+      break
     if connector_type['dialect'] == connector['dialect']:
       connector_types.insert(0, connector_type)
     elif connector['interface'] and connector_type.get('interface') == connector['interface']:

+ 35 - 3
desktop/core/src/desktop/lib/connectors/types.py

@@ -174,7 +174,36 @@ CONNECTOR_TYPES = [
       {'name': 'ssh_server_host', 'value': '127.0.0.1'},
     ],
     'category': 'editor',
-    'description': 'Via Thrift server',
+    'description': 'Via Thrift Server and SqlAlchemy interface',
+    'properties': {
+      'is_sql': True,
+      'sql_identifier_quote': '`',
+      'sql_identifier_comment_single': '--',
+      'has_catalog': False,
+      'has_database': True,
+      'has_table': True,
+      'has_live_queries': False,
+      'has_optimizer_risks': True,
+      'has_optimizer_values': True,
+      'has_auto_limit': False,
+      'has_reference_language': False,
+      'has_reference_functions': False,
+      'trim_statement_semicolon': False,
+    }
+  },
+  {
+    'nice_name': "SparkSQL",
+    'dialect': 'sparksql',
+    'interface': 'hiveserver2',
+    'settings': [
+      {'name': 'server_host', 'value': ''},
+      {'name': 'server_port', 'value': ''},
+      {'name': 'impersonation_enabled', 'value': False},
+      {'name': 'has_ssh', 'value': False},
+      {'name': 'ssh_server_host', 'value': '127.0.0.1'},
+    ],
+    'category': 'editor',
+    'description': 'Via Thrift Server and Hive interface',
     'properties': {
       'is_sql': True,
       'sql_identifier_quote': '`',
@@ -664,8 +693,11 @@ def get_connectors_types():
 def get_connector_categories():
   return CATEGORIES
 
-def get_connector_by_type(dialect):
-  instance = [connector for connector in get_connectors_types() if connector['dialect'] == dialect]
+def get_connector_by_type(dialect, interface):
+  instance = [
+    connector
+    for connector in get_connectors_types() if connector['dialect'] == dialect and connector['interface'] == interface
+  ]
 
   if instance:
     return instance[0]

+ 1 - 1
desktop/core/src/desktop/lib/connectors/urls.py

@@ -26,7 +26,7 @@ urlpatterns = [
   url(r'^api/types/?$', api.get_connector_types, name='connectors.api.get_connector_types'),
   url(r'^api/instances/?$', api.get_connectors_instances, name='connectors.api.get_connectors_instances'),
 
-  url(r'^api/instance/new/(?P<dialect>[\w\-]+)$', api.new_connector, name='connectors.api.new_connector'),
+  url(r'^api/instance/new/(?P<dialect>[\w\-]+)/(?P<interface>[\w\-]+)$', api.new_connector, name='connectors.api.new_connector'),
   url(r'^api/instance/get/(?P<id>\d+)$', api.get_connector, name='connectors.api.get_connector'),
   url(r'^api/instance/delete/?$', api.delete_connector, name='connectors.api.delete_connector'),
   url(r'^api/instance/update/?$', api.update_connector, name='connectors.api.update_connector'),

+ 20 - 0
desktop/core/src/desktop/migrations/0012_connector_interface.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.28 on 2020-11-20 17:51
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('desktop', '0011_document2_connector'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='connector',
+            name='interface',
+            field=models.CharField(db_index=True, default='sqlalchemy', help_text='Type of interface, e.g. sqlalchemy, hiveserver2... ', max_length=32),
+        ),
+    ]

+ 20 - 0
desktop/core/src/desktop/org_migrations/0003_connector_interface.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.28 on 2020-11-20 17:51
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('desktop', '0002_document2_connector'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='connector',
+            name='interface',
+            field=models.CharField(db_index=True, default='sqlalchemy', help_text='Type of interface, e.g. sqlalchemy, hiveserver2... ', max_length=32),
+        ),
+    ]