56 lines
2.2 KiB
Python
56 lines
2.2 KiB
Python
# Copyright 2017 Hewlett Packard Enterprise Development LP
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
__author__ = 'HPE'
|
|
|
|
import retrying
|
|
from six.moves.urllib.parse import urlparse
|
|
from sushy import connector
|
|
from sushy import exceptions
|
|
|
|
|
|
class HPEConnector(connector.Connector):
|
|
"""Class that extends base Sushy Connector class
|
|
|
|
This class extends the Sushy's Connector class to override certain methods
|
|
required to customize the functionality of the http operations.
|
|
"""
|
|
|
|
MAX_RETRY_ATTEMPTS = 3 # Maximum number of attempts to be retried
|
|
MAX_TIME_BEFORE_RETRY = 2 * 1000 # wait time in milliseconds before retry
|
|
|
|
@retrying.retry(
|
|
retry_on_exception=(
|
|
lambda e: isinstance(e, exceptions.ConnectionError)),
|
|
stop_max_attempt_number=MAX_RETRY_ATTEMPTS,
|
|
wait_fixed=MAX_TIME_BEFORE_RETRY)
|
|
def _op(self, method, path='', data=None, headers=None):
|
|
"""Overrides the base method to support retrying the operation.
|
|
|
|
:param method: The HTTP method to be used, e.g: GET, POST,
|
|
PUT, PATCH, etc...
|
|
:param path: The sub-URI path to the resource.
|
|
:param data: Optional JSON data.
|
|
:param headers: Optional dictionary of headers.
|
|
:returns: The response from the connector.Connector's _op method.
|
|
"""
|
|
resp = super(HPEConnector, self)._op(method, path, data,
|
|
headers, allow_redirects=False)
|
|
# With IPv6, Gen10 server gives redirection response with new path with
|
|
# a prefix of '/' so this check is required
|
|
if resp.status_code == 308:
|
|
path = urlparse(resp.headers['Location']).path
|
|
resp = super(HPEConnector, self)._op(method, path, data, headers)
|
|
return resp
|