570
570
api.glance: ('image_get',
571
571
'image_list_detailed'),
572
572
quotas: ('tenant_limit_usages',)})
573
def _test_create_volume_from_image_under_image_min_disk_size(self, image):
574
usage_limit = {'maxTotalVolumeGigabytes': 100,
576
'volumesUsed': len(self.cinder_volumes.list()),
577
'maxTotalVolumes': 6}
578
formData = {'name': u'A Volume I Am Making',
579
'description': u'This is a volume I am making for a test.',
580
'method': u'CreateForm',
581
'size': 5, 'image_source': image.id}
583
cinder.volume_type_list(IsA(http.HttpRequest)).\
584
AndReturn(self.volume_types.list())
585
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
586
AndReturn(usage_limit)
587
api.glance.image_get(IsA(http.HttpRequest),
588
str(image.id)).AndReturn(image)
589
cinder.extension_supported(IsA(http.HttpRequest), 'AvailabilityZones')\
591
cinder.availability_zone_list(IsA(http.HttpRequest)).AndReturn(
592
self.cinder_availability_zones.list())
593
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
594
AndReturn(usage_limit)
598
url = reverse('horizon:project:volumes:volumes:create')
599
res = self.client.post("?".join([url,
600
"image_id=" + str(image.id)]),
601
formData, follow=True)
602
self.assertEqual(res.redirect_chain, [])
603
self.assertFormError(res, 'form', None,
604
"The volume size cannot be less than the "
605
"image minimum disk size (30GB)")
573
607
def test_create_volume_from_image_under_image_min_disk_size(self):
574
usage_limit = {'maxTotalVolumeGigabytes': 100,
576
'volumesUsed': len(self.cinder_volumes.list()),
577
'maxTotalVolumes': 6}
578
608
image = self.images.get(name="protected_images")
579
609
image.min_disk = 30
580
formData = {'name': u'A Volume I Am Making',
581
'description': u'This is a volume I am making for a test.',
582
'method': u'CreateForm',
583
'size': 5, 'image_source': image.id}
585
cinder.volume_type_list(IsA(http.HttpRequest)).\
586
AndReturn(self.volume_types.list())
587
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
588
AndReturn(usage_limit)
589
api.glance.image_get(IsA(http.HttpRequest),
590
str(image.id)).AndReturn(image)
591
cinder.extension_supported(IsA(http.HttpRequest), 'AvailabilityZones')\
593
cinder.availability_zone_list(IsA(http.HttpRequest)).AndReturn(
594
self.cinder_availability_zones.list())
595
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
596
AndReturn(usage_limit)
600
url = reverse('horizon:project:volumes:volumes:create')
601
res = self.client.post("?".join([url,
602
"image_id=" + str(image.id)]),
603
formData, follow=True)
604
self.assertEqual(res.redirect_chain, [])
605
self.assertFormError(res, 'form', None,
606
"The volume size cannot be less than the "
607
"image minimum disk size (30GB)")
610
self._test_create_volume_from_image_under_image_min_disk_size(image)
612
def test_create_volume_from_image_under_image_property_min_disk_size(self):
613
image = self.images.get(name="protected_images")
615
image.properties['min_disk'] = 30
616
self._test_create_volume_from_image_under_image_min_disk_size(image)
609
618
@test.create_stubs({cinder: ('volume_snapshot_list',
610
619
'volume_type_list',
878
887
self.assertEqual(res.status_code, 200)
880
889
@test.create_stubs({cinder: ('tenant_absolute_limits',
891
def test_create_snapshot_button_disabled_when_quota_exceeded(self):
892
limits = {'maxTotalSnapshots': 1}
893
limits['totalSnapshotsUsed'] = limits['maxTotalSnapshots']
894
volume = self.cinder_volumes.first()
896
cinder.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume)
897
cinder.tenant_absolute_limits(IsA(http.HttpRequest)).AndReturn(limits)
900
create_link = tables.CreateSnapshot()
901
url = reverse(create_link.get_link_url(), args=[volume.id])
902
res_url = VOLUME_INDEX_URL + \
903
"?action=row_update&table=volumes&obj_id=" + volume.id
905
res = self.client.get(res_url, {},
906
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
908
classes = list(create_link.get_default_classes())\
909
+ list(create_link.classes)
910
link_name = "%s (%s)" % (unicode(create_link.verbose_name),
912
expected_string = "<a href='%s' class=\"%s disabled\" "\
913
"id=\"volumes__row_%s__action_snapshots\">%s</a>" \
914
% (url, " ".join(classes), volume.id, link_name)
916
self.assertContains(res, expected_string, html=True,
917
msg_prefix="The create snapshot button is not disabled")
919
@test.create_stubs({cinder: ('tenant_absolute_limits',
882
921
'volume_backup_supported',),
883
922
api.nova: ('server_list',)})
1047
1090
self.assertRedirectsNoFollow(res, redirect_url)
1049
1092
@test.create_stubs({cinder: ('volume_get',
1094
quotas: ('tenant_limit_usages',)})
1051
1095
def test_extend_volume(self):
1052
1096
volume = self.cinder_volumes.first()
1097
usage_limit = {'maxTotalVolumeGigabytes': 100,
1098
'gigabytesUsed': 20,
1099
'volumesUsed': len(self.volumes.list()),
1100
'maxTotalVolumes': 6}
1053
1101
formData = {'name': u'A Volume I Am Making',
1054
1102
'orig_size': volume.size,
1057
1105
cinder.volume_get(IsA(http.HttpRequest), volume.id).\
1058
AndReturn(self.cinder_volumes.first())
1106
AndReturn(self.cinder_volumes.first())
1107
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
1108
AndReturn(usage_limit)
1060
1109
cinder.volume_extend(IsA(http.HttpRequest),
1062
1111
formData['new_size']).AndReturn(volume)
1097
1146
"current size.")
1099
1148
@test.create_stubs({cinder: ('volume_get',
1100
'retype_supported'),
1150
'tenant_absolute_limits'),
1101
1151
api.nova: ('server_get',)})
1102
1152
def test_retype_volume_not_supported_no_action_item(self):
1103
1153
volume = self.cinder_volumes.get(name='my_volume')
1154
limits = self.cinder_limits['absolute']
1104
1155
server = self.servers.first()
1106
1157
cinder.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume)
1107
1158
cinder.retype_supported().AndReturn(False)
1159
cinder.tenant_absolute_limits(IsA(http.HttpRequest))\
1160
.MultipleTimes('limits').AndReturn(limits)
1108
1161
api.nova.server_get(IsA(http.HttpRequest), server.id).AndReturn(server)
1110
1163
self.mox.ReplayAll()
1120
1173
self.assertNotContains(res, 'retype')
1122
1175
@test.create_stubs({cinder: ('volume_get',
1123
'retype_supported')})
1177
'tenant_absolute_limits')})
1124
1178
def test_retype_volume_supported_action_item(self):
1125
1179
volume = self.cinder_volumes.get(name='v2_volume')
1180
limits = self.cinder_limits['absolute']
1127
1182
cinder.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume)
1128
1183
cinder.retype_supported().AndReturn(True)
1184
cinder.tenant_absolute_limits(IsA(http.HttpRequest))\
1185
.MultipleTimes('limits').AndReturn(limits)
1130
1187
self.mox.ReplayAll()
1241
1298
for row in rows:
1242
1299
self.assertEqual(row.cells['encryption'].data, column_value)
1301
@test.create_stubs({cinder: ('volume_get',),
1302
quotas: ('tenant_limit_usages',)})
1303
def test_extend_volume_with_size_out_of_quota(self):
1304
volume = self.volumes.first()
1305
usage_limit = {'maxTotalVolumeGigabytes': 100,
1306
'gigabytesUsed': 20,
1307
'volumesUsed': len(self.volumes.list()),
1308
'maxTotalVolumes': 6}
1309
formData = {'name': u'A Volume I Am Making',
1310
'orig_size': volume.size,
1313
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
1314
AndReturn(usage_limit)
1315
cinder.volume_get(IsA(http.HttpRequest), volume.id).\
1316
AndReturn(self.volumes.first())
1317
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
1318
AndReturn(usage_limit)
1320
self.mox.ReplayAll()
1322
url = reverse('horizon:project:volumes:volumes:extend',
1324
res = self.client.post(url, formData)
1325
self.assertFormError(res, "form", "new_size",
1326
"Volume cannot be extended to 1000GB as you only "
1327
"have 80GB of your quota available.")