Statistics
| Branch: | Tag: | Revision:

root / snf-quotaholder-app / quotaholder_django / test / simpletests.py @ 4ec8c043

History | View | Annotate | Download (14.5 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from config import QHTestCase
35
from config import run_test_case
36
from config import rand_string
37
from config import printf
38

    
39
from synnefo.lib.commissioning import CallError
40
from synnefo.lib.quotaholder.api import InvalidDataError, NoEntityError
41
from synnefo.lib.quotaholder.api.quotaholder import (
42
    Name, Key, Quantity, Capacity, ImportLimit, ExportLimit, Resource, Flags,
43
    Imported, Exported, Returned, Released)
44

    
45
DEFAULT_HOLDING = (0, 0, 0, 0)
46

    
47
class QHAPITest(QHTestCase):
48

    
49
    @classmethod
50
    def setUpClass(self):
51
        QHTestCase.setUpClass()
52
        e = self.rand_entity()
53
        k = Key.random()
54
        r = self.qh.create_entity(create_entity=[(e, 'system', k, '')])
55
        self.e_name = e
56
        self.e_key = k
57
        self.client = self.rand_entity()
58

    
59
    @classmethod
60
    def rand_name(self, exclude=[]):
61
        for i in range(1,100):
62
            r = Name().random()
63
            if r not in exclude:
64
                exclude.append(r)
65
                return r
66
        else:
67
            m = 'Could not make a unique random name'
68
            raise Exception(m)
69

    
70
    used_entities = ['system']
71

    
72
    @classmethod
73
    def rand_entity(self):
74
        return self.rand_name(self.used_entities)
75

    
76
    used_policies = []
77

    
78
    @classmethod
79
    def rand_policy(self):
80
        return self.rand_name(self.used_policies)
81

    
82
    used_resources = []
83

    
84
    @classmethod
85
    def rand_resource(self):
86
        return self.rand_name(self.used_resources)
87

    
88
    def rand_limits(self):
89
        q = Capacity.random() # Nonnegative
90
        c = Capacity.random()
91
        il = ImportLimit.random()
92
        el = ExportLimit.random()
93
        return q, c, il, el
94

    
95
    def rand_policy_limits(self):
96
        p = self.rand_policy()
97
        limits = self.rand_limits()
98
        return p, limits
99

    
100
    def rand_flags(self):
101
        return Flags.random()
102

    
103
    def rand_counters(self):
104
        return (Imported.random(), Exported.random(),
105
                Returned.random(), Released.random())
106

    
107
    def new_entity(self, parent='system', parent_key=''):
108
        e = self.rand_entity()
109
        k = Key.random()
110
        r = self.qh.create_entity(create_entity=[(e, parent, k, parent_key)])
111
        self.assertEqual(r, [])
112
        return e, k
113

    
114
    def new_policy(self):
115
        p, limits = self.rand_policy_limits()
116
        r = self.qh.set_limits(set_limits=[(p,) + limits])
117
        self.assertEqual(r, [])
118
        return p, limits
119

    
120
    def test_001_list_entities(self):
121
        r = self.qh.list_entities(entity='system', key='')
122
        self.assertEqual(sorted(r), sorted(['system', self.e_name]))
123

    
124
        with self.assertRaises(NoEntityError):
125
            self.qh.list_entities(entity='doesnotexist', key='')
126

    
127
        with self.assertRaises(InvalidDataError):
128
            self.qh.list_entities(entity='system; SELECT ALL', key='')
129

    
130
    def test_002_create_entity(self):
131
        e = self.rand_entity()
132
        k = Key.random()
133
        r = self.qh.create_entity(
134
            create_entity=[(self.e_name, 'system', self.e_key, ''),
135
                           (e, self.e_name, k, self.e_key),
136
                           (e, self.e_name, k, self.e_key)])
137
        self.assertEqual(r, [0,2])
138

    
139
    def test_003_release_entity(self):
140
        e, k = self.new_entity()
141
        r = self.qh.release_entity(release_entity=[(e, k)])
142
        self.assertEqual(r, [])
143

    
144
    def test_004_set_entity_key(self):
145
        e, k = self.new_entity()
146
        k1 = Key.random()
147
        k2 = Key.random()
148
        r = self.qh.set_entity_key(set_entity_key=[(e, k1, k2)])
149
        self.assertEqual(r, [e])
150
        r = self.qh.set_entity_key(set_entity_key=[(e, k, k2)])
151
        self.assertEqual(r, [])
152
        r = self.qh.release_entity(release_entity=[(e, k)])
153
        self.assertEqual(r, [e])
154

    
155
    def test_005_get_entity(self):
156
        e = self.rand_entity()
157
        k = Key.random()
158
        r = self.qh.get_entity(get_entity=[(self.e_name, self.e_key), (e, k)])
159
        self.assertEqual(r, [(self.e_name, 'system')])
160

    
161
    def test_006_get_set_limits(self):
162

    
163
        p1, limits1 = self.rand_policy_limits()
164
        limits2 = self.rand_limits()
165
        r = self.qh.set_limits(set_limits=[(p1,) + limits1,
166
                                           (p1,) + limits2])
167
        self.assertEqual(r, [])
168

    
169
        p2, _ = self.rand_policy_limits()
170
        r = self.qh.get_limits(get_limits=[p1, p2])
171
        self.assertEqual(r, [(p1,) + limits2])
172

    
173
    def test_007_get_set_holding(self):
174
        e, k = self.new_entity()
175
        resource = self.rand_resource()
176

    
177
        p0 = self.rand_policy()
178
        f0 = self.rand_flags()
179
        p1, _ = self.new_policy()
180
        f1 = self.rand_flags()
181
        p2, _ = self.new_policy()
182
        f2 = self.rand_flags()
183

    
184
        # none is committed
185
        r = self.qh.set_holding(set_holding=[(e, resource, k, p0, f0),
186
                                             (e, resource, k, p1, f1),
187
                                             (e, resource, k, p2, f2)])
188
        self.assertEqual(r, [(e, resource, p0)])
189

    
190
        r = self.qh.get_holding(get_holding=[(e, resource, k)])
191
        self.assertEqual(r, [])
192

    
193
        r = self.qh.set_holding(set_holding=[(e, resource, k, p1, f1),
194
                                             (e, resource, k, p2, f2)])
195
        self.assertEqual(r, [])
196

    
197
        resource1 = self.rand_resource()
198
        r = self.qh.get_holding(get_holding=[(e, resource, k),
199
                                             (e, resource1, k)])
200
        self.assertEqual(r, [(e, resource, p2) + DEFAULT_HOLDING + (f2,)])
201

    
202
    def test_008_get_set_quota(self):
203
        e, k = self.new_entity()
204
        resource = self.rand_resource()
205
        limits = self.rand_limits()
206
        limits1 = self.rand_limits()
207
        f = self.rand_flags()
208
        r = self.qh.set_quota(set_quota=[(e, resource, k) + limits + (f,),
209
                                         (e, resource, k) + limits1 + (f,)])
210
        self.assertEqual(r, [])
211

    
212
        resource2 = self.rand_resource()
213
        r = self.qh.get_quota(get_quota=[(e, resource, k),
214
                                         (e, resource2, k)])
215
        self.assertEqual(r, [(e, resource) + limits1 +
216
                             DEFAULT_HOLDING + (f,)])
217

    
218
    def new_quota(self, entity, key, resource):
219
        limits = self.rand_limits()
220
        f = self.rand_flags()
221
        r = self.qh.set_quota(
222
            set_quota=[(entity, resource, key) + limits + (f,)])
223
        self.assertEqual(r, [])
224
        return limits
225

    
226
    def test_0081_add_quota(self):
227
        e0, k0 = self.new_entity()
228
        e1, k1 = self.new_entity()
229
        resource0 = self.rand_resource()
230
        resource1 = self.rand_resource()
231

    
232
        r = self.qh.set_quota(
233
            set_quota=[(e0, resource0, k0) + (5, 5, 5, 5) + (0,),
234
                       (e1, resource0, k1) + (5, 5, 5, 5) + (0,)])
235
        self.assertEqual(r, [])
236

    
237
        r = self.qh.add_quota(add_quota=[(e0, resource0, k0, 0, (-2), None, 0),
238
                                         (e0, resource1, k0, 0, None, 5, 5)])
239
        self.assertEqual(r, [])
240

    
241
        r = self.qh.get_quota(get_quota=[(e0, resource0, k0),
242
                                         (e0, resource1, k0)])
243
        self.assertEqual(r, [(e0, resource0, 5, 5 - 2, None, 5)
244
                             + DEFAULT_HOLDING + (0,),
245
                             (e0, resource1, 0, None, 5, 5)
246
                             + DEFAULT_HOLDING + (0,)])
247

    
248
        # none is committed
249
        r = self.qh.add_quota(add_quota=[(e1, resource0, k1, 0, (-10), None, 0),
250
                                         (e0, resource1, k0, 1, 0, 0, 0)])
251
        self.assertEqual(r, [(e1, resource0)])
252

    
253
        r = self.qh.get_quota(get_quota=[(e1, resource0, k1),
254
                                         (e0, resource1, k0)])
255
        self.assertEqual(r, [(e1, resource0, 5, 5 , 5, 5)
256
                             + DEFAULT_HOLDING + (0,),
257
                             (e0, resource1, 0, None, 5, 5)
258
                             + DEFAULT_HOLDING + (0,)])
259

    
260
    def test_009_commissions(self):
261
        e0, k0 = self.new_entity()
262
        e1, k1 = self.new_entity()
263
        resource = self.rand_resource()
264
        q0, c0, il0, el0 = self.new_quota(e0, k0, resource)
265
        q1, c1, il1, el1 = self.new_quota(e1, k1, resource)
266

    
267
        most = max(0, min(c0, il0, q1, el1))
268
        r = self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
269
                                     name='something',
270
                                     provisions=[(e1, resource, most)])
