def login(self): """Login to NVSD Controller.""" headers = {"Content-Type": "application/json"} login_url = parse.urljoin(self.api_url, "/pluginhandler/ocplugin/authmgmt/login") data = jsonutils.dumps({ "user_name": self._user, "passwd": self._password }) attempts = 0 while True: if attempts < self._retries: attempts += 1 elif self._retries == 0: attempts = 0 else: msg = _("Unable to connect to NVSD controller. Exiting after " "%(retries)s attempts") % { 'retries': self._retries } LOG.error(msg) raise exception.ServerException(reason=msg) try: response = self.do_request("POST", url=login_url, headers=headers, data=data) break except Exception as e: LOG.error(_("Login Failed: %s"), e) LOG.error( _("Unable to establish connection" " with Controller %s"), self.api_url) LOG.error(_("Retrying after 1 second...")) time.sleep(1) if response.status_code == requests.codes.ok: LOG.debug(_("Login Successful %(uri)s " "%(status)s"), { 'uri': self.api_url, 'status': response.status_code }) self.auth_token = jsonutils.loads(response.content)["session_uuid"] LOG.debug(_("AuthToken = %s"), self.auth_token) else: LOG.error(_("login failed")) return
def request(self, method, url, body="", content_type="application/json"): """Issue a request to NVSD controller.""" if self.auth_token is None: LOG.warning(_("No Token, Re-login")) self.login() headers = {"Content-Type": content_type} uri = parse.urljoin(url, "?authToken=%s" % self.auth_token) url = parse.urljoin(self.api_url, uri) request_ok = False response = None try: response = self.do_request(method, url=url, headers=headers, data=body) LOG.debug(_("request: %(method)s %(uri)s successful"), { 'method': method, 'uri': self.api_url + uri }) request_ok = True except httplib.IncompleteRead as e: response = e.partial request_ok = True except Exception as e: LOG.error(_("request: Request failed from " "Controller side :%s"), e) if response is None: # Timeout. LOG.error( _("Response is Null, Request timed out: %(method)s to " "%(uri)s"), { 'method': method, 'uri': uri }) self.auth_token = None raise exception.RequestTimeout() status = response.status_code if status == requests.codes.unauthorized: self.auth_token = None # Raise an exception to inform that the request failed. raise exception.UnAuthorizedException() if status in self.error_codes: LOG.error( _("Request %(method)s %(uri)s body = %(body)s failed " "with status %(status)s"), { 'method': method, 'uri': uri, 'body': body, 'status': status }) LOG.error(_("%s"), response.reason) raise self.error_codes[status]() elif status not in (requests.codes.ok, requests.codes.created, requests.codes.no_content): LOG.error( _("%(method)s to %(url)s, unexpected response code: " "%(status)d"), { 'method': method, 'url': url, 'status': status }) return if not request_ok: LOG.error( _("Request failed from Controller side with " "Status=%s"), status) raise exception.ServerException() else: LOG.debug(_("Success: %(method)s %(url)s status=%(status)s"), { 'method': method, 'url': self.api_url + uri, 'status': status }) response.body = response.content return response