Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / astakos / test.py @ d77e33d4

History | View | Annotate | Download (6.7 kB)

1 24851aa5 Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 c1004a00 Stavros Sachtouris
#
3 c1004a00 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 c1004a00 Stavros Sachtouris
# without modification, are permitted provided that the following
5 c1004a00 Stavros Sachtouris
# conditions are met:
6 c1004a00 Stavros Sachtouris
#
7 c1004a00 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 c1004a00 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 c1004a00 Stavros Sachtouris
#      disclaimer.
10 c1004a00 Stavros Sachtouris
#
11 c1004a00 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 c1004a00 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 c1004a00 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 c1004a00 Stavros Sachtouris
#      provided with the distribution.
15 c1004a00 Stavros Sachtouris
#
16 c1004a00 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 c1004a00 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 c1004a00 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 c1004a00 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 c1004a00 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 c1004a00 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 c1004a00 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 c1004a00 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 c1004a00 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 c1004a00 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 c1004a00 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 c1004a00 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 c1004a00 Stavros Sachtouris
#
29 c1004a00 Stavros Sachtouris
# The views and conclusions contained in the software and
30 c1004a00 Stavros Sachtouris
# documentation are those of the authors and should not be
31 c1004a00 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 c1004a00 Stavros Sachtouris
# or implied, of GRNET S.A.
33 c1004a00 Stavros Sachtouris
34 ae4585f5 Stavros Sachtouris
from mock import patch, call
35 c1004a00 Stavros Sachtouris
from unittest import TestCase
36 3c50df2e Stavros Sachtouris
37 528550d9 Stavros Sachtouris
from kamaki.clients import astakos, ClientError
38 274bcf7a Stavros Sachtouris
39 274bcf7a Stavros Sachtouris
40 274bcf7a Stavros Sachtouris
example = dict(
41 508570ae Stavros Sachtouris
    access=dict(
42 508570ae Stavros Sachtouris
        serviceCatalog=[
43 508570ae Stavros Sachtouris
            dict(name='service name 1', type='compute', endpoints=[
44 508570ae Stavros Sachtouris
                dict(versionId='v1', publicUrl='http://1.1.1.1/v1'),
45 508570ae Stavros Sachtouris
                dict(versionId='v2', publicUrl='http://1.1.1.1/v2')]),
46 508570ae Stavros Sachtouris
            dict(name='service name 2', type='image', endpoints=[
47 508570ae Stavros Sachtouris
                dict(versionId='v2', publicUrl='http://1.1.1.1/v2'),
48 508570ae Stavros Sachtouris
                dict(versionId='v2.1', publicUrl='http://1.1.1.1/v2/xtra')])
49 508570ae Stavros Sachtouris
            ],
50 508570ae Stavros Sachtouris
        user=dict(
51 508570ae Stavros Sachtouris
            name='Simple Name',
52 508570ae Stavros Sachtouris
            username='User Full Name',
53 508570ae Stavros Sachtouris
            auth_token_expires='1362583796000',
54 508570ae Stavros Sachtouris
            auth_token_created='1359991796000',
55 508570ae Stavros Sachtouris
            email=['user@example.gr'],
56 508570ae Stavros Sachtouris
            id=42,
57 508570ae Stavros Sachtouris
            uuid='aus3r-uu1d-f0r-73s71ng-as7ak0s')
58 508570ae Stavros Sachtouris
        )
59 528550d9 Stavros Sachtouris
    )
