Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (16.3 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 printf
37

    
38
from astakos.quotaholder.exception import (
39
                            QuotaholderError,
40
                            InvalidDataError,
41
                            NoCapacityError,
42
                            NoStockError,
43
                            NonExportedError,
44
                            CommissionValueException,
45
                            DuplicateError)
46

    
47
from astakos.quotaholder.api import QH_PRACTICALLY_INFINITE
48
from astakos.quotaholder.utils.rand import random_int, random_nat, random_name
49

    
50
DEFAULT_HOLDING = (0, 0, 0, 0)
51

    
52
class QHAPITest(QHTestCase):
53

    
54
    @classmethod
55
    def setUpClass(self):
56
        QHTestCase.setUpClass()
57
        self.client = self.rand_holder()
58

    
59
    @classmethod
60
    def rand_name(self, exclude=None):
61
        for i in range(1,100):
62
            r = random_name()
63
            if exclude is not None and 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_holder(self):
74
        return self.rand_name(self.used_entities)
75

    
76
    used_resources = []
77

    
78
    @classmethod
79
    def rand_resource(self):
80
        return self.rand_name(self.used_resources)
81

    
82
    def rand_limits(self):
83
        c = random_nat()
84
        return (c,)
85

    
86
    def rand_flags(self):
87
        return random_nat()
88

    
89
    def rand_counters(self):
90
        return tuple(random_nat() for i in range(4))
91

    
92
    def new_policy(self):
93
        p, limits = self.rand_policy_limits()
94
        self.qh.set_limits(set_limits=[(p,) + limits])
95
        return p, limits
96

    
97
    @transaction.commit_on_success
98
    def test_0080_get_set_quota(self):
99
        e = self.rand_holder()
100
        resource = self.rand_resource()
101
        limits = self.rand_limits()
102
        limits1 = self.rand_limits()
103
        f = self.rand_flags()
104
        self.qh.set_quota(set_quota=[(e, resource) + limits + (f,),
105
                                     (e, resource) + limits1 + (f,)])
106

    
107
        resource2 = self.rand_resource()
108
        r = self.qh.get_quota(get_quota=[(e, resource),
109
                                         (e, resource2)])
110
        self.assertEqual(r, [(e, resource) + limits1 +
111
                             DEFAULT_HOLDING + (f,)])
112

    
113
    def new_quota(self, holder, resource, limits=None):
114
        if limits is None:
115
            limits = self.rand_limits()
116
        f = self.rand_flags()
117
        self.qh.set_quota(
118
            set_quota=[(holder, resource) + limits + (f,)])
119
        return limits
120

    
121
    @transaction.commit_on_success
122
    def test_0081_add_quota(self):
123
        e0 = self.rand_holder()
124
        e1 = self.rand_holder()
125
        resource0 = self.rand_resource()
126
        resource1 = self.rand_resource()
127

    
128
        self.qh.set_quota(
129
            set_quota=[(e0, resource0) + (QH_PRACTICALLY_INFINITE, 0),
130
                       (e1, resource0) + (5, 0)])
131

    
132
        self.qh.add_quota(sub_quota=[(e0, resource0,
133
                                      QH_PRACTICALLY_INFINITE)],
134
                          add_quota=[(e0, resource0,
135
                                      3),
136
                                     # new holding
137
                                     (e0, resource1,
138
                                      QH_PRACTICALLY_INFINITE)])
139

    
140
        r = self.qh.get_quota(get_quota=[(e0, resource0),
141
                                         (e0, resource1)])
142
        self.assertEqual(r, [(e0, resource0, 3)
143
                             + DEFAULT_HOLDING + (0,),
144
                             (e0, resource1, QH_PRACTICALLY_INFINITE)
145
                             + DEFAULT_HOLDING + (0,)])
146

    
147
        with self.assertRaises(QuotaholderError) as cm:
148
            self.qh.add_quota(add_quota=[(e1, resource0,
149
                                          (-10)),
150
                                         (e0, resource1, 0)])
151

    
152
        err = cm.exception
153
        self.assertEqual(err.message, [(e1, resource0)])
154

    
155
        # r = self.qh.get_quota(get_quota=[(e1, resource0),
156
        #                                  (e0, resource1)])
157
        # self.assertEqual(r, [(e1, resource0, 5, 5)
158
        #                      + DEFAULT_HOLDING + (0,),
159
        #                      (e0, resource1, 0, QH_PRACTICALLY_INFINITE)
160
        #                      + DEFAULT_HOLDING + (0,)])
161

    
162
    @transaction.commit_on_success
163
    def test_0082_max_quota(self):
164
        e0 = self.rand_holder()
165
        e1 = self.rand_holder()
166
        resource0 = self.rand_resource()
167
        resource1 = self.rand_resource()
168

    
169
        self.qh.set_quota(
170
            set_quota=[(e0, resource0) +
171
                       (QH_PRACTICALLY_INFINITE,) + (0,)])
172

    
173
        self.qh.add_quota(add_quota=[(e0, resource0,
174
                                      QH_PRACTICALLY_INFINITE)])
175

    
176
        r = self.qh.get_quota(get_quota=[(e0, resource0)])
177
        self.assertEqual(r, [(e0, resource0, 2*QH_PRACTICALLY_INFINITE)
178
                             + DEFAULT_HOLDING + (0,)])
179

    
180
    @transaction.commit_on_success
181
    def test_0090_commissions(self):
182
        e0 = self.rand_holder()
183
        e1 = self.rand_holder()
184
        resource = self.rand_resource()
185
        c0, = self.new_quota(e0, resource)
186
        c1, = self.new_quota(e1, resource)
187

    
188
        @transaction.commit_on_success
189
        def f():
190
            self.qh.reset_holding(
191
                reset_holding=[(e1, resource, c1, c1, c1, c1)])
192

    
193
            most = min(c0, c1)
194
            if most < 0:
195
                raise AssertionError("%s <= 0" % most)
196

    
197
            return self.qh.issue_commission(clientkey=self.client, target=e0,
198
                                            name='something',
199
                                            provisions=[(e1, resource, most)])
200

    
201
        r = f()
202

    
203
        self.assertEqual(r, 1)
204

    
205
        @transaction.commit_on_success
206
        def f():
207
            self.qh.issue_commission(clientkey=self.client, target=e0,
208
                                     name='something',
209
                                     provisions=[(e1, resource, 1)])
210

    
211
        with self.assertRaises(CommissionValueException):
212
            f()
213

    
214
        r = self.qh.get_pending_commissions(clientkey=self.client)
215
        self.assertEqual(list(r), [1])
216
        r = self.qh.resolve_pending_commissions(clientkey=self.client,
217
                                                max_serial=1, accept_set=[1])
218
        r = self.qh.get_pending_commissions(clientkey=self.client)
219
        self.assertEqual(list(r), [])
220

    
221
    @transaction.commit_on_success
222
    def test_0091_commissions_exceptions(self):
223
        es1 = self.rand_holder()
224
        es2 = self.rand_holder()
225
        et1 = self.rand_holder()
226
        et2 = self.rand_holder()
227
        resource = self.rand_resource()
228
        self.new_quota(es1, resource, (10,))
229
        self.new_quota(es2, resource, (10,))
230
        self.new_quota(et1, resource, (15,))
231
        self.new_quota(et2, resource, (15,))
232

    
233
        self.qh.reset_holding(
234
            reset_holding=[(es1, resource, 10, 10, 10, 10),
235
                           (es2, resource, 10, 10, 10, 10)])
236

    
237
        with self.assertRaises(NoStockError) as cm:
238
            self.qh.issue_commission(clientkey=self.client, target=et1,
239
                                     name='something',
240
                                     provisions=[(es1, resource, 12)])
241
        e = cm.exception
242
        self.assertEqual(e.holder, es1)
243
        self.assertEqual(e.resource, resource)
244
        self.assertEqual(int(e.limit), 10)
245
        self.assertEqual(int(e.requested), 12)
246

    
247
        r = self.qh.issue_commission(clientkey=self.client, target=et1,
248
                                     name='something',
249
                                     provisions=[(es1, resource, 2)])
250
        self.assertGreater(r, 0)
251

    
252

    
253

    
254
        r = self.qh.issue_commission(clientkey=self.client, target=et2,
255
                                     name='something',
256
                                     provisions=[(es2, resource, 9)])
257
        self.assertGreater(r, 0)
258

    
259
        with self.assertRaises(NoCapacityError) as cm:
260
            self.qh.issue_commission(clientkey=self.client, target=et2,
261
                                     name='something',
262
                                     provisions=[(es2, resource, 1),
263
                                                 (es1, resource, 6)])
264
        e = cm.exception
265
        self.assertEqual(e.holder, et2)
266
        self.assertEqual(e.resource, resource)
267
        self.assertEqual(int(e.limit), 15)
268
        self.assertEqual(int(e.requested), 6)
269
        # 9 actual + 1 from the first provision
270
        self.assertEqual(int(e.current), 10)
271

    
272
    @transaction.commit_on_success
273
    def test_010_list_holdings(self):
274
        e0 = 'list_holdings_one'
275
        e1 = 'list_holdings_two'
276
        resource = 'list_holdings_resource'
277
        sys = 'system'
278

    
279
        self.qh.set_quota(set_quota=[(sys, resource, 10, 0),
280
                                     (e0, resource, 10, 0),
281
                                     (e1, resource, 10, 0)])
282

    
283
        self.qh.reset_holding(
284
            reset_holding=[(sys, resource, 10, 10, 10, 10)])
285

    
286
        s0 = self.qh.issue_commission(clientkey=self.client, target=e0,
287
                                      name='a commission',
288
                                      provisions=[('system', resource, 3)])
289

    
290
        s1 = self.qh.issue_commission(clientkey=self.client, target=e1,
291
                                      name='a commission',
292
                                      provisions=[('system', resource, 4)])
293

    
294
        holdings_list, rejected = self.qh.list_holdings(
295
            list_holdings=[e0, e1, e0+e1])
296

    
297
        self.assertEqual(rejected, [e0+e1])
298
        self.assertEqual(holdings_list, [[(e0, resource, 0, 3, 0, 0)],
299
                                         [(e1, resource, 0, 4, 0, 0)]])
300

    
301
        self.qh.accept_commission(clientkey=self.client, serials=[s0, s1])
302

    
303
        holdings_list, rejected = self.qh.list_holdings(
304
            list_holdings=[e0, e1, e0+e1])
305

    
306
        self.assertEqual(rejected, [e0+e1])
307
        self.assertEqual(holdings_list, [[(e0, resource, 3, 3, 3, 3)],
308
                                         [(e1, resource, 4, 4, 4, 4)]])
309

    
310

    
311
    @transaction.commit_on_success
312
    def test_0130_release_holding(self):
313
        e = self.rand_holder()
314
        resource = self.rand_resource()
315
        limits = self.new_quota(e, resource, (2,))
316
        self.qh.reset_holding(
317
            reset_holding=[(e, resource, 1, 1, 1, 1)])
318

    
319
        with self.assertRaises(QuotaholderError) as cm:
320
            self.qh.release_holding(release_holding=[(e, resource)])
321

    
322
        err = cm.exception
323
        self.assertEqual(err.message, [0])
324

    
325
    @transaction.commit_on_success
326
    def test_0131_release_holding(self):
327
        e = self.rand_holder()
328
        resource = self.rand_resource()
329
        limits = self.new_quota(e, resource, (2,))
330

    
331
        self.qh.release_holding(release_holding=[(e, resource)])
332

    
333
    @transaction.commit_on_success
334
    def test_0132_release_holding(self):
335
        resource = self.rand_resource()
336

    
337
        es = self.rand_holder()
338
        limits_s = self.new_quota(es, resource, (3,))
339

    
340
        self.qh.reset_holding(
341
            reset_holding=[(es, resource, 3, 3, 3, 3)])
342

    
343
        e = self.rand_holder()
344
        limits = self.new_quota(e, resource, (2,))
345

    
346
        r = self.qh.issue_commission(clientkey=self.client, target=e,
347
                                     name='something',
348
                                     provisions=[(es, resource, 1)])
349
        self.assertGreater(r, 0)
350

    
351
        with self.assertRaises(QuotaholderError) as cm:
352
            self.qh.release_holding(release_holding=[(e, resource)])
353

    
354
        err = cm.exception
355
        self.assertEqual(err.message, [0])
356

    
357
    @transaction.commit_on_success
358
    def test_014_reset_holding(self):
359
        e0 = self.rand_holder()
360
        e1 = self.rand_holder()
361
        resource = self.rand_resource()
362
        c, = self.rand_limits()
363
        f = self.rand_flags()
364
        r = self.qh.set_quota(set_quota=[(e1, resource, c, f)])
365

    
366
        counters = self.rand_counters()
367

    
368
        with self.assertRaises(QuotaholderError) as cm:
369
            self.qh.reset_holding(
370
                reset_holding=[(e0, resource) + counters,
371
                               (e1, resource) + counters])
372

    
373
        err = cm.exception
374
        self.assertEqual(err.message, [0])
375

    
376
        r = self.qh.get_quota(get_quota=[(e1, resource)])
377
        self.assertEqual(r, [(e1, resource, c) + counters + (f,)])
378

    
379
    @transaction.commit_on_success
380
    def test_015_release_nocapacity(self):
381
        qh = self.qh
382
        owner = "system"
383
        source = "test_015_release_nocapacity_source"
384
        resource = "resource"
385
        target = "test_015_release_nocapacity_target"
386
        flags = 0
387

    
388
        qh.init_holding(init_holding=[(source, resource, 6, 6, 6, 6, 6, 0)])
389
        qh.set_quota(set_quota=[(target, resource, 5, 0)])
390

    
391
        serial = qh.issue_commission(clientkey=self.client, target=target,
392
                                     name="something",
393
                                     provisions=[(source, resource, 5)])
394
        qh.accept_commission(clientkey=self.client, serials=[serial])
395

    
396
        holding = qh.get_quota(get_quota=[[source, resource]])
397
        self.assertEqual(tuple(holding[0]),
398
                         (source, resource, 6, 6, 6, 1, 1, flags))
399
        holding = qh.get_quota(get_quota=[[target, resource]])
400
        self.assertEqual(tuple(holding[0]),
401
                         (target, resource, 5, 5, 5, 5, 5, flags))
402

    
403
        if qh.reset_holding(
404
            reset_holding=[[target, resource, 10, 10, 10, 10]]):
405
            raise failed
406

    
407
        with self.assertRaises(NoCapacityError):
408
            qh.issue_commission(clientkey=self.client, target=target,
409
                                name="something",
410
                                provisions=[(source, resource, 1)])
411

    
412
        with self.assertRaises(NonExportedError):
413
            qh.issue_commission(clientkey=self.client, target=target,
414
                                name="something",
415
                                provisions=[(source, resource, -7)])
416

    
417
        serial = qh.issue_commission(clientkey=self.client, target=target,
418
                                     name="something",
419
                                     provisions=[(source, resource, -1)])
420
        qh.accept_commission(clientkey=self.client, serials=[serial])
421

    
422
        holding = qh.get_quota(get_quota=[[source, resource]])
423
        self.assertEqual(tuple(holding[0]),
424
                         (source, resource, 6, 6, 6, 2, 2, flags))
425
        holding = qh.get_quota(get_quota=[[target, resource]])
426
        self.assertEqual(tuple(holding[0]),
427
                         (target, resource, 5, 9, 9, 9, 9, flags))
428

    
429
        with self.assertRaises(NonExportedError):
430
            qh.issue_commission(clientkey=self.client, target=target,
431
                                name="something",
432
                                provisions=[(source, resource, -10)])
433

    
434

    
435
if __name__ == "__main__":
436
    import sys
437
    printf("Using {0}", sys.executable)
438
    run_test_case(QHAPITest)