271
        self.assertEqual(r, 1)
272

    
273
        with self.assertRaises(CallError):
274
            self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
275
                                     name='something',
276
                                     provisions=[(e1, resource, 1)])
277

    
278
        r = self.qh.get_pending_commissions(clientkey=self.client)
279
        self.assertEqual(r, [1])
280
        r = self.qh.resolve_pending_commissions(clientkey=self.client,
281
                                                max_serial=1, accept_set=[1])
282
        r = self.qh.get_pending_commissions(clientkey=self.client)
283
        self.assertEqual(r, [])
284

    
285
    def test_010_list_holdings(self):
286
        e0, k0 = ('list_holdings_one', '1')
287
        e1, k1 = ('list_holdings_two', '1')
288
        resource = 'list_holdings_resource'
289
        sys = 'system'
290

    
291
        r = self.qh.create_entity(create_entity=[(e0, sys, k0, ''),
292
                                                 (e1, sys, k1, '')])
293
        if r:
294
            raise AssertionError("cannot create entities")
295

    
296
        self.qh.set_quota(set_quota=[(sys, resource, '', 10, 0, None, None, 0),
297
                                     (e0, resource, k0, 0, 10, None, None, 0),
298
                                     (e1, resource, k1, 0, 10, None, None, 0)])
299

    
300
        s0 = self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
