Revision ce55f211 snf-cyclades-app/synnefo/api/tests.py

b/snf-cyclades-app/synnefo/api/tests.py
46 46
from synnefo.db.models import *
47 47
from synnefo.logic.utils import get_rsapi_state
48 48

  
49
import mock
49 50

  
50 51
class AaiClient(Client):
51 52
    def request(self, **request):
......
53 54
        return super(AaiClient, self).request(**request)
54 55

  
55 56

  
57
class TestQuota(TestCase):
58

  
59
    fixtures = ['users', 'flavors']
60
    astakos_response_user = 'test'
61

  
62
    def setUp(self):
63

  
64
        self.astakos_response_user = 'test'
65
        def get_user_mock(request, *Args, **kwargs):
66
            if request.META.get('HTTP_X_AUTH_TOKEN', None) == '0000':
67
                request.user_uniq = self.astakos_response_user
68
                request.user = {'uniq': self.astakos_response_user}
69

  
70
        def get_image_mock(request, *Args, **kwargs):
71
            return {'backend_id':'1234', 'location':'pithos://dummyimage',
72
                    'disk_format': 'plain'}
73

  
74
        self.rapi_patch = mock.patch('synnefo.logic.backend.rapi')
75
        self.rapi_mock = self.rapi_patch.start()
76

  
77
        self.pithos_patch = mock.patch('synnefo.api.util.get_image')
78
        self.pithos_mock = self.rapi_patch.start()
79

  
80
        # mock the astakos authentication function
81
        from synnefo.api import util
82
        util.get_user = get_user_mock
83
        util.get_image = get_image_mock
84

  
85
        settings.SKIP_SSH_VALIDATION = True
86
        self.client = AaiClient()
87
        self.user = 'test'
88

  
89
    def test_vms_quota(self):
90
        request = {
91
                    "server": {
92
                        "name": "new-server-test",
93
                        "userid": "test",
94
                        "imageRef": 1,
95
                        "flavorRef": 1,
96
                        "metadata": {
97
                            "My Server Name": "Apache1"
98
                        },
99
                        "personality": []
100
                    }
101
        }
102

  
103
        def create_server(for_user='test'):
104
            self.astakos_response_user = for_user
105
            return self.client.post('/api/v1.1/servers', json.dumps(request),
106
                content_type="application/json")
107

  
108
        def user_vms_count(user='test'):
109
            return VirtualMachine.objects.filter(userid=user).count()
110

  
111
        # admin sets max vms per user to 2
112
        settings.MAX_VMS_PER_USER = 2
113
        create_server()
114
        create_server()
115
        self.assertEqual(user_vms_count(), 2)
116

  
117
        # third creation fails
118
        resp = create_server()
119
        self.assertEqual(resp.status_code, 413)
120
        self.assertEqual(user_vms_count(), 2)
121

  
122
        # setting changed, no additional servers can get created
123
        settings.MAX_VMS_PER_USER = 1
124
        resp = create_server()
125
        self.assertEqual(resp.status_code, 413)
126
        self.assertEqual(user_vms_count(), 2)
127

  
128
        # admin wants test user to create 4 vms, now test user can create
129
        # one additional vm, but no more
130
        settings.VMS_USER_QUOTA = {'test':3}
131
        create_server()
132
        self.assertEqual(user_vms_count(), 3)
133
        resp = create_server()
134
        self.assertEqual(resp.status_code, 413)
135
        self.assertEqual(user_vms_count(), 3)
136
        # other users still apply to the global quota
137
        create_server("testuser2")
138
        self.assertEqual(user_vms_count("testuser2"), 1)
139
        resp = create_server("testuser2")
140
        self.assertEqual(resp.status_code, 413)
141
        self.assertEqual(user_vms_count("testuser2"), 1)
142

  
143

  
144
    def test_networks_quota(self):
145

  
146
        def create_network(for_user='test'):
147
            request = json.dumps({'network': {'name': 'user %s network' %
148
                for_user}})
149
            self.astakos_response_user = for_user
150
            return self.client.post('/api/v1.1/networks', request,
151
                content_type="application/json")
152

  
153
        def user_networks_count(user='test'):
154
            return Network.objects.filter(userid=user).count()
155

  
156
        settings.MAX_NETWORKS_PER_USER = 1
157
        create_network()
158
        self.assertEqual(user_networks_count(),1)
159
        resp = create_network()
160
        self.assertEqual(resp.status_code, 413)
161
        self.assertEqual(user_networks_count(), 1)
162

  
163
        settings.NETWORKS_USER_QUOTA = {'test':2}
164
        create_network()
165
        self.assertEqual(user_networks_count(),2)
166
        resp = create_network()
167
        self.assertEqual(resp.status_code, 413)
168
        self.assertEqual(user_networks_count(), 2)
169

  
170
        create_network("testuser2")
171
        self.assertEqual(user_networks_count("testuser2"),1)
172
        resp = create_network("testuser2")
173
        self.assertEqual(resp.status_code, 413)
174
        self.assertEqual(user_networks_count("testuser2"), 1)
175

  
176
        settings.GANETI_MAX_LINK_NUMBER = 3
177
        settings.NETWORKS_USER_QUOTA = {'test':10}
178
        resp = create_network()
179
        self.assertEqual(Network.objects.count(), 4)
180
        self.assertEqual('No networks available.' in resp.content, True)
181
        self.assertEqual(user_networks_count(), 2)
182

  
183

  
184

  
185

  
56 186
class APITestCase(TestCase):
57 187
    fixtures = ['users', 'api_test_data']
58 188
    test_server_id = 1001

Also available in: Unified diff