def _encryption_update_bad_body(self, update_body, msg):

        # Create Volume Type and Encryption
        volume_type = self._default_volume_type
        res = self._create_type_and_encryption(volume_type)

        # Update Encryption
        res = self.\
            _get_response(volume_type, req_method='PUT',
                          req_body=json.dumps(update_body),
                          req_headers='application/json',
                          url='/v2/fake/types/%s/encryption/fake_type_id')

        res_dict = json.loads(res.body)

        expected = {
            'badRequest': {
                'code': 400,
                'message': (msg)
            }
        }

        # Confirm Failure
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #2
0
def destroy(context, id):
    """Marks volume types as deleted."""
    if id is None:
        msg = _("id cannot be None")
        raise exception.InvalidVolumeType(reason=msg)
    else:
        db.volume_type_destroy(context, id)
    def test_update_item(self):
        volume_type = self._default_volume_type

        # Create Encryption Specs
        create_body = {"encryption": {'cipher': 'cipher',
                                      'control_location': 'front-end',
                                      'key_size': 128,
                                      'provider': 'fake_provider',
                                      'volume_type_id': volume_type['id']}}
        self._create_type_and_encryption(volume_type, create_body)

        # Update Encryption Specs
        update_body = {"encryption": {'key_size': 512,
                                      'provider': 'fake_provider2'}}

        res = self.\
            _get_response(volume_type, req_method='PUT',
                          req_body=json.dumps(update_body),
                          req_headers='application/json',
                          url='/v2/fake/types/%s/encryption/fake_type_id')

        res_dict = json.loads(res.body)
        self.assertEqual(512, res_dict['encryption']['key_size'])
        self.assertEqual('fake_provider2', res_dict['encryption']['provider'])

        # Get Encryption Specs
        res = self._get_response(volume_type)
        res_dict = json.loads(res.body)

        # Confirm Encryption Specs
        self.assertEqual(512, res_dict['key_size'])
        self.assertEqual('fake_provider2', res_dict['provider'])

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def test_create_encryption_type_exists(self):
        self.stubs.Set(db, 'volume_type_encryption_get',
                       return_volume_type_encryption)

        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {"encryption": {'cipher': 'cipher',
                               'control_location': 'front-end',
                               'key_size': 128,
                               'provider': 'fake_provider',
                               'volume_type_id': volume_type['id']}}

        # Try to create encryption specs for a volume type
        # that already has them.
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res_dict = json.loads(res.body)

        expected = {
            'badRequest': {
                'code': 400,
                'message': ('Volume type encryption for type '
                            'fake_type_id already exists.')
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #5
0
    def test_create_encryption_type_exists(self):
        self.stubs.Set(db, "volume_type_encryption_get", return_volume_type_encryption)

        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {
            "encryption": {
                "cipher": "cipher",
                "control_location": "front-end",
                "key_size": 128,
                "provider": "fake_provider",
                "volume_type_id": volume_type["id"],
            }
        }

        # Try to create encryption specs for a volume type
        # that already has them.
        res = self._get_response(
            volume_type, req_method="POST", req_body=json.dumps(body), req_headers="application/json"
        )
        res_dict = json.loads(res.body)

        expected = {
            "badRequest": {"code": 400, "message": ("Volume type encryption for type " "fake_type_id already exists.")}
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
 def tearDown(self):
     # Remove the volume type from the database
     db.volume_type_destroy(context.get_admin_context(),
                            self.vol_type1['id'])
     db.volume_type_destroy(context.get_admin_context(),
                            self.vol_type2_noextra['id'])
     super(VolumeTypeExtraSpecsTestCase, self).tearDown()
Example #7
0
def destroy(context, id):
    """Marks volume types as deleted."""
    if id is None:
        msg = _("id cannot be None")
        raise exception.InvalidVolumeType(reason=msg)
    else:
        elevated = context if context.is_admin else context.elevated()
        db.volume_type_destroy(elevated, id)
Example #8
0
    def test_create_group_from_group(self, mock_policy, mock_volume_get_all,
                                     mock_rpc_create_group_from_src,
                                     mock_group_get,
                                     mock_volume_api_create,
                                     mock_mapping_create,
                                     mock_get_volume_type):
        vol_type = utils.create_volume_type(self.ctxt,
                                            name = 'fake_volume_type')
        mock_get_volume_type.return_value = vol_type

        grp = utils.create_group(self.ctxt, group_type_id = fake.GROUP_TYPE_ID,
                                 volume_type_ids = [vol_type['id']],
                                 availability_zone = 'nova',
                                 status = fields.GroupStatus.CREATING)
        mock_group_get.return_value = grp

        vol = utils.create_volume(
            self.ctxt,
            availability_zone = grp.availability_zone,
            volume_type_id = fake.VOLUME_TYPE_ID,
            group_id = grp.id)
        mock_volume_get_all.return_value = [vol]

        grp2 = utils.create_group(self.ctxt,
                                  group_type_id = fake.GROUP_TYPE_ID,
                                  volume_type_ids = [vol_type['id']],
                                  availability_zone = 'nova',
                                  source_group_id = grp.id,
                                  status = fields.GroupStatus.CREATING)

        vol2 = utils.create_volume(
            self.ctxt,
            availability_zone = grp.availability_zone,
            volume_type_id = vol_type['id'],
            group_id = grp2.id,
            source_volid = vol.id)

        self.group_api._create_group_from_source_group(self.ctxt, grp2,
                                                       grp.id)

        mock_volume_api_create.assert_called_once_with(
            self.ctxt, 1, None, None,
            availability_zone = grp.availability_zone,
            source_group = grp,
            group = grp2,
            source_volume = vol,
            volume_type = vol_type)

        mock_rpc_create_group_from_src.assert_called_once_with(
            self.ctxt, grp2, None, grp)

        vol2.destroy()
        grp2.destroy()
        vol.destroy()
        grp.destroy()
        db.volume_type_destroy(self.ctxt, vol_type['id'])
    def test_show_provider(self):
        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)

        res = self._get_response(volume_type, url="/v2/fake/types/%s/encryption/provider")
        res_dict = json.loads(res.body)

        self.assertEqual(200, res.status_code)
        self.assertEqual("fake_provider", res_dict["provider"])
        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
    def test_show_item_not_found(self):
        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)

        res = self._get_response(volume_type, url="/v2/fake/types/%s/encryption/fake")
        res_dict = json.loads(res.body)

        self.assertEqual(404, res.status_code)
        expected = {"itemNotFound": {"code": 404, "message": ("The resource could not be found.")}}
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
    def test_show_provider(self):
        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)

        res = self._get_response(volume_type,
                                 url='/v2/%s/types/%s/encryption/provider')
        res_dict = jsonutils.loads(res.body)

        self.assertEqual(http_client.OK, res.status_code)
        self.assertEqual('fake_provider', res_dict['provider'])
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def test_show_key_size(self):
        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)
        res = self._get_response(volume_type,
                                 url='/v2/fake/types/%s/encryption/key_size')
        res_dict = json.loads(res.body)

        self.assertEqual(200, res.status_code)
        self.assertEqual(256, res_dict['key_size'])

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #13
0
    def test_show_provider(self):
        self.stubs.Set(db, "volume_type_encryption_get", return_volume_type_encryption)

        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)

        res = self._get_response(volume_type, url="/v2/fake/types/%s/encryption/provider")
        res_dict = json.loads(res.body)

        self.assertEqual(200, res.status_code)
        self.assertEqual("fake_provider", res_dict["provider"])
        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
