code: def apic_driver(self):
          
          if not self._apic_driver:
              try:
                  self._apic_driver = (bc.get_plugin(
                      'GROUP_POLICY').policy_driver_manager.
                                       policy_drivers['apic'].obj)
                  self._get_ext_net_name = self._get_ext_net_name_gbp
                  self._get_vrf_context = self._get_vrf_context_gbp
              except AttributeError:
                      LOG.info("GBP service plugin not present -- will "
                               "try APIC ML2 plugin.")
              if not self._apic_driver:
                  try:
                      self._apic_driver = (
                          self._core_plugin.mechanism_manager.mech_drivers[
                              'cisco_apic_ml2'].obj)
                      self._get_ext_net_name = self._get_ext_net_name_neutron
                      self._get_vrf_context = self._get_vrf_context_neutron
                  except KeyError:
                      LOG.error("APIC ML2 plugin not present: "
                                "no APIC ML2 driver could be found.")
                      raise AciDriverNoAciDriverInstalledOrConfigured()
          return self._apic_driver
docs: Get APIC driver
  
          There are different drivers for the GBP workflow
          and Neutron workflow for APIC. First see if the GBP
          workflow is active, and if so get the APIC driver for it.
          If the GBP service isn't installed, try to get the driver
          from the Neutron (APIC ML2) workflow.