Revision cb66110b snf-cyclades-app/synnefo/api/test/servers.py

b/snf-cyclades-app/synnefo/api/test/servers.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
import json
35
from copy import deepcopy
35 36

  
36 37
from snf_django.utils.testing import (BaseAPITest, mocked_quotaholder,
37 38
                                      override_settings)
......
43 44
from synnefo.lib import join_urls
44 45
from synnefo import settings
45 46

  
46
from mock import patch
47
from mock import patch, Mock, call
47 48

  
48 49

  
49 50
class ComputeAPITest(BaseAPITest):
......
234 235
        self.assertMethodNotAllowed(response)
235 236

  
236 237

  
237
@patch('synnefo.api.util.get_image')
238
fixed_image = Mock()
239
fixed_image.return_value = {'location': 'pithos://foo',
240
                            'checksum': '1234',
241
                            "id": 1,
242
                            "name": "test_image",
243
                            'disk_format': 'diskdump'}
244

  
245

  
246
@patch('synnefo.api.util.get_image', fixed_image)
238 247
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
239 248
class ServerCreateAPITest(ComputeAPITest):
240
    def test_create_server(self, mrapi, mimage):
241
        """Test if the create server call returns the expected response
242
           if a valid request has been speficied."""
243
        mimage.return_value = {'location': 'pithos://foo',
244
                               'checksum': '1234',
245
                               "id": 1,
246
                               "name": "test_image",
247
                               'disk_format': 'diskdump'}
248
        mrapi().CreateInstance.return_value = 12
249
        flavor = mfactory.FlavorFactory()
249
    def setUp(self):
250
        self.flavor = mfactory.FlavorFactory()
250 251
        # Create public network and backend
251
        network = mfactory.NetworkFactory(public=True)
252
        backend = mfactory.BackendFactory()
253
        mfactory.BackendNetworkFactory(network=network, backend=backend)
254

  
255
        request = {
252
        self.network = mfactory.NetworkFactory(public=True)
253
        self.backend = mfactory.BackendFactory()
254
        mfactory.BackendNetworkFactory(network=self.network,
255
                                       backend=self.backend,
256
                                       operstate="ACTIVE")
257
        self.request = {
256 258
                    "server": {
257 259
                        "name": "new-server-test",
258 260
                        "userid": "test_user",
259 261
                        "imageRef": 1,
260
                        "flavorRef": flavor.id,
262
                        "flavorRef": self.flavor.id,
261 263
                        "metadata": {
262 264
                            "My Server Name": "Apache1"
263 265
                        },
264 266
                        "personality": []
265 267
                    }
266 268
        }
267
        with mocked_quotaholder():
268
            response = self.mypost('servers', 'test_user',
269
                                   json.dumps(request), 'json')
269

  
270
    def test_create_server(self, mrapi):
271
        """Test if the create server call returns the expected response
272
           if a valid request has been speficied."""
273

  
274
        mrapi().CreateInstance.return_value = 12
275
        with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=[]):
276
            with mocked_quotaholder():
277
                response = self.mypost('/api/v1.1/servers', 'test_user',
278
                                       json.dumps(self.request), 'json')
270 279
        self.assertEqual(response.status_code, 202)
271 280
        mrapi().CreateInstance.assert_called_once()
272 281

  
......
282 291
        self.assertEqual(api_server['status'], db_vm.operstate)
283 292

  
284 293
        # Test drained flag in Network:
285
        network.drained = True
286
        network.save()
294
        self.network.drained = True
295
        self.network.save()
287 296
        with mocked_quotaholder():
288 297
            response = self.mypost('servers', 'test_user',
289
                                    json.dumps(request), 'json')
298
                                    json.dumps(self.request), 'json')
290 299
        self.assertEqual(response.status_code, 503, "serviceUnavailable")
291 300

  
292
    def test_create_server_no_flavor(self, mrapi, mimage):
293
        request = {
294
                    "server": {
295
                        "name": "new-server-test",
296
                        "userid": "test_user",
297
                        "imageRef": 1,
298
                        "flavorRef": 42,
299
                        "metadata": {
300
                            "My Server Name": "Apache1"
301
                        },
302
                        "personality": []
303
                    }
304
        }
