summaryrefslogtreecommitdiffstats
path: root/testapi/testapi-client/testapiclient/utils/clientmanager.py
blob: 7e4e6303d86928998c0df5383a8fe4bd868fea4d (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
import httplib
import json
import os
import urllib

import requests


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()

    def auth(self):
        hostname = '{}{}{}'.format(os.environ.get('testapi_cas_auth_url'),
                                   urllib.quote(os.environ.get('testapi_url')),
                                   os.environ.get('testapi_cas_signin_return'))
        data = {
            'name': self.cli_options.u,
            'pass': self.cli_options.p,
            'form_id': 'user_login'
        }
        response = self.session.post(hostname, data)
        if "login" in response.text:
            raise Exception('Authenticate failed')

    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:
            return response.json() if op != 'Delete' else None
        else:
            self._raise_failure(op, response)