Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / quotaholder / test / simpletests.py @ ccdb7c02

History | View | Annotate | Download (24.5 kB)

1
# Copyright 2012, 2013 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 import (
41
                            QH_PRACTICALLY_INFINITE,
42
                            InvalidDataError,
43
                            InvalidKeyError, NoEntityError,
44
                            NoQuantityError, NoCapacityError,
45
                            ExportLimitError, ImportLimitError,
46
                            DuplicateError)
47
from synnefo.lib.quotaholder.api.quotaholder import (
48
    Name, Key, Quantity, Capacity, ImportLimit, ExportLimit, Resource, Flags,
49
    Imported, Exported, Returned, Released)
50

    
51
DEFAULT_HOLDING = (0, 0, 0, 0)
52

    
53
class QHAPITest(QHTestCase):
54

    
55
    @classmethod
56
    def setUpClass(self):
57
        QHTestCase.setUpClass()
58
        e = self.rand_entity()
59
        k = Key.random()
60
        r = self.qh.create_entity(create_entity=[(e, 'system', k, '')])
61
        self.e_name = e
62
        self.e_key = k
63
        self.client = self.rand_entity()
64

    
65
    @classmethod
66
    def rand_name(self, exclude=None):
67
        for i in range(1,100):
68
            r = Name().random()
69
            if exclude is not None and r not in exclude:
70
                exclude.append(r)
71
                return r
72
        else:
73
            m = 'Could not make a unique random name'
74
            raise Exception(m)
75

    
76
    used_entities = ['system']
77

    
78
    @classmethod
79
    def rand_entity(self):
80
        return self.rand_name(self.used_entities)
81

    
82
    used_policies = []
83

    
84
    @classmethod
85
    def rand_policy(self):
86
        return self.rand_name(self.used_policies)
87

    
88
    used_resources = []
89

    
90
    @classmethod
91
    def rand_resource(self):
92
        return self.rand_name(self.used_resources)
93

    
94
    def rand_limits(self):
95
        q = Capacity.random() # Nonnegative
96
        c = Capacity.random()
97
        il = ImportLimit.random()
98
        el = ExportLimit.random()
99
        return q, c, il, el
100

    
101
    def rand_policy_limits(self):
102
        p = self.rand_policy()
103
        limits = self.rand_limits()
104
        return p, limits
105

    
106
    def rand_flags(self):
107
        return Flags.random()
108

    
109
    def rand_counters(self):
110
        return (Imported.random(), Exported.random(),
111
                Returned.random(), Released.random())
112

    
113
    def new_entity(self, parent='system', parent_key=''):
114
        e = self.rand_entity()
115
        k = Key.random()
116
        r = self.qh.create_entity(create_entity=[(e, parent, k, parent_key)])
117
        self.assertEqual(r, [])
118
        return e, k
119

    
120
    def new_policy(self):
121
        p, limits = self.rand_policy_limits()
122
        r = self.qh.set_limits(set_limits=[(p,) + limits])
123
        self.assertEqual(r, [])
124
        return p, limits
125

    
126
    def test_001_list_entities(self):
127
        r = self.qh.list_entities(entity='system', key='')
128
        self.assertEqual(sorted(r), sorted(['system', self.e_name]))
129

    
130
        with self.assertRaises(NoEntityError):
131
            self.qh.list_entities(entity='doesnotexist', key='')
132

    
133
        with self.assertRaises(InvalidDataError):
134
            self.qh.list_entities(entity='system; SELECT ALL', key='')
135

    
136
    def test_002_create_entity(self):
137
        e = self.rand_entity()
138
        k = Key.random()
139
        r = self.qh.create_entity(
140
            create_entity=[(self.e_name, 'system', self.e_key, ''),
141
                           (e, self.e_name, k, self.e_key),
142
                           (e, self.e_name, k, self.e_key)])
143
        self.assertEqual(r, [0,2])
144

    
145
    def test_003_release_entity(self):
146
        e, k = self.new_entity()
147
        r = self.qh.release_entity(release_entity=[(e, k)])
148
        self.assertEqual(r, [])
149

    
150
    def test_004_set_entity_key(self):
151
        e, k = self.new_entity()
152
        k1 = Key.random()
153
        k2 = Key.random()
154
        r = self.qh.set_entity_key(set_entity_key=[(e, k1, k2)])
