Ejemplo n.º 1
0
 def login(self):
     """Login dell_emc unity storage array."""
     try:
         with self.session_lock:
             data = {}
             if self.session is None:
                 self.init_http_head()
             self.session.headers.update({"X-EMC-REST-CLIENT": "true"})
             self.session.auth = requests.auth.HTTPBasicAuth(
                 self.rest_username, cryptor.decode(self.rest_password))
             res = self.call_with_token(RestHandler.REST_AUTH_URL, data,
                                        'GET')
             if res.status_code == 200:
                 self.session.headers[RestHandler.AUTH_KEY] = \
                     cryptor.encode(res.headers[RestHandler.AUTH_KEY])
             else:
                 LOG.error("Login error.URL: %s,Reason: %s.",
                           RestHandler.REST_AUTH_URL, res.text)
                 if 'Unauthorized' in res.text:
                     raise exception.InvalidUsernameOrPassword()
                 elif 'Forbidden' in res.text:
                     raise exception.InvalidIpOrPort()
                 else:
                     raise exception.BadResponse(res.text)
     except Exception as e:
         LOG.error("Login error: %s", six.text_type(e))
         raise e
Ejemplo n.º 2
0
 def get_rest_info(self, url, data=None, method='GET'):
     if 'login' == data:
         self.session.auth = requests.auth.HTTPBasicAuth(
             self.rest_username, cryptor.decode(self.rest_password))
     else:
         self.login()
         self.session.auth = requests.auth.HTTPBasicAuth(
             self.rest_username, self.rest_auth_token)
     res = self.do_call(url, data, method)
     try:
         if res.status_code == 200:
             result_json = json.loads(res.text)
         elif res.status_code == 500:
             LOG.error('Connect Timeout error')
             raise exception.ConnectTimeout()
         elif res.status_code == 401:
             LOG.error('User authentication failed')
             raise exception.InvalidUsernameOrPassword
         else:
             raise exception.BadResponse()
     except Exception as err:
         LOG.exception(
             'Get RestHandler.call failed: %(url)s.'
             ' Error: %(err)s', {
                 'url': url,
                 'err': err
             })
         raise exception.InvalidResults(err)
     return result_json
Ejemplo n.º 3
0
    def do_call(self, url, data, method,
                calltimeout=consts.SOCKET_TIMEOUT):
        """Send requests to Hpe3par storage server.
        """
        if 'http' not in url:
            if self.san_address:
                url = self.san_address + url

        kwargs = {'timeout': calltimeout}
        if data:
            kwargs['data'] = json.dumps(data)

        if method in ('POST', 'PUT', 'GET', 'DELETE'):
            func = getattr(self.session, method.lower())
        else:
            msg = _("Request method %s is invalid.") % method
            LOG.error(msg)
            raise exception.StorageBackendException(reason=msg)
        res = None
        try:
            res = func(url, **kwargs)
        except requests.exceptions.ConnectTimeout as ct:
            LOG.error('ConnectTimeout err: {}'.format(ct))
            raise exception.ConnectTimeout()
        except Exception as err:
            LOG.exception('Bad response from server: %(url)s.'
                          ' Error: %(err)s', {'url': url, 'err': err})
            if 'WSAETIMEDOUT' in str(err):
                raise exception.ConnectTimeout()
            else:
                raise exception.BadResponse()

        return res
Ejemplo n.º 4
0
 def login(self):
     try:
         access_session = self.rest_auth_token
         if self.rest_auth_token is None:
             url = RestHandler.REST_AUTH_URL
             data = {}
             self.init_rest_client()
             res = self. \
                 do_call(url, data, 'GET',
                         calltimeout=consts.SOCKET_TIMEOUT)
             if res.status_code == 200:
                 access_session = res.headers['EMC-CSRF-TOKEN']
                 self.rest_auth_token = access_session
                 self.session.headers[
                     RestHandler.REST_AUTH_KEY] = access_session
             else:
                 LOG.error(
                     "Login error. URL: %(url)s\n"
                     "Reason: %(reason)s.", {
                         "url": url,
                         "reason": res.text
                     })
                 if 'invalid username or password' in res.text:
                     raise exception.InvalidUsernameOrPassword()
                 else:
                     raise exception.BadResponse(res.text)
         else:
             LOG.error('Login Parameter error')
         return access_session
     except Exception as e:
         LOG.error("Login error: %s", six.text_type(e))
         raise e
