summaryrefslogtreecommitdiffstats
path: root/testapi/testapi-client/testapiclient/utils/clientmanager.py
blob: 885881939d3f3aea8e691b61af123d4d94d94f46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import httplib
import json
import os
import urllib
import logging

import requests

LOG = logging.getLogger(__name__)


class ClientManager(object):
    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}

    def __init__(self, cli_options=None):
        self.cli_options = cli_options
        self.session = requests.Session()
        self._auth_completed = False

    @property
    def auth_required(self):
        return self._auth()

    def _auth(self):
        return {
            'name': self.cli_options.u,
            'pass': self.cli_options.p
        } if self.cli_options.u else None

    def auth(self):

        if self._auth_completed:
            return

        hostname = '{}{}{}'.format(os.environ.get('testapi_cas_auth_url'),
                                   urllib.quote(os.environ.get('testapi_url')),
                                   os.environ.get('testapi_cas_signin_return'))
        data = self._auth()
        data.update({'form_id': 'user_login'})
        LOG.debug('authenticating.....')
        response = self.session.post(hostname, data)
        if "login" in response.text:
            raise Exception('Authenticate failed')
        self._auth_completed = True

    def get(self, url):
        return self._parse_response('Get',
                                    self._request('get', url,
                                                  headers=self.headers))

    def post(self, url, data):
        return self._parse_response('Create',
                                    self._request('post', url,
                                                  data=json.dumps(data),
                                                  headers=self.headers))

    def put(self, url, data):
        return self._parse_response('Update',
                                    self._request('put', url,
                                                  data=json.dumps(data),
                                                  headers=self.headers))

    def delete(self, url, *args):
        data = json.dumps(args[0]) if len(args) > 0 else None
        return self._parse_response('Delete',
                                    self._request('delete', url,
                                                  data=data,
                                                  headers=self.headers))

    def _request(self, method, *args, **kwargs):
        return getattr(self.session, method)(*args, **kwargs)

    def _raise_failure(self, op, response):
        raise Exception('{} failed: {}'.format(op, response.reason))

    def _parse_response(self, op, response):
        if response.status_code == httplib.OK:
            if op != 'Delete' and response.text != '':
                return response.json()
            else:
                return None
        else:
            self._raise_failure(op, response)