155
        self.assertEqual(r, [e])
156
        r = self.qh.set_entity_key(set_entity_key=[(e, k, k2)])
157
        self.assertEqual(r, [])
158
        r = self.qh.release_entity(release_entity=[(e, k)])
159
        self.assertEqual(r, [e])
160

    
161
    def test_005_get_entity(self):
162
        e = self.rand_entity()
163
        k = Key.random()
164
        r = self.qh.get_entity(get_entity=[(self.e_name, self.e_key), (e, k)])
165
        self.assertEqual(r, [(self.e_name, 'system')])
166

    
167
    def test_0051_get_entity(self):
168
        e = self.rand_entity()
169
        k = Key.random()
170
        e1, k1 = self.new_entity()
171
        e2, k2 = self.new_entity()
172
        e3, k3 = self.new_entity(e1, k1)
173
        r = self.qh.get_entity(get_entity=[(self.e_name, self.e_key),
174
                                           (e, k),
175
                                           (e2, k2),
176
                                           (e2, k2+'wrong'),
177
                                           (e3, k3),
178
                                           (e3, k3),
179
                                           ])
180
        self.assertEqual(r, [(self.e_name, 'system'),
181
                             (e2, 'system'),
182
                             (e3, e1),
183
                             (e3, e1),
184
                             ])
185

    
186
    def test_006_get_set_limits(self):
187

    
188
        p1, limits1 = self.rand_policy_limits()
189
        limits2 = self.rand_limits()
190
        r = self.qh.set_limits(set_limits=[(p1,) + limits1,
191
                                           (p1,) + limits2])
192
        self.assertEqual(r, [])
193

    
194
        p2, _ = self.rand_policy_limits()
195
        r = self.qh.get_limits(get_limits=[p1, p2])
196
        self.assertEqual(r, [(p1,) + limits2])
197

    
198
    def test_007_get_set_holding(self):
199
        e, k = self.new_entity()
200
        resource = self.rand_resource()
201

    
202
        p0 = self.rand_policy()
203
        f0 = self.rand_flags()
204
        p1, _ = self.new_policy()
205
        f1 = self.rand_flags()
206
        p2, _ = self.new_policy()
207
        f2 = self.rand_flags()
208

    
209
        # none is committed
210
        r = self.qh.set_holding(set_holding=[(e, resource, k, p0, f0),
211
                                             (e, resource, k, p1, f1),
212
                                             (e, resource, k, p2, f2)])
213
        self.assertEqual(r, [(e, resource, p0)])
214

    
215
        r = self.qh.get_holding(get_holding=[(e, resource, k)])
216
        self.assertEqual(r, [])
217

    
218
        r = self.qh.set_holding(set_holding=[(e, resource, k, p1, f1),
219
                                             (e, resource, k, p2, f2)])
220
        self.assertEqual(r, [])
221

    
222
        resource1 = self.rand_resource()
223
        r = self.qh.get_holding(get_holding=[(e, resource, k),
224
                                             (e, resource1, k)])
225
        self.assertEqual(r, [(e, resource, p2) + DEFAULT_HOLDING + (f2,)])
226

    
227
    def test_008_get_set_quota(self):
228
        e, k = self.new_entity()
229
        resource = self.rand_resource()
230
        limits = self.rand_limits()
231
        limits1 = self.rand_limits()
232
        f = self.rand_flags()
233
        r = self.qh.set_quota(set_quota=[(e, resource, k) + limits + (f,),
234
                                         (e, resource, k) + limits1 + (f,)])
235
        self.assertEqual(r, [])
236

    
237
        resource2 = self.rand_resource()
238
        r = self.qh.get_quota(get_quota=[(e, resource, k),
239
                                         (e, resource2, k)])
240
        self.assertEqual(r, [(e, resource) + limits1 +
241
                             DEFAULT_HOLDING + (f,)])
242

    
243
    def new_quota(self, entity, key, resource, limits=None):
244
        if limits is None:
245
            limits = self.rand_limits()
246
        f = self.rand_flags()
247
        r = self.qh.set_quota(
248
            set_quota=[(entity, resource, key) + limits + (f,)])
249
        self.assertEqual(r, [])
250
        return limits
251

    
252
    def test_0081_add_quota(self):
253
        e0, k0 = self.new_entity()
254
        e1, k1 = self.new_entity()
255
        resource0 = self.rand_resource()