60 274bcf7a Stavros Sachtouris
61 274bcf7a Stavros Sachtouris
example0 = dict(
62 508570ae Stavros Sachtouris
    access=dict(
63 b44a5a37 Stavros Sachtouris
         token=dict(
64 b44a5a37 Stavros Sachtouris
            expires="2013-07-14T10:07:42.481134+00:00",
65 b44a5a37 Stavros Sachtouris
            id="ast@k0sT0k3n==",
66 b44a5a37 Stavros Sachtouris
            tenant=dict(
67 b44a5a37 Stavros Sachtouris
                id="42",
68 b44a5a37 Stavros Sachtouris
                name="Simple Name 0")
69 b44a5a37 Stavros Sachtouris
        ),
70 508570ae Stavros Sachtouris
        serviceCatalog=[
71 508570ae Stavros Sachtouris
            dict(name='service name 1', type='compute', endpoints=[
72 508570ae Stavros Sachtouris
                dict(versionId='v1', publicUrl='http://1.1.1.1/v1'),
73 508570ae Stavros Sachtouris
                dict(versionId='v2', publicUrl='http://1.1.1.1/v2')]),
74 508570ae Stavros Sachtouris
            dict(name='service name 3', type='object-storage', endpoints=[
75 508570ae Stavros Sachtouris
                dict(versionId='v2', publicUrl='http://1.1.1.1/v2'),
76 508570ae Stavros Sachtouris
                dict(versionId='v2.1', publicUrl='http://1.1.1.1/v2/xtra')])
77 508570ae Stavros Sachtouris
            ],
78 508570ae Stavros Sachtouris
        user=dict(
79 508570ae Stavros Sachtouris
            name='Simple Name 0',
80 508570ae Stavros Sachtouris
            username='User Full Name 0',
81 508570ae Stavros Sachtouris
            auth_token_expires='1362585796000',
82 508570ae Stavros Sachtouris
            auth_token_created='1359931796000',
83 508570ae Stavros Sachtouris
            email=['user0@example.gr'],
84 508570ae Stavros Sachtouris
            id=42,
85 508570ae Stavros Sachtouris
            uuid='aus3r-uu1d-507-73s71ng-as7ak0s')
86 508570ae Stavros Sachtouris
        )
87 528550d9 Stavros Sachtouris
    )
88 c1004a00 Stavros Sachtouris
89 c1004a00 Stavros Sachtouris
90 975270f2 Stavros Sachtouris
class FR(object):
91 975270f2 Stavros Sachtouris
    json = example
92 975270f2 Stavros Sachtouris
    headers = {}
93 975270f2 Stavros Sachtouris
    content = json
94 975270f2 Stavros Sachtouris
    status = None
95 975270f2 Stavros Sachtouris
    status_code = 200
96 975270f2 Stavros Sachtouris
97 ae4585f5 Stavros Sachtouris
astakos_pkg = 'kamaki.clients.astakos.AstakosClient'
98 c1004a00 Stavros Sachtouris
99 c1004a00 Stavros Sachtouris
100 3c50df2e Stavros Sachtouris
class AstakosClient(TestCase):
101 c1004a00 Stavros Sachtouris
102 274bcf7a Stavros Sachtouris
    cached = False
103 274bcf7a Stavros Sachtouris
104 528550d9 Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
105 528550d9 Stavros Sachtouris
        for k, v in d1.items():
106 528550d9 Stavros Sachtouris
            self.assertTrue(k in d2)
107 528550d9 Stavros Sachtouris
            if isinstance(v, dict):
108 528550d9 Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
109 528550d9 Stavros Sachtouris
            else:
110 528550d9 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
111 528550d9 Stavros Sachtouris
112 c1004a00 Stavros Sachtouris
    def setUp(self):
113 c1004a00 Stavros Sachtouris
        self.url = 'https://astakos.example.com'
114 c1004a00 Stavros Sachtouris
        self.token = 'ast@k0sT0k3n=='
115 3c50df2e Stavros Sachtouris
        self.client = astakos.AstakosClient(self.url, self.token)
116 c1004a00 Stavros Sachtouris
117 975270f2 Stavros Sachtouris
    def tearDown(self):
118 975270f2 Stavros Sachtouris
        FR.json = example
119 975270f2 Stavros Sachtouris
120 508570ae Stavros Sachtouris
    @patch('%s.post' % astakos_pkg, return_value=FR())
121 508570ae Stavros Sachtouris
    def _authenticate(self, post):
122 975270f2 Stavros Sachtouris
        r = self.client.authenticate()
123 508570ae Stavros Sachtouris
        send_body = dict(auth=dict(token=dict(id=self.token)))
124 508570ae Stavros Sachtouris
        self.assertEqual(post.mock_calls[-1], call('/tokens', json=send_body))
125 274bcf7a Stavros Sachtouris
        self.cached = True
126 274bcf7a Stavros Sachtouris
        return r
127 c1004a00 Stavros Sachtouris
128 274bcf7a Stavros Sachtouris
    def test_authenticate(self):
129 274bcf7a Stavros Sachtouris
        r = self._authenticate()
130 528550d9 Stavros Sachtouris
        self.assert_dicts_are_equal(r, example)
131 528550d9 Stavros Sachtouris
132 528550d9 Stavros Sachtouris
    def test_get_services(self):
133 528550d9 Stavros Sachtouris
        if not self.cached:
