Exemple #1
0
    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()
Exemple #10
0
    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()
Exemple #11
0
    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()
Exemple #13
0
    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()
Exemple #14
0
    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()
Exemple #15
0
    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()
Exemple #16
0
    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()
Exemple #17
0
    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()
Exemple #18
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, 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()
Exemple #20
0
 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()
Exemple #21
0
 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()
Exemple #22
0
    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()
Exemple #23
0
    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()
Exemple #25
0
    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_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_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_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()
Exemple #33
0
    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()
Exemple #34
0
    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()
Exemple #37
0
    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_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()
Exemple #39
0
    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()
Exemple #44
0
    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()
Exemple #45
0
    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()