24
24
from django import http
25
25
from django.test import utils as test_utils
26
26
from django.utils.datastructures import SortedDict
27
from django.utils import encoding
27
28
from django.utils.http import urlencode
29
30
from mox import IgnoreArg # noqa
65
66
api.nova.flavor_list(IsA(http.HttpRequest)) \
66
67
.AndReturn(self.flavors.list())
67
68
api.glance.image_list_detailed(IgnoreArg()) \
68
.AndReturn((self.images.list(), False))
69
.AndReturn((self.images.list(), False, False))
69
70
search_opts = {'marker': None, 'paginate': True}
70
71
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
71
72
.AndReturn([servers, False])
126
127
api.nova.flavor_list(IsA(http.HttpRequest)) \
127
128
.AndRaise(self.exceptions.nova)
128
129
api.glance.image_list_detailed(IgnoreArg()) \
129
.AndReturn((self.images.list(), False))
130
.AndReturn((self.images.list(), False, False))
130
131
for server in servers:
131
132
api.nova.flavor_get(IsA(http.HttpRequest), server.flavor["id"]). \
132
133
AndReturn(full_flavors[server.flavor["id"]])
171
172
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
172
173
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
173
174
api.glance.image_list_detailed(IgnoreArg()) \
174
.AndReturn((self.images.list(), False))
175
.AndReturn((self.images.list(), False, False))
175
176
for server in servers:
176
177
api.nova.flavor_get(IsA(http.HttpRequest), server.flavor["id"]). \
177
178
AndRaise(self.exceptions.nova)
212
213
api.nova.flavor_list(IsA(http.HttpRequest)) \
213
214
.AndReturn(self.flavors.list())
214
215
api.glance.image_list_detailed(IgnoreArg()) \
215
.AndReturn((self.images.list(), False))
216
.AndReturn((self.images.list(), False, False))
216
217
search_opts = {'marker': None, 'paginate': True}
217
218
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
218
219
.AndReturn([servers, False])
246
247
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
247
248
api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list())
248
249
api.glance.image_list_detailed(IgnoreArg()) \
249
.AndReturn((self.images.list(), False))
250
.AndReturn((self.images.list(), False, False))
250
251
api.nova.server_delete(IsA(http.HttpRequest), server.id)
251
252
self.mox.ReplayAll()
270
271
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
271
272
api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list())
272
273
api.glance.image_list_detailed(IgnoreArg()) \
273
.AndReturn((self.images.list(), False))
274
.AndReturn((self.images.list(), False, False))
274
275
api.nova.server_delete(IsA(http.HttpRequest), server.id) \
275
276
.AndRaise(self.exceptions.nova)
297
298
api.nova.flavor_list(IsA(http.HttpRequest)) \
298
299
.AndReturn(self.flavors.list())
299
300
api.glance.image_list_detailed(IgnoreArg()) \
300
.AndReturn((self.images.list(), False))
301
.AndReturn((self.images.list(), False, False))
301
302
search_opts = {'marker': None, 'paginate': True}
302
303
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
303
304
.AndReturn([servers, False])
327
328
api.nova.flavor_list(IsA(http.HttpRequest)) \
328
329
.AndReturn(self.flavors.list())
329
330
api.glance.image_list_detailed(IgnoreArg()) \
330
.AndReturn((self.images.list(), False))
331
.AndReturn((self.images.list(), False, False))
331
332
search_opts = {'marker': None, 'paginate': True}
332
333
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
333
334
.AndReturn([servers, False])
358
359
api.nova.flavor_list(IsA(http.HttpRequest)) \
359
360
.AndReturn(self.flavors.list())
360
361
api.glance.image_list_detailed(IgnoreArg()) \
361
.AndReturn((self.images.list(), False))
362
.AndReturn((self.images.list(), False, False))
362
363
search_opts = {'marker': None, 'paginate': True}
363
364
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
364
365
.AndReturn([servers, False])
389
390
api.nova.flavor_list(IsA(http.HttpRequest)) \
390
391
.AndReturn(self.flavors.list())
391
392
api.glance.image_list_detailed(IgnoreArg()) \
392
.AndReturn((self.images.list(), False))
393
.AndReturn((self.images.list(), False, False))
393
394
search_opts = {'marker': None, 'paginate': True}
394
395
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
395
396
.AndReturn([servers, False])
415
416
api.nova.flavor_list(IsA(http.HttpRequest)) \
416
417
.AndReturn(self.flavors.list())
417
418
api.glance.image_list_detailed(IgnoreArg()) \
418
.AndReturn((self.images.list(), False))
419
.AndReturn((self.images.list(), False, False))
419
420
search_opts = {'marker': None, 'paginate': True}
420
421
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
421
422
.AndReturn([servers, False])
442
443
api.nova.flavor_list(IsA(http.HttpRequest)) \
443
444
.AndReturn(self.flavors.list())
444
445
api.glance.image_list_detailed(IgnoreArg()) \
445
.AndReturn((self.images.list(), False))
446
.AndReturn((self.images.list(), False, False))
446
447
search_opts = {'marker': None, 'paginate': True}
447
448
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
448
449
.AndReturn([servers, False])
470
471
api.nova.flavor_list(IsA(http.HttpRequest)) \
471
472
.AndReturn(self.flavors.list())
472
473
api.glance.image_list_detailed(IgnoreArg()) \
473
.AndReturn((self.images.list(), False))
474
.AndReturn((self.images.list(), False, False))
474
475
search_opts = {'marker': None, 'paginate': True}
475
476
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
476
477
.AndReturn([servers, False])
501
502
api.nova.flavor_list(IsA(http.HttpRequest)) \
502
503
.AndReturn(self.flavors.list())
503
504
api.glance.image_list_detailed(IgnoreArg()) \
504
.AndReturn((self.images.list(), False))
505
.AndReturn((self.images.list(), False, False))
505
506
search_opts = {'marker': None, 'paginate': True}
506
507
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
507
508
.AndReturn([servers, False])
531
532
api.nova.flavor_list(IsA(http.HttpRequest)) \
532
533
.AndReturn(self.flavors.list())
533
534
api.glance.image_list_detailed(IgnoreArg()) \
534
.AndReturn((self.images.list(), False))
535
.AndReturn((self.images.list(), False, False))
535
536
search_opts = {'marker': None, 'paginate': True}
536
537
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
537
538
.AndReturn([servers, False])
563
564
api.nova.flavor_list(IsA(http.HttpRequest)) \
564
565
.AndReturn(self.flavors.list())
565
566
api.glance.image_list_detailed(IgnoreArg()) \
566
.AndReturn((self.images.list(), False))
567
.AndReturn((self.images.list(), False, False))
567
568
search_opts = {'marker': None, 'paginate': True}
568
569
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
569
570
.AndReturn([servers, False])
594
595
api.nova.flavor_list(IsA(http.HttpRequest)) \
595
596
.AndReturn(self.flavors.list())
596
597
api.glance.image_list_detailed(IgnoreArg()) \
597
.AndReturn((self.images.list(), False))
598
.AndReturn((self.images.list(), False, False))
598
599
search_opts = {'marker': None, 'paginate': True}
599
600
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
600
601
.AndReturn([servers, False])
947
948
"snapshot1").AndReturn(self.snapshots.first())
949
950
api.glance.image_list_detailed(IsA(http.HttpRequest),
950
marker=None).AndReturn([[], False])
951
marker=None).AndReturn([[], False,
952
954
self.mox.ReplayAll()
985
987
api.nova.flavor_list(IsA(http.HttpRequest)) \
986
988
.AndReturn(self.flavors.list())
987
989
api.glance.image_list_detailed(IgnoreArg()) \
988
.AndReturn((self.images.list(), False))
990
.AndReturn((self.images.list(), False, False))
989
991
search_opts = {'marker': None, 'paginate': True}
990
992
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
991
993
.AndReturn([servers, False])
1173
1175
block_device_mapping_v2=True,
1174
1176
custom_flavor_sort=None,
1175
1177
only_one_network=False,
1179
test_with_profile=False):
1177
1180
image = self.images.first()
1179
1182
api.nova.extension_supported('BlockDeviceMappingV2Boot',
1186
1189
api.glance.image_list_detailed(IsA(http.HttpRequest),
1187
1190
filters={'is_public': True,
1188
1191
'status': 'active'}) \
1189
.AndReturn([self.images.list(), False])
1192
.AndReturn([self.images.list(), False, False])
1190
1193
api.glance.image_list_detailed(IsA(http.HttpRequest),
1191
1194
filters={'property-owner_id': self.tenant.id,
1192
1195
'status': 'active'}) \
1193
.AndReturn([[], False])
1196
.AndReturn([[], False, False])
1194
1197
api.neutron.network_list(IsA(http.HttpRequest),
1195
1198
tenant_id=self.tenant.id,
1196
1199
shared=False) \
1202
1205
api.neutron.network_list(IsA(http.HttpRequest),
1204
1207
.AndReturn(self.networks.list()[1:])
1205
# TODO(absubram): Remove if clause and create separate
1206
# test stubs for when profile_support is being used.
1207
# Additionally ensure those are always run even in default setting
1208
if api.neutron.is_port_profiles_supported():
1208
if test_with_profile:
1209
1209
policy_profiles = self.policy_profiles.list()
1210
1210
api.neutron.profile_list(IsA(http.HttpRequest),
1211
1211
'policy').AndReturn(policy_profiles)
1348
1348
def test_launch_instance_get_with_only_one_network(self):
1349
1349
self.test_launch_instance_get(only_one_network=True)
1351
@test_utils.override_settings(
1352
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
1353
def test_launch_instance_get_with_profile(self):
1354
self.test_launch_instance_get(test_with_profile=True)
1351
1356
@test.create_stubs({api.nova: ('extension_supported',
1353
1358
'keypair_list',
1362
1367
def test_launch_instance_get_bootable_volumes(self,
1363
1368
block_device_mapping_v2=True,
1364
1369
only_one_network=False,
1371
test_with_profile=False):
1366
1372
api.nova.extension_supported('BlockDeviceMappingV2Boot',
1367
1373
IsA(http.HttpRequest)) \
1368
1374
.AndReturn(block_device_mapping_v2)
1373
1379
api.glance.image_list_detailed(IsA(http.HttpRequest),
1374
1380
filters={'is_public': True,
1375
1381
'status': 'active'}) \
1376
.AndReturn([self.images.list(), False])
1382
.AndReturn([self.images.list(), False, False])
1377
1383
api.glance.image_list_detailed(IsA(http.HttpRequest),
1378
1384
filters={'property-owner_id': self.tenant.id,
1379
1385
'status': 'active'}) \
1380
.AndReturn([[], False])
1386
.AndReturn([[], False, False])
1381
1387
api.neutron.network_list(IsA(http.HttpRequest),
1382
1388
tenant_id=self.tenant.id,
1383
1389
shared=False) \
1391
1397
.AndReturn(self.networks.list()[1:])
1393
if api.neutron.is_port_profiles_supported():
1399
if test_with_profile:
1394
1400
policy_profiles = self.policy_profiles.list()
1395
1401
api.neutron.profile_list(IsA(http.HttpRequest),
1396
1402
'policy').AndReturn(policy_profiles)
1431
1437
for volume in bootable_volumes:
1432
1438
self.assertTrue(volume in volume_sources_ids)
1440
@test_utils.override_settings(
1441
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
1442
def test_launch_instance_get_bootable_volumes_with_profile(self):
1443
self.test_launch_instance_get_bootable_volumes(test_with_profile=True)
1434
1445
@test.create_stubs({api.glance: ('image_list_detailed',),
1435
1446
api.neutron: ('network_list',
1436
1447
'profile_list',
1445
1456
'volume_snapshot_list',),
1446
1457
quotas: ('tenant_quota_usages',)})
1447
1458
def test_launch_instance_post(self,
1460
test_with_profile=False):
1449
1461
flavor = self.flavors.first()
1450
1462
image = self.images.first()
1451
1463
keypair = self.keypairs.first()
1470
1482
api.glance.image_list_detailed(IsA(http.HttpRequest),
1471
1483
filters={'is_public': True,
1472
1484
'status': 'active'}) \
1473
.AndReturn([self.images.list(), False])
1485
.AndReturn([self.images.list(), False, False])
1474
1486
api.glance.image_list_detailed(IsA(http.HttpRequest),
1475
1487
filters={'property-owner_id': self.tenant.id,
1476
1488
'status': 'active'}) \
1477
.AndReturn([[], False])
1489
.AndReturn([[], False, False])
1478
1490
api.neutron.network_list(IsA(http.HttpRequest),
1479
1491
tenant_id=self.tenant.id,
1480
1492
shared=False) \
1482
1494
api.neutron.network_list(IsA(http.HttpRequest),
1484
1496
.AndReturn(self.networks.list()[1:])
1485
# TODO(absubram): Remove if clause and create separate
1486
# test stubs for when profile_support is being used.
1487
# Additionally ensure those are always run even in default setting
1488
if api.neutron.is_port_profiles_supported():
1497
if test_with_profile:
1489
1498
policy_profiles = self.policy_profiles.list()
1490
1499
policy_profile_id = self.policy_profiles.first().id
1491
1500
port = self.ports.first()
1494
1503
'policy').AndReturn(policy_profiles)
1495
1504
api.neutron.port_create(
1496
1505
IsA(http.HttpRequest),
1497
network_id=self.networks.first().id,
1506
self.networks.first().id,
1498
1507
policy_profile_id=policy_profile_id).AndReturn(port)
1508
nics = [{"port-id": port.id}]
1499
1509
api.nova.extension_supported('DiskConfig',
1500
1510
IsA(http.HttpRequest)) \
1501
1511
.AndReturn(disk_config)
1543
1553
if disk_config:
1544
1554
form_data['disk_config'] = 'AUTO'
1555
if test_with_profile:
1556
form_data['profile'] = self.policy_profiles.first().id
1545
1557
url = reverse('horizon:project:instances:launch')
1546
1558
res = self.client.post(url, form_data)
1551
1563
def test_launch_instance_post_no_disk_config_supported(self):
1552
1564
self.test_launch_instance_post(disk_config=False)
1566
@test_utils.override_settings(
1567
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
1568
def test_launch_instance_post_with_profile(self):
1569
self.test_launch_instance_post(test_with_profile=True)
1554
1571
@test.create_stubs({api.glance: ('image_list_detailed',),
1555
1572
api.neutron: ('network_list',
1557
1575
api.nova: ('extension_supported',
1559
1577
'keypair_list',
1563
1581
cinder: ('volume_list',
1564
1582
'volume_snapshot_list',),
1565
1583
quotas: ('tenant_quota_usages',)})
1566
def test_launch_instance_post_boot_from_volume(self):
1584
def test_launch_instance_post_boot_from_volume(self,
1585
test_with_profile=False):
1567
1586
flavor = self.flavors.first()
1568
1587
keypair = self.keypairs.first()
1569
1588
server = self.servers.first()
1591
1610
api.glance.image_list_detailed(IsA(http.HttpRequest),
1592
1611
filters={'is_public': True,
1593
1612
'status': 'active'}) \
1594
.AndReturn([self.images.list(), False])
1613
.AndReturn([self.images.list(), False, False])
1595
1614
api.glance.image_list_detailed(IsA(http.HttpRequest),
1596
1615
filters={'property-owner_id': self.tenant.id,
1597
1616
'status': 'active'}) \
1598
.AndReturn([[], False])
1617
.AndReturn([[], False, False])
1599
1618
api.neutron.network_list(IsA(http.HttpRequest),
1600
1619
tenant_id=self.tenant.id,
1601
1620
shared=False) \
1603
1622
api.neutron.network_list(IsA(http.HttpRequest),
1605
1624
.AndReturn(self.networks.list()[1:])
1606
# TODO(absubram): Remove if clause and create separate
1607
# test stubs for when profile_support is being used.
1608
# Additionally ensure those are always run even in default setting
1609
if api.neutron.is_port_profiles_supported():
1625
if test_with_profile:
1610
1626
policy_profiles = self.policy_profiles.list()
1611
1627
policy_profile_id = self.policy_profiles.first().id
1612
1628
port = self.ports.first()
1615
1631
'policy').AndReturn(policy_profiles)
1616
1632
api.neutron.port_create(
1617
1633
IsA(http.HttpRequest),
1618
network_id=self.networks.first().id,
1634
self.networks.first().id,
1619
1635
policy_profile_id=policy_profile_id).AndReturn(port)
1620
1636
nics = [{"port-id": port.id}]
1621
1637
api.nova.extension_supported('DiskConfig',
1659
1675
'network': self.networks.first().id,
1661
1677
'disk_config': 'AUTO'}
1678
if test_with_profile:
1679
form_data['profile'] = self.policy_profiles.first().id
1662
1680
url = reverse('horizon:project:instances:launch')
1663
1681
res = self.client.post(url, form_data)
1665
1683
self.assertNoFormErrors(res)
1666
1684
self.assertRedirectsNoFollow(res, INDEX_URL)
1686
@test_utils.override_settings(
1687
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
1688
def test_launch_instance_post_boot_from_volume_with_profile(self):
1689
self.test_launch_instance_post_boot_from_volume(test_with_profile=True)
1668
1691
@test.create_stubs({api.glance: ('image_list_detailed',),
1669
1692
api.neutron: ('network_list',
1670
1693
'profile_list',
1679
1702
cinder: ('volume_list',
1680
1703
'volume_snapshot_list',),
1681
1704
quotas: ('tenant_quota_usages',)})
1682
def test_launch_instance_post_no_images_available_boot_from_volume(self):
1705
def test_launch_instance_post_no_images_available_boot_from_volume(
1707
test_with_profile=False):
1683
1708
flavor = self.flavors.first()
1684
1709
keypair = self.keypairs.first()
1685
1710
server = self.servers.first()
1707
1732
api.glance.image_list_detailed(IsA(http.HttpRequest),
1708
1733
filters={'is_public': True,
1709
1734
'status': 'active'}) \
1710
.AndReturn([self.images.list(), False])
1735
.AndReturn([self.images.list(), False, False])
1712
1737
api.glance.image_list_detailed(IsA(http.HttpRequest),
1713
1738
filters={'property-owner_id': self.tenant.id,
1714
1739
'status': 'active'}) \
1715
.AndReturn([[], False])
1740
.AndReturn([[], False, False])
1716
1741
api.neutron.network_list(IsA(http.HttpRequest),
1717
1742
tenant_id=self.tenant.id,
1718
1743
shared=False) \
1720
1745
api.neutron.network_list(IsA(http.HttpRequest),
1722
1747
.AndReturn(self.networks.list()[1:])
1723
# TODO(absubram): Remove if clause and create separate
1724
# test stubs for when profile_support is being used.
1725
# Additionally ensure those are always run even in default setting
1726
if api.neutron.is_port_profiles_supported():
1748
if test_with_profile:
1727
1749
policy_profiles = self.policy_profiles.list()
1728
1750
policy_profile_id = self.policy_profiles.first().id
1729
1751
port = self.ports.first()
1732
1754
'policy').AndReturn(policy_profiles)
1733
1755
api.neutron.port_create(
1734
1756
IsA(http.HttpRequest),
1735
network_id=self.networks.first().id,
1757
self.networks.first().id,
1736
1758
policy_profile_id=policy_profile_id).AndReturn(port)
1737
1759
nics = [{"port-id": port.id}]
1738
1760
api.nova.extension_supported('DiskConfig',
1777
1799
'device_name': device_name,
1779
1801
'disk_config': 'MANUAL'}
1802
if test_with_profile:
1803
form_data['profile'] = self.policy_profiles.first().id
1780
1804
url = reverse('horizon:project:instances:launch')
1781
1805
res = self.client.post(url, form_data)
1783
1807
self.assertNoFormErrors(res)
1784
1808
self.assertRedirectsNoFollow(res, INDEX_URL)
1810
@test_utils.override_settings(
1811
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
1812
def test_lnch_inst_post_no_images_avail_boot_from_vol_with_profile(self):
1813
self.test_launch_instance_post_no_images_available_boot_from_volume(
1814
test_with_profile=True)
1786
1816
@test.create_stubs({api.glance: ('image_list_detailed',),
1787
1817
api.neutron: ('network_list',
1788
1818
'profile_list',),
1795
1825
cinder: ('volume_list',
1796
1826
'volume_snapshot_list',),
1797
1827
quotas: ('tenant_quota_usages',)})
1798
def test_launch_instance_post_no_images_available(self):
1828
def test_launch_instance_post_no_images_available(self,
1829
test_with_profile=False):
1799
1830
flavor = self.flavors.first()
1800
1831
keypair = self.keypairs.first()
1801
1832
server = self.servers.first()
1814
1845
api.glance.image_list_detailed(IsA(http.HttpRequest),
1815
1846
filters={'is_public': True,
1816
1847
'status': 'active'}) \
1817
.AndReturn([[], False])
1848
.AndReturn([[], False, False])
1818
1849
api.glance.image_list_detailed(IsA(http.HttpRequest),
1819
1850
filters={'property-owner_id': self.tenant.id,
1820
1851
'status': 'active'}) \
1821
.AndReturn([[], False])
1852
.AndReturn([[], False, False])
1822
1853
api.neutron.network_list(IsA(http.HttpRequest),
1823
1854
tenant_id=self.tenant.id,
1824
1855
shared=False) \
1826
1857
api.neutron.network_list(IsA(http.HttpRequest),
1828
1859
.AndReturn(self.networks.list()[1:])
1829
# TODO(absubram): Remove if clause and create separate
1830
# test stubs for when profile_support is being used.
1831
# Additionally ensure those are always run even in default setting
1832
if api.neutron.is_port_profiles_supported():
1860
if test_with_profile:
1833
1861
policy_profiles = self.policy_profiles.list()
1834
1862
api.neutron.profile_list(IsA(http.HttpRequest),
1835
1863
'policy').AndReturn(policy_profiles)
1870
1898
self.assertFormErrors(res, 1, "You must select an image.")
1871
1899
self.assertTemplateUsed(res, views.WorkflowView.template_name)
1901
@test_utils.override_settings(
1902
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
1903
def test_launch_instance_post_no_images_available_with_profile(self):
1904
self.test_launch_instance_post_no_images_available(
1905
test_with_profile=True)
1873
1907
@test.create_stubs({api.glance: ('image_list_detailed',),
1874
1908
api.neutron: ('network_list',
1875
1909
'profile_list',),
1881
1915
'keypair_list',
1882
1916
'tenant_absolute_limits',
1883
1917
'availability_zone_list',)})
1884
def test_launch_flavorlist_error(self):
1918
def test_launch_flavorlist_error(self,
1919
test_with_profile=False):
1885
1920
api.nova.extension_supported('BlockDeviceMappingV2Boot',
1886
1921
IsA(http.HttpRequest)) \
1887
1922
.AndReturn(True)
1892
1927
api.glance.image_list_detailed(IsA(http.HttpRequest),
1893
1928
filters={'is_public': True,
1894
1929
'status': 'active'}) \
1895
.AndReturn([self.images.list(), False])
1930
.AndReturn([self.images.list(), False, False])
1896
1931
api.glance.image_list_detailed(IsA(http.HttpRequest),
1897
1932
filters={'property-owner_id': self.tenant.id,
1898
1933
'status': 'active'}) \
1899
.AndReturn([[], False])
1934
.AndReturn([[], False, False])
1900
1935
api.neutron.network_list(IsA(http.HttpRequest),
1901
1936
tenant_id=self.tenant.id,
1902
1937
shared=False) \
1904
1939
api.neutron.network_list(IsA(http.HttpRequest),
1906
1941
.AndReturn(self.networks.list()[1:])
1907
# TODO(absubram): Remove if clause and create separate
1908
# test stubs for when profile_support is being used.
1909
# Additionally ensure those are always run even in default setting
1910
if api.neutron.is_port_profiles_supported():
1942
if test_with_profile:
1911
1943
policy_profiles = self.policy_profiles.list()
1912
1944
api.neutron.profile_list(IsA(http.HttpRequest),
1913
1945
'policy').AndReturn(policy_profiles)
1935
1967
self.assertTemplateUsed(res, views.WorkflowView.template_name)
1969
@test_utils.override_settings(
1970
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
1971
def test_launch_flavorlist_error_with_profile(self):
1972
self.test_launch_flavorlist_error(test_with_profile=True)
1937
1974
@test.create_stubs({api.glance: ('image_list_detailed',),
1938
1975
api.neutron: ('network_list',
1939
1976
'profile_list',
1947
1984
cinder: ('volume_list',
1948
1985
'volume_snapshot_list',),
1949
1986
quotas: ('tenant_quota_usages',)})
1950
def test_launch_form_keystone_exception(self):
1987
def test_launch_form_keystone_exception(self,
1988
test_with_profile=False):
1951
1989
flavor = self.flavors.first()
1952
1990
image = self.images.first()
1953
1991
keypair = self.keypairs.first()
1972
2010
api.glance.image_list_detailed(IsA(http.HttpRequest),
1973
2011
filters={'is_public': True,
1974
2012
'status': 'active'}) \
1975
.AndReturn([self.images.list(), False])
2013
.AndReturn([self.images.list(), False, False])
1976
2014
api.glance.image_list_detailed(IsA(http.HttpRequest),
1977
2015
filters={'property-owner_id': self.tenant.id,
1978
2016
'status': 'active'}) \
1979
.AndReturn([[], False])
2017
.AndReturn([[], False, False])
1980
2018
api.neutron.network_list(IsA(http.HttpRequest),
1981
2019
tenant_id=self.tenant.id,
1982
2020
shared=False) \
1984
2022
api.neutron.network_list(IsA(http.HttpRequest),
1986
2024
.AndReturn(self.networks.list()[1:])
1987
# TODO(absubram): Remove if clause and create separate
1988
# test stubs for when profile_support is being used.
1989
# Additionally ensure those are always run even in default setting
1990
if api.neutron.is_port_profiles_supported():
2025
if test_with_profile:
1991
2026
policy_profiles = self.policy_profiles.list()
1992
2027
policy_profile_id = self.policy_profiles.first().id
1993
2028
port = self.ports.first()
1996
2031
'policy').AndReturn(policy_profiles)
1997
2032
api.neutron.port_create(
1998
2033
IsA(http.HttpRequest),
1999
network_id=self.networks.first().id,
2034
self.networks.first().id,
2000
2035
policy_profile_id=policy_profile_id).AndReturn(port)
2001
2036
nics = [{"port-id": port.id}]
2002
2037
api.nova.extension_supported('DiskConfig',
2043
2078
'admin_pass': 'password',
2044
2079
'confirm_admin_pass': 'password',
2045
2080
'disk_config': 'AUTO'}
2081
if test_with_profile:
2082
form_data['profile'] = self.policy_profiles.first().id
2046
2083
url = reverse('horizon:project:instances:launch')
2047
2084
res = self.client.post(url, form_data)
2049
2086
self.assertRedirectsNoFollow(res, INDEX_URL)
2088
@test_utils.override_settings(
2089
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
2090
def test_launch_form_keystone_exception_with_profile(self):
2091
self.test_launch_form_keystone_exception(test_with_profile=True)
2051
2093
@test.create_stubs({api.glance: ('image_list_detailed',),
2052
2094
api.neutron: ('network_list',
2053
2095
'profile_list',),
2060
2102
cinder: ('volume_list',
2061
2103
'volume_snapshot_list',),
2062
2104
quotas: ('tenant_quota_usages',)})
2063
def test_launch_form_instance_count_error(self):
2105
def test_launch_form_instance_count_error(self,
2106
test_with_profile=False):
2064
2107
flavor = self.flavors.first()
2065
2108
image = self.images.first()
2066
2109
keypair = self.keypairs.first()
2087
2130
api.glance.image_list_detailed(IsA(http.HttpRequest),
2088
2131
filters={'is_public': True,
2089
2132
'status': 'active'}) \
2090
.AndReturn([self.images.list(), False])
2133
.AndReturn([self.images.list(), False, False])
2091
2134
api.glance.image_list_detailed(IsA(http.HttpRequest),
2092
2135
filters={'property-owner_id': self.tenant.id,
2093
2136
'status': 'active'}) \
2094
.AndReturn([[], False])
2137
.AndReturn([[], False, False])
2095
2138
api.neutron.network_list(IsA(http.HttpRequest),
2096
2139
tenant_id=self.tenant.id,
2097
2140
shared=False) \
2099
2142
api.neutron.network_list(IsA(http.HttpRequest),
2101
2144
.AndReturn(self.networks.list()[1:])
2102
# TODO(absubram): Remove if clause and create separate
2103
# test stubs for when profile_support is being used.
2104
# Additionally ensure those are always run even in default setting
2105
if api.neutron.is_port_profiles_supported():
2145
if test_with_profile:
2106
2146
policy_profiles = self.policy_profiles.list()
2107
2147
api.neutron.profile_list(IsA(http.HttpRequest),
2108
2148
'policy').AndReturn(policy_profiles)
2144
2184
self.assertContains(res, "greater than or equal to 1")
2186
@test_utils.override_settings(
2187
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
2188
def test_launch_form_instance_count_error_with_profile(self):
2189
self.test_launch_form_instance_count_error(test_with_profile=True)
2146
2191
@test.create_stubs({api.glance: ('image_list_detailed',),
2147
2192
api.neutron: ('network_list',
2148
2193
'profile_list',),
2155
2200
cinder: ('volume_list',
2156
2201
'volume_snapshot_list',),
2157
2202
quotas: ('tenant_quota_usages',)})
2158
def _test_launch_form_instance_requirement_error(self, image, flavor):
2203
def _test_launch_form_instance_requirement_error(self, image, flavor,
2204
test_with_profile=False):
2159
2205
keypair = self.keypairs.first()
2160
2206
server = self.servers.first()
2161
2207
volume = self.volumes.first()
2180
2226
api.glance.image_list_detailed(IsA(http.HttpRequest),
2181
2227
filters={'is_public': True,
2182
2228
'status': 'active'}) \
2183
.AndReturn([self.images.list(), False])
2229
.AndReturn([self.images.list(), False, False])
2184
2230
api.glance.image_list_detailed(IsA(http.HttpRequest),
2185
2231
filters={'property-owner_id': self.tenant.id,
2186
2232
'status': 'active'}) \
2187
.AndReturn([[], False])
2233
.AndReturn([[], False, False])
2188
2234
api.neutron.network_list(IsA(http.HttpRequest),
2189
2235
tenant_id=self.tenant.id,
2190
2236
shared=False) \
2192
2238
api.neutron.network_list(IsA(http.HttpRequest),
2194
2240
.AndReturn(self.networks.list()[1:])
2195
# TODO(absubram): Remove if clause and create separate
2196
# test stubs for when profile_support is being used.
2197
# Additionally ensure those are always run even in default setting
2198
if api.neutron.is_port_profiles_supported():
2241
if test_with_profile:
2199
2242
policy_profiles = self.policy_profiles.list()
2200
2243
api.neutron.profile_list(IsA(http.HttpRequest),
2201
2244
'policy').AndReturn(policy_profiles)
2237
2280
msg = "The flavor '%s' is too small" % flavor.name
2238
2281
self.assertContains(res, msg)
2240
def test_launch_form_instance_requirement_error_disk(self):
2283
def test_launch_form_instance_requirement_error_disk(
2285
test_with_profile=False):
2241
2286
flavor = self.flavors.first()
2242
2287
image = self.images.first()
2243
2288
image.min_ram = flavor.ram
2244
2289
image.min_disk = flavor.disk + 1
2245
self._test_launch_form_instance_requirement_error(image, flavor)
2290
self._test_launch_form_instance_requirement_error(image, flavor,
2247
def test_launch_form_instance_requirement_error_ram(self):
2293
def test_launch_form_instance_requirement_error_ram(
2295
test_with_profile=False):
2248
2296
flavor = self.flavors.first()
2249
2297
image = self.images.first()
2250
2298
image.min_ram = flavor.ram + 1
2251
2299
image.min_disk = flavor.disk
2252
self._test_launch_form_instance_requirement_error(image, flavor)
2300
self._test_launch_form_instance_requirement_error(image, flavor,
2303
@test_utils.override_settings(
2304
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
2305
def test_launch_form_instance_requirement_error_disk_with_profile(self):
2306
self.test_launch_form_instance_requirement_error_disk(
2307
test_with_profile=True)
2309
@test_utils.override_settings(
2310
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
2311
def test_launch_form_instance_requirement_error_ram_with_profile(self):
2312
self.test_launch_form_instance_requirement_error_ram(
2313
test_with_profile=True)
2254
2315
@test.create_stubs({api.glance: ('image_list_detailed',),
2255
2316
api.neutron: ('network_list',
2263
2324
cinder: ('volume_list',
2264
2325
'volume_snapshot_list',),
2265
2326
quotas: ('tenant_quota_usages',)})
2266
def _test_launch_form_instance_volume_size(self, image, volume_size, msg):
2327
def _test_launch_form_instance_volume_size(self, image, volume_size, msg,
2328
test_with_profile=False):
2267
2329
flavor = self.flavors.get(name='m1.massive')
2268
2330
keypair = self.keypairs.first()
2269
2331
server = self.servers.first()
2287
2349
api.glance.image_list_detailed(IsA(http.HttpRequest),
2288
2350
filters={'is_public': True,
2289
2351
'status': 'active'}) \
2290
.AndReturn([self.images.list(), False])
2352
.AndReturn([self.images.list(), False, False])
2291
2353
api.glance.image_list_detailed(IsA(http.HttpRequest),
2292
2354
filters={'property-owner_id': self.tenant.id,
2293
2355
'status': 'active'}) \
2294
.AndReturn([[], False])
2356
.AndReturn([[], False, False])
2295
2357
api.neutron.network_list(IsA(http.HttpRequest),
2296
2358
tenant_id=self.tenant.id,
2297
2359
shared=False) \
2299
2361
api.neutron.network_list(IsA(http.HttpRequest),
2301
2363
.AndReturn(self.networks.list()[1:])
2302
# TODO(absubram): Remove if clause and create separate
2303
# test stubs for when profile_support is being used.
2304
# Additionally ensure those are always run even in default setting
2305
if api.neutron.is_port_profiles_supported():
2364
if test_with_profile:
2306
2365
policy_profiles = self.policy_profiles.list()
2307
2366
api.neutron.profile_list(IsA(http.HttpRequest),
2308
2367
'policy').AndReturn(policy_profiles)
2344
2403
res = self.client.post(url, form_data)
2345
2404
self.assertContains(res, msg)
2347
def test_launch_form_instance_volume_size_error(self):
2406
def test_launch_form_instance_volume_size_error(self,
2407
test_with_profile=False):
2348
2408
image = self.images.get(name='protected_images')
2349
2409
volume_size = image.min_disk / 2
2350
2410
msg = ("The Volume size is too small for the '%s' image" %
2352
self._test_launch_form_instance_volume_size(image, volume_size, msg)
2412
self._test_launch_form_instance_volume_size(image, volume_size, msg,
2354
def test_launch_form_instance_non_int_volume_size(self):
2415
def test_launch_form_instance_non_int_volume_size(self,
2416
test_with_profile=False):
2355
2417
image = self.images.get(name='protected_images')
2356
2418
msg = "Enter a whole number."
2357
self._test_launch_form_instance_volume_size(image, 1.5, msg)
2419
self._test_launch_form_instance_volume_size(image, 1.5, msg,
2422
@test_utils.override_settings(
2423
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
2424
def test_launch_form_instance_volume_size_error_with_profile(self):
2425
self.test_launch_form_instance_volume_size_error(
2426
test_with_profile=True)
2428
@test_utils.override_settings(
2429
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
2430
def test_launch_form_instance_non_int_volume_size_with_profile(self):
2431
self.test_launch_form_instance_non_int_volume_size(
2432
test_with_profile=True)
2359
2434
@test.create_stubs({api.nova: ('flavor_list', 'server_list',
2360
2435
'tenant_absolute_limits',
2375
2450
api.nova.flavor_list(IsA(http.HttpRequest)) \
2376
2451
.AndReturn(self.flavors.list())
2377
2452
api.glance.image_list_detailed(IgnoreArg()) \
2378
.AndReturn((self.images.list(), False))
2453
.AndReturn((self.images.list(), False, False))
2379
2454
search_opts = {'marker': None, 'paginate': True}
2380
2455
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
2381
2456
.AndReturn([servers, False])
2392
2467
classes = list(launch.get_default_classes()) + list(launch.classes)
2393
2468
link_name = "%s (%s)" % (unicode(launch.verbose_name),
2394
2469
"Quota exceeded")
2395
expected_string = "<a href='%s' id='instances__action_launch' " \
2396
"title='%s' class='%s disabled' data-update-url=" \
2397
"'/project/instances/?action=launch&table=instances'>%s</a>" \
2398
% (url, link_name, " ".join(classes), link_name)
2400
2471
res = self.client.get(INDEX_URL)
2472
expected_string = encoding.smart_str(u'''
2473
<a href="%s" id="instances__action_launch" title="%s"
2476
"/project/instances/?action=launch&table=instances">%s</a>
2477
''' % (url, link_name, " ".join(classes), link_name), res._charset)
2401
2479
self.assertContains(res, expected_string, html=True,
2402
2480
msg_prefix="The launch button is not disabled")
2419
2497
api.nova.flavor_list(IsA(http.HttpRequest)) \
2420
2498
.AndReturn(self.flavors.list())
2421
2499
api.glance.image_list_detailed(IgnoreArg()) \
2422
.AndReturn((self.images.list(), False))
2500
.AndReturn((self.images.list(), False, False))
2423
2501
search_opts = {'marker': None, 'paginate': True}
2424
2502
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
2425
2503
.AndReturn([servers, False])
2446
2524
api.neutron: ('network_list',
2447
2525
'profile_list'),
2448
2526
api.glance: ('image_list_detailed',)})
2449
def test_select_default_keypair_if_only_one(self):
2527
def test_select_default_keypair_if_only_one(self,
2528
test_with_profile=False):
2450
2529
keypair = self.keypairs.first()
2452
2531
cinder.volume_list(IsA(http.HttpRequest)) \
2456
2535
api.glance.image_list_detailed(IsA(http.HttpRequest),
2457
2536
filters={'is_public': True,
2458
2537
'status': 'active'}) \
2459
.AndReturn([self.images.list(), False])
2538
.AndReturn([self.images.list(), False, False])
2460
2539
api.glance.image_list_detailed(IsA(http.HttpRequest),
2461
2540
filters={'property-owner_id': self.tenant.id,
2462
2541
'status': 'active'}) \
2463
.AndReturn([[], False])
2542
.AndReturn([[], False, False])
2464
2543
api.neutron.network_list(IsA(http.HttpRequest),
2465
2544
tenant_id=self.tenant.id,
2466
2545
shared=False) \
2468
2547
api.neutron.network_list(IsA(http.HttpRequest),
2470
2549
.AndReturn(self.networks.list()[1:])
2471
# TODO(absubram): Remove if clause and create separate
2472
# test stubs for when profile_support is being used.
2473
# Additionally ensure those are always run even in default setting
2474
if api.neutron.is_port_profiles_supported():
2550
if test_with_profile:
2475
2551
policy_profiles = self.policy_profiles.list()
2476
2552
api.neutron.profile_list(IsA(http.HttpRequest),
2477
2553
'policy').AndReturn(policy_profiles)
2505
2581
msg_prefix="The default key pair was not selected.")
2583
@test_utils.override_settings(
2584
OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'})
2585
def test_select_default_keypair_if_only_one_with_profile(self):
2586
self.test_select_default_keypair_if_only_one(test_with_profile=True)
2507
2588
@test.create_stubs({api.network: ('floating_ip_target_get_by_instance',
2508
2589
'tenant_floating_ip_allocate',
2509
2590
'floating_ip_associate',
2522
2603
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
2523
2604
api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list())
2524
2605
api.glance.image_list_detailed(IgnoreArg()) \
2525
.AndReturn((self.images.list(), False))
2606
.AndReturn((self.images.list(), False, False))
2526
2607
api.network.floating_ip_target_get_by_instance(
2527
2608
IsA(http.HttpRequest),
2528
2609
server.id).AndReturn(server.id)
2557
2638
api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
2558
2639
api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list())
2559
2640
api.glance.image_list_detailed(IgnoreArg()) \
2560
.AndReturn((self.images.list(), False))
2641
.AndReturn((self.images.list(), False, False))
2561
2642
api.network.floating_ip_target_list_by_instance(
2562
2643
IsA(http.HttpRequest),
2563
2644
server.id).AndReturn([server.id, ])
2694
2775
api.glance.image_list_detailed(IsA(http.HttpRequest),
2695
2776
filters={'is_public': True,
2696
2777
'status': 'active'}) \
2697
.AndReturn([self.images.list(), False])
2778
.AndReturn([self.images.list(), False, False])
2698
2779
api.glance.image_list_detailed(IsA(http.HttpRequest),
2699
2780
filters={'property-owner_id': self.tenant.id,
2700
2781
'status': 'active'}) \
2701
.AndReturn([[], False])
2782
.AndReturn([[], False, False])
2702
2783
api.nova.extension_supported('DiskConfig',
2703
2784
IsA(http.HttpRequest)) \
2704
2785
.AndReturn(True)
2749
2830
api.glance.image_list_detailed(IsA(http.HttpRequest),
2750
2831
filters={'is_public': True,
2751
2832
'status': 'active'}) \
2752
.AndReturn([self.images.list(), False])
2833
.AndReturn([self.images.list(), False, False])
2753
2834
api.glance.image_list_detailed(IsA(http.HttpRequest),
2754
2835
filters={'property-owner_id': self.tenant.id,
2755
2836
'status': 'active'}) \
2756
.AndReturn([[], False])
2837
.AndReturn([[], False, False])
2757
2838
api.nova.extension_supported('DiskConfig',
2758
2839
IsA(http.HttpRequest)) \
2759
2840
.AndReturn(True)
2780
2861
api.glance.image_list_detailed(IsA(http.HttpRequest),
2781
2862
filters={'is_public': True,
2782
2863
'status': 'active'}) \
2783
.AndReturn([self.images.list(), False])
2864
.AndReturn([self.images.list(), False, False])
2784
2865
api.glance.image_list_detailed(IsA(http.HttpRequest),
2785
2866
filters={'property-owner_id': self.tenant.id,
2786
2867
'status': 'active'}) \
2787
.AndReturn([[], False])
2868
.AndReturn([[], False, False])
2788
2869
api.nova.extension_supported('DiskConfig',
2789
2870
IsA(http.HttpRequest)) \
2790
2871
.AndReturn(True)
2813
2894
api.glance.image_list_detailed(IsA(http.HttpRequest),
2814
2895
filters={'is_public': True,
2815
2896
'status': 'active'}) \
2816
.AndReturn([self.images.list(), False])
2897
.AndReturn([self.images.list(), False, False])
2817
2898
api.glance.image_list_detailed(IsA(http.HttpRequest),
2818
2899
filters={'property-owner_id': self.tenant.id,
2819
2900
'status': 'active'}) \
2820
.AndReturn([[], False])
2901
.AndReturn([[], False, False])
2821
2902
api.nova.extension_supported('DiskConfig',
2822
2903
IsA(http.HttpRequest)) \
2823
2904
.AndReturn(True)
2838
2919
api.glance.image_list_detailed(IsA(http.HttpRequest),
2839
2920
filters={'is_public': True,
2840
2921
'status': 'active'}) \
2841
.AndReturn([self.images.list(), False])
2922
.AndReturn([self.images.list(), False, False])
2842
2923
api.glance.image_list_detailed(IsA(http.HttpRequest),
2843
2924
filters={'property-owner_id': self.tenant.id,
2844
2925
'status': 'active'}) \
2845
.AndReturn([[], False])
2926
.AndReturn([[], False, False])
2846
2927
api.nova.extension_supported('DiskConfig',
2847
2928
IsA(http.HttpRequest)) \
2848
2929
.AndReturn(True)
2870
2951
api.glance.image_list_detailed(IsA(http.HttpRequest),
2871
2952
filters={'is_public': True,
2872
2953
'status': 'active'}) \
2873
.AndReturn([self.images.list(), False])
2954
.AndReturn([self.images.list(), False, False])
2874
2955
api.glance.image_list_detailed(IsA(http.HttpRequest),
2875
2956
filters={'property-owner_id': self.tenant.id,
2876
2957
'status': 'active'}) \
2877
.AndReturn([[], False])
2958
.AndReturn([[], False, False])
2878
2959
api.nova.extension_supported('DiskConfig',
2879
2960
IsA(http.HttpRequest)) \
2880
2961
.AndReturn(True)
2916
2997
api.nova.flavor_list(IsA(http.HttpRequest)) \
2917
2998
.MultipleTimes().AndReturn(self.flavors.list())
2918
2999
api.glance.image_list_detailed(IgnoreArg()) \
2919
.MultipleTimes().AndReturn((self.images.list(), False))
3000
.MultipleTimes().AndReturn((self.images.list(), False, False))
2921
3002
search_opts = {'marker': None, 'paginate': True}
2922
3003
api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
2974
3055
servers[page_size:])
2975
3056
api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list())
2976
3057
api.glance.image_list_detailed(IgnoreArg()) \
2977
.AndReturn((self.images.list(), False))
3058
.AndReturn((self.images.list(), False, False))
2978
3059
api.nova.server_delete(IsA(http.HttpRequest), server.id)
2979
3060
self.mox.ReplayAll()