Example #14
0
    def _encryption_create_bad_body(self, body, msg="Create body is not valid."):
        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)
        res = self._get_response(
            volume_type, req_method="POST", req_body=json.dumps(body), req_headers="application/json"
        )

        res_dict = json.loads(res.body)

        expected = {"badRequest": {"code": 400, "message": (msg)}}
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
Example #15
0
    def test_delete(self):
        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)

        # Test that before create, there's nothing with a get
        res = self._get_response(
            volume_type, req_method="GET", req_headers="application/json", url="/v2/fake/types/%s/encryption"
        )
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual({}, res_dict)

        body = {
            "encryption": {
                "cipher": "cipher",
                "key_size": 128,
                "control_location": "front-end",
                "provider": "fake_provider",
                "volume_type_id": volume_type["id"],
            }
        }

        # Create, and test that get returns something
        res = self._get_response(
            volume_type, req_method="POST", req_body=json.dumps(body), req_headers="application/json"
        )
        res_dict = json.loads(res.body)

        res = self._get_response(
            volume_type, req_method="GET", req_headers="application/json", url="/v2/fake/types/%s/encryption"
        )
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual(volume_type["id"], res_dict["volume_type_id"])

        # Delete, and test that get returns nothing
        res = self._get_response(
            volume_type,
            req_method="DELETE",
            req_headers="application/json",
            url="/v2/fake/types/%s/encryption/provider",
        )
        self.assertEqual(202, res.status_code)
        self.assertEqual(0, len(res.body))
        res = self._get_response(
            volume_type, req_method="GET", req_headers="application/json", url="/v2/fake/types/%s/encryption"
        )
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual({}, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
Example #16
0
    def test_show_item_not_found(self):
        self.stubs.Set(db, "volume_type_encryption_get", return_volume_type_encryption)

        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)

        res = self._get_response(volume_type, url="/v2/fake/types/%s/encryption/fake")
        res_dict = json.loads(res.body)

        self.assertEqual(404, res.status_code)
        expected = {"itemNotFound": {"code": 404, "message": ("The resource could not be found.")}}
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
    def _encryption_create_bad_body(self, body):

        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=jsonutils.dump_as_bytes(body),
                                 req_headers='application/json')

        res_dict = jsonutils.loads(res.body)

        self.assertEqual(http_client.BAD_REQUEST,
                         res_dict['badRequest']['code'])
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def _create(self, cipher, control_location, key_size, provider):
        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {"encryption": {'cipher': cipher,
                               'control_location': control_location,
                               'key_size': key_size,
                               'provider': provider,
                               'volume_type_id': volume_type['id']}}

        self.assertEqual(len(test_notifier.NOTIFICATIONS), 0)
        res = self._get_response(volume_type)
        res_dict = json.loads(res.body)
        self.assertEqual(200, res.status_code)
        # Confirm that volume type has no encryption information
        # before create.
        self.assertEqual('{}', res.body)

        # Create encryption specs for the volume type
        # with the defined body.
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res_dict = json.loads(res.body)

        self.assertEqual(len(test_notifier.NOTIFICATIONS), 1)

        # check response
        self.assertIn('encryption', res_dict)
        self.assertEqual(cipher, res_dict['encryption']['cipher'])
        self.assertEqual(control_location,
                         res_dict['encryption']['control_location'])
        self.assertEqual(key_size, res_dict['encryption']['key_size'])
        self.assertEqual(provider, res_dict['encryption']['provider'])
        self.assertEqual(volume_type['id'],
                         res_dict['encryption']['volume_type_id'])

        # check database
        encryption = db.volume_type_encryption_get(context.get_admin_context(),
                                                   volume_type['id'])
        self.assertIsNotNone(encryption)
        self.assertEqual(cipher, encryption['cipher'])
        self.assertEqual(key_size, encryption['key_size'])
        self.assertEqual(provider, encryption['provider'])
        self.assertEqual(volume_type['id'], encryption['volume_type_id'])

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #19
0
    def test_index(self):
        self.stubs.Set(db, "volume_type_encryption_get", return_volume_type_encryption)

        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)

        res = self._get_response(volume_type)
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)

        expected = stub_volume_type_encryption()
        self.assertEqual(expected, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
    def test_index(self):
        self.mock_object(db, 'volume_type_encryption_get',
                         return_volume_type_encryption)

        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)

        res = self._get_response(volume_type)
        self.assertEqual(http_client.OK, res.status_code)
        res_dict = jsonutils.loads(res.body)

        expected = fake_volume_type_encryption()
        self.assertEqual(expected, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def test_index(self):
        self.stubs.Set(db, 'volume_type_encryption_get',
                       return_volume_type_encryption)

        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)

        res = self._get_response(volume_type)
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)

        expected = stub_volume_type_encryption()
        self.assertEqual(expected, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #22
0
    def _create(self, cipher, control_location, key_size, provider):
        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {
            "encryption": {
                "cipher": cipher,
                "control_location": control_location,
                "key_size": key_size,
                "provider": provider,
                "volume_type_id": volume_type["id"],
            }
        }

        self.assertEqual(len(test_notifier.NOTIFICATIONS), 0)
        res = self._get_response(volume_type)
        res_dict = json.loads(res.body)
        self.assertEqual(200, res.status_code)
        # Confirm that volume type has no encryption information
        # before create.
        self.assertEqual("{}", res.body)

        # Create encryption specs for the volume type
        # with the defined body.
        res = self._get_response(
            volume_type, req_method="POST", req_body=json.dumps(body), req_headers="application/json"
        )
        res_dict = json.loads(res.body)

        self.assertEqual(len(test_notifier.NOTIFICATIONS), 1)

        # check response
        self.assertIn("encryption", res_dict)
        self.assertEqual(cipher, res_dict["encryption"]["cipher"])
        self.assertEqual(control_location, res_dict["encryption"]["control_location"])
        self.assertEqual(key_size, res_dict["encryption"]["key_size"])
        self.assertEqual(provider, res_dict["encryption"]["provider"])
        self.assertEqual(volume_type["id"], res_dict["encryption"]["volume_type_id"])

        # check database
        encryption = db.volume_type_encryption_get(context.get_admin_context(), volume_type["id"])
        self.assertIsNotNone(encryption)
        self.assertEqual(cipher, encryption["cipher"])
        self.assertEqual(key_size, encryption["key_size"])
        self.assertEqual(provider, encryption["provider"])
        self.assertEqual(volume_type["id"], encryption["volume_type_id"])

        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
    def test_delete(self):
        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        # Test that before create, there's nothing with a get
        res = self._get_response(volume_type, req_method='GET',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption')
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual({}, res_dict)

        body = {"encryption": {'cipher': 'cipher',
                               'key_size': 128,
                               'control_location': 'front-end',
                               'provider': 'fake_provider',
                               'volume_type_id': volume_type['id']}}

        # Create, and test that get returns something
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res_dict = json.loads(res.body)

        res = self._get_response(volume_type, req_method='GET',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption')
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual(volume_type['id'], res_dict['volume_type_id'])

        # Delete, and test that get returns nothing
        res = self._get_response(volume_type, req_method='DELETE',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption/provider')
        self.assertEqual(202, res.status_code)
        self.assertEqual(0, len(res.body))
        res = self._get_response(volume_type, req_method='GET',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption')
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual({}, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #24
0
def destroy(context, id):
    """Marks volume types as deleted."""
    if id is None:
        msg = _("id cannot be None")
        raise exception.InvalidVolumeType(reason=msg)
    elevated = context if context.is_admin else context.elevated()
    return db.volume_type_destroy(elevated, id)
Example #25
0
    def test_create_xml(self):
        volume_type = {"id": "fake_type_id", "name": "fake_type"}
        db.volume_type_create(context.get_admin_context(), volume_type)

        ctxt = context.RequestContext("fake", "fake", is_admin=True)

        req = webob.Request.blank("/v2/fake/types/%s/encryption" % volume_type["id"])
        req.method = "POST"
        req.body = '<encryption provider="test_provider" ' 'cipher="cipher" control_location="front-end" />'
        req.headers["Content-Type"] = "application/xml"
        req.headers["Accept"] = "application/xml"
        res = req.get_response(fakes.wsgi_app(fake_auth_context=ctxt))

        self.assertEqual(res.status_int, 200)

        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
Example #26
0
    def _encryption_create_bad_body(self,
                                    body,
                                    msg='Create body is not valid.'):

        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)
        res = self._get_response(volume_type,
                                 req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')

        res_dict = json.loads(res.body)

        expected = {'badRequest': {'code': 400, 'message': (msg)}}
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def _create(self, cipher, control_location, key_size, provider):
        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {"encryption": {'cipher': cipher,
                               'control_location': control_location,
                               'key_size': key_size,
                               'provider': provider,
                               'volume_type_id': volume_type['id']}}

        self.assertEqual(0, len(self.notifier.notifications))
        res = self._get_response(volume_type)
        res_dict = jsonutils.loads(res.body)
        self.assertEqual(http_client.OK, res.status_code)
        # Confirm that volume type has no encryption information
        # before create.
        self.assertEqual(b'{}', res.body)

        # Create encryption specs for the volume type
        # with the defined body.
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=jsonutils.dump_as_bytes(body),
                                 req_headers='application/json')
        res_dict = jsonutils.loads(res.body)

        self.assertEqual(1, len(self.notifier.notifications))

        # check response
        self.assertIn('encryption', res_dict)
        self.assertEqual(cipher, res_dict['encryption']['cipher'])
        self.assertEqual(control_location,
                         res_dict['encryption']['control_location'])
        self.assertEqual(key_size, res_dict['encryption']['key_size'])
        self.assertEqual(provider, res_dict['encryption']['provider'])
        self.assertEqual(volume_type['id'],
                         res_dict['encryption']['volume_type_id'])

        # check database
        encryption = db.volume_type_encryption_get(context.get_admin_context(),
                                                   volume_type['id'])
        self.assertIsNotNone(encryption)
        self.assertEqual(cipher, encryption['cipher'])
        self.assertEqual(key_size, encryption['key_size'])
        self.assertEqual(provider, encryption['provider'])
        self.assertEqual(volume_type['id'], encryption['volume_type_id'])

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #28
0
    def _create(self, cipher, control_location, key_size, provider):
        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {"encryption": {'cipher': cipher,
                               'control_location': control_location,
                               'key_size': key_size,
                               'provider': provider,
                               'volume_type_id': volume_type['id']}}

        self.assertEqual(len(fake_notifier.NOTIFICATIONS), 0)
        res = self._get_response(volume_type)
        res_dict = json.loads(res.body)
        self.assertEqual(200, res.status_code)
        # Confirm that volume type has no encryption information
        # before create.
        self.assertEqual('{}', res.body)

        # Create encryption specs for the volume type
        # with the defined body.
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res_dict = json.loads(res.body)

        self.assertEqual(len(fake_notifier.NOTIFICATIONS), 1)

        # check response
        self.assertIn('encryption', res_dict)
        self.assertEqual(cipher, res_dict['encryption']['cipher'])
        self.assertEqual(control_location,
                         res_dict['encryption']['control_location'])
        self.assertEqual(key_size, res_dict['encryption']['key_size'])
        self.assertEqual(provider, res_dict['encryption']['provider'])
        self.assertEqual(volume_type['id'],
                         res_dict['encryption']['volume_type_id'])

        # check database
        encryption = db.volume_type_encryption_get(context.get_admin_context(),
                                                   volume_type['id'])
        self.assertIsNotNone(encryption)
        self.assertEqual(cipher, encryption['cipher'])
        self.assertEqual(key_size, encryption['key_size'])
        self.assertEqual(provider, encryption['provider'])
        self.assertEqual(volume_type['id'], encryption['volume_type_id'])

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #29
0
    def test_show_provider(self):
        self.stubs.Set(db, 'volume_type_encryption_get',
                       return_volume_type_encryption)

        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        res = self._get_response(volume_type,
                                 url='/v2/fake/types/%s/encryption/provider')
        res_dict = json.loads(res.body)

        self.assertEqual(200, res.status_code)
        self.assertEqual('fake_provider', res_dict['provider'])
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def test_show_provider(self):
        self.stubs.Set(db, 'volume_type_encryption_get',
                       return_volume_type_encryption)

        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        res = self._get_response(volume_type,
                                 url='/v2/fake/types/%s/encryption/provider')
        res_dict = json.loads(res.body)

        self.assertEqual(200, res.status_code)
        self.assertEqual('fake_provider', res_dict['provider'])
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #31
0
    def test_show_item_not_found(self):
        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)

        res = self._get_response(volume_type,
                                 url='/v2/fake/types/%s/encryption/fake')
        res_dict = json.loads(res.body)

        self.assertEqual(404, res.status_code)
        expected = {
            'itemNotFound': {
                'code': 404,
                'message': ('The resource could not be found.')
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def test_create_encryption_type_exists(self):
        volume_type = self._default_volume_type
        body = {"encryption": stub_volume_type_encryption()}
        self._create_type_and_encryption(volume_type, body)

        # Try to create encryption specs for a volume type
        # that already has them.
        res = self._get_response(
            volume_type, req_method="POST", req_body=json.dumps(body), req_headers="application/json"
        )
        res_dict = json.loads(res.body)

        expected = {
            "badRequest": {"code": 400, "message": ("Volume type encryption for type " "fake_type_id already exists.")}
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type["id"])
    def test_update_item(self, mock_validate_integer):
        mock_validate_integer.return_value = 512
        volume_type = self._default_volume_type

        # Create Encryption Specs
        create_body = {
            "encryption": {
                'cipher': 'cipher',
                'control_location': 'front-end',
                'key_size': 128,
                'provider': 'fake_provider',
                'volume_type_id': volume_type['id']
            }
        }
        self._create_type_and_encryption(volume_type, create_body)

        # Update Encryption Specs
        update_body = {
            "encryption": {
                'key_size': 512,
                'provider': 'fake_provider2'
            }
        }

        res = self.\
            _get_response(volume_type, req_method='PUT',
                          req_body=jsonutils.dump_as_bytes(update_body),
                          req_headers='application/json',
                          url='/v2/%s/types/%s/encryption/' +
                              fake.ENCRYPTION_KEY_ID)

        res_dict = jsonutils.loads(res.body)
        self.assertEqual(512, res_dict['encryption']['key_size'])
        self.assertEqual('fake_provider2', res_dict['encryption']['provider'])

        # Get Encryption Specs
        res = self._get_response(volume_type)
        res_dict = jsonutils.loads(res.body)

        # Confirm Encryption Specs
        self.assertEqual(512, res_dict['key_size'])
        self.assertEqual('fake_provider2', res_dict['provider'])
        self.assertTrue(mock_validate_integer.called)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #34
0
    def test_index(self):
        self.stubs.Set(db, 'volume_type_encryption_get',
                       return_volume_type_encryption)

        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        res = self._get_response(volume_type)
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)

        expected = stub_volume_type_encryption()
        self.assertEqual(expected, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def _encryption_update_bad_body(self, update_body):

        # Create Volume Type and Encryption
        volume_type = self._default_volume_type
        res = self._create_type_and_encryption(volume_type)
        # Update Encryption
        res = self.\
            _get_response(volume_type, req_method='PUT',
                          req_body=jsonutils.dump_as_bytes(update_body),
                          req_headers='application/json',
                          url='/v2/%s/types/%s/encryption/' +
                              fake.ENCRYPTION_KEY_ID)
        res_dict = jsonutils.loads(res.body)

        # Confirm Failure
        self.assertEqual(http_client.BAD_REQUEST,
                         res_dict['badRequest']['code'])
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #36
0
    def test_create_xml(self):
        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)

        ctxt = context.RequestContext('fake', 'fake', is_admin=True)

        req = webob.Request.blank('/v2/fake/types/%s/encryption'
                                  % volume_type['id'])
        req.method = 'POST'
        req.body = ('<encryption provider="test_provider" '
                    'cipher="cipher" control_location="front-end" />')
        req.headers['Content-Type'] = 'application/xml'
        req.headers['Accept'] = 'application/xml'
        res = req.get_response(fakes.wsgi_app(fake_auth_context=ctxt))

        self.assertEqual(res.status_int, 200)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #37
0
    def test_show_item_not_found(self):
        volume_type = self._default_volume_type
        self._create_type_and_encryption(volume_type)

        res = self._get_response(volume_type,
                                 url='/v2/%s/types/%s/encryption/fake')
        res_dict = jsonutils.loads(res.body)

        self.assertEqual(HTTPStatus.NOT_FOUND, res.status_code)
        expected = {
            'itemNotFound': {
                'code': HTTPStatus.NOT_FOUND,
                'message': ('Volume type encryption for type %s does not '
                            'exist.' % volume_type['id'])
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #38
0
    def _encryption_update_bad_body(self, update_body):

        # Create Volume Type and Encryption
        volume_type = self._default_volume_type
        res = self._create_type_and_encryption(volume_type)
        # Update Encryption
        res = self.\
            _get_response(volume_type, req_method='PUT',
                          req_body=jsonutils.dump_as_bytes(update_body),
                          req_headers='application/json',
                          url='/v3/%s/types/%s/encryption/' +
                              fake.ENCRYPTION_KEY_ID)
        res_dict = jsonutils.loads(res.body)

        # Confirm Failure
        self.assertEqual(HTTPStatus.BAD_REQUEST,
                         res_dict['badRequest']['code'])
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def test_create_volume_exists(self):
        # Create the volume type and a volume with the volume type.
        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)
        db.volume_create(
            context.get_admin_context(), {
                'id': fake.VOLUME_ID,
                'display_description': 'Test Desc',
                'size': 20,
                'status': 'creating',
                'instance_uuid': None,
                'host': 'dummy',
                'volume_type_id': volume_type['id']
            })

        body = {
            "encryption": {
                'cipher': 'cipher',
                'key_size': 128,
                'control_location': 'front-end',
                'provider': 'fake_provider',
                'volume_type_id': volume_type['id']
            }
        }

        # Try to create encryption specs for a volume type
        # with a volume.
        res = self._get_response(volume_type,
                                 req_method='POST',
                                 req_body=jsonutils.dump_as_bytes(body),
                                 req_headers='application/json')
        res_dict = jsonutils.loads(res.body)

        expected = {
            'badRequest': {
                'code':
                400,
                'message': ('Cannot create encryption specs. '
                            'Volume type in use.')
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_destroy(context.get_admin_context(), fake.VOLUME_ID)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
def destroy(context, id):
    """Marks volume types as deleted."""
    if id is None:
        msg = _("id cannot be None")
        raise exception.InvalidVolumeType(reason=msg)
    vol_type = get_volume_type(context, id)
    if vol_type['name'] == DEFAULT_VOLUME_TYPE:
        raise exception.VolumeTypeDefault(vol_type['name'])
    elevated = context if context.is_admin else context.elevated()
    return db.volume_type_destroy(elevated, id)
    def _encryption_update_bad_body(self, update_body, msg):

        # Create Volume Type and Encryption
        volume_type = self._default_volume_type
        res = self._create_type_and_encryption(volume_type)
        # Update Encryption
        res = self.\
            _get_response(volume_type, req_method='PUT',
                          req_body=jsonutils.dump_as_bytes(update_body),
                          req_headers='application/json',
                          url='/v2/%s/types/%s/encryption/' +
                              fake.ENCRYPTION_KEY_ID)
        res_dict = jsonutils.loads(res.body)

        expected = {'badRequest': {'code': 400, 'message': (msg)}}

        # Confirm Failure
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #42
0
    def test_delete(self):
        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)

        # Test that before create, there's nothing with a get
        res = self._get_response(volume_type)
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual({}, res_dict)

        body = {"encryption": {'cipher': 'cipher',
                               'key_size': 128,
                               'control_location': 'front-end',
                               'provider': 'fake_provider',
                               'volume_type_id': volume_type['id']}}

        # Create, and test that get returns something
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res_dict = json.loads(res.body)

        res = self._get_response(volume_type, req_method='GET',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption')
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual(volume_type['id'], res_dict['volume_type_id'])

        # Delete, and test that get returns nothing
        res = self._get_response(volume_type, req_method='DELETE',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption/provider')
        self.assertEqual(202, res.status_code)
        self.assertEqual(0, len(res.body))
        res = self._get_response(volume_type, req_method='GET',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption')
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual({}, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
    def test_update_item(self):
        volume_type = self._default_volume_type

        # Create Encryption Specs
        create_body = {
            "encryption": {
                'cipher': 'cipher',
                'control_location': 'front-end',
                'key_size': 128,
                'provider': 'fake_provider',
                'volume_type_id': volume_type['id']
            }
        }
        self._create_type_and_encryption(volume_type, create_body)

        # Update Encryption Specs
        update_body = {
            "encryption": {
                'key_size': 512,
                'provider': 'fake_provider2'
            }
        }

        res = self.\
            _get_response(volume_type, req_method='PUT',
                          req_body=json.dumps(update_body),
                          req_headers='application/json',
                          url='/v2/fake/types/%s/encryption/fake_type_id')

        res_dict = json.loads(res.body)
        self.assertEqual(512, res_dict['encryption']['key_size'])
        self.assertEqual('fake_provider2', res_dict['encryption']['provider'])

        # Get Encryption Specs
        res = self._get_response(volume_type)
        res_dict = json.loads(res.body)

        # Confirm Encryption Specs
        self.assertEqual(512, res_dict['key_size'])
        self.assertEqual('fake_provider2', res_dict['provider'])

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #44
0
    def test_delete_with_no_encryption(self):
        volume_type = self._default_volume_type
        # create a volume type
        db.volume_type_create(context.get_admin_context(), volume_type)

        # without creating encryption type, try to delete
        # and check if 404 is raised.
        res = self._get_response(volume_type, req_method='DELETE',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption/provider')
        self.assertEqual(404, res.status_code)
        expected = {
            "itemNotFound": {
                "message": "Volume type encryption for type "
                           "fake_type_id does not exist.",
                "code": 404
            }
        }
        self.assertEqual(expected, jsonutils.loads(res.body))
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #45
0
    def test_create_encryption_type_exists(self):
        volume_type = self._default_volume_type
        body = {"encryption": fake_volume_type_encryption()}
        self._create_type_and_encryption(volume_type, body)

        # Try to create encryption specs for a volume type
        # that already has them.
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=jsonutils.dump_as_bytes(body),
                                 req_headers='application/json')
        res_dict = jsonutils.loads(res.body)

        expected = {
            'badRequest': {
                'code': HTTPStatus.BAD_REQUEST,
                'message': ('Volume type encryption for type '
                            '%s already exists.' % fake.VOLUME_TYPE_ID)
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #46
0
    def test_create_encryption_type_exists(self):
        volume_type = self._default_volume_type
        body = {"encryption": stub_volume_type_encryption()}
        self._create_type_and_encryption(volume_type, body)

        # Try to create encryption specs for a volume type
        # that already has them.
        res = self._get_response(volume_type, req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res_dict = json.loads(res.body)

        expected = {
            'badRequest': {
                'code': 400,
                'message': ('Volume type encryption for type '
                            'fake_type_id already exists.')
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #47
0
    def test_create_encryption_type_exists(self):
        self.stubs.Set(db, 'volume_type_encryption_get',
                       return_volume_type_encryption)

        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {
            "encryption": {
                'cipher': 'cipher',
                'control_location': 'front-end',
                'key_size': 128,
                'provider': 'fake_provider',
                'volume_type_id': volume_type['id']
            }
        }

        # Try to create encryption specs for a volume type
        # that already has them.
        res = self._get_response(volume_type,
                                 req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res_dict = json.loads(res.body)

        expected = {
            'badRequest': {
                'code':
                400,
                'message': ('Volume type encryption for type '
                            'fake_type_id already exists.')
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #48
0
    def test_show_item_not_found(self):
        self.stubs.Set(db, 'volume_type_encryption_get',
                       return_volume_type_encryption)

        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)

        res = self._get_response(volume_type,
                                 url='/v2/fake/types/%s/encryption/fake')
        res_dict = json.loads(res.body)

        self.assertEqual(404, res.status_code)
        expected = {
            'itemNotFound': {
                'code': 404,
                'message': ('The resource could not be found.')
            }
        }
        self.assertEqual(expected, res_dict)
        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #49
0
def destroy(context, id):
    """Marks volume types as deleted.

    There must exist at least one volume type (i.e. the default type) in
    the deployment.
    This method achieves that by ensuring:
    1) the default_volume_type is set and is a valid one
    2) the type requested to delete isn't the default type

    :raises VolumeTypeDefaultDeletionError: when the type requested to
                                            delete is the default type
    """
    if id is None:
        msg = _("id cannot be None")
        raise exception.InvalidVolumeType(reason=msg)

    projects_with_default_type = db.get_all_projects_with_default_type(
        context.elevated(), id)
    if len(projects_with_default_type) > 0:
        # don't allow delete if the type requested is a project default
        project_list = [p.project_id for p in projects_with_default_type]
        LOG.exception(
            'Default type with %(volume_type_id)s is associated '
            'with projects %(projects)s', {
                'volume_type_id': id,
                'projects': project_list
            })
        raise exception.VolumeTypeDefaultDeletionError(volume_type_id=id)

    # Default type *must* be set in order to delete any volume type.
    # If the default isn't set, the following call will raise
    # VolumeTypeDefaultMisconfiguredError exception which will error out the
    # delete operation.
    default_type = get_default_volume_type()
    # don't allow delete if the type requested is the conf default type
    if id == default_type.get('id'):
        raise exception.VolumeTypeDefaultDeletionError(volume_type_id=id)

    elevated = context if context.is_admin else context.elevated()
    return db.volume_type_destroy(elevated, id)
Example #50
0
    def test_delete_with_volume_in_use(self):
        # Create the volume type and volumes with the volume type.
        volume_type = {
            'id': 'fake_type_id',
            'name': 'fake_type',
        }
        db.volume_type_create(context.get_admin_context(), volume_type)
        db.volume_create(
            context.get_admin_context(), {
                'id': 'fake_id',
                'display_description': 'Test Desc',
                'size': 20,
                'status': 'creating',
                'instance_uuid': None,
                'host': 'dummy',
                'volume_type_id': volume_type['id']
            })

        db.volume_create(
            context.get_admin_context(), {
                'id': 'fake_id2',
                'display_description': 'Test Desc2',
                'size': 2,
                'status': 'creating',
                'instance_uuid': None,
                'host': 'dummy',
                'volume_type_id': volume_type['id']
            })
        body = {
            "encryption": {
                'cipher': 'cipher',
                'key_size': 128,
                'control_location': 'front-end',
                'provider': 'fake_provider',
                'volume_type_id': volume_type['id']
            }
        }

        # Create encryption with volume type, and test with GET
        res = self._get_response(volume_type,
                                 req_method='POST',
                                 req_body=json.dumps(body),
                                 req_headers='application/json')
        res = self._get_response(volume_type,
                                 req_method='GET',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption')
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual(volume_type['id'], res_dict['volume_type_id'])

        # Delete, and test that there is an error since volumes exist
        res = self._get_response(volume_type,
                                 req_method='DELETE',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption/provider')
        self.assertEqual(400, res.status_code)
        res_dict = json.loads(res.body)
        expected = {
            'badRequest': {
                'code': 400,
                'message': 'Cannot delete encryption specs. '
                'Volume type in use.'
            }
        }
        self.assertEqual(expected, res_dict)

        # Delete the volumes
        db.volume_destroy(context.get_admin_context(), 'fake_id')
        db.volume_destroy(context.get_admin_context(), 'fake_id2')

        # Delete, and test that get returns nothing
        res = self._get_response(volume_type,
                                 req_method='DELETE',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption/provider')
        self.assertEqual(202, res.status_code)
        self.assertEqual(0, len(res.body))
        res = self._get_response(volume_type,
                                 req_method='GET',
                                 req_headers='application/json',
                                 url='/v2/fake/types/%s/encryption')
        self.assertEqual(200, res.status_code)
        res_dict = json.loads(res.body)
        self.assertEqual({}, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #51
0
 def _cleanup(self):
     self.group1.destroy()
     self.group2.destroy()
     self.group3.destroy()
     db.volume_type_destroy(self.ctxt, self.volume_type1.id)
Example #52
0
    def test_delete_with_volume_in_use(self):
        # Create the volume type
        volume_type = self._default_volume_type
        db.volume_type_create(context.get_admin_context(), volume_type)

        body = {
            "encryption": {
                'cipher': 'cipher',
                'key_size': 128,
                'control_location': 'front-end',
                'provider': 'fake_provider'
            }
        }

        # Create encryption with volume type, and test with GET
        res = self._get_response(volume_type,
                                 req_method='POST',
                                 req_body=jsonutils.dump_as_bytes(body),
                                 req_headers='application/json')
        res = self._get_response(volume_type,
                                 req_method='GET',
                                 req_headers='application/json',
                                 url='/v3/%s/types/%s/encryption')
        self.assertEqual(HTTPStatus.OK, res.status_code)
        res_dict = jsonutils.loads(res.body)
        self.assertEqual(volume_type['id'], res_dict['volume_type_id'])

        # Create volumes with the volume type
        db.volume_create(
            context.get_admin_context(), {
                'id': fake.VOLUME_ID,
                'display_description': 'Test Desc',
                'size': 20,
                'status': 'creating',
                'instance_uuid': None,
                'host': 'dummy',
                'volume_type_id': volume_type['id']
            })

        db.volume_create(
            context.get_admin_context(), {
                'id': fake.VOLUME2_ID,
                'display_description': 'Test Desc2',
                'size': 2,
                'status': 'creating',
                'instance_uuid': None,
                'host': 'dummy',
                'volume_type_id': volume_type['id']
            })

        # Delete, and test that there is an error since volumes exist
        res = self._get_response(volume_type,
                                 req_method='DELETE',
                                 req_headers='application/json',
                                 url='/v3/%s/types/%s/encryption/provider')
        self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_code)
        res_dict = jsonutils.loads(res.body)
        expected = {
            'badRequest': {
                'code': HTTPStatus.BAD_REQUEST,
                'message': 'Cannot delete encryption specs. '
                'Volume type in use.'
            }
        }
        self.assertEqual(expected, res_dict)

        # Delete the volumes
        db.volume_destroy(context.get_admin_context(), fake.VOLUME_ID)
        db.volume_destroy(context.get_admin_context(), fake.VOLUME2_ID)

        # Delete, and test that get returns nothing
        res = self._get_response(volume_type,
                                 req_method='DELETE',
                                 req_headers='application/json',
                                 url='/v3/%s/types/%s/encryption/provider')
        self.assertEqual(HTTPStatus.ACCEPTED, res.status_code)
        self.assertEqual(0, len(res.body))
        res = self._get_response(volume_type,
                                 req_method='GET',
                                 req_headers='application/json',
                                 url='/v3/%s/types/%s/encryption')
        self.assertEqual(HTTPStatus.OK, res.status_code)
        res_dict = jsonutils.loads(res.body)
        self.assertEqual({}, res_dict)

        db.volume_type_destroy(context.get_admin_context(), volume_type['id'])
Example #53
0
    def test_create_group_from_snap(self, mock_volume_get_all,
                                    mock_rpc_create_group_from_src,
                                    mock_snap_get_all, mock_group_snap_get,
                                    mock_volume_api_create,
                                    mock_mapping_create, mock_get_volume_type):
        vol_type = utils.create_volume_type(self.ctxt, name='fake_volume_type')
        mock_get_volume_type.return_value = vol_type

        grp_snap = utils.create_group_snapshot(
            self.ctxt,
            fake.GROUP_ID,
            group_type_id=fake.GROUP_TYPE_ID,
            status=fields.GroupStatus.CREATING)
        mock_group_snap_get.return_value = grp_snap

        vol1 = utils.create_volume(self.ctxt,
                                   availability_zone='nova',
                                   volume_type_id=vol_type['id'],
                                   group_id=fake.GROUP_ID)

        snap = utils.create_snapshot(self.ctxt,
                                     vol1.id,
                                     volume_type_id=vol_type['id'],
                                     status=fields.GroupStatus.CREATING)
        mock_snap_get_all.return_value = [snap]

        name = "test_group"
        description = "this is a test group"
        grp = utils.create_group(self.ctxt,
                                 group_type_id=fake.GROUP_TYPE_ID,
                                 volume_type_ids=[vol_type['id']],
                                 availability_zone='nova',
                                 name=name,
                                 description=description,
                                 group_snapshot_id=grp_snap.id,
                                 status=fields.GroupStatus.CREATING)

        vol2 = utils.create_volume(self.ctxt,
                                   availability_zone=grp.availability_zone,
                                   volume_type_id=vol_type['id'],
                                   group_id=grp.id,
                                   snapshot_id=snap.id)
        mock_volume_get_all.return_value = [vol2]

        self.group_api._create_group_from_group_snapshot(
            self.ctxt, grp, grp_snap.id)

        mock_volume_api_create.assert_called_once_with(
            self.ctxt,
            1,
            None,
            None,
            availability_zone=grp.availability_zone,
            group_snapshot=grp_snap,
            group=grp,
            snapshot=snap,
            volume_type=vol_type)

        mock_rpc_create_group_from_src.assert_called_once_with(
            self.ctxt, grp, grp_snap)

        vol2.destroy()
        grp.destroy()
        snap.destroy()
        vol1.destroy()
        grp_snap.destroy()
        db.volume_type_destroy(self.ctxt, vol_type['id'])