def test_update_consistencygroup_invalid_state(self): consistencygroup = self._create_consistencygroup( status=fields.ConsistencyGroupStatus.IN_USE, ctxt=self.ctxt) req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' body = { "consistencygroup": { "name": "new name", "description": None, "add_volumes": None, "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 ConsistencyGroup: Consistency group status must be " "available, but current status is: %s.") % ( fields.ConsistencyGroupStatus.IN_USE) self.assertEqual(msg, res_dict['badRequest']['message']) consistencygroup.destroy()
def test_update_consistencygroup_add_volume_already_in_cg(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) add_volume_id = utils.create_volume( self.ctxt, consistencygroup_id='some_other_cg')['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": "cg1", "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']) self.assertIsNotNone(res_dict['badRequest']['message']) consistencygroup.destroy()
def test_create_consistencygroup_from_src_both_snap_cg(self): self.stubs.Set(volume_api.API, "create", stubs.stub_volume_create) consistencygroup = utils.create_consistencygroup(self.ctxt) volume_id = utils.create_volume(self.ctxt, consistencygroup_id=consistencygroup.id)["id"] cgsnapshot_id = utils.create_cgsnapshot(self.ctxt, consistencygroup_id=consistencygroup.id)["id"] snapshot = utils.create_snapshot(self.ctxt, volume_id, cgsnapshot_id=cgsnapshot_id, status="available") test_cg_name = "test cg" body = { "consistencygroup-from-src": { "name": test_cg_name, "description": "Consistency Group 1", "cgsnapshot_id": cgsnapshot_id, "source_cgid": consistencygroup.id, } } req = webob.Request.blank("/v2/fake/consistencygroups/create_from_src") req.method = "POST" req.headers["Content-Type"] = "application/json" req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict["badRequest"]["code"]) self.assertIsNotNone(res_dict["badRequest"]["message"]) snapshot.destroy() db.cgsnapshot_destroy(self.ctxt.elevated(), cgsnapshot_id) db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy()
def test_create_consistencygroup_from_src_no_host(self): consistencygroup = utils.create_consistencygroup(self.ctxt, host=None) volume_id = utils.create_volume(self.ctxt, consistencygroup_id=consistencygroup.id)["id"] cgsnapshot = utils.create_cgsnapshot(self.ctxt, consistencygroup_id=consistencygroup.id) snapshot = utils.create_snapshot(self.ctxt, volume_id, cgsnapshot_id=cgsnapshot.id, status="available") 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 = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict["badRequest"]["code"]) msg = _("Invalid ConsistencyGroup: No host to create consistency " "group") self.assertIn(msg, res_dict["badRequest"]["message"]) snapshot.destroy() db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy() cgsnapshot.destroy()
def test_update_consistencygroup_add_volume_invalid_state(self): volume_type_id = "123456" consistencygroup = self._create_consistencygroup(ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) add_volume_id = utils.create_volume(self.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": "cg1", "description": "", "add_volumes": add_volumes, "remove_volumes": None} } req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.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"]) consistencygroup.destroy()
def test_create_consistencygroup_from_src_cgsnapshot_notfound(self): consistencygroup = utils.create_consistencygroup(self.ctxt) volume_id = utils.create_volume(self.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": "fake_cgsnap", } } req = webob.Request.blank("/v2/fake/consistencygroups/create_from_src") req.method = "POST" req.headers["Content-Type"] = "application/json" req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(404, res.status_int) self.assertEqual(404, res_dict["itemNotFound"]["code"]) self.assertIsNotNone(res_dict["itemNotFound"]["message"]) db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy()
def test_update_consistencygroup_remove_volume_not_found(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' body = {"consistencygroup": {"name": None, "description": "new description", "add_volumes": None, "remove_volumes": "fake-volume-uuid", }} 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 remove volume fake-volume-uuid " "from consistency group %(group_id)s because it is not " "in the group.") % {'group_id': consistencygroup.id}) self.assertEqual(msg, res_dict['badRequest']['message']) consistencygroup.destroy()
def test_create_consistencygroup_from_src_cgsnapshot_empty(self): consistencygroup = utils.create_consistencygroup(self.ctxt) volume_id = utils.create_volume( self.ctxt, consistencygroup_id=consistencygroup.id)['id'] cgsnapshot = utils.create_cgsnapshot( self.ctxt, consistencygroup_id=consistencygroup.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']) self.assertIsNotNone(res_dict['badRequest']['message']) db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy() cgsnapshot.destroy()
def test_update_consistencygroup_add_volume_invalid_state(self): volume_type_id = '123456' consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) add_volume_id = utils.create_volume( self.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": "cg1", "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']) consistencygroup.destroy()
def test_update_consistencygroup_add_volume_invalid_volume_type(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) wrong_type = 'wrong-volume-type-id' add_volume_id = utils.create_volume(self.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": "cg1", "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']) consistencygroup.destroy()
def test_update_consistencygroup_add_volume_already_in_cg(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) add_volume_id = utils.create_volume( self.ctxt, consistencygroup_id='some_other_cg')['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": "cg1", "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']) self.assertIsNotNone(res_dict['badRequest']['message']) consistencygroup.destroy()
def test_update_consistencygroup_add_volume_invalid_volume_type(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) wrong_type = 'wrong-volume-type-id' add_volume_id = utils.create_volume( self.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": "cg1", "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']) consistencygroup.destroy()
def test_update_consistencygroup_add_volume_invalid_volume_type(self): consistencygroup = self._create_consistencygroup(ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) wrong_type = "wrong-volume-type-id" add_volume_id = utils.create_volume(self.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": "cg1", "description": "", "add_volumes": add_volumes, "remove_volumes": None} } req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.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"]) consistencygroup.destroy()
def test_update_consistencygroup_remove_volume_not_found(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' body = { "consistencygroup": { "name": None, "description": "new description", "add_volumes": None, "remove_volumes": "fake-volume-uuid", } } 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 remove volume fake-volume-uuid " "from consistency group %(group_id)s because it is not " "in the group.") % { 'group_id': consistencygroup.id }) self.assertEqual(msg, res_dict['badRequest']['message']) consistencygroup.destroy()
def test_create_consistencygroup_from_src(self, mock_validate): self.stubs.Set(volume_api.API, "create", stubs.stub_volume_create) consistencygroup = utils.create_consistencygroup(self.ctxt) volume_id = utils.create_volume(self.ctxt, consistencygroup_id=consistencygroup.id)["id"] cgsnapshot = utils.create_cgsnapshot(self.ctxt, consistencygroup_id=consistencygroup.id) snapshot = utils.create_snapshot(self.ctxt, volume_id, cgsnapshot_id=cgsnapshot.id, status="available") 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 = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(202, res.status_int) self.assertIn("id", res_dict["consistencygroup"]) self.assertEqual(test_cg_name, res_dict["consistencygroup"]["name"]) self.assertTrue(mock_validate.called) cg_ref = objects.ConsistencyGroup.get_by_id(self.ctxt.elevated(), res_dict["consistencygroup"]["id"]) cg_ref.destroy() snapshot.destroy() db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy() cgsnapshot.destroy()
def test_update_consistencygroup_remove_volume_not_found(self): consistencygroup = self._create_consistencygroup(ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = webob.Request.blank("/v2/fake/consistencygroups/%s/update" % consistencygroup.id) req.method = "PUT" req.headers["Content-Type"] = "application/json" body = { "consistencygroup": { "name": None, "description": "new description", "add_volumes": None, "remove_volumes": "fake-volume-uuid", } } req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict["badRequest"]["code"]) msg = _( "Invalid volume: Cannot remove volume fake-volume-uuid " "from consistency group %(group_id)s because it is not " "in the group." ) % {"group_id": consistencygroup.id} self.assertEqual(msg, res_dict["badRequest"]["message"]) consistencygroup.destroy()
def test_create_consistencygroup_from_src_cgsnapshot_empty(self): consistencygroup = utils.create_consistencygroup(self.ctxt) volume_id = utils.create_volume( self.ctxt, consistencygroup_id=consistencygroup.id)['id'] cgsnapshot = utils.create_cgsnapshot( self.ctxt, consistencygroup_id=consistencygroup.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']) self.assertIsNotNone(res_dict['badRequest']['message']) db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy() cgsnapshot.destroy()
def test_update_consistencygroup_success(self, mock_validate): volume_type_id = '123456' consistencygroup = self._create_consistencygroup( status=fields.ConsistencyGroupStatus.AVAILABLE, host='test_host') remove_volume_id = utils.create_volume( self.ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup.id)['id'] remove_volume_id2 = utils.create_volume( self.ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup.id)['id'] self.assertEqual(fields.ConsistencyGroupStatus.AVAILABLE, consistencygroup.status) cg_volumes = db.volume_get_all_by_group(self.ctxt.elevated(), consistencygroup.id) cg_vol_ids = [cg_vol['id'] for cg_vol in cg_volumes] self.assertIn(remove_volume_id, cg_vol_ids) self.assertIn(remove_volume_id2, cg_vol_ids) add_volume_id = utils.create_volume( self.ctxt, volume_type_id=volume_type_id)['id'] add_volume_id2 = utils.create_volume( self.ctxt, volume_type_id=volume_type_id)['id'] req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' name = 'newcg' description = 'New Consistency Group Description' add_volumes = add_volume_id + "," + add_volume_id2 remove_volumes = remove_volume_id + "," + remove_volume_id2 body = { "consistencygroup": { "name": name, "description": description, "add_volumes": add_volumes, "remove_volumes": remove_volumes, } } req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) consistencygroup = objects.ConsistencyGroup.get_by_id( self.ctxt, consistencygroup.id) self.assertEqual(202, res.status_int) self.assertTrue(mock_validate.called) self.assertEqual(fields.ConsistencyGroupStatus.UPDATING, consistencygroup.status) consistencygroup.destroy()
def test_update_consistencygroup_success(self, mock_validate): volume_type_id = '123456' consistencygroup = self._create_consistencygroup( status=fields.ConsistencyGroupStatus.AVAILABLE, host='test_host') remove_volume_id = utils.create_volume( self.ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup.id)['id'] remove_volume_id2 = utils.create_volume( self.ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup.id)['id'] self.assertEqual(fields.ConsistencyGroupStatus.AVAILABLE, consistencygroup.status) cg_volumes = db.volume_get_all_by_group(self.ctxt.elevated(), consistencygroup.id) cg_vol_ids = [cg_vol['id'] for cg_vol in cg_volumes] self.assertIn(remove_volume_id, cg_vol_ids) self.assertIn(remove_volume_id2, cg_vol_ids) add_volume_id = utils.create_volume( self.ctxt, volume_type_id=volume_type_id)['id'] add_volume_id2 = utils.create_volume( self.ctxt, volume_type_id=volume_type_id)['id'] req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' name = 'newcg' description = 'New Consistency Group Description' add_volumes = add_volume_id + "," + add_volume_id2 remove_volumes = remove_volume_id + "," + remove_volume_id2 body = {"consistencygroup": {"name": name, "description": description, "add_volumes": add_volumes, "remove_volumes": remove_volumes, }} req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) consistencygroup = objects.ConsistencyGroup.get_by_id( self.ctxt, consistencygroup.id) self.assertEqual(202, res.status_int) self.assertTrue(mock_validate.called) self.assertEqual(fields.ConsistencyGroupStatus.UPDATING, consistencygroup.status) consistencygroup.destroy()
def test_show_consistencygroup_xml_content_type(self): consistencygroup = self._create_consistencygroup() req = webob.Request.blank("/v2/fake/consistencygroups/%s" % consistencygroup.id) 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) consistencygroups = dom.getElementsByTagName("consistencygroup") name = consistencygroups.item(0).getAttribute("name") self.assertEqual("test_consistencygroup", name.strip()) consistencygroup.destroy()
def test_show_consistencygroup_xml_content_type(self): consistencygroup = self._create_consistencygroup() req = webob.Request.blank('/v2/fake/consistencygroups/%s' % consistencygroup.id) 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) consistencygroups = dom.getElementsByTagName('consistencygroup') name = consistencygroups.item(0).getAttribute('name') self.assertEqual("test_consistencygroup", name.strip()) consistencygroup.destroy()
def test_delete_consistencygroup_available(self): consistencygroup = self._create_consistencygroup(status=fields.ConsistencyGroupStatus.AVAILABLE) req = webob.Request.blank("/v2/fake/consistencygroups/%s/delete" % consistencygroup.id) req.method = "POST" req.headers["Content-Type"] = "application/json" body = {"consistencygroup": {"force": True}} req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) consistencygroup = objects.ConsistencyGroup.get_by_id(self.ctxt, consistencygroup.id) self.assertEqual(202, res.status_int) self.assertEqual(fields.ConsistencyGroupStatus.DELETING, consistencygroup.status) consistencygroup.destroy()
def test_update_consistencygroup_empty_parameters(self): consistencygroup = self._create_consistencygroup(ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = webob.Request.blank("/v2/fake/consistencygroups/%s/update" % consistencygroup.id) req.method = "PUT" req.headers["Content-Type"] = "application/json" body = {"consistencygroup": {"name": "", "description": "", "add_volumes": None, "remove_volumes": None}} req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict["badRequest"]["code"]) consistencygroup.destroy()
def test_delete_consistencygroup_available(self): consistencygroup = self._create_consistencygroup(status='available') req = webob.Request.blank('/v2/fake/consistencygroups/%s/delete' % consistencygroup.id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' body = {"consistencygroup": {"force": True}} req.body = json.dumps(body) res = req.get_response(fakes.wsgi_app()) consistencygroup = objects.ConsistencyGroup.get_by_id( self.ctxt, consistencygroup.id) self.assertEqual(202, res.status_int) self.assertEqual('deleting', consistencygroup.status) consistencygroup.destroy()
def test_show_consistencygroup(self): consistencygroup = self._create_consistencygroup() req = webob.Request.blank("/v2/fake/consistencygroups/%s" % consistencygroup.id) req.method = "GET" req.headers["Content-Type"] = "application/json" res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(200, res.status_int) self.assertEqual("az1", res_dict["consistencygroup"]["availability_zone"]) self.assertEqual("this is a test consistency group", res_dict["consistencygroup"]["description"]) self.assertEqual("test_consistencygroup", res_dict["consistencygroup"]["name"]) self.assertEqual("creating", res_dict["consistencygroup"]["status"]) self.assertEqual(["123456"], res_dict["consistencygroup"]["volume_types"]) consistencygroup.destroy()
def test_update_consistencygroup_no_body(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = fakes.HTTPRequest.blank('/v3/%s/consistencygroups/%s/update' % (fake.PROJECT_ID, consistencygroup.id)) req.environ['cinder.context'].is_admin = True req.headers['Content-Type'] = 'application/json' req.headers['OpenStack-API-Version'] = 'volume 3.5' req.api_version_request = api_version.APIVersionRequest('3.5') body = None self.assertRaisesRegexp(webob.exc.HTTPBadRequest, "Missing request body", self.controller.update, req, consistencygroup.id, body) consistencygroup.destroy()
def test_update_consistencygroup_empty_parameters_unsupport_version(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = fakes.HTTPRequest.blank('/v3/%s/consistencygroups/%s/update' % (fake.PROJECT_ID, consistencygroup.id)) req.environ['cinder.context'].is_admin = True req.headers['Content-Type'] = 'application/json' req.headers['OpenStack-API-Version'] = 'volume 3.5' req.api_version_request = api_version.APIVersionRequest('3.5') body = {"consistencygroup": {"name": "", "description": "", "add_volumes": None, "remove_volumes": None, }} self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, req, consistencygroup.id, body) consistencygroup.destroy()
def test_delete_consistencygroup_with_Invalidconsistencygroup(self): consistencygroup = self._create_consistencygroup(status='invalid') req = webob.Request.blank('/v2/fake/consistencygroups/%s/delete' % consistencygroup.id) req.method = 'POST' req.headers['Content-Type'] = 'application/json' body = {"consistencygroup": {"force": False}} 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: Consistency group status must be ' 'available or error, but current status is: invalid')) self.assertEqual(msg, res_dict['badRequest']['message']) consistencygroup.destroy()
def test_update_consistencygroup_empty_parameters(self): consistencygroup = self._create_consistencygroup(ctxt=self.ctxt, status='available') req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' body = {"consistencygroup": {"name": "", "description": "", "add_volumes": None, "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']) consistencygroup.destroy()
def test_show_consistencygroup(self): consistencygroup = self._create_consistencygroup() req = webob.Request.blank('/v2/fake/consistencygroups/%s' % consistencygroup.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(200, res.status_int) self.assertEqual('az1', res_dict['consistencygroup']['availability_zone']) self.assertEqual('this is a test consistency group', res_dict['consistencygroup']['description']) self.assertEqual('test_consistencygroup', res_dict['consistencygroup']['name']) self.assertEqual('creating', res_dict['consistencygroup']['status']) consistencygroup.destroy()
def test_delete_consistencygroup_with_Invalidconsistencygroup(self): consistencygroup = self._create_consistencygroup(status=fields.ConsistencyGroupStatus.IN_USE) req = webob.Request.blank("/v2/fake/consistencygroups/%s/delete" % consistencygroup.id) req.method = "POST" req.headers["Content-Type"] = "application/json" body = {"consistencygroup": {"force": False}} req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict["badRequest"]["code"]) msg = _( "Invalid ConsistencyGroup: Consistency group status must be " "available or error, but current status is: in-use" ) self.assertEqual(msg, res_dict["badRequest"]["message"]) consistencygroup.destroy()
def test_update_consistencygroup_add_volume_already_in_cg(self): consistencygroup = self._create_consistencygroup(ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) add_volume_id = utils.create_volume(self.ctxt, consistencygroup_id="some_other_cg")["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": "cg1", "description": "", "add_volumes": add_volumes, "remove_volumes": None} } req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict["badRequest"]["code"]) self.assertIsNotNone(res_dict["badRequest"]["message"]) consistencygroup.destroy()
def test_update_consistencygroup_all_empty_parameters_version_36(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = fakes.HTTPRequest.blank('/v3/%s/consistencygroups/%s/update' % (fake.PROJECT_ID, consistencygroup.id)) req.environ['cinder.context'].is_admin = True req.headers['Content-Type'] = 'application/json' req.headers['OpenStack-API-Version'] = 'volume 3.6' req.api_version_request = api_version.APIVersionRequest('3.6') body = {"consistencygroup": {"name": None, "description": None, "add_volumes": None, "remove_volumes": None, }} self.assertRaisesRegexp(webob.exc.HTTPBadRequest, "Must specify " "one or more of the following keys to " "update: name, description, add_volumes, " "remove_volumes.", self.controller.update, req, consistencygroup.id, body) consistencygroup.destroy()
def test_update_consistencygroup_empty_parameters_unsupport_version(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = fakes.HTTPRequest.blank('/v3/%s/consistencygroups/%s/update' % (fake.PROJECT_ID, consistencygroup.id)) req.environ['cinder.context'].is_admin = True req.headers['Content-Type'] = 'application/json' req.headers['OpenStack-API-Version'] = 'volume 3.5' req.api_version_request = api_version.APIVersionRequest('3.5') body = { "consistencygroup": { "name": "", "description": "", "add_volumes": None, "remove_volumes": None, } } self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, req, consistencygroup.id, body) consistencygroup.destroy()
def test_update_consistencygroup_invalid_state(self): consistencygroup = self._create_consistencygroup(status=fields.ConsistencyGroupStatus.IN_USE, ctxt=self.ctxt) req = webob.Request.blank("/v2/fake/consistencygroups/%s/update" % consistencygroup.id) req.method = "PUT" req.headers["Content-Type"] = "application/json" body = { "consistencygroup": {"name": "new name", "description": None, "add_volumes": None, "remove_volumes": None} } req.body = jsonutils.dump_as_bytes(body) res = req.get_response(fakes.wsgi_app()) res_dict = jsonutils.loads(res.body) self.assertEqual(400, res.status_int) self.assertEqual(400, res_dict["badRequest"]["code"]) msg = _( "Invalid ConsistencyGroup: Consistency group status must be " "available, but current status is: %s." ) % (fields.ConsistencyGroupStatus.IN_USE) self.assertEqual(msg, res_dict["badRequest"]["message"]) consistencygroup.destroy()
def test_create_consistencygroup_from_src(self, mock_validate): self.stubs.Set(volume_api.API, "create", stubs.stub_volume_create) consistencygroup = utils.create_consistencygroup(self.ctxt) volume_id = utils.create_volume( self.ctxt, consistencygroup_id=consistencygroup.id)['id'] cgsnapshot = utils.create_cgsnapshot( self.ctxt, consistencygroup_id=consistencygroup.id) snapshot = utils.create_snapshot(self.ctxt, volume_id, cgsnapshot_id=cgsnapshot.id, status='available') 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(202, res.status_int) self.assertIn('id', res_dict['consistencygroup']) self.assertEqual(test_cg_name, res_dict['consistencygroup']['name']) self.assertTrue(mock_validate.called) cg_ref = objects.ConsistencyGroup.get_by_id( self.ctxt.elevated(), res_dict['consistencygroup']['id']) cg_ref.destroy() snapshot.destroy() db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy() cgsnapshot.destroy()
def test_create_consistencygroup_from_src(self, mock_validate): self.stubs.Set(volume_api.API, "create", stubs.stub_volume_create) consistencygroup = utils.create_consistencygroup(self.ctxt) volume_id = utils.create_volume( self.ctxt, consistencygroup_id=consistencygroup.id)['id'] cgsnapshot_id = utils.create_cgsnapshot( self.ctxt, consistencygroup_id=consistencygroup.id)['id'] snapshot_id = utils.create_snapshot( self.ctxt, volume_id, cgsnapshot_id=cgsnapshot_id, status='available')['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(202, res.status_int) self.assertIn('id', res_dict['consistencygroup']) self.assertEqual(test_cg_name, res_dict['consistencygroup']['name']) self.assertTrue(mock_validate.called) cg_ref = objects.ConsistencyGroup.get_by_id( self.ctxt.elevated(), res_dict['consistencygroup']['id']) cg_ref.destroy() db.snapshot_destroy(self.ctxt.elevated(), snapshot_id) db.cgsnapshot_destroy(self.ctxt.elevated(), cgsnapshot_id) db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy()
def test_update_consistencygroups_no_empty_parameters(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = fakes.HTTPRequest.blank('/v3/%s/consistencygroups/%s/update' % (fake.PROJECT_ID, consistencygroup.id)) req.environ['cinder.context'].is_admin = True req.headers['Content-Type'] = 'application/json' req.headers['OpenStack-API-Version'] = 'volume 3.5' req.api_version_request = api_version.APIVersionRequest('3.5') body = {"consistencygroup": {"name": "my_fake_cg", "description": "fake consistency group", "add_volumes": "volume-uuid-1", "remove_volumes": "volume-uuid-2, volume uuid-3", }} allow_empty = self.controller._check_update_parameters_v3( req, body['consistencygroup']['name'], body['consistencygroup']['description'], body['consistencygroup']['add_volumes'], body['consistencygroup']['remove_volumes']) self.assertEqual(False, allow_empty) consistencygroup.destroy()
def test_update_consistencygroup_invalid_state(self): wrong_status = 'wrong_status' consistencygroup = self._create_consistencygroup(status=wrong_status, ctxt=self.ctxt) req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' body = {"consistencygroup": {"name": "new name", "description": None, "add_volumes": None, "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 ConsistencyGroup: Consistency group status must be " "available, but current status is: %s.") % wrong_status self.assertEqual(msg, res_dict['badRequest']['message']) consistencygroup.destroy()
def test_update_consistencygroup_empty_parameters(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = fakes.HTTPRequest.blank('/v3/%s/consistencygroups/%s/update' % (fake.PROJECT_ID, consistencygroup.id)) req.environ['cinder.context'].is_admin = True req.headers['Content-Type'] = 'application/json' req.headers['OpenStack-API-Version'] = 'volume 3.6' req.api_version_request = api_version.APIVersionRequest('3.6') body = {"consistencygroup": {"name": "", "description": "", "add_volumes": None, "remove_volumes": None, }} res_dict = self.controller.update(req, consistencygroup.id, body) consistencygroup = objects.ConsistencyGroup.get_by_id( self.ctxt, consistencygroup.id) self.assertEqual(202, res_dict.status_int) self.assertEqual("", consistencygroup.name) self.assertEqual("", consistencygroup.description) consistencygroup.destroy()
def test_update_consistencygroup_empty_parameters(self): consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) req = webob.Request.blank('/v2/fake/consistencygroups/%s/update' % consistencygroup.id) req.method = 'PUT' req.headers['Content-Type'] = 'application/json' body = { "consistencygroup": { "name": "", "description": "", "add_volumes": None, "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']) consistencygroup.destroy()
def test_update_consistencygroup_add_volume_invalid_state(self): volume_type_id = '123456' consistencygroup = self._create_consistencygroup( ctxt=self.ctxt, status=fields.ConsistencyGroupStatus.AVAILABLE) add_volume_id = utils.create_volume(self.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": "cg1", "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']) consistencygroup.destroy()
def test_create_consistencygroup_from_src_no_host(self): consistencygroup = utils.create_consistencygroup(self.ctxt, host=None) volume_id = utils.create_volume( self.ctxt, consistencygroup_id=consistencygroup.id)['id'] cgsnapshot_id = utils.create_cgsnapshot( self.ctxt, consistencygroup_id=consistencygroup.id)['id'] snapshot_id = utils.create_snapshot(self.ctxt, volume_id, cgsnapshot_id=cgsnapshot_id, status='available')['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: No host to create consistency ' 'group') self.assertIn(msg, res_dict['badRequest']['message']) db.snapshot_destroy(self.ctxt.elevated(), snapshot_id) db.cgsnapshot_destroy(self.ctxt.elevated(), cgsnapshot_id) db.volume_destroy(self.ctxt.elevated(), volume_id) consistencygroup.destroy()