134 528550d9 Stavros Sachtouris
            self._authenticate()
135 528550d9 Stavros Sachtouris
        slist = self.client.get_services()
136 508570ae Stavros Sachtouris
        self.assertEqual(slist, example['access']['serviceCatalog'])
137 c1004a00 Stavros Sachtouris
138 528550d9 Stavros Sachtouris
    def test_get_service_details(self):
139 528550d9 Stavros Sachtouris
        if not self.cached:
140 528550d9 Stavros Sachtouris
            self._authenticate()
141 528550d9 Stavros Sachtouris
        stype = '#FAIL'
142 528550d9 Stavros Sachtouris
        self.assertRaises(ClientError, self.client.get_service_details, stype)
143 528550d9 Stavros Sachtouris
        stype = 'compute'
144 508570ae Stavros Sachtouris
        expected = [s for s in example['access']['serviceCatalog'] if (
145 508570ae Stavros Sachtouris
            s['type'] == stype)]
146 528550d9 Stavros Sachtouris
        self.assert_dicts_are_equal(
147 528550d9 Stavros Sachtouris
            self.client.get_service_details(stype), expected[0])
148 528550d9 Stavros Sachtouris
149 528550d9 Stavros Sachtouris
    def test_get_service_endpoints(self):
150 528550d9 Stavros Sachtouris
        if not self.cached:
151 528550d9 Stavros Sachtouris
            self._authenticate()
152 528550d9 Stavros Sachtouris
        stype, version = 'compute', 'V2'
153 528550d9 Stavros Sachtouris
        self.assertRaises(
154 528550d9 Stavros Sachtouris
            ClientError, self.client.get_service_endpoints, stype)
155 508570ae Stavros Sachtouris
        expected = [s for s in example['access']['serviceCatalog'] if (
156 508570ae Stavros Sachtouris
            s['type'] == stype)]
157 528550d9 Stavros Sachtouris
        expected = [e for e in expected[0]['endpoints'] if (
158 508570ae Stavros Sachtouris
            e['versionId'] == version.lower())]
159 528550d9 Stavros Sachtouris
        self.assert_dicts_are_equal(
160 528550d9 Stavros Sachtouris
            self.client.get_service_endpoints(stype, version), expected[0])
161 528550d9 Stavros Sachtouris
162 528550d9 Stavros Sachtouris
    def test_user_info(self):
163 274bcf7a Stavros Sachtouris
        if not self.cached:
164 274bcf7a Stavros Sachtouris
            self._authenticate()
165 508570ae Stavros Sachtouris
        self.assertTrue(set(example['access']['user'].keys()).issubset(
166 508570ae Stavros Sachtouris
            self.client.user_info().keys()))
167 c1004a00 Stavros Sachtouris
168 528550d9 Stavros Sachtouris
    def test_item(self):
169 274bcf7a Stavros Sachtouris
        if not self.cached:
170 274bcf7a Stavros Sachtouris
            self._authenticate()
171 508570ae Stavros Sachtouris
        for term, val in example['access']['user'].items():
172 274bcf7a Stavros Sachtouris
            self.assertEqual(self.client.term(term, self.token), val)
173 528550d9 Stavros Sachtouris
        self.assertTrue(
174 508570ae Stavros Sachtouris
            example['access']['user']['email'][0] in self.client.term('email'))
175 c1004a00 Stavros Sachtouris
176 528550d9 Stavros Sachtouris
    def test_list_users(self):
177 274bcf7a Stavros Sachtouris
        if not self.cached:
178 b44a5a37 Stavros Sachtouris
            self._authenticate()
179 975270f2 Stavros Sachtouris
        FR.json = example0
180 975270f2 Stavros Sachtouris
        self._authenticate()
181 528550d9 Stavros Sachtouris
        r = self.client.list_users()
182 274bcf7a Stavros Sachtouris
        self.assertTrue(len(r) == 1)
183 274bcf7a Stavros Sachtouris
        self.assertEqual(r[0]['auth_token'], self.token)
184 85898ca4 Stavros Sachtouris
185 85898ca4 Stavros Sachtouris
if __name__ == '__main__':
186 85898ca4 Stavros Sachtouris
    from sys import argv
187 85898ca4 Stavros Sachtouris
    from kamaki.clients.test import runTestCase
188 3c50df2e Stavros Sachtouris
    runTestCase(AstakosClient, 'AstakosClient', argv[1:])