256
        resource1 = self.rand_resource()
257

    
258
        r = self.qh.set_quota(
259
            set_quota=[(e0, resource0, k0) + (5, QH_PRACTICALLY_INFINITE, 5, 6) + (0,),
260
                       (e1, resource0, k1) + (5, 5, 5, 5) + (0,)])
261
        self.assertEqual(r, [])
262

    
263
        r = self.qh.add_quota(clientkey=self.client,
264
                              serial=1,
265
                              sub_quota=[(e0, resource0, k0,
266
                                          0, QH_PRACTICALLY_INFINITE, 1, 1)],
267
                              add_quota=[(e0, resource0, k0,
268
                                          0, 3, QH_PRACTICALLY_INFINITE, 0),
269
                                         # new holding
270
                                         (e0, resource1, k0,
271
                                          0, QH_PRACTICALLY_INFINITE, 5, 5)])
272
        self.assertEqual(r, [])
273

    
274
        r = self.qh.get_quota(get_quota=[(e0, resource0, k0),
275
                                         (e0, resource1, k0)])
276
        self.assertEqual(r, [(e0, resource0, 5, 3, QH_PRACTICALLY_INFINITE+4, 5)
277
                             + DEFAULT_HOLDING + (0,),
278
                             (e0, resource1, 0, QH_PRACTICALLY_INFINITE, 5, 5)
279
                             + DEFAULT_HOLDING + (0,)])
280

    
281
        # repeated serial
282
        r = self.qh.add_quota(clientkey=self.client,
283
                              serial=1,
284
                              sub_quota=[(e0, resource1, k0,
285
                                          0, QH_PRACTICALLY_INFINITE, (-5), 0)],
286
                              add_quota=[(e0, resource0, k0,
287
                                          0, 2, QH_PRACTICALLY_INFINITE, 0)])
288
        self.assertEqual(r, [(e0, resource1), (e0, resource0)])
289

    
290
        r = self.qh.query_serials(clientkey=self.client, serials=[1, 2])
291
        self.assertEqual(r, [1])
292

    
293
        r = self.qh.query_serials(clientkey=self.client, serials=[])
294
        self.assertEqual(r, [1])
295

    
296
        r = self.qh.query_serials(clientkey=self.client, serials=[2])
297
        self.assertEqual(r, [])
298

    
299
        r = self.qh.ack_serials(clientkey=self.client, serials=[1])
300

    
301
        r = self.qh.query_serials(clientkey=self.client, serials=[1, 2])
302
        self.assertEqual(r, [])
303

    
304
        # idempotent
305
        r = self.qh.ack_serials(clientkey=self.client, serials=[1])
306

    
307
        # serial has been deleted
308
        r = self.qh.add_quota(clientkey=self.client,
309
                              serial=1,
310
                              add_quota=[(e0, resource0, k0,
311
                                          0, 2, QH_PRACTICALLY_INFINITE, 0)])
312
        self.assertEqual(r, [])
313

    
314
        # none is committed
315
        r = self.qh.add_quota(clientkey=self.client,
316
                              serial=2,
317
                              add_quota=[(e1, resource0, k1,
318
                                          0, (-10), QH_PRACTICALLY_INFINITE, 0),
319
                                         (e0, resource1, k0, 1, 0, 0, 0)])
320
        self.assertEqual(r, [(e1, resource0)])
321

    
322
        r = self.qh.get_quota(get_quota=[(e1, resource0, k1),
323
                                         (e0, resource1, k0)])
324
        self.assertEqual(r, [(e1, resource0, 5, 5 , 5, 5)
325
                             + DEFAULT_HOLDING + (0,),
326
                             (e0, resource1, 0, QH_PRACTICALLY_INFINITE, 5, 5)
327
                             + DEFAULT_HOLDING + (0,)])
328

    
329
    def test_0082_max_quota(self):
330
        e0, k0 = self.new_entity()
331
        e1, k1 = self.new_entity()
332
        resource0 = self.rand_resource()
333
        resource1 = self.rand_resource()
334

    
335
        r = self.qh.set_quota(
336
            set_quota=[(e0, resource0, k0) +
337
                       (5, QH_PRACTICALLY_INFINITE, 5, 6) + (0,)])
338
        self.assertEqual(r, [])
