summaryrefslogtreecommitdiffstats
path: root/base/common/python
diff options
context:
space:
mode:
authorAde Lee <alee@redhat.com>2017-04-03 12:43:05 -0400
committerAde Lee <alee@redhat.com>2017-04-03 13:12:37 -0400
commit5dfd6e1c3cc38b5fbfdc4e96476934219f53e13f (patch)
tree721fbefdbf09c4e98dea52d59a517e0e37fe8e54 /base/common/python
parent2d77ca150ee17238f4b137e3987a69e888141d51 (diff)
downloadpki-5dfd6e1c3cc38b5fbfdc4e96476934219f53e13f.tar.gz
pki-5dfd6e1c3cc38b5fbfdc4e96476934219f53e13f.tar.xz
pki-5dfd6e1c3cc38b5fbfdc4e96476934219f53e13f.zip
Added python info client
Add python client code to read from the InfoResource class and get the server version. As the PKIConnection in the python client currently requires a subsystem, it is difficult to add an infoclient to an existing KRAClient (or any other client). To get around this, I modified the PKIConnection to allow using the rootURI. Change-Id: Ided75f45f741e2ba3fc86acec715d24b829c8a97
Diffstat (limited to 'base/common/python')
-rw-r--r--base/common/python/pki/client.py51
-rw-r--r--base/common/python/pki/info.py98
2 files changed, 138 insertions, 11 deletions
diff --git a/base/common/python/pki/client.py b/base/common/python/pki/client.py
index 90ca4fefb..805d0fadb 100644
--- a/base/common/python/pki/client.py
+++ b/base/common/python/pki/client.py
@@ -78,9 +78,8 @@ class PKIConnection:
self.port = port
self.subsystem = subsystem
- self.serverURI = self.protocol + '://' + \
- self.hostname + ':' + self.port + '/' + \
- self.subsystem
+ self.rootURI = self.protocol + '://' + self.hostname + ':' + self.port
+ self.serverURI = self.rootURI + '/' + self.subsystem
self.session = requests.Session()
self.session.trust_env = trust_env
@@ -125,7 +124,8 @@ class PKIConnection:
self.session.cert = pem_cert_path
@catch_insecure_warning
- def get(self, path, headers=None, params=None, payload=None):
+ def get(self, path, headers=None, params=None, payload=None,
+ use_root_uri=False):
"""
Uses python-requests to issue a GET request to the server.
@@ -137,12 +137,19 @@ class PKIConnection:
:type params: dict or bytes
:param payload: data to be sent in the body of the request
:type payload: dict, bytes, file-like object
+ :param use_root_uri: use root URI instead of subsystem URI as base
+ :type use_root_uri: boolean
:returns: request.response -- response from the server
:raises: Exception from python-requests in case the GET was not
successful, or returns an error code.
"""
+ if use_root_uri:
+ target_path = self.rootURI + path
+ else:
+ target_path = self.serverURI + path
+
r = self.session.get(
- self.serverURI + path,
+ target_path,
verify=False,
headers=headers,
params=params,
@@ -151,7 +158,8 @@ class PKIConnection:
return r
@catch_insecure_warning
- def post(self, path, payload, headers=None, params=None):
+ def post(self, path, payload, headers=None, params=None,
+ use_root_uri=False):
"""
Uses python-requests to issue a POST request to the server.
@@ -163,12 +171,19 @@ class PKIConnection:
:type headers: dict
:param params: Query parameters for the POST request
:type params: dict or bytes
+ :param use_root_uri: use root URI instead of subsystem URI as base
+ :type use_root_uri: boolean
:returns: request.response -- response from the server
:raises: Exception from python-requests in case the POST was not
successful, or returns an error code.
"""
+ if use_root_uri:
+ target_path = self.rootURI + path
+ else:
+ target_path = self.serverURI + path
+
r = self.session.post(
- self.serverURI + path,
+ target_path,
verify=False,
data=payload,
headers=headers,
@@ -177,7 +192,7 @@ class PKIConnection:
return r
@catch_insecure_warning
- def put(self, path, payload, headers=None):
+ def put(self, path, payload, headers=None, use_root_uri=False):
"""
Uses python-requests to issue a PUT request to the server.
@@ -187,16 +202,23 @@ class PKIConnection:
:type payload: dict, bytes, file-like object
:param headers: headers for the PUT request
:type headers: dict
+ :param use_root_uri: use root URI instead of subsystem URI as base
+ :type use_root_uri: boolean
:returns: request.response -- response from the server
:raises: Exception from python-requests in case the PUT was not
successful, or returns an error code.
"""
- r = self.session.put(self.serverURI + path, payload, headers=headers)
+ if use_root_uri:
+ target_path = self.rootURI + path
+ else:
+ target_path = self.serverURI + path
+
+ r = self.session.put(target_path, payload, headers=headers)
r.raise_for_status()
return r
@catch_insecure_warning
- def delete(self, path, headers=None):
+ def delete(self, path, headers=None, use_root_uri=False):
"""
Uses python-requests to issue a DEL request to the server.
@@ -204,11 +226,18 @@ class PKIConnection:
:type path: str
:param headers: headers for the DEL request
:type headers: dict
+ :param use_root_uri: use root URI instead of subsystem URI as base
+ :type use_root_uri: boolean
:returns: request.response -- response from the server
:raises: Exception from python-requests in case the DEL was not
successful, or returns an error code.
"""
- r = self.session.delete(self.serverURI + path, headers=headers)
+ if use_root_uri:
+ target_path = self.rootURI + path
+ else:
+ target_path = self.serverURI + path
+
+ r = self.session.delete(target_path, headers=headers)
r.raise_for_status()
return r
diff --git a/base/common/python/pki/info.py b/base/common/python/pki/info.py
new file mode 100644
index 000000000..65d482568
--- /dev/null
+++ b/base/common/python/pki/info.py
@@ -0,0 +1,98 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the Lesser GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Copyright (C) 2013 Red Hat, Inc.
+# All rights reserved.
+#
+# Author:
+# Ade Lee <alee@redhat.com>
+#
+"""
+Module containing the Python client classes for the InfoClient
+"""
+from six import iteritems
+
+import pki
+
+
+class Info(object):
+ """
+ This class encapsulates the parameters returned by the server's
+ InfoService.
+ """
+
+ json_attribute_names = {
+ 'Version': 'version',
+ 'Banner': 'banner'
+ }
+
+ def __init__(self, version=None, banner=None):
+ """ Constructor """
+ self.version = version
+ self.banner = banner
+
+ @classmethod
+ def from_json(cls, attr_list):
+ """ Return Info from JSON dict """
+ info = cls()
+ for k, v in iteritems(attr_list):
+ if k in Info.json_attribute_names:
+ setattr(info, Info.json_attribute_names[k], v)
+ else:
+ setattr(info, k, v)
+ return info
+
+
+class Version(object):
+ """
+ This class encapsulates a version object as returned from
+ a Dogtag server and decomposes it into major, minor, etc.
+ """
+
+ def __init__(self, version_string):
+ for idx, val in enumerate(version_string.split('.')):
+ if idx == 0:
+ self.major = val
+ if idx == 1:
+ self.minor = val
+ if idx == 2:
+ self.patch = val
+
+
+class InfoClient(object):
+ """
+ Class encapsulating and mirroring the functionality in the
+ InfoResource Java interface class defining the REST API for
+ server Info resources.
+ """
+
+ def __init__(self, connection):
+ """ Constructor """
+ self.connection = connection
+
+ @pki.handle_exceptions()
+ def get_info(self):
+ """ Return an Info object form a PKI server """
+
+ url = '/pki/rest/info'
+ headers = {'Content-type': 'application/json',
+ 'Accept': 'application/json'}
+ r = self.connection.get(url, headers, use_root_uri=True)
+ return Info.from_json(r.json())
+
+ @pki.handle_exceptions()
+ def get_version(self):
+ """ return Version object from server """
+ version_string = self.get_info().version
+ return Version(version_string)