305
        response = self.mypost('servers', 'test_user',
306
                               json.dumps(request), 'json')
301
    def test_create_network_settings(self, mrapi):
302
        mrapi().CreateInstance.return_value = 12
303
        bnet1 = mfactory.BackendNetworkFactory(operstate="ACTIVE",
304
                                               backend=self.backend)
305
        bnet2 = mfactory.BackendNetworkFactory(operstate="ACTIVE",
306
                                               backend=self.backend)
307
        bnet3 = mfactory.BackendNetworkFactory(network__userid="test_user",
308
                                               operstate="ACTIVE",
309
                                               backend=self.backend)
310
        bnet4 = mfactory.BackendNetworkFactory(network__userid="test_user",
311
                                               operstate="ACTIVE",
312
                                               backend=self.backend)
313
        # User requested private networks
314
        request = deepcopy(self.request)
315
        request["server"]["networks"] = [bnet3.network.id, bnet4.network.id]
316
        with override_settings(settings,
317
                DEFAULT_INSTANCE_NETWORKS=["public", bnet1.network.id,
318
                                           bnet2.network.id]):
319
            with mocked_quotaholder():
320
                response = self.mypost('/api/v1.1/servers', 'test_user',
321
                                       json.dumps(request), 'json')
322
        self.assertEqual(response.status_code, 202)
323
        name, args, kwargs = mrapi().CreateInstance.mock_calls[0]
324
        self.assertEqual(len(kwargs["nics"]), 5)
325
        self.assertEqual(kwargs["nics"][0]["network"],
326
                         self.network.backend_id)
327
        self.assertEqual(kwargs["nics"][1]["network"],
328
                         bnet1.network.backend_id)
329
        self.assertEqual(kwargs["nics"][2]["network"],
330
                         bnet2.network.backend_id)
331
        self.assertEqual(kwargs["nics"][3]["network"],
332
                         bnet3.network.backend_id)
333
        self.assertEqual(kwargs["nics"][4]["network"],
334
                         bnet4.network.backend_id)
335

  
336
        with override_settings(settings,
337
                DEFAULT_INSTANCE_NETWORKS=[bnet2.network.id]):
338
            with mocked_quotaholder():
339
                response = self.mypost('/api/v1.1/servers', 'test_user',
340
                                       json.dumps(request), 'json')
341
        self.assertEqual(response.status_code, 202)
342
        name, args, kwargs = mrapi().CreateInstance.mock_calls[1]
343
        self.assertEqual(len(kwargs["nics"]), 3)
344
        self.assertEqual(kwargs["nics"][0]["network"],
345
                         bnet2.network.backend_id)
346
        self.assertEqual(kwargs["nics"][1]["network"],
347
                         bnet3.network.backend_id)
348
        self.assertEqual(kwargs["nics"][2]["network"],
349
                         bnet4.network.backend_id)
350

  
351
        # test invalid network in DEFAULT_INSTANCE_NETWORKS
352
        with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=[42]):
353
            response = self.mypost('/api/v1.1/servers', 'test_user',
354
                                   json.dumps(request), 'json')
355
        self.assertFault(response, 500, "internalServerError")
356

  
357
        # test connect to public netwok
358
        request = deepcopy(self.request)
359
        request["server"]["networks"] = [self.network.id]
360
        with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=["public"]):
361
            response = self.mypost('/api/v1.1/servers', 'test_user',
362
                                    json.dumps(request), 'json')
363
        self.assertFault(response, 403, "forbidden")
364
        # test wrong user
365
        request = deepcopy(self.request)
366
        request["server"]["networks"] = [bnet3.network.id]
367
        with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=["public"]):
368
            with mocked_quotaholder():
369
                response = self.mypost('/api/v1.1/servers', 'dummy_user',
370
                                       json.dumps(request), 'json')
371
        self.assertItemNotFound(response)
372

  
373
    def test_create_server_no_flavor(self, mrapi):
374
        request = deepcopy(self.request)
375
        request["server"]["flavorRef"] = 42
376
        with mocked_quotaholder():
377
            response = self.mypost('/api/v1.1/servers', 'test_user',
378
                                   json.dumps(request), 'json')
307 379
        self.assertItemNotFound(response)
308 380

  
309 381

  

Also available in: Unified diff