339

    
340
        r = self.qh.add_quota(clientkey=self.client,
341
                              serial=3,
342
                              add_quota=[(e0, resource0, k0,
343
                                          0, QH_PRACTICALLY_INFINITE, 0, 0)])
344

    
345
        self.assertEqual(r, [])
346

    
347
        r = self.qh.get_quota(get_quota=[(e0, resource0, k0)])
348
        self.assertEqual(r, [(e0, resource0, 5, 2*QH_PRACTICALLY_INFINITE, 5, 6)
349
                             + DEFAULT_HOLDING + (0,)])
350

    
351

    
352

    
353
    def test_0090_commissions(self):
354
        e0, k0 = self.new_entity()
355
        e1, k1 = self.new_entity()
356
        resource = self.rand_resource()
357
        q0, c0, il0, el0 = self.new_quota(e0, k0, resource)
358
        q1, c1, il1, el1 = self.new_quota(e1, k1, resource)
359

    
360
        most = min(c0, il0, q1, el1)
361
        if most < 0:
362
            raise AssertionError("%s <= 0" % most)
363

    
364
        r = self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
365
                                     name='something',
366
                                     provisions=[(e1, resource, most)])
367
        self.assertEqual(r, 1)
368

    
369
        with self.assertRaises(CallError):
370
            self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
371
                                     name='something',
372
                                     provisions=[(e1, resource, 1)])
373

    
374
        r = self.qh.get_pending_commissions(clientkey=self.client)
375
        self.assertEqual(r, [1])
376
        r = self.qh.resolve_pending_commissions(clientkey=self.client,
377
                                                max_serial=1, accept_set=[1])
378
        r = self.qh.get_pending_commissions(clientkey=self.client)
379
        self.assertEqual(r, [])
380

    
381
    def test_0091_commissions_exceptions(self):
382
        es1, ks1 = self.new_entity()
383
        es2, ks2 = self.new_entity()
384
        et1, kt1 = self.new_entity()
385
        et2, kt2 = self.new_entity()
386
        resource = self.rand_resource()
387
        self.new_quota(es1, ks1, resource, (10, 5, 5, 15))
388
        self.new_quota(es2, ks2, resource, (10, 5, 5, 10))
389
        self.new_quota(et1, kt1, resource, (0, 15, 3, 20))
390
        self.new_quota(et2, kt2, resource, (0, 15, 20, 20))
391

    
392
        with self.assertRaises(NoQuantityError) as cm:
393
            self.qh.issue_commission(clientkey=self.client, target=et1, key=kt1,
394
                                     name='something',
395
                                     provisions=[(es1, resource, 12)])
396
        e = cm.exception
397
        self.assertEqual(e.source, es1)
398
        self.assertEqual(e.target, et1)
399
        self.assertEqual(e.resource, resource)
400
        self.assertEqual(int(e.limit), 10)
401
        self.assertEqual(int(e.requested), 12)
402
        self.assertEqual(int(e.current), 0)
403

    
404
        r = self.qh.issue_commission(clientkey=self.client, target=et1,
405
                                     key=kt1,
406
                                     name='something',
407
                                     provisions=[(es1, resource, 2)])
408
        self.assertGreater(r, 0)
409

    
410
        with self.assertRaises(ImportLimitError) as cm:
411
            self.qh.issue_commission(clientkey=self.client, target=et1, key=kt1,
412
                                     name='something',
413
                                     provisions=[(es1, resource, 2)])
414
        e = cm.exception
415
        self.assertEqual(e.source, es1)
416
        self.assertEqual(e.target, et1)
417
        self.assertEqual(e.resource, resource)
418
        self.assertEqual(int(e.limit), 3)
419
        self.assertEqual(int(e.requested), 2)
420
        self.assertEqual(int(e.current), 2)
421

    
422
        r = self.qh.issue_commission(clientkey=self.client, target=et2,
423
                                     key=kt2,
424
                                     name='something',
425
                                     provisions=[(es2, resource, 9)])
426
        self.assertGreater(r, 0)
427

    
428
        with self.assertRaises(NoCapacityError) as cm:
429
            self.qh.issue_commission(clientkey=self.client, target=et2,
430
                                     key=kt2,
431
                                     name='something',
432
                                     provisions=[(es2, resource, 1),
433
                                                 (es1, resource, 6)])
434
        e = cm.exception
435
        self.assertEqual(e.source, es1)