301
                                      name='a commission',
302
                                      provisions=[('system', resource, 3)])
303

    
304
        s1 = self.qh.issue_commission(clientkey=self.client, target=e1, key=k1,
305
                                      name='a commission',
306
                                      provisions=[('system', resource, 4)])
307

    
308
        self.qh.accept_commission(clientkey=self.client, serials=[s0, s1])
309

    
310
        holdings_list, rejected = self.qh.list_holdings(list_holdings=[
311
                                                        (e0, k0),
312
                                                        (e1, k1),
313
                                                        (e0+e1, k0+k1)])
314

    
315
        self.assertEqual(rejected, [e0+e1])
316
        self.assertEqual(holdings_list, [[(e0, resource, 3, 0, 0, 0)],
317
                                         [(e1, resource, 4, 0, 0, 0)]])
318

    
319

    
320
    def test_011_release_empty(self):
321
        e, k = self.new_entity()
322
        e0, k0 = self.rand_entity(), Key.random()
323

    
324
        # none is committed
325
        r = self.qh.release_entity(release_entity=[(e, k), (e0, k0)])
326
        self.assertEqual(r, [e0])
327

    
328
        r = self.qh.get_entity(get_entity=[(e, k)])
329
        self.assertEqual(r, [(e, 'system')])
330

    
331
        r = self.qh.release_entity(release_entity=[(e, k)])
