예제 #1
0
    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
예제 #2
0
    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