docstr: Insert a new function entry
  
  Arguments:
      name (str): name of the function
      impl_path (str): path to the function implementation relative to evadb/function
      type (str): function operator kind, classification or detection or etc
      checksum(str): checksum of the function file content, used for consistency
  
  Returns:
      FunctionCatalogEntry: Returns the new entry created
docstr_tok: ["Insert","a","new","function","entry","Arguments",":","name","(","str",")",":","name","of","the","function","impl_path","(","str",")",":","path","to","the","function","implementation","relative","to","evadb\/function","type","(","str",")",":","function","operator","kind",",","classification","or","detection","or","etc","checksum","(","str",")",":","checksum","of","the","function","file","content",",","used","for","consistency","Returns",":","FunctionCatalogEntry",":","Returns","the","new","entry","created"]
code: def insert_entry(
      self,
      name: str,
      impl_path: str,
      type: str,
      checksum: str,
      function_io_list: List[FunctionIOCatalogEntry],
      function_metadata_list: List[FunctionMetadataCatalogEntry],
  ) -> FunctionCatalogEntry:
      """Insert a new function entry
  
      Arguments:
          name (str): name of the function
          impl_path (str): path to the function implementation relative to evadb/function
          type (str): function operator kind, classification or detection or etc
          checksum(str): checksum of the function file content, used for consistency
  
      Returns:
          FunctionCatalogEntry: Returns the new entry created
      """
      function_obj = self.model(name, impl_path, type, checksum)
      function_obj = function_obj.save(self.session)
  
      for function_io in function_io_list:
          function_io.function_id = function_obj._row_id
      io_objs = self._function_io_service.create_entries(
          function_io_list
      )
      for function_metadata in function_metadata_list:
          function_metadata.function_id = function_obj._row_id
      metadata_objs = self._function_metadata_service.create_entries(
          function_metadata_list
      )
  
      # atomic operation for adding table and its corresponding columns.
      try:
          self.session.add_all(io_objs)
          self.session.add_all(metadata_objs)
          self.session.commit()
      except Exception as e:
          self.session.rollback()
          self.session.delete(function_obj)
          self.session.commit()
          logger.exception(
              f"Failed to insert entry into function catalog with exception {str(e)}"
          )
          raise CatalogError(e)
      else:
          return function_obj.as_dataclass()
  
file_path: evadb/evadb/catalog/services/function_catalog_service.py
imports: from typing import List
  from sqlalchemy.orm import Session
  from sqlalchemy.sql.expression import select
  from evadb.catalog.models.function_catalog import FunctionCatalog, FunctionCatalogEntry
  from evadb.catalog.models.utils import FunctionIOCatalogEntry, FunctionMetadataCatalogEntry
  from evadb.catalog.services.base_service import BaseService
  from evadb.catalog.services.function_io_catalog_service import FunctionIOCatalogService
  from evadb.catalog.services.function_metadata_catalog_service import FunctionMetadataCatalogService
  from evadb.utils.errors import CatalogError
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 2 for calling the FunctionCatalogService obj's underlying member method code with example usage: obj.insert_entry(name, impl_path, type, checksum, function_io_list, function_metadata_list) and returns: function_obj