Example #1
0
 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)
Example #2
0
 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)
Example #3
0
    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)
Example #7
0
    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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
 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)
Example #11
0
    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
 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)