docs: def cpu_baseline(full=False, migratable=False, out='libvirt', **kwargs):
      '''
      Return the optimal 'custom' CPU baseline config for VM's on this minion
  
      .. versionadded:: 2016.3.0
  
      :param full: Return all CPU features rather than the ones on top of the closest CPU model
      :param migratable: Exclude CPU features that are unmigratable (libvirt 2.13+)
      :param out: 'libvirt' (default) for usable libvirt XML definition, 'salt' for nice dict
      :param connection: libvirt connection URI, overriding defaults
  
          .. versionadded:: 2019.2.0
      :param username: username to connect with, overriding defaults
  
          .. versionadded:: 2019.2.0
      :param password: password to connect with, overriding defaults
  
          .. versionadded:: 2019.2.0
  
      CLI Example:
  
      .. code-block:: bash
  
          salt '*' virt.cpu_baseline
  
      '''
      conn = __get_conn(**kwargs)
      caps = ElementTree.fromstring(conn.getCapabilities())
      cpu = caps.find('host/cpu')
      log.debug('Host CPU model definition: %s', salt.utils.stringutils.to_str(ElementTree.tostring(cpu)))
  
      flags = 0
      if migratable:
          # This one is only in 1.2.14+
          if getattr(libvirt, 'VIR_CONNECT_BASELINE_CPU_MIGRATABLE', False):
              flags += libvirt.VIR_CONNECT_BASELINE_CPU_MIGRATABLE
          else:
              conn.close()
              raise ValueError
  
      if full and getattr(libvirt, 'VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES', False):
          # This one is only in 1.1.3+
          flags += libvirt.VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES
  
      cpu = ElementTree.fromstring(conn.baselineCPU([salt.utils.stringutils.to_str(ElementTree.tostring(cpu))], flags))
      conn.close()
  
      if full and not getattr(libvirt, 'VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES', False):
          # Try do it by ourselves
          # Find the models in cpu_map.xml and iterate over them for as long as entries have submodels
          with salt.utils.files.fopen('/usr/share/libvirt/cpu_map.xml', 'r') as cpu_map:
              cpu_map = ElementTree.parse(cpu_map)
  
          cpu_model = cpu.find('model').text
          while cpu_model:
              cpu_map_models = cpu_map.findall('arch/model')
              cpu_specs = [el for el in cpu_map_models if el.get('name') == cpu_model and bool(len(el))]
  
              if not cpu_specs:
                  raise ValueError('Model {0} not found in CPU map'.format(cpu_model))
              elif len(cpu_specs) > 1:
                  raise ValueError('Multiple models {0} found in CPU map'.format(cpu_model))
  
              cpu_specs = cpu_specs[0]
  
              # libvirt's cpu map used to nest model elements, to point the parent model.
              # keep this code for compatibility with old libvirt versions
              model_node = cpu_specs.find('model')
              if model_node is None:
                  cpu_model = None
              else:
                  cpu_model = model_node.get('name')
  
              cpu.extend([feature for feature in cpu_specs.findall('feature')])
  
      if out == 'salt':
          return {
              'model': cpu.find('model').text,
              'vendor': cpu.find('vendor').text,
              'features': [feature.get('name') for feature in cpu.findall('feature')]
          }
      return cpu.toxml()