def test_attach_with_invalid_arguments(self): # Invalid request to attach volume an invalid target body = {"os-attach": {"mountpoint": "/dev/vdc"}} req = webob.Request.blank("/v2/fake/volumes/1/action") req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400) # Invalid request to attach volume to an instance and a host body = {"os-attach": {"instance_uuid": "fake", "host_name": "fake_host", "mountpoint": "/dev/vdc"}} req = webob.Request.blank("/v2/fake/volumes/1/action") req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400) # Invalid request to attach volume with an invalid mode body = {"os-attach": {"instance_uuid": "fake", "mountpoint": "/dev/vdc", "mode": "rr"}} req = webob.Request.blank("/v2/fake/volumes/1/action") req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400) body = {"os-attach": {"host_name": "fake_host", "mountpoint": "/dev/vdc", "mode": "ww"}} req = webob.Request.blank("/v2/fake/volumes/1/action") req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400)
def test_delete_transfer_awaiting_transfer(self): volume_id = self._create_volume() transfer = self._create_transfer(volume_id) req = webob.Request.blank('/v2/fake/os-volume-transfer/%s' % transfer['id']) req.method = 'DELETE' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 202) # verify transfer has been deleted req = webob.Request.blank('/v2/fake/os-volume-transfer/%s' % transfer['id']) req.method = 'GET' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 404) self.assertEqual(res_dict['itemNotFound']['code'], 404) self.assertEqual(res_dict['itemNotFound']['message'], 'Transfer %s could not be found.' % transfer['id']) self.assertEqual(db.volume_get(context.get_admin_context(), volume_id)['status'], 'available') db.volume_destroy(context.get_admin_context(), volume_id)
def test_attach_with_invalid_arguments(self): # Invalid request to attach volume an invalid target body = {'os-attach': {'mountpoint': '/dev/vdc'}} req = webob.Request.blank('/v2/fake/volumes/1/action') req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400) # Invalid request to attach volume to an instance and a host body = { 'os-attach': { 'instance_uuid': 'fake', 'host_name': 'fake_host', 'mountpoint': '/dev/vdc' } } req = webob.Request.blank('/v2/fake/volumes/1/action') req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400) # Invalid request to attach volume with an invalid mode body = { 'os-attach': { 'instance_uuid': 'fake', 'mountpoint': '/dev/vdc', 'mode': 'rr' } } req = webob.Request.blank('/v2/fake/volumes/1/action') req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400) body = { 'os-attach': { 'host_name': 'fake_host', 'mountpoint': '/dev/vdc', 'mode': 'ww' } } req = webob.Request.blank('/v2/fake/volumes/1/action') req.method = "POST" req.headers["content-type"] = "application/json" req.body = jsonutils.dumps(body) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400)
def test_list_backups_json(self): backup_id1 = self._create_backup() backup_id2 = self._create_backup() backup_id3 = self._create_backup() req = webob.Request.blank('/v2/fake/backups') req.method = 'GET' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 200) self.assertEqual(len(res_dict['backups'][0]), 3) self.assertEqual(res_dict['backups'][0]['id'], backup_id1) self.assertEqual(res_dict['backups'][0]['name'], 'test_backup') self.assertEqual(len(res_dict['backups'][1]), 3) self.assertEqual(res_dict['backups'][1]['id'], backup_id2) self.assertEqual(res_dict['backups'][1]['name'], 'test_backup') self.assertEqual(len(res_dict['backups'][2]), 3) self.assertEqual(res_dict['backups'][2]['id'], backup_id3) self.assertEqual(res_dict['backups'][2]['name'], 'test_backup') db.backup_destroy(context.get_admin_context(), backup_id3) db.backup_destroy(context.get_admin_context(), backup_id2) db.backup_destroy(context.get_admin_context(), backup_id1)
def test_show_cgsnapshot(self): consistencygroup_id = utils.create_consistencygroup(self.context)['id'] volume_id = utils.create_volume(self.context, consistencygroup_id= consistencygroup_id)['id'] cgsnapshot_id = self._create_cgsnapshot( consistencygroup_id=consistencygroup_id) LOG.debug('Created cgsnapshot with id %s' % cgsnapshot_id) req = webob.Request.blank('/v2/fake/cgsnapshots/%s' % cgsnapshot_id) req.method = 'GET' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 200) self.assertEqual(res_dict['cgsnapshot']['description'], 'this is a test cgsnapshot') self.assertEqual(res_dict['cgsnapshot']['name'], 'test_cgsnapshot') self.assertEqual(res_dict['cgsnapshot']['status'], 'creating') db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id) db.volume_destroy(context.get_admin_context(), volume_id) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id)
def test_delete_cgsnapshot_available(self): consistencygroup_id = utils.create_consistencygroup(self.context)['id'] volume_id = utils.create_volume( self.context, consistencygroup_id=consistencygroup_id)['id'] cgsnapshot_id = self._create_cgsnapshot( consistencygroup_id=consistencygroup_id, status='available') req = webob.Request.blank('/v2/fake/cgsnapshots/%s' % cgsnapshot_id) req.method = 'DELETE' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 202) self.assertEqual(self._get_cgsnapshot_attrib(cgsnapshot_id, 'status'), 'deleting') db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id) db.volume_destroy(context.get_admin_context(), volume_id) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id)
def test_accept_transfer_with_VolumeLimitExceeded(self): def fake_transfer_api_accept_throwing_VolumeLimitExceeded(cls, context, transfer, volume_id): raise exception.VolumeLimitExceeded(allowed=1) self.stubs.Set(cinder.transfer.API, 'accept', fake_transfer_api_accept_throwing_VolumeLimitExceeded) volume_id = self._create_volume() transfer = self._create_transfer(volume_id) body = {"accept": {"id": transfer['id'], "auth_key": transfer['auth_key']}} req = webob.Request.blank('/v2/fake/os-volume-transfer/%s/accept' % transfer['id']) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 413) self.assertEqual(res_dict['overLimit']['code'], 413) self.assertEqual(res_dict['overLimit']['message'], 'VolumeLimitExceeded: Maximum number of volumes ' 'allowed (1) exceeded')
def test_list_transfers_xml(self): volume_id_1 = self._create_volume(size=5) volume_id_2 = self._create_volume(size=5) transfer1 = self._create_transfer(volume_id_1) transfer2 = self._create_transfer(volume_id_2) req = webob.Request.blank('/v2/fake/os-volume-transfer') req.method = 'GET' req.headers['Content-Type'] = 'application/xml' req.headers['Accept'] = 'application/xml' res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 200) dom = minidom.parseString(res.body) transfer_list = dom.getElementsByTagName('transfer') self.assertEqual(transfer_list.item(0).attributes.length, 3) self.assertEqual(transfer_list.item(0).getAttribute('id'), transfer1['id']) self.assertEqual(transfer_list.item(1).attributes.length, 3) self.assertEqual(transfer_list.item(1).getAttribute('id'), transfer2['id']) db.transfer_destroy(context.get_admin_context(), transfer2['id']) db.transfer_destroy(context.get_admin_context(), transfer1['id']) db.volume_destroy(context.get_admin_context(), volume_id_2) db.volume_destroy(context.get_admin_context(), volume_id_1)
def test_create_backup_WithOUT_enabled_backup_service(self): # need an enabled backup service available def stub_empty_service_get_all_by_topic(ctxt, topic): return [] self.stubs.Set(cinder.db, 'service_get_all_by_topic', stub_empty_service_get_all_by_topic) volume_size = 2 volume_id = self._create_volume(status='available', size=volume_size) req = webob.Request.blank('/v2/fake/backups') body = {"backup": {"display_name": "nightly001", "display_description": "Nightly Backup 03-Sep-2012", "volume_id": volume_id, "container": "nightlybackups", } } req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.headers['Accept'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 500) self.assertEqual(res_dict['computeFault']['code'], 500) self.assertEqual(res_dict['computeFault']['message'], 'Service cinder-backup could not be found.')
def test_create_consistencygroup_from_src_cgsnapshot_empty(self): ctxt = context.RequestContext('fake', 'fake', auth_token=True) consistencygroup_id = utils.create_consistencygroup( ctxt)['id'] volume_id = utils.create_volume( ctxt, consistencygroup_id=consistencygroup_id)['id'] cgsnapshot_id = utils.create_cgsnapshot( ctxt, consistencygroup_id=consistencygroup_id)['id'] test_cg_name = 'test cg' body = {"consistencygroup-from-src": {"name": test_cg_name, "description": "Consistency Group 1", "cgsnapshot_id": cgsnapshot_id}} req = webob.Request.blank('/v2/fake/consistencygroups/create_from_src') req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict['badRequest']['code']) msg = _("Invalid ConsistencyGroup: Cgsnahost is empty. No " "consistency group will be created.") self.assertIn(msg, res_dict['badRequest']['message']) db.cgsnapshot_destroy(ctxt.elevated(), cgsnapshot_id) db.volume_destroy(ctxt.elevated(), volume_id) db.consistencygroup_destroy(ctxt.elevated(), consistencygroup_id)
def test_update_consistencygroup_add_volume_invalid_volume_type(self): ctxt = context.RequestContext('fake', 'fake') consistencygroup_id = self._create_consistencygroup(status='available') wrong_type = 'wrong-volume-type-id' add_volume_id = utils.create_volume( ctxt, volume_type_id=wrong_type)['id'] req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup_id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' add_volumes = add_volume_id body = {"consistencygroup": {"name": "", "description": "", "add_volumes": add_volumes, "remove_volumes": None, }} req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict['badRequest']['code']) msg = (_("Invalid volume: Cannot add volume %(volume_id)s " "to consistency group %(group_id)s because volume type " "%(volume_type)s is not supported by the group.") % {'volume_id': add_volume_id, 'group_id': consistencygroup_id, 'volume_type': wrong_type}) self.assertEqual(msg, res_dict['badRequest']['message']) db.consistencygroup_destroy(ctxt.elevated(), consistencygroup_id)
def test_restore_backup_with_VolumeSizeExceedsAvailableQuota(self): def fake_backup_api_restore_throwing_VolumeSizeExceedsAvailableQuota(cls, context, backup_id, volume_id): raise exception.VolumeSizeExceedsAvailableQuota(requested="2", consumed="2", quota="3") self.stubs.Set(cinder.backup.API, "restore", fake_backup_api_restore_throwing_VolumeSizeExceedsAvailableQuota) backup_id = self._create_backup(status="available") # need to create the volume referenced below first volume_id = utils.create_volume(self.context, size=5)["id"] body = {"restore": {"volume_id": volume_id}} req = webob.Request.blank("/v2/fake/backups/%s/restore" % backup_id) req.method = "POST" req.headers["Content-Type"] = "application/json" req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 413) self.assertEqual(res_dict["overLimit"]["code"], 413) self.assertEqual( res_dict["overLimit"]["message"], "Requested volume or snapshot exceeds allowed " "Gigabytes quota. Requested 2G, quota is 3G and " "2G has been consumed.", )
def test_create_backup_WithOUT_enabled_backup_service(self): # need an enabled backup service available def stub_empty_service_get_all_by_topic(ctxt, topic): return [] self.stubs.Set(cinder.db, "service_get_all_by_topic", stub_empty_service_get_all_by_topic) volume_id = utils.create_volume(self.context, size=2)["id"] req = webob.Request.blank("/v2/fake/backups") body = { "backup": { "display_name": "nightly001", "display_description": "Nightly Backup 03-Sep-2012", "volume_id": volume_id, "container": "nightlybackups", } } req.method = "POST" req.headers["Content-Type"] = "application/json" req.headers["Accept"] = "application/json" req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 500) self.assertEqual(res_dict["computeFault"]["code"], 500) self.assertEqual(res_dict["computeFault"]["message"], "Service cinder-backup could not be found.") volume = self.volume_api.get(context.get_admin_context(), volume_id) self.assertEqual(volume["status"], "available")
def test_list_backups_json(self): backup_id1 = self._create_backup() backup_id2 = self._create_backup() backup_id3 = self._create_backup() req = webob.Request.blank("/v2/fake/backups") req.method = "GET" req.headers["Content-Type"] = "application/json" res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 200) self.assertEqual(len(res_dict["backups"][0]), 3) self.assertEqual(res_dict["backups"][0]["id"], backup_id1) self.assertEqual(res_dict["backups"][0]["name"], "test_backup") self.assertEqual(len(res_dict["backups"][1]), 3) self.assertEqual(res_dict["backups"][1]["id"], backup_id2) self.assertEqual(res_dict["backups"][1]["name"], "test_backup") self.assertEqual(len(res_dict["backups"][2]), 3) self.assertEqual(res_dict["backups"][2]["id"], backup_id3) self.assertEqual(res_dict["backups"][2]["name"], "test_backup") db.backup_destroy(context.get_admin_context(), backup_id3) db.backup_destroy(context.get_admin_context(), backup_id2) db.backup_destroy(context.get_admin_context(), backup_id1)
def test_restore_backup_to_undersized_volume(self): backup_size = 10 backup_id = self._create_backup(status='available', size=backup_size) # need to create the volume referenced below first volume_size = 5 volume_id = self._create_volume(status='available', size=volume_size) body = {"restore": {"volume_id": volume_id, }} req = webob.Request.blank('/v2/fake/backups/%s/restore' % backup_id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 400) self.assertEqual(res_dict['badRequest']['code'], 400) self.assertEqual(res_dict['badRequest']['message'], 'Invalid volume: volume size %d is too ' 'small to restore backup of size %d.' % (volume_size, backup_size)) db.volume_destroy(context.get_admin_context(), volume_id) db.backup_destroy(context.get_admin_context(), backup_id)
def test_restore_backup_with_VolumeLimitExceeded(self): def fake_backup_api_restore_throwing_VolumeLimitExceeded(cls, context, backup_id, volume_id): raise exception.VolumeLimitExceeded(allowed=1) self.stubs.Set(cinder.backup.API, 'restore', fake_backup_api_restore_throwing_VolumeLimitExceeded) backup_id = self._create_backup(status='available') # need to create the volume referenced below first volume_size = 5 volume_id = self._create_volume(status='available', size=volume_size) body = {"restore": {"volume_id": volume_id, }} req = webob.Request.blank('/v2/fake/backups/%s/restore' % backup_id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 413) self.assertEqual(res_dict['overLimit']['code'], 413) self.assertEqual(res_dict['overLimit']['message'], 'Maximum number of volumes allowed ' '(%(allowed)d) exceeded')
def test_list_consistencygroups_json(self): consistencygroup_id1 = self._create_consistencygroup() consistencygroup_id2 = self._create_consistencygroup() consistencygroup_id3 = self._create_consistencygroup() req = webob.Request.blank('/v2/fake/consistencygroups') req.method = 'GET' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(200, res.status_int) self.assertEqual(consistencygroup_id1, res_dict['consistencygroups'][0]['id']) self.assertEqual('test_consistencygroup', res_dict['consistencygroups'][0]['name']) self.assertEqual(consistencygroup_id2, res_dict['consistencygroups'][1]['id']) self.assertEqual('test_consistencygroup', res_dict['consistencygroups'][1]['name']) self.assertEqual(consistencygroup_id3, res_dict['consistencygroups'][2]['id']) self.assertEqual('test_consistencygroup', res_dict['consistencygroups'][2]['name']) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id3) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id2) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id1)
def test_restore_backup_with_InvalidInput(self): def fake_backup_api_restore_throwing_InvalidInput(cls, context, backup_id, volume_id): msg = _("Invalid input") raise exception.InvalidInput(reason=msg) self.stubs.Set(cinder.backup.API, 'restore', fake_backup_api_restore_throwing_InvalidInput) backup_id = self._create_backup(status='available') # need to create the volume referenced below first volume_size = 0 volume_id = self._create_volume(status='available', size=volume_size) body = {"restore": {"volume_id": volume_id, }} req = webob.Request.blank('/v2/fake/backups/%s/restore' % backup_id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 400) self.assertEqual(res_dict['badRequest']['code'], 400) self.assertEqual(res_dict['badRequest']['message'], 'Invalid input received: Invalid input')
def test_list_consistencygroups_xml(self): consistencygroup_id1 = self._create_consistencygroup() consistencygroup_id2 = self._create_consistencygroup() consistencygroup_id3 = self._create_consistencygroup() req = webob.Request.blank('/v2/fake/consistencygroups') req.method = 'GET' req.headers['Content-Type'] = 'application/xml' req.headers['Accept'] = 'application/xml' res = req.get_response(fakes.wsgi_app()) self.assertEqual(200, res.status_int) dom = minidom.parseString(res.body) consistencygroup_list = dom.getElementsByTagName('consistencygroup') self.assertEqual(consistencygroup_id1, consistencygroup_list.item(0).getAttribute('id')) self.assertEqual(consistencygroup_id2, consistencygroup_list.item(1).getAttribute('id')) self.assertEqual(consistencygroup_id3, consistencygroup_list.item(2).getAttribute('id')) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id3) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id2) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id1)
def test_list_transfers_detail_json(self): volume_id_1 = self._create_volume(size=5) volume_id_2 = self._create_volume(size=5) transfer1 = self._create_transfer(volume_id_1) transfer2 = self._create_transfer(volume_id_2) req = webob.Request.blank('/v2/fake/os-volume-transfer/detail') req.method = 'GET' req.headers['Content-Type'] = 'application/json' req.headers['Accept'] = 'application/json' res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 200) self.assertEqual(len(res_dict['transfers'][0]), 5) self.assertEqual(res_dict['transfers'][0]['name'], 'test_transfer') self.assertEqual(res_dict['transfers'][0]['id'], transfer1['id']) self.assertEqual(res_dict['transfers'][0]['volume_id'], volume_id_1) self.assertEqual(len(res_dict['transfers'][1]), 5) self.assertEqual(res_dict['transfers'][1]['name'], 'test_transfer') self.assertEqual(res_dict['transfers'][1]['id'], transfer2['id']) self.assertEqual(res_dict['transfers'][1]['volume_id'], volume_id_2) db.transfer_destroy(context.get_admin_context(), transfer2['id']) db.transfer_destroy(context.get_admin_context(), transfer1['id']) db.volume_destroy(context.get_admin_context(), volume_id_2) db.volume_destroy(context.get_admin_context(), volume_id_1)
def test_list_cgsnapshots_xml(self): consistencygroup_id = utils.create_consistencygroup(self.context)["id"] volume_id = utils.create_volume(self.context, consistencygroup_id=consistencygroup_id)["id"] cgsnapshot_id1 = self._create_cgsnapshot(consistencygroup_id=consistencygroup_id) cgsnapshot_id2 = self._create_cgsnapshot(consistencygroup_id=consistencygroup_id) cgsnapshot_id3 = self._create_cgsnapshot(consistencygroup_id=consistencygroup_id) req = webob.Request.blank("/v2/fake/cgsnapshots") req.method = "GET" req.headers["Content-Type"] = "application/xml" req.headers["Accept"] = "application/xml" res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 200) dom = minidom.parseString(res.body) cgsnapshot_list = dom.getElementsByTagName("cgsnapshot") self.assertEqual(cgsnapshot_list.item(0).getAttribute("id"), cgsnapshot_id1) self.assertEqual(cgsnapshot_list.item(1).getAttribute("id"), cgsnapshot_id2) self.assertEqual(cgsnapshot_list.item(2).getAttribute("id"), cgsnapshot_id3) db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id3) db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id2) db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id1) db.volume_destroy(context.get_admin_context(), volume_id) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id)
def test_list_backups_xml(self): backup_id1 = self._create_backup() backup_id2 = self._create_backup() backup_id3 = self._create_backup() req = webob.Request.blank('/v2/fake/backups') req.method = 'GET' req.headers['Content-Type'] = 'application/xml' req.headers['Accept'] = 'application/xml' res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 200) dom = minidom.parseString(res.body) backup_list = dom.getElementsByTagName('backup') self.assertEqual(backup_list.item(0).attributes.length, 2) self.assertEqual(backup_list.item(0).getAttribute('id'), backup_id1) self.assertEqual(backup_list.item(1).attributes.length, 2) self.assertEqual(backup_list.item(1).getAttribute('id'), backup_id2) self.assertEqual(backup_list.item(2).attributes.length, 2) self.assertEqual(backup_list.item(2).getAttribute('id'), backup_id3) db.backup_destroy(context.get_admin_context(), backup_id3) db.backup_destroy(context.get_admin_context(), backup_id2) db.backup_destroy(context.get_admin_context(), backup_id1)
def test_list_cgsnapshots_detail_json(self): consistencygroup_id = utils.create_consistencygroup(self.context)["id"] volume_id = utils.create_volume(self.context, consistencygroup_id=consistencygroup_id)["id"] cgsnapshot_id1 = self._create_cgsnapshot(consistencygroup_id=consistencygroup_id) cgsnapshot_id2 = self._create_cgsnapshot(consistencygroup_id=consistencygroup_id) cgsnapshot_id3 = self._create_cgsnapshot(consistencygroup_id=consistencygroup_id) req = webob.Request.blank("/v2/fake/cgsnapshots/detail") req.method = "GET" req.headers["Content-Type"] = "application/json" req.headers["Accept"] = "application/json" res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 200) self.assertEqual(res_dict["cgsnapshots"][0]["description"], "this is a test cgsnapshot") self.assertEqual(res_dict["cgsnapshots"][0]["name"], "test_cgsnapshot") self.assertEqual(res_dict["cgsnapshots"][0]["id"], cgsnapshot_id1) self.assertEqual(res_dict["cgsnapshots"][0]["status"], "creating") self.assertEqual(res_dict["cgsnapshots"][1]["description"], "this is a test cgsnapshot") self.assertEqual(res_dict["cgsnapshots"][1]["name"], "test_cgsnapshot") self.assertEqual(res_dict["cgsnapshots"][1]["id"], cgsnapshot_id2) self.assertEqual(res_dict["cgsnapshots"][1]["status"], "creating") self.assertEqual(res_dict["cgsnapshots"][2]["description"], "this is a test cgsnapshot") self.assertEqual(res_dict["cgsnapshots"][2]["name"], "test_cgsnapshot") self.assertEqual(res_dict["cgsnapshots"][2]["id"], cgsnapshot_id3) self.assertEqual(res_dict["cgsnapshots"][2]["status"], "creating") db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id3) db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id2) db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id1) db.volume_destroy(context.get_admin_context(), volume_id) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id)
def test_create_cgsnapshot_json(self): cgsnapshot_id = "1" consistencygroup_id = utils.create_consistencygroup(self.context)['id'] utils.create_volume( self.context, consistencygroup_id=consistencygroup_id)['id'] body = {"cgsnapshot": {"name": "cg1", "description": "CG Snapshot 1", "consistencygroup_id": consistencygroup_id}} req = webob.Request.blank('/v2/fake/cgsnapshots') req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) LOG.info(res_dict) self.assertEqual(res.status_int, 202) self.assertIn('id', res_dict['cgsnapshot']) db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id)
def test_create_backup_json(self): self.stubs.Set(cinder.db, 'service_get_all_by_topic', self._stub_service_get_all_by_topic) volume_id = utils.create_volume(self.context, size=5)['id'] body = {"backup": {"display_name": "nightly001", "display_description": "Nightly Backup 03-Sep-2012", "volume_id": volume_id, "container": "nightlybackups", } } req = webob.Request.blank('/v2/fake/backups') req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) LOG.info(res_dict) self.assertEqual(res.status_int, 202) self.assertIn('id', res_dict['backup']) db.volume_destroy(context.get_admin_context(), volume_id)
def test_delete_cgsnapshot_with_Invalidcgsnapshot(self): consistencygroup_id = utils.create_consistencygroup(self.context)['id'] volume_id = utils.create_volume( self.context, consistencygroup_id=consistencygroup_id)['id'] cgsnapshot_id = self._create_cgsnapshot( consistencygroup_id=consistencygroup_id, status='invalid') req = webob.Request.blank('/v2/fake/cgsnapshots/%s' % cgsnapshot_id) req.method = 'DELETE' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 400) self.assertEqual(res_dict['badRequest']['code'], 400) self.assertEqual(res_dict['badRequest']['message'], 'Invalid cgsnapshot') db.cgsnapshot_destroy(context.get_admin_context(), cgsnapshot_id) db.volume_destroy(context.get_admin_context(), volume_id) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id)
def test_restore_backup_with_VolumeSizeExceedsAvailableQuota(self): def fake_backup_api_restore_throwing_VolumeSizeExceedsAvailableQuota( cls, context, backup_id, volume_id): raise exception.VolumeSizeExceedsAvailableQuota(requested='2', consumed='2', quota='3') self.stubs.Set( cinder.backup.API, 'restore', fake_backup_api_restore_throwing_VolumeSizeExceedsAvailableQuota) backup_id = self._create_backup(status='available') # need to create the volume referenced below first volume_id = utils.create_volume(self.context, size=5)['id'] body = {"restore": {"volume_id": volume_id, }} req = webob.Request.blank('/v2/fake/backups/%s/restore' % backup_id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 413) self.assertEqual(res_dict['overLimit']['code'], 413) self.assertEqual(res_dict['overLimit']['message'], 'Requested volume or snapshot exceeds allowed ' 'Gigabytes quota. Requested 2G, quota is 3G and ' '2G has been consumed.')
def test_show_backup(self): volume_id = self._create_volume(size=5) backup_id = self._create_backup(volume_id) LOG.debug('Created backup with id %s' % backup_id) req = webob.Request.blank('/v2/fake/backups/%s' % backup_id) req.method = 'GET' req.headers['Content-Type'] = 'application/json' res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 200) self.assertEqual(res_dict['backup']['availability_zone'], 'az1') self.assertEqual(res_dict['backup']['container'], 'volumebackups') self.assertEqual(res_dict['backup']['description'], 'this is a test backup') self.assertEqual(res_dict['backup']['name'], 'test_backup') self.assertEqual(res_dict['backup']['id'], backup_id) self.assertEqual(res_dict['backup']['object_count'], 0) self.assertEqual(res_dict['backup']['size'], 0) self.assertEqual(res_dict['backup']['status'], 'creating') self.assertEqual(res_dict['backup']['volume_id'], volume_id) db.backup_destroy(context.get_admin_context(), backup_id) db.volume_destroy(context.get_admin_context(), volume_id)
def test_accept_transfer_with_VolumeSizeExceedsAvailableQuota(self): def fake_transfer_api_accept_throwing_VolumeSizeExceedsAvailableQuota( cls, context, transfer, volume_id): raise exception.VolumeSizeExceedsAvailableQuota(requested='2', consumed='2', quota='3') self.stubs.Set( cinder.transfer.API, 'accept', fake_transfer_api_accept_throwing_VolumeSizeExceedsAvailableQuota) volume_id = self._create_volume() transfer = self._create_transfer(volume_id) body = {"accept": {"id": transfer['id'], "auth_key": transfer['auth_key']}} req = webob.Request.blank('/v2/fake/os-volume-transfer/%s/accept' % transfer['id']) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 413) self.assertEqual(res_dict['overLimit']['code'], 413) self.assertEqual(res_dict['overLimit']['message'], 'Requested volume or snapshot exceeds allowed ' 'Gigabytes quota. Requested 2G, quota is 3G and ' '2G has been consumed.')
def test_retype_volume_no_body(self): # Request with no body should fail req = webob.Request.blank('/v2/fake/volumes/1/action') req.method = 'POST' req.headers['content-type'] = 'application/json' req.body = jsonutils.dumps({'os-retype': None}) res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 400)
def test_update_consistencygroup_add_volume_invalid_state(self): volume_type_id = '123456' ctxt = context.RequestContext('fake', 'fake') consistencygroup_id = self._create_consistencygroup(status='available') add_volume_id = utils.create_volume(ctxt, volume_type_id=volume_type_id, status='wrong_status')['id'] req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup_id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' add_volumes = add_volume_id body = { "consistencygroup": { "name": "", "description": "", "add_volumes": add_volumes, "remove_volumes": None, } } req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict['badRequest']['code']) msg = (_("Invalid volume: Cannot add volume %(volume_id)s " "to consistency group %(group_id)s because volume is in an " "invalid state: %(status)s. Valid states are: ('available', " "'in-use').") % { 'volume_id': add_volume_id, 'group_id': consistencygroup_id, 'status': 'wrong_status' }) self.assertEqual(msg, res_dict['badRequest']['message']) db.consistencygroup_destroy(ctxt.elevated(), consistencygroup_id)
def test_restore_backup_to_oversized_volume(self): backup_id = self._create_backup(status='available', size=10) # need to create the volume referenced below first volume_size = 15 volume_id = self._create_volume(status='available', size=volume_size) body = { "restore": { "volume_id": volume_id, } } req = webob.Request.blank('/v2/fake/backups/%s/restore' % backup_id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 202) self.assertEqual(res_dict['restore']['backup_id'], backup_id) self.assertEqual(res_dict['restore']['volume_id'], volume_id) db.volume_destroy(context.get_admin_context(), volume_id) db.backup_destroy(context.get_admin_context(), backup_id)
def test_list_transfers_detail_xml(self): volume_id_1 = self._create_volume(size=5) volume_id_2 = self._create_volume(size=5) transfer1 = self._create_transfer(volume_id_1) transfer2 = self._create_transfer(volume_id_2) req = webob.Request.blank('/v2/fake/os-volume-transfer/detail') req.method = 'GET' req.headers['Content-Type'] = 'application/xml' req.headers['Accept'] = 'application/xml' res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 200) dom = minidom.parseString(res.body) transfer_detail = dom.getElementsByTagName('transfer') self.assertEqual(transfer_detail.item(0).attributes.length, 4) self.assertEqual( transfer_detail.item(0).getAttribute('name'), 'test_transfer') self.assertEqual( transfer_detail.item(0).getAttribute('id'), transfer1['id']) self.assertEqual( transfer_detail.item(0).getAttribute('volume_id'), volume_id_1) self.assertEqual(transfer_detail.item(1).attributes.length, 4) self.assertEqual( transfer_detail.item(1).getAttribute('name'), 'test_transfer') self.assertEqual( transfer_detail.item(1).getAttribute('id'), transfer2['id']) self.assertEqual( transfer_detail.item(1).getAttribute('volume_id'), volume_id_2) db.transfer_destroy(context.get_admin_context(), transfer2['id']) db.transfer_destroy(context.get_admin_context(), transfer1['id']) db.volume_destroy(context.get_admin_context(), volume_id_2) db.volume_destroy(context.get_admin_context(), volume_id_1)
def test_accept_transfer_volume_id_specified_json(self): volume_id = self._create_volume() transfer = self._create_transfer(volume_id) svc = self.start_service('volume', host='fake_host') body = { "accept": { "id": transfer['id'], "auth_key": transfer['auth_key'] } } req = webob.Request.blank('/v2/fake/os-volume-transfer/%s/accept' % transfer['id']) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 202) self.assertEqual(res_dict['transfer']['id'], transfer['id']) self.assertEqual(res_dict['transfer']['volume_id'], volume_id) # cleanup svc.stop()
def test_restore_backup_with_InvalidBackup(self): backup_id = self._create_backup(status='restoring') # need to create the volume referenced below first volume_id = utils.create_volume(self.context, size=5)['id'] body = { "restore": { "volume_id": volume_id, } } req = webob.Request.blank('/v2/fake/backups/%s/restore' % backup_id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 400) self.assertEqual(res_dict['badRequest']['code'], 400) self.assertEqual(res_dict['badRequest']['message'], 'Invalid backup: Backup status must be available') db.volume_destroy(context.get_admin_context(), volume_id) db.backup_destroy(context.get_admin_context(), backup_id)
def test_create_with_cgsnapshot_not_found(self, mock_create_cgsnapshot): consistencygroup_id = utils.create_consistencygroup(self.context)['id'] utils.create_volume(self.context, consistencygroup_id=consistencygroup_id)['id'] body = { "cgsnapshot": { "name": "cg1", "description": "CG Snapshot 1", "consistencygroup_id": consistencygroup_id } } req = webob.Request.blank('/v2/fake/cgsnapshots') req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(404, res.status_int) self.assertEqual(404, res_dict['itemNotFound']['code']) self.assertEqual('CgSnapshot invalid_id could not be found.', res_dict['itemNotFound']['message'])
def test_create_backup_json(self): self.stubs.Set(cinder.db, 'service_get_all_by_topic', self._stub_service_get_all_by_topic) volume_id = self._create_volume(status='available', size=5) body = {"backup": {"display_name": "nightly001", "display_description": "Nightly Backup 03-Sep-2012", "volume_id": volume_id, "container": "nightlybackups", } } req = webob.Request.blank('/v2/fake/backups') req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) LOG.info(res_dict) self.assertEqual(res.status_int, 202) self.assertTrue('id' in res_dict['backup']) db.volume_destroy(context.get_admin_context(), volume_id)
def test_create_backup_with_InvalidVolume(self): # need to create the volume referenced below first volume_size = 5 volume_id = self._create_volume(status='restoring', size=volume_size) body = {"backup": {"display_name": "nightly001", "display_description": "Nightly Backup 03-Sep-2012", "volume_id": volume_id, "container": "nightlybackups", } } req = webob.Request.blank('/v2/fake/backups') req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 400) self.assertEqual(res_dict['badRequest']['code'], 400) self.assertEqual(res_dict['badRequest']['message'], 'Invalid volume: Volume to be backed up must' ' be available')
def test_restore_backup_volume_id_unspecified(self): # intercept volume creation to ensure created volume # has status of available def fake_volume_api_create(cls, context, size, name, description): volume_id = self._create_volume(status='available', size=size) return db.volume_get(context, volume_id) self.stubs.Set(cinder.volume.API, 'create', fake_volume_api_create) backup_id = self._create_backup(size=5, status='available') body = {"restore": {}} req = webob.Request.blank('/v2/fake/backups/%s/restore' % backup_id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 202) self.assertEqual(res_dict['restore']['backup_id'], backup_id)
def test_accept_transfer_with_VolumeSizeExceedsAvailableQuota(self): def fake_transfer_api_accept_throwing_VolumeSizeExceedsAvailableQuota( cls, context, transfer, volume_id): raise exception.VolumeSizeExceedsAvailableQuota(requested='2', consumed='2', quota='3') self.stubs.Set( cinder.transfer.API, 'accept', fake_transfer_api_accept_throwing_VolumeSizeExceedsAvailableQuota) volume_id = self._create_volume() transfer = self._create_transfer(volume_id) body = { "accept": { "id": transfer['id'], "auth_key": transfer['auth_key'] } } req = webob.Request.blank('/v2/fake/os-volume-transfer/%s/accept' % transfer['id']) req.method = 'POST' req.headers['Content-Type'] = 'application/json' req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(res.status_int, 413) self.assertEqual(res_dict['overLimit']['code'], 413) self.assertEqual( res_dict['overLimit']['message'], 'Requested volume or snapshot exceeds allowed ' 'Gigabytes quota. Requested 2G, quota is 3G and ' '2G has been consumed.')
def test_list_consistencygroups_detail_xml(self): consistencygroup_id1 = self._create_consistencygroup() consistencygroup_id2 = self._create_consistencygroup() consistencygroup_id3 = self._create_consistencygroup() req = webob.Request.blank('/v2/fake/consistencygroups/detail') req.method = 'GET' req.headers['Content-Type'] = 'application/xml' req.headers['Accept'] = 'application/xml' res = req.get_response(fakes.wsgi_app()) self.assertEqual(200, res.status_int) dom = minidom.parseString(res.body) consistencygroup_detail = dom.getElementsByTagName('consistencygroup') self.assertEqual( 'az1', consistencygroup_detail.item(0).getAttribute('availability_zone')) self.assertEqual( 'this is a test consistency group', consistencygroup_detail.item(0).getAttribute('description')) self.assertEqual('test_consistencygroup', consistencygroup_detail.item(0).getAttribute('name')) self.assertEqual(consistencygroup_id1, consistencygroup_detail.item(0).getAttribute('id')) self.assertEqual( 'creating', consistencygroup_detail.item(0).getAttribute('status')) self.assertEqual( 'az1', consistencygroup_detail.item(1).getAttribute('availability_zone')) self.assertEqual( 'this is a test consistency group', consistencygroup_detail.item(1).getAttribute('description')) self.assertEqual('test_consistencygroup', consistencygroup_detail.item(1).getAttribute('name')) self.assertEqual(consistencygroup_id2, consistencygroup_detail.item(1).getAttribute('id')) self.assertEqual( 'creating', consistencygroup_detail.item(1).getAttribute('status')) self.assertEqual( 'az1', consistencygroup_detail.item(2).getAttribute('availability_zone')) self.assertEqual( 'this is a test consistency group', consistencygroup_detail.item(2).getAttribute('description')) self.assertEqual('test_consistencygroup', consistencygroup_detail.item(2).getAttribute('name')) self.assertEqual(consistencygroup_id3, consistencygroup_detail.item(2).getAttribute('id')) self.assertEqual( 'creating', consistencygroup_detail.item(2).getAttribute('status')) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id3) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id2) db.consistencygroup_destroy(context.get_admin_context(), consistencygroup_id1)
def _make_request(self, url): req = webob.Request.blank(url) req.headers['Accept'] = self.content_type res = req.get_response(fakes.wsgi_app()) return res
def test_list_backups_detail_xml(self): backup_id1 = self._create_backup() backup_id2 = self._create_backup() backup_id3 = self._create_backup() req = webob.Request.blank('/v2/fake/backups/detail') req.method = 'GET' req.headers['Content-Type'] = 'application/xml' req.headers['Accept'] = 'application/xml' res = req.get_response(fakes.wsgi_app()) self.assertEqual(res.status_int, 200) dom = minidom.parseString(res.body) backup_detail = dom.getElementsByTagName('backup') self.assertEqual(backup_detail.item(0).attributes.length, 11) self.assertEqual( backup_detail.item(0).getAttribute('availability_zone'), 'az1') self.assertEqual( backup_detail.item(0).getAttribute('container'), 'volumebackups') self.assertEqual( backup_detail.item(0).getAttribute('description'), 'this is a test backup') self.assertEqual( backup_detail.item(0).getAttribute('name'), 'test_backup') self.assertEqual(backup_detail.item(0).getAttribute('id'), backup_id1) self.assertEqual( int(backup_detail.item(0).getAttribute('object_count')), 0) self.assertEqual(int(backup_detail.item(0).getAttribute('size')), 0) self.assertEqual( backup_detail.item(0).getAttribute('status'), 'creating') self.assertEqual(int(backup_detail.item(0).getAttribute('volume_id')), 1) self.assertEqual(backup_detail.item(1).attributes.length, 11) self.assertEqual( backup_detail.item(1).getAttribute('availability_zone'), 'az1') self.assertEqual( backup_detail.item(1).getAttribute('container'), 'volumebackups') self.assertEqual( backup_detail.item(1).getAttribute('description'), 'this is a test backup') self.assertEqual( backup_detail.item(1).getAttribute('name'), 'test_backup') self.assertEqual(backup_detail.item(1).getAttribute('id'), backup_id2) self.assertEqual( int(backup_detail.item(1).getAttribute('object_count')), 0) self.assertEqual(int(backup_detail.item(1).getAttribute('size')), 0) self.assertEqual( backup_detail.item(1).getAttribute('status'), 'creating') self.assertEqual(int(backup_detail.item(1).getAttribute('volume_id')), 1) self.assertEqual(backup_detail.item(2).attributes.length, 11) self.assertEqual( backup_detail.item(2).getAttribute('availability_zone'), 'az1') self.assertEqual( backup_detail.item(2).getAttribute('container'), 'volumebackups') self.assertEqual( backup_detail.item(2).getAttribute('description'), 'this is a test backup') self.assertEqual( backup_detail.item(2).getAttribute('name'), 'test_backup') self.assertEqual(backup_detail.item(2).getAttribute('id'), backup_id3) self.assertEqual( int(backup_detail.item(2).getAttribute('object_count')), 0) self.assertEqual(int(backup_detail.item(2).getAttribute('size')), 0) self.assertEqual( backup_detail.item(2).getAttribute('status'), 'creating') self.assertEqual(int(backup_detail.item(2).getAttribute('volume_id')), 1) db.backup_destroy(context.get_admin_context(), backup_id3) db.backup_destroy(context.get_admin_context(), backup_id2) db.backup_destroy(context.get_admin_context(), backup_id1)