Bläddra i källkod

HUE-7584 [solr] Support creating configSet via the config API

Romain Rigaux 8 år sedan
förälder
incheckning
f90b9af

+ 3 - 2
desktop/libs/indexer/src/indexer/api3.py

@@ -241,11 +241,12 @@ def _create_index(user, fs, client, source, destination, index_name):
   if not client.exists(index_name):
     client.create_index(
         name=index_name,
-        fields=fields,
+        config_name=destination.get('indexerConfigSet'),
+        fields=fields,        
         unique_key_field=unique_key_field,
         df=df,
         shards=destination['indexerNumShards'],
-        replication=destination['indexerReplicationFactor']
+        replication=destination['indexerReplicationFactor'],
     )
 
   if source['inputFormat'] not in ('manual', 'table'):

+ 27 - 11
desktop/libs/indexer/src/indexer/solr_client.py

@@ -92,19 +92,35 @@ class SolrClient(object):
 
   def create_index(self, name, fields, config_name=None, unique_key_field=None, df=None, shards=1, replication=1):
     if self.is_solr_cloud_mode():
-      if config_name is None:
-        self._create_cloud_config(name, fields, unique_key_field, df)
-        config_name = name
-
-      self.api.create_collection2(name, config_name=config_name, shards=shards, replication=replication)
-      fields = [{
-          'name': field['name'],
-          'type': field['type'],
-          'stored': field.get('stored', True)
-        } for field in fields
-      ]
       if self.is_solr_six_or_more():
+        if not config_name:
+          config_sets = self.list_configs()
+          if not config_sets:
+            raise PopupException(_('Solr does not have any predefined configSets.'))
+
+          config_name_target = 'managedTemplate' # 'Secure' cf. /solr/admin/info/system
+          if config_name_target in config_sets:
+            config_name = config_name_target
+          else:
+            config_name = config_sets[0]
+
+          self.api.create_config(name, config_name, immutable=False)
+
+        # unique_key_field
+        # df
+
+        self.api.create_collection2(name, config_name=config_name, shards=shards, replication=replication)
+
+        fields = [{
+            'name': field['name'],
+            'type': field['type'],
+            'stored': field.get('stored', True)
+          } for field in fields
+        ]
         self.api.add_fields(name, fields)
+      else:
+        self._create_cloud_config(name, fields, unique_key_field, df)
+        self.api.create_collection2(name, config_name=config_name, shards=shards, replication=replication)
     else:
       self._create_non_solr_cloud_index(name, fields, unique_key_field, df)
 

+ 14 - 0
desktop/libs/libsolr/src/libsolr/api.py

@@ -369,6 +369,20 @@ class SolrApi(object):
       raise PopupException(e, title=_('Error while accessing Solr'))
 
 
+  def create_config(self, name, base_config, immutable=False):
+    try:
+      params = self._get_params() + (
+          ('action', 'CREATE'),
+          ('myConfigSet', name),
+          ('baseConfigSet', base_config),
+          ('configSetProp.immutable', 'false' if immutable else 'true'),
+          ('wt', 'json'),
+      )
+      return self._root.get('admin/configs', params=params)['configSets']
+    except RestException, e:
+      raise PopupException(e, title=_('Error while accessing Solr'))
+
+
   def list_aliases(self):
     try:
       params = self._get_params() + (