nova-fusioncompute/nova/virt/fusioncomputeapi/restclient.py

140 lines
4.0 KiB
Python

# Copyright 2016 Huawei Technologies Co.,LTD.
# All Rights Reserved.
#
# 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.
import copy
import requests
from nova.i18n import _
from nova.virt.fusioncomputeapi import utils
from nova.virt.fusioncomputeapi.utils import LOG
from oslo_serialization import jsonutils
class RestClient(object):
"""send rest msg class
"""
def __init__(self, host, port=80, ssl=None, cert=None):
self.host = host
self.port = port
self.__ssl = ssl
self.__cert = cert
self.__protocol = 'http' if not self.__ssl else 'https'
def __repr__(self):
"""get rest path msg
:return:
"""
return 'REST client %s://%s:%s' % (
self.__protocol, self.host, self.port)
def _to_url(self, path):
"""get rest url
:param path:
:return:
"""
return '%s://%s:%s%s' % (
self.__protocol, self.host, self.port, path)
def _request(self, method, path, data=None, headers=None, **kwargs):
"""send request msg
:param method:
:param path:
:param data:
:param headers:
:param kwargs:
:return:
"""
url = self._to_url(path)
if not data:
data = jsonutils.dumps({})
elif isinstance(data, dict) or isinstance(data, list):
data = jsonutils.dumps(data)
if method == 'get':
log_fun = LOG.debug
else:
log_fun = LOG.info
try:
data_for_log = copy.deepcopy(jsonutils.loads(data))
utils.drop_password_key(data_for_log)
except Exception:
log_fun(_('request: %s'), method)
rsp = requests.request(method, url, data=data, headers=headers,
verify=False, **kwargs)
return rsp
def request_msg(self, method, path, data=None, headers=None, **kwargs):
"""send rest message base func, should achieve in child class
:param method:
:param path:
:param data:
:param headers:
:param kwargs:
:return:
"""
return self._request(method, path, data=data, headers=headers,
**kwargs)
def post(self, path, data=None, **kwargs):
"""Post.
:param path: path under Context, something like '/app/resource'
:param data: (Optional) data of request
:param kwargs: headers, etc.
:return: Response object in requests
"""
return self.request_msg('post', path, data=data, **kwargs)
def get(self, path, **kwargs):
"""Get.
:param path: path under Context, something like '/app/resource/id'
:param kwargs: headers, etc.
:return: Response object in requests
"""
return self.request_msg('get', path, **kwargs)
def put(self, path, data=None, **kwargs):
"""Put.
:param path: path under Context, something like '/app/resource/id'
:param data: (Optional) data of request
:param kwargs: headers, etc.
:return: Response object in requests
"""
return self.request_msg('put', path, data=data, **kwargs)
def delete(self, path, **kwargs):
"""Delete.
:param path: path under Context, something like '/app/resource/id'
:param kwargs: headers, etc.
:return: Response object in requests
"""
return self.request_msg('delete', path, **kwargs)