def get_all_by_group(cls, context, group_id, filters=None): volumes = db.volume_get_all_by_group(context, group_id, filters) expected_attrs = cls._get_expected_attrs(context) return base.obj_make_list(context, cls(context), objects.Volume, volumes, expected_attrs=expected_attrs)
def get_all_by_group(cls, context, group_id, filters=None): volumes = db.volume_get_all_by_group(context, group_id, filters) expected_attrs = ['admin_metadata', 'metadata'] return base.obj_make_list(context, cls(context), objects.Volume, volumes, expected_attrs=expected_attrs)
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): volume_type_id = '123456' ctxt = context.RequestContext('fake', 'fake') consistencygroup_id = self._create_consistencygroup(status='available', host='test_host') remove_volume_id = utils.create_volume( ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup_id)['id'] remove_volume_id2 = utils.create_volume( ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup_id)['id'] self.assertEqual( 'available', self._get_consistencygroup_attrib(consistencygroup_id, 'status')) cg_volumes = db.volume_get_all_by_group(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( ctxt, volume_type_id=volume_type_id)['id'] add_volume_id2 = utils.create_volume( 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()) self.assertEqual(202, res.status_int) self.assertEqual( 'updating', self._get_consistencygroup_attrib(consistencygroup_id, 'status')) db.consistencygroup_destroy(ctxt.elevated(), consistencygroup_id)
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): volume_type_id = '123456' ctxt = context.RequestContext('fake', 'fake') consistencygroup_id = self._create_consistencygroup(status='available', host='test_host') remove_volume_id = utils.create_volume( ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup_id)['id'] remove_volume_id2 = utils.create_volume( ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup_id)['id'] self.assertEqual('available', self._get_consistencygroup_attrib(consistencygroup_id, 'status')) cg_volumes = db.volume_get_all_by_group(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( ctxt, volume_type_id=volume_type_id)['id'] add_volume_id2 = utils.create_volume( 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()) self.assertEqual(202, res.status_int) self.assertEqual('updating', self._get_consistencygroup_attrib(consistencygroup_id, 'status')) db.consistencygroup_destroy(ctxt.elevated(), consistencygroup_id)
def test_update_consistencygroup_success(self): volume_type_id = "123456" ctxt = context.RequestContext("fake", "fake") consistencygroup_id = self._create_consistencygroup(status="available", host="test_host") remove_volume_id = utils.create_volume( ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup_id )["id"] remove_volume_id2 = utils.create_volume( ctxt, volume_type_id=volume_type_id, consistencygroup_id=consistencygroup_id )["id"] self.assertEqual("available", self._get_consistencygroup_attrib(consistencygroup_id, "status")) cg_volumes = db.volume_get_all_by_group(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(ctxt, volume_type_id=volume_type_id)["id"] add_volume_id2 = utils.create_volume(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()) self.assertEqual(202, res.status_int) self.assertEqual("updating", self._get_consistencygroup_attrib(consistencygroup_id, "status")) db.consistencygroup_destroy(ctxt.elevated(), consistencygroup_id)
def create_cgsnapshot(ctxt, consistencygroup_id, name='test_cgsnapshot', description='this is a test cgsnapshot', status='creating', recursive_create_if_needed=True, return_vo=True, **kwargs): """Create a cgsnapshot object in the DB.""" values = { 'user_id': ctxt.user_id or fake.USER_ID, 'project_id': ctxt.project_id or fake.PROJECT_ID, 'status': status, 'name': name, 'description': description, 'consistencygroup_id': consistencygroup_id} values.update(kwargs) if recursive_create_if_needed and consistencygroup_id: create_cg = False try: objects.ConsistencyGroup.get_by_id(ctxt, consistencygroup_id) create_vol = not db.volume_get_all_by_group( ctxt, consistencygroup_id) except exception.ConsistencyGroupNotFound: create_cg = True create_vol = True if create_cg: create_consistencygroup(ctxt, id=consistencygroup_id) if create_vol: create_volume(ctxt, consistencygroup_id=consistencygroup_id) cgsnap = db.cgsnapshot_create(ctxt, values) if not return_vo: return cgsnap return objects.CGSnapshot.get_by_id(ctxt, cgsnap.id)
def test_update_consistencygroup(self, fake_update_cg, fake_create_cg, fake_rollback, fake_commit, fake_reserve): """Test consistencygroup can be updated.""" group = tests_utils.create_consistencygroup( self.context, availability_zone=CONF.storage_availability_zone, volume_type='type1,type2') self.volume.create_consistencygroup(self.context, group) volume = tests_utils.create_volume( self.context, consistencygroup_id=group.id, **self.volume_params) volume_id = volume['id'] self.volume.create_volume(self.context, volume_id) volume2 = tests_utils.create_volume( self.context, consistencygroup_id=None, **self.volume_params) volume_id2 = volume2['id'] self.volume.create_volume(self.context, volume_id2) fake_update_cg.return_value = ( {'status': fields.ConsistencyGroupStatus.AVAILABLE}, [{'id': volume_id2, 'status': 'available'}], [{'id': volume_id, 'status': 'available'}]) self.volume.update_consistencygroup(self.context, group, add_volumes=volume_id2, remove_volumes=volume_id) cg = objects.ConsistencyGroup.get_by_id(self.context, group.id) expected = { 'status': fields.ConsistencyGroupStatus.AVAILABLE, 'name': 'test_cg', 'availability_zone': 'nova', 'tenant_id': self.context.project_id, 'created_at': 'DONTCARE', 'user_id': fake.USER_ID, 'consistencygroup_id': group.id } self.assertEqual(fields.ConsistencyGroupStatus.AVAILABLE, cg.status) self.assertEqual(10, len(self.notifier.notifications), self.notifier.notifications) msg = self.notifier.notifications[6] self.assertEqual('consistencygroup.update.start', msg['event_type']) self.assertDictMatch(expected, msg['payload']) msg = self.notifier.notifications[8] self.assertEqual('consistencygroup.update.end', msg['event_type']) self.assertDictMatch(expected, msg['payload']) cgvolumes = db.volume_get_all_by_group(self.context, group.id) cgvol_ids = [cgvol['id'] for cgvol in cgvolumes] # Verify volume is removed. self.assertNotIn(volume_id, cgvol_ids) # Verify volume is added. self.assertIn(volume_id2, cgvol_ids) self.volume_params['status'] = 'wrong-status' volume3 = tests_utils.create_volume( self.context, consistencygroup_id=None, **self.volume_params) volume_id3 = volume3['id'] volume_get_orig = self.volume.db.volume_get self.volume.db.volume_get = mock.Mock( return_value={'status': 'wrong_status', 'id': volume_id3}) # Try to add a volume in wrong status self.assertRaises(exception.InvalidVolume, self.volume.update_consistencygroup, self.context, group, add_volumes=volume_id3, remove_volumes=None) self.volume.db.volume_get.reset_mock() self.volume.db.volume_get = volume_get_orig