332
        self.assertEqual(r, [])
333

    
334
        r = self.qh.get_entity(get_entity=[(e, k)])
335
        self.assertEqual(r, [])
336

    
337
    def test_012_release_nonempty(self):
338
        e, k = self.new_entity()
339
        e1, k1 = self.new_entity(e, k)
340

    
341
        # none is committed
342
        r = self.qh.release_entity(release_entity=[(e, k), (e1, k1)])
343
        self.assertEqual(r, [e])
344

    
345
        r = self.qh.get_entity(get_entity=[(e1, k1)])
346
        self.assertEqual(r, [(e1, e)])
347

    
348
        r = self.qh.release_entity(release_entity=[(e1, k1), (e, k)])
349
        self.assertEqual(r, [])
350

    
351
        r = self.qh.get_entity(get_entity=[(e1, k1)])
352
        self.assertEqual(r, [])
353

    
354
    def test_013_release_nonempty(self):
355
        e, k = self.new_entity()
356
        resource = self.rand_resource()
357
        limits = self.new_quota(e, k, resource)
358
        r = self.qh.release_entity(release_entity=[(e, k)])
359
        self.assertEqual(r, [e])
360
        r = self.qh.release_holding(release_holding=[(e, resource, k)])
361
        self.assertEqual(r, [])
362
        r = self.qh.release_entity(release_entity=[(e, k)])
363
        self.assertEqual(r, [])
364

    
365
    def test_014_reset_holding(self):
366
        e0, k0 = self.new_entity()
367
        e1, k1 = self.new_entity()
368
        resource = self.rand_resource()
369
        p, _ = self.new_policy()
370
        f = self.rand_flags()
371
        r = self.qh.set_holding(set_holding=[(e1, resource, k1, p, f)])
372

    
373
        counters = self.rand_counters()
374

    
375
        # none is committed
376
        r = self.qh.reset_holding(
377
            reset_holding=[(e0, resource, k0) + counters,
378
                           (e1, resource, k1) + counters])
379
        self.assertEqual(r, [0])
380

    
381
        r = self.qh.get_holding(get_holding=[(e1, resource, k1)])
382
        self.assertEqual(r, [(e1, resource, p) + DEFAULT_HOLDING + (f,)])
383

    
384
        r = self.qh.reset_holding(
385
            reset_holding=[(e1, resource, k1) + counters])
386
        self.assertEqual(r, [])
387

    
388
        r = self.qh.get_holding(get_holding=[(e1, resource, k1)])
389
        self.assertEqual(r, [(e1, resource, p) + counters + (f,)])
390

    
391

    
392
if __name__ == "__main__":
393
    import sys
394
    printf("Using {0}", sys.executable)
395
    run_test_case(QHAPITest)