436
        self.assertEqual(e.target, et2)
437
        self.assertEqual(e.resource, resource)
438
        self.assertEqual(int(e.limit), 15)
439
        self.assertEqual(int(e.requested), 6)
440
        # 9 actual + 1 from the first provision
441
        self.assertEqual(int(e.current), 10)
442

    
443

    
444
    def test_010_list_holdings(self):
445
        e0, k0 = ('list_holdings_one', '1')
446
        e1, k1 = ('list_holdings_two', '1')
447
        resource = 'list_holdings_resource'
448
        sys = 'system'
449

    
450
        r = self.qh.create_entity(create_entity=[(e0, sys, k0, ''),
451
                                                 (e1, sys, k1, '')])
452
        if r:
453
            raise AssertionError("cannot create entities")
454

    
455
        self.qh.set_quota(set_quota=[(sys, resource, '', 10, 0,
456
                                      QH_PRACTICALLY_INFINITE,
457
                                      QH_PRACTICALLY_INFINITE, 0),
458
                                     (e0, resource, k0, 0, 10,
459
                                      QH_PRACTICALLY_INFINITE,
460
                                      QH_PRACTICALLY_INFINITE, 0),
461
                                     (e1, resource, k1, 0, 10,
462
                                      QH_PRACTICALLY_INFINITE,
463
                                      QH_PRACTICALLY_INFINITE, 0)])
464

    
465
        s0 = self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
466
                                      name='a commission',
467
                                      provisions=[('system', resource, 3)])
468

    
469
        s1 = self.qh.issue_commission(clientkey=self.client, target=e1, key=k1,
470
                                      name='a commission',
471
                                      provisions=[('system', resource, 4)])
472

    
473
        self.qh.accept_commission(clientkey=self.client, serials=[s0, s1])
474

    
475
        holdings_list, rejected = self.qh.list_holdings(list_holdings=[
476
                                                        (e0, k0),
477
                                                        (e1, k1),
478
                                                        (e0+e1, k0+k1)])
479

    
480
        self.assertEqual(rejected, [e0+e1])
481
        self.assertEqual(holdings_list, [[(e0, resource, 3, 0, 0, 0)],
482
                                         [(e1, resource, 4, 0, 0, 0)]])
483

    
484

    
485
    def test_011_release_empty(self):
486
        e, k = self.new_entity()
487
        e0, k0 = self.rand_entity(), Key.random()
488

    
489
        # none is committed
490
        r = self.qh.release_entity(release_entity=[(e, k), (e0, k0)])
491
        self.assertEqual(r, [e0])
492

    
493
        r = self.qh.get_entity(get_entity=[(e, k)])
494
        self.assertEqual(r, [(e, 'system')])
495

    
496
        r = self.qh.release_entity(release_entity=[(e, k)])
497
        self.assertEqual(r, [])
498

    
499
        r = self.qh.get_entity(get_entity=[(e, k)])
500
        self.assertEqual(r, [])
501

    
502
    def test_012_release_nonempty(self):
503
        e, k = self.new_entity()
504
        e1, k1 = self.new_entity(e, k)
505

    
506
        # none is committed
507
        r = self.qh.release_entity(release_entity=[(e, k), (e1, k1)])
508
        self.assertEqual(r, [e])
509

    
510
        r = self.qh.get_entity(get_entity=[(e1, k1)])
511
        self.assertEqual(r, [(e1, e)])
512

    
513
        r = self.qh.release_entity(release_entity=[(e1, k1), (e, k)])
514
        self.assertEqual(r, [])
515

    
516
        r = self.qh.get_entity(get_entity=[(e1, k1)])
517
        self.assertEqual(r, [])
518

    
519
    def test_013_release_nonempty(self):
520
        e, k = self.new_entity()
521
        resource = self.rand_resource()
522
        limits = self.new_quota(e, k, resource)
523
        r = self.qh.release_entity(release_entity=[(e, k)])
524
        self.assertEqual(r, [e])
525
        r = self.qh.release_holding(release_holding=[(e, resource, k)])
526
        self.assertEqual(r, [])
527
        r = self.qh.release_entity(release_entity=[(e, k)])
528
        self.assertEqual(r, [])
529

    
530
    def test_014_reset_holding(self):
531
        e0, k0 = self.new_entity()
532
        e1, k1 = self.new_entity()