Ejemplo n.º 5
0
    def login(self):
        """Login Hpe3par storage array."""
        try:
            access_session = self.rest_client.rest_auth_token
            if self.rest_client.san_address:
                url = RestHandler.REST_AUTH_URL

                data = {
                    "user": self.rest_client.rest_username,
                    "password": cryptor.decode(self.rest_client.rest_password)
                }

                self.session_lock.acquire()

                if self.rest_client.rest_auth_token is not None:
                    return self.rest_client.rest_auth_token

                self.rest_client.init_http_head()
                res = self.rest_client. \
                    do_call(url, data, 'POST',
                            calltimeout=consts.SOCKET_TIMEOUT)

                if res is None:
                    LOG.error('Login res is None')
                    raise exception.InvalidResults('res is None')

                if res.status_code == consts. \
                        LOGIN_SUCCESS_STATUS_CODES:
                    result = res.json()

                    access_session = result.get('key')
                    self.rest_client.rest_auth_token = access_session
                    self.rest_client.session.headers[
                        RestHandler.REST_AUTH_KEY] = access_session
                else:
                    LOG.error(
                        "Login error. URL: %(url)s\n"
                        "Reason: %(reason)s.", {
                            "url": url,
                            "reason": res.text
                        })
                    if 'invalid username or password' in res.text:
                        raise exception.InvalidUsernameOrPassword()
                    else:
                        raise exception.BadResponse(res.text)
            else:
                LOG.error('Login Parameter error')

            return access_session
        except Exception as e:
            LOG.error("Login error: %s", six.text_type(e))
            raise e
        finally:
            self.session_lock.release()
Ejemplo n.º 6
0
    def do_call(self, url, data, method, calltimeout=SOCKET_TIMEOUT):
        if 'http' not in url:
            if self.san_address:
                url = '%s%s' % (self.san_address, url)

        kwargs = {'timeout': calltimeout}
        if data:
            kwargs['data'] = json.dumps(data)

        if method in ('POST', 'PUT', 'GET', 'DELETE'):
            func = getattr(self.session, method.lower())
        else:
            msg = _("Request method %s is invalid.") % method
            LOG.error(msg)
            raise exception.StorageBackendException(msg)
        res = None
        try:
            res = func(url, **kwargs)
        except requests.exceptions.ConnectTimeout as ct:
            LOG.error('Connect Timeout err: {}'.format(ct))
            raise exception.InvalidIpOrPort()
        except requests.exceptions.ReadTimeout as rt:
            LOG.error('Read timed out err: {}'.format(rt))
            raise exception.StorageBackendException(six.text_type(rt))
        except requests.exceptions.SSLError as e:
            LOG.error('SSLError for %s %s' % (method, url))
            err_str = six.text_type(e)
            if 'certificate verify failed' in err_str:
                raise exception.SSLCertificateFailed()
            else:
                raise exception.SSLHandshakeFailed()
        except Exception as err:
            LOG.exception(
                'Bad response from server: %(url)s.'
                ' Error: %(err)s', {
                    'url': url,
                    'err': err
                })
            if 'WSAETIMEDOUT' in str(err):
                raise exception.ConnectTimeout()
            elif 'Failed to establish a new connection' in str(err):
                LOG.error('Failed to establish: {}'.format(err))
                raise exception.InvalidIpOrPort()
            elif 'Read timed out' in str(err):
                raise exception.StorageBackendException(six.text_type(err))
            else:
                raise exception.BadResponse()

        return res
Ejemplo n.º 7
0
    def get_token(self):
        try:
            succeed = False
            if self.san_address:
                url = '%s/%s/sessions' % \
                      (RestHandler.COMM_URL,
                       self.storage_device_id)
                data = {}

                with self.session_lock:
                    if self.session is None:
                        self.init_http_head()
                    self.session.auth = \
                        requests.auth.HTTPBasicAuth(
                            self.rest_username,
                            cryptor.decode(self.rest_password))
                    res = self.call_with_token(url, data, 'POST', 30)
                    if res.status_code == 200:
                        succeed = True
                        result = res.json()
                        self.session_id = cryptor.encode(
                            result.get('sessionId'))
                        access_session = 'Session %s' % result.get('token')
                        self.session.headers[
                            RestHandler.AUTH_KEY] = cryptor.encode(
                                access_session)
                    else:
                        LOG.error(
                            "Login error. URL: %(url)s\n"
                            "Reason: %(reason)s.", {
                                "url": url,
                                "reason": res.text
                            })
                        if 'authentication failed' in res.text:
                            raise exception.InvalidUsernameOrPassword()
                        elif 'KART30005-E' in res.text:
                            raise exception.StorageBackendException(
                                six.text_type(res.text))
                        else:
                            raise exception.BadResponse(res.text)
            else:
                LOG.error('Token Parameter error')

            return succeed
        except Exception as e:
            LOG.error("Get token error: %s", six.text_type(e))
            raise e
Ejemplo n.º 8
0
 def login(self):
     try:
         data = {}
         self.init_http_head()
         self.session.headers.update({
             "username":
             self.rest_username,
             "password":
             cryptor.decode(self.rest_password)
         })
         res = self.do_call(consts.REST_AUTH_URL, data, 'GET')
         if res.status_code != 200:
             LOG.error("Login error. URL: %(url)s\n"
                       "Reason: %(reason)s.", {
                           "url": consts.REST_AUTH_URL,
                           "reason": res.text
                       })
             if 'User authentication failed' in res.text:
                 raise exception.InvalidUsernameOrPassword()
             else:
                 raise exception.BadResponse(res.text)
     except Exception as e:
         LOG.error("Login error: %s", six.text_type(e))
         raise e