'Performs an HTTP request on the device, with locking.
Raises a DotHillRequestError if the device returned but the status is
not 0. The device error message will be used in the exception message.
If the status is OK, returns the XML data for further processing.'

@utils.synchronized(__name__, external=True)
def _api_request(self, path, *args, **kargs):

    url = self._build_request_url(path, *args, **kargs)
    LOG.debug('Array    Request    URL:    %s    (session    %s)', url, self._session_key)
    headers = {'dataType': 'api', 'sessionKey': self._session_key}
    try:
        xml = requests.get(url, headers=headers, verify=self.ssl_verify, timeout=60)
        tree = etree.XML(xml.text.encode('utf8'))
    except Exception as e:
        message = (_('Exception    handling    URL    %(url)s:    %(msg)s') % {'url': url, 'msg': e})
        raise exception.DotHillConnectionError(message=message)
    if (path == '/show/volumecopy-status'):
        return tree
    self._assert_response_ok(tree)
    return tree