533
        resource = self.rand_resource()
534
        p, _ = self.new_policy()
535
        f = self.rand_flags()
536
        r = self.qh.set_holding(set_holding=[(e1, resource, k1, p, f)])
537

    
538
        counters = self.rand_counters()
539

    
540
        # none is committed
541
        r = self.qh.reset_holding(
542
            reset_holding=[(e0, resource, k0) + counters,
543
                           (e1, resource, k1) + counters])
544
        self.assertEqual(r, [0])
545

    
546
        r = self.qh.get_holding(get_holding=[(e1, resource, k1)])
547
        self.assertEqual(r, [(e1, resource, p) + DEFAULT_HOLDING + (f,)])
548

    
549
        r = self.qh.reset_holding(
550
            reset_holding=[(e1, resource, k1) + counters])
551
        self.assertEqual(r, [])
552

    
553
        r = self.qh.get_holding(get_holding=[(e1, resource, k1)])
554
        self.assertEqual(r, [(e1, resource, p) + counters + (f,)])
555

    
556
    def test_015_release_nocapacity(self):
557
        qh = self.qh
558
        key = "key"
559
        owner = "system"
560
        owner_key = ""
561
        source = "test_015_release_nocapacity_source"
562
        resource = "resource"
563
        target = "test_015_release_nocapacity_target"
564
        flags = 0
565
        source_create  = [source, owner, key, owner_key]
566
        source_limits  = [source, 6, 0, 1000, 1000]
567
        source_holding = [source, resource, key, source, flags]
568
        target_create  = [target, owner, key, owner_key]
569
        target_limits  = [target, 0, 5, 1000, 1000]
570
        target_holding = [target, resource, key, target, flags]
571

    
572
        failed = AssertionError("Quotaholder call failed")
573
        if qh.create_entity(create_entity=[source_create, target_create]):
574
            raise failed
575
        if qh.set_limits(set_limits=[source_limits, target_limits]):
576
            raise failed
577
        if qh.set_holding(set_holding=[source_holding, target_holding]):
578
            raise failed
579

    
580
        serial = qh.issue_commission(clientkey=self.client, target=target, key=key,
581
                                     name="something", provisions=[(source, resource, 5)])
582
        qh.accept_commission(clientkey=self.client, serials=[serial])
583

    
584
        holding = qh.get_holding(get_holding=[[source, resource, key]])
585
        self.assertEqual(tuple(holding[0]), (source, resource, source, 0, 5, 0, 0, flags)) 
586
        holding = qh.get_holding(get_holding=[[target, resource, key]])
587
        self.assertEqual(tuple(holding[0]), (target, resource, target, 5, 0, 0, 0, flags)) 
588

    
589
        if qh.reset_holding(reset_holding=[[target, resource, key, 10, 0, 0, 0]]):
590
            raise failed
591

    
592
        with self.assertRaises(NoCapacityError):
593
            qh.issue_commission(clientkey=self.client, target=target, key=key,
594
                                name="something", provisions=[(source, resource, 1)])
595

    
596
        with self.assertRaises(NoQuantityError):
597
            qh.issue_commission(clientkey=self.client, target=target, key=key,
598
                                name="something", provisions=[(source, resource, -7)])
599

    
600
        source_limits  = [source, 6, 10, 1000, 1000]
601
        if qh.set_limits(set_limits=[source_limits]):
602
            raise failed
603

    
604
        serial = qh.issue_commission(clientkey=self.client, target=target, key=key,
605
                                     name="something", provisions=[(source, resource, -1)])
606
        qh.accept_commission(clientkey=self.client, serials=[serial])
607

    
608
        holding = qh.get_holding(get_holding=[[source, resource, key]])
609
        self.assertEqual(tuple(holding[0]), (source, resource, source, 0, 5, 1, 0, flags)) 
610
        holding = qh.get_holding(get_holding=[[target, resource, key]])
611
        self.assertEqual(tuple(holding[0]), (target, resource, target, 10, 0, 0, 1, flags)) 
612

    
613
        with self.assertRaises(NoCapacityError):
614
            qh.issue_commission(clientkey=self.client, target=target, key=key,
615
                                name="something", provisions=[(source, resource, -10)])
616

    
617

    
618
if __name__ == "__main__":
619
    import sys
620
    printf("Using {0}", sys.executable)
621
    run_test_case(QHAPITest)