docs: def invoke(client, method, **kwargs):
      """Invoke a method on the underlying soap service."""
      try:
          # Proxy the method to the suds service
          result = getattr(client.service, method)(**kwargs)
      except AttributeError:
          logger.critical("Unknown method: %s", method)
          raise
      except URLError as e:
          logger.debug(pprint(e))
          logger.debug("A URL related error occurred while invoking the '%s' "
                "method on the VIM server, this can be caused by "
                "name resolution or connection problems.", method)
          logger.debug("The underlying error is: %s", e.reason[1])
          raise
      except suds.client.TransportError as e:
          logger.debug(pprint(e))
          logger.debug("TransportError: %s", e)
      except suds.WebFault as e:
          # Get the type of fault
          logger.critical("SUDS Fault: %s" % e.fault.faultstring)
          if len(e.fault.faultstring) > 0:
              raise
  
          detail = e.document.childAtPath("/Envelope/Body/Fault/detail")
          fault_type = detail.getChildren()[0].name
          fault = create(fault_type)
          if isinstance(e.fault.detail[0], list):
              for attr in e.fault.detail[0]:
                  setattr(fault, attr[0], attr[1])
          else:
              fault["text"] = e.fault.detail[0]
  
          raise VimFault(fault)
  
      return result