Example #1
0
    def test_create_snapshot_force(self):
        """Test snapshot in use can be created forcibly."""

        instance_uuid = '12345678-1234-4678-1234-567812345678'
        # create volume and attach to the instance
        volume = tests_utils.create_volume(self.context, **self.volume_params)
        self.volume.create_volume(self.context, volume)
        values = {'volume_id': volume['id'],
                  'instance_uuid': instance_uuid,
                  'attach_status': fields.VolumeAttachStatus.ATTACHING, }
        attachment = db.volume_attach(self.context, values)
        db.volume_attached(self.context, attachment['id'], instance_uuid,
                           None, '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot_force(self.context,
                                                        volume,
                                                        'fake_name',
                                                        'fake_description')
        snapshot_ref.destroy()
        db.volume_destroy(self.context, volume['id'])
Example #2
0
    def test_create_snapshot_force(self):
        """Test snapshot in use can be created forcibly."""

        def fake_cast(ctxt, topic, msg):
            pass
        self.stubs.Set(rpc, 'cast', fake_cast)
        instance_uuid = '12345678-1234-5678-1234-567812345678'

        volume = self._create_volume()
        self.volume.create_volume(self.context, volume['id'])
        db.volume_attached(self.context, volume['id'], instance_uuid,
                           '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot_force(self.context,
                                                        volume,
                                                        'fake_name',
                                                        'fake_description')
        db.snapshot_destroy(self.context, snapshot_ref['id'])
        db.volume_destroy(self.context, volume['id'])
Example #3
0
 def attach_volume(self, context, volume_id, instance_uuid, host_name,
                   mountpoint, mode):
     volume = db.volume_get(context, volume_id)
     client = LunrClient(volume, logger=LOG)
     attach_volume(client, volume_id, instance_uuid, mountpoint)
     db.volume_attached(context.elevated(), volume_id, instance_uuid,
                        host_name, mountpoint)
Example #4
0
    def test_run_attach_detach_volume(self):
        """Make sure volume can be attached and detached from instance."""
        instance_uuid = '12345678-1234-5678-1234-567812345678'
        mountpoint = "/dev/sdf"
        volume = self._create_volume()
        volume_id = volume['id']
        self.volume.create_volume(self.context, volume_id)
        db.volume_attached(self.context, volume_id, instance_uuid, mountpoint)
        vol = db.volume_get(context.get_admin_context(), volume_id)
        self.assertEqual(vol['status'], "in-use")
        self.assertEqual(vol['attach_status'], "attached")
        self.assertEqual(vol['mountpoint'], mountpoint)
        self.assertEqual(vol['instance_uuid'], instance_uuid)

        self.assertRaises(exception.VolumeAttached,
                          self.volume.delete_volume,
                          self.context,
                          volume_id)
        db.volume_detached(self.context, volume_id)
        vol = db.volume_get(self.context, volume_id)
        self.assertEqual(vol['status'], "available")

        self.volume.delete_volume(self.context, volume_id)
        self.assertRaises(exception.VolumeNotFound,
                          db.volume_get,
                          self.context,
                          volume_id)
Example #5
0
    def test_run_attach_detach_volume(self):
        """Make sure volume can be attached and detached from instance."""
        instance_uuid = "12345678-1234-5678-1234-567812345678"
        mountpoint = "/dev/sdf"
        volume = self._create_volume()
        volume_id = volume["id"]
        self.volume.create_volume(self.context, volume_id)
        if FLAGS.fake_tests:
            db.volume_attached(self.context, volume_id, instance_uuid, mountpoint)
        else:
            self.compute.attach_volume(self.context, instance_uuid, volume_id, mountpoint)
        vol = db.volume_get(context.get_admin_context(), volume_id)
        self.assertEqual(vol["status"], "in-use")
        self.assertEqual(vol["attach_status"], "attached")
        self.assertEqual(vol["mountpoint"], mountpoint)
        self.assertEqual(vol["instance_uuid"], instance_uuid)

        self.assertRaises(exception.VolumeAttached, self.volume.delete_volume, self.context, volume_id)
        if FLAGS.fake_tests:
            db.volume_detached(self.context, volume_id)
        else:
            pass
            self.compute.detach_volume(self.context, instance_uuid, volume_id)
        vol = db.volume_get(self.context, volume_id)
        self.assertEqual(vol["status"], "available")

        self.volume.delete_volume(self.context, volume_id)
        self.assertRaises(exception.VolumeNotFound, db.volume_get, self.context, volume_id)
Example #6
0
    def test_create_snapshot_force(self):
        """Test snapshot in use can be created forcibly."""

        def fake_cast(ctxt, topic, msg):
            pass
        self.stubs.Set(rpc, 'cast', fake_cast)
        instance_uuid = '12345678-1234-5678-1234-567812345678'

        volume = self._create_volume()
        self.volume.create_volume(self.context, volume['id'])
        db.volume_attached(self.context, volume['id'], instance_uuid,
                           '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot_force(self.context,
                                                        volume,
                                                        'fake_name',
                                                        'fake_description')
        db.snapshot_destroy(self.context, snapshot_ref['id'])
        db.volume_destroy(self.context, volume['id'])
Example #7
0
 def _create_volume_attach(self, volume_id):
     values = {
         'volume_id': volume_id,
         'attach_status': 'attached',
     }
     attachment = db.volume_attach(self.ctxt, values)
     db.volume_attached(self.ctxt, attachment['id'], None, 'testhost',
                        '/dev/vd0')
Example #8
0
    def test_volume_update_with_admin_metadata(self):
        def stubs_volume_admin_metadata_get(context, volume_id):
            return {'key': 'value',
                    'readonly': 'True'}
        self.stubs.Set(db, 'volume_admin_metadata_get',
                       stubs_volume_admin_metadata_get)
        self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)

        volume = stubs.stub_volume("1")
        del volume['name']
        del volume['volume_type']
        del volume['volume_type_id']
        volume['metadata'] = {'key': 'value'}
        db.volume_create(context.get_admin_context(), volume)
        db.volume_admin_metadata_update(context.get_admin_context(), "1",
                                        {"readonly": "True",
                                         "invisible_key": "invisible_value"},
                                        False)
        values = {'volume_id': '1', }
        attachment = db.volume_attach(context.get_admin_context(), values)
        db.volume_attached(context.get_admin_context(),
                           attachment['id'], stubs.FAKE_UUID, None, '/')

        updates = {
            "display_name": "Updated Test Name",
        }
        body = {"volume": updates}
        req = fakes.HTTPRequest.blank('/v1/volumes/1')
        self.assertEqual(0, len(self.notifier.notifications))
        admin_ctx = context.RequestContext('admin', 'fakeproject', True)
        req.environ['cinder.context'] = admin_ctx
        res_dict = self.controller.update(req, '1', body)
        expected = {'volume': {
            'status': 'in-use',
            'display_description': 'displaydesc',
            'availability_zone': 'fakeaz',
            'display_name': 'Updated Test Name',
            'encrypted': False,
            'attachments': [{
                'attachment_id': attachment['id'],
                'id': '1',
                'volume_id': '1',
                'server_id': stubs.FAKE_UUID,
                'host_name': None,
                'device': '/'
            }],
            'multiattach': 'false',
            'bootable': 'false',
            'volume_type': None,
            'snapshot_id': None,
            'source_volid': None,
            'metadata': {'key': 'value',
                         'readonly': 'True'},
            'id': '1',
            'created_at': datetime.datetime(1900, 1, 1, 1, 1, 1),
            'size': 1}}
        self.assertEqual(expected, res_dict)
        self.assertEqual(2, len(self.notifier.notifications))
Example #9
0
 def attach_volume(self, context, volume_id, instance_uuid, host_name, mountpoint, mode):
     volume = db.volume_get(context, volume_id)
     client = LunrClient(volume, logger=LOG)
     attach_volume(client, volume_id, instance_uuid, mountpoint)
     db.volume_attached(context.elevated(),
                        volume_id,
                        instance_uuid,
                        host_name,
                        mountpoint)
Example #10
0
 def test_volume_attached(self):
     volume = db.volume_create(self.ctxt, {'host': 'host1'})
     db.volume_attached(self.ctxt, volume['id'],
                        'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '/tmp')
     volume = db.volume_get(self.ctxt, volume['id'])
     self.assertEqual(volume['status'], 'in-use')
     self.assertEqual(volume['mountpoint'], '/tmp')
     self.assertEqual(volume['attach_status'], 'attached')
     self.assertEqual(volume['instance_uuid'],
                      'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa')
Example #11
0
 def test_volume_attached_to_host(self):
     volume = db.volume_create(self.ctxt, {"host": "host1"})
     host_name = "fake_host"
     db.volume_attached(self.ctxt, volume["id"], None, host_name, "/tmp")
     volume = db.volume_get(self.ctxt, volume["id"])
     self.assertEqual(volume["status"], "in-use")
     self.assertEqual(volume["mountpoint"], "/tmp")
     self.assertEqual(volume["attach_status"], "attached")
     self.assertIsNone(volume["instance_uuid"])
     self.assertEqual(volume["attached_host"], host_name)
Example #12
0
 def test_volume_attached_to_instance(self):
     volume = db.volume_create(self.ctxt, {"host": "host1"})
     instance_uuid = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
     db.volume_attached(self.ctxt, volume["id"], instance_uuid, None, "/tmp")
     volume = db.volume_get(self.ctxt, volume["id"])
     self.assertEqual(volume["status"], "in-use")
     self.assertEqual(volume["mountpoint"], "/tmp")
     self.assertEqual(volume["attach_status"], "attached")
     self.assertEqual(volume["instance_uuid"], instance_uuid)
     self.assertIsNone(volume["attached_host"])
Example #13
0
 def test_volume_attached_to_host(self):
     volume = db.volume_create(self.ctxt, {'host': 'host1'})
     host_name = 'fake_host'
     db.volume_attached(self.ctxt, volume['id'], None, host_name, '/tmp')
     volume = db.volume_get(self.ctxt, volume['id'])
     self.assertEqual(volume['status'], 'in-use')
     self.assertEqual(volume['mountpoint'], '/tmp')
     self.assertEqual(volume['attach_status'], 'attached')
     self.assertIsNone(volume['instance_uuid'])
     self.assertEqual(volume['attached_host'], host_name)
Example #14
0
 def test_volume_detached_from_host(self):
     volume = db.volume_create(self.ctxt, {})
     db.volume_attached(self.ctxt, volume['id'], None, 'fake_host', '/tmp')
     db.volume_detached(self.ctxt, volume['id'])
     volume = db.volume_get(self.ctxt, volume['id'])
     self.assertEqual('available', volume['status'])
     self.assertEqual('detached', volume['attach_status'])
     self.assertIsNone(volume['mountpoint'])
     self.assertIsNone(volume['instance_uuid'])
     self.assertIsNone(volume['attached_host'])
Example #15
0
 def test_volume_attached(self):
     volume = db.volume_create(self.ctxt, {'host': 'host1'})
     db.volume_attached(self.ctxt, volume['id'],
                        'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '/tmp')
     volume = db.volume_get(self.ctxt, volume['id'])
     self.assertEqual(volume['status'], 'in-use')
     self.assertEqual(volume['mountpoint'], '/tmp')
     self.assertEqual(volume['attach_status'], 'attached')
     self.assertEqual(volume['instance_uuid'],
                      'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa')
Example #16
0
 def test_volume_detached_from_host(self):
     volume = db.volume_create(self.ctxt, {})
     db.volume_attached(self.ctxt, volume["id"], None, "fake_host", "/tmp")
     db.volume_detached(self.ctxt, volume["id"])
     volume = db.volume_get(self.ctxt, volume["id"])
     self.assertEqual("available", volume["status"])
     self.assertEqual("detached", volume["attach_status"])
     self.assertIsNone(volume["mountpoint"])
     self.assertIsNone(volume["instance_uuid"])
     self.assertIsNone(volume["attached_host"])
Example #17
0
 def test_volume_attached_to_host(self):
     volume = db.volume_create(self.ctxt, {'host': 'host1'})
     host_name = 'fake_host'
     db.volume_attached(self.ctxt, volume['id'],
                        None, host_name, '/tmp')
     volume = db.volume_get(self.ctxt, volume['id'])
     self.assertEqual(volume['status'], 'in-use')
     self.assertEqual(volume['mountpoint'], '/tmp')
     self.assertEqual(volume['attach_status'], 'attached')
     self.assertEqual(volume['instance_uuid'], None)
     self.assertEqual(volume['attached_host'], host_name)
Example #18
0
 def test_volume_detached_from_host(self):
     volume = db.volume_create(self.ctxt, {})
     db.volume_attached(self.ctxt, volume['id'],
                        None, 'fake_host', '/tmp')
     db.volume_detached(self.ctxt, volume['id'])
     volume = db.volume_get(self.ctxt, volume['id'])
     self.assertEqual('available', volume['status'])
     self.assertEqual('detached', volume['attach_status'])
     self.assertIsNone(volume['mountpoint'])
     self.assertIsNone(volume['instance_uuid'])
     self.assertIsNone(volume['attached_host'])
Example #19
0
    def test_create_snapshot_in_use(self):
        """Test snapshot in use can be created forcibly."""

        instance_uuid = 'a14dc210-d43b-4792-a608-09fe0824de54'
        # create volume and attach to the instance
        volume = tests_utils.create_volume(self.context, **self.volume_params)
        self.volume.create_volume(self.context, volume)
        values = {'volume_id': volume['id'],
                  'instance_uuid': instance_uuid,
                  'attach_status': fields.VolumeAttachStatus.ATTACHING, }
        attachment = db.volume_attach(self.context, values)
        db.volume_attached(self.context, attachment['id'], instance_uuid,
                           None, '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot(self.context,
                                                  volume,
                                                  'fake_name',
                                                  'fake_description',
                                                  allow_in_use=True)
        snapshot_ref.destroy()
        db.volume_destroy(self.context, volume['id'])

        # create volume and attach to the host
        volume = tests_utils.create_volume(self.context, **self.volume_params)
        self.volume.create_volume(self.context, volume)
        values = {'volume_id': volume['id'],
                  'attached_host': 'fake_host',
                  'attach_status': fields.VolumeAttachStatus.ATTACHING, }
        attachment = db.volume_attach(self.context, values)
        db.volume_attached(self.context, attachment['id'], None,
                           'fake_host', '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot(self.context,
                                                  volume,
                                                  'fake_name',
                                                  'fake_description',
                                                  allow_in_use=True)
        snapshot_ref.destroy()
        db.volume_destroy(self.context, volume['id'])
Example #20
0
    def test_create_snapshot_force(self):
        """Test snapshot in use can be created forcibly."""

        instance_uuid = '12345678-1234-5678-1234-567812345678'
        # create volume and attach to the instance
        volume = tests_utils.create_volume(self.context, **self.volume_params)
        self.volume.create_volume(self.context, volume)
        values = {'volume_id': volume['id'],
                  'instance_uuid': instance_uuid,
                  'attach_status': fields.VolumeAttachStatus.ATTACHING, }
        attachment = db.volume_attach(self.context, values)
        db.volume_attached(self.context, attachment['id'], instance_uuid,
                           None, '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot_force(self.context,
                                                        volume,
                                                        'fake_name',
                                                        'fake_description')
        snapshot_ref.destroy()
        db.volume_destroy(self.context, volume['id'])

        # create volume and attach to the host
        volume = tests_utils.create_volume(self.context, **self.volume_params)
        self.volume.create_volume(self.context, volume)
        values = {'volume_id': volume['id'],
                  'attached_host': 'fake_host',
                  'attach_status': fields.VolumeAttachStatus.ATTACHING, }
        attachment = db.volume_attach(self.context, values)
        db.volume_attached(self.context, attachment['id'], None,
                           'fake_host', '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot_force(self.context,
                                                        volume,
                                                        'fake_name',
                                                        'fake_description')
        snapshot_ref.destroy()
        db.volume_destroy(self.context, volume['id'])
Example #21
0
def attach_volume(ctxt, volume_id, instance_uuid, attached_host,
                  mountpoint, mode='rw'):

    if isinstance(volume_id, objects.Volume):
        volume_ovo = volume_id
        volume_id = volume_ovo.id
    else:
        volume_ovo = None

    now = timeutils.utcnow()
    values = {}
    values['volume_id'] = volume_id
    values['attached_host'] = attached_host
    values['mountpoint'] = mountpoint
    values['attach_time'] = now

    attachment = db.volume_attach(ctxt.elevated(), values)
    volume, updated_values = db.volume_attached(
        ctxt.elevated(), attachment['id'], instance_uuid,
        attached_host, mountpoint, mode)

    if volume_ovo:
        cls = objects.Volume
        expected_attrs = cls._get_expected_attrs(ctxt)
        volume = cls._from_db_object(ctxt, cls(ctxt), volume,
                                     expected_attrs=expected_attrs)

    return volume
Example #22
0
    def _attach_volume(self):
        """Attach volumes to an instance. """
        volume_id_list = []
        for index in xrange(3):
            vol = {}
            vol["size"] = 0
            vol_ref = db.volume_create(self.context, vol)
            self.volume.create_volume(self.context, vol_ref["id"])
            vol_ref = db.volume_get(self.context, vol_ref["id"])

            # each volume has a different mountpoint
            mountpoint = "/dev/sd" + chr((ord("b") + index))
            instance_uuid = "12345678-1234-5678-1234-567812345678"
            db.volume_attached(self.context, vol_ref["id"], instance_uuid, mountpoint)
            volume_id_list.append(vol_ref["id"])

        return volume_id_list
Example #23
0
    def test_volume_show_with_admin_metadata(self):
        volume = stubs.stub_volume(fake.VOLUME_ID)
        del volume['name']
        del volume['volume_type']
        del volume['volume_type_id']
        volume['metadata'] = {'key': 'value'}
        db.volume_create(context.get_admin_context(), volume)
        db.volume_admin_metadata_update(context.get_admin_context(),
                                        fake.VOLUME_ID,
                                        {"readonly": "True",
                                         "invisible_key": "invisible_value"},
                                        False)
        values = {'volume_id': fake.VOLUME_ID, }
        attachment = db.volume_attach(context.get_admin_context(), values)
        db.volume_attached(context.get_admin_context(),
                           attachment['id'], fake.INSTANCE_ID, None, '/')

        req = fakes.HTTPRequest.blank('/v1/volumes/%s' % fake.VOLUME_ID)
        admin_ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
        req.environ['cinder.context'] = admin_ctx
        res_dict = self.controller.show(req, fake.VOLUME_ID)
        expected = {'volume': {'status': 'in-use',
                               'display_description': 'displaydesc',
                               'availability_zone': 'fakeaz',
                               'display_name': 'displayname',
                               'encrypted': False,
                               'attachments': [
                                   {'attachment_id': attachment['id'],
                                    'device': '/',
                                    'server_id': fake.INSTANCE_ID,
                                    'host_name': None,
                                    'id': fake.VOLUME_ID,
                                    'volume_id': fake.VOLUME_ID}],
                               'multiattach': 'false',
                               'bootable': 'false',
                               'volume_type': None,
                               'snapshot_id': None,
                               'source_volid': None,
                               'metadata': {'key': 'value',
                                            'readonly': 'True'},
                               'id': fake.VOLUME_ID,
                               'created_at': datetime.datetime(
                                   1900, 1, 1, 1, 1, 1,
                                   tzinfo=iso8601.iso8601.Utc()),
                               'size': 1}}
        self.assertEqual(expected, res_dict)
Example #24
0
    def test_volume_show_with_admin_metadata(self):
        volume = stubs.stub_volume(fake.VOLUME_ID)
        del volume['name']
        del volume['volume_type']
        del volume['volume_type_id']
        volume['metadata'] = {'key': 'value'}
        db.volume_create(context.get_admin_context(), volume)
        db.volume_admin_metadata_update(context.get_admin_context(),
                                        fake.VOLUME_ID,
                                        {"readonly": "True",
                                         "invisible_key": "invisible_value"},
                                        False)
        values = {'volume_id': fake.VOLUME_ID, }
        attachment = db.volume_attach(context.get_admin_context(), values)
        db.volume_attached(context.get_admin_context(),
                           attachment['id'], fake.INSTANCE_ID, None, '/')

        req = fakes.HTTPRequest.blank('/v1/volumes/%s' % fake.VOLUME_ID)
        admin_ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
        req.environ['cinder.context'] = admin_ctx
        res_dict = self.controller.show(req, fake.VOLUME_ID)
        expected = {'volume': {'status': 'in-use',
                               'display_description': 'displaydesc',
                               'availability_zone': 'fakeaz',
                               'display_name': 'displayname',
                               'encrypted': False,
                               'attachments': [
                                   {'attachment_id': attachment['id'],
                                    'device': '/',
                                    'server_id': fake.INSTANCE_ID,
                                    'host_name': None,
                                    'id': fake.VOLUME_ID,
                                    'volume_id': fake.VOLUME_ID}],
                               'multiattach': 'false',
                               'bootable': 'false',
                               'volume_type': None,
                               'snapshot_id': None,
                               'source_volid': None,
                               'metadata': {'key': 'value',
                                            'readonly': 'True'},
                               'id': fake.VOLUME_ID,
                               'created_at': datetime.datetime(
                                   1900, 1, 1, 1, 1, 1,
                                   tzinfo=iso8601.iso8601.Utc()),
                               'size': 1}}
        self.assertEqual(expected, res_dict)
    def _attach_volume(self):
        """Attach volumes to an instance. """
        volume_id_list = []
        for index in xrange(3):
            vol = {}
            vol['size'] = 0
            vol_ref = db.volume_create(self.context, vol)
            self.volume.create_volume(self.context, vol_ref['id'])
            vol_ref = db.volume_get(self.context, vol_ref['id'])

            # each volume has a different mountpoint
            mountpoint = "/dev/sd" + chr((ord('b') + index))
            instance_uuid = '12345678-1234-5678-1234-567812345678'
            db.volume_attached(self.context, vol_ref['id'], instance_uuid,
                               mountpoint)
            volume_id_list.append(vol_ref['id'])

        return volume_id_list
Example #26
0
    def test_volume_show_with_admin_metadata(self):
        volume = stubs.stub_volume("1")
        del volume['name']
        del volume['volume_type']
        del volume['volume_type_id']
        volume['metadata'] = {'key': 'value'}
        db.volume_create(context.get_admin_context(), volume)
        db.volume_admin_metadata_update(context.get_admin_context(), "1",
                                        {"readonly": "True",
                                         "invisible_key": "invisible_value"},
                                        False)
        values = {'volume_id': '1', }
        attachment = db.volume_attach(context.get_admin_context(), values)
        db.volume_attached(context.get_admin_context(),
                           attachment['id'], stubs.FAKE_UUID, None, '/')

        req = fakes.HTTPRequest.blank('/v1/volumes/1')
        admin_ctx = context.RequestContext('admin', 'fakeproject', True)
        req.environ['cinder.context'] = admin_ctx
        res_dict = self.controller.show(req, '1')
        expected = {'volume': {'status': 'in-use',
                               'display_description': 'displaydesc',
                               'availability_zone': 'fakeaz',
                               'display_name': 'displayname',
                               'encrypted': False,
                               'attachments': [
                                   {'attachment_id': attachment['id'],
                                    'device': '/',
                                    'server_id': stubs.FAKE_UUID,
                                    'host_name': None,
                                    'id': '1',
                                    'volume_id': '1'}],
                               'multiattach': 'false',
                               'bootable': 'false',
                               'volume_type': None,
                               'snapshot_id': None,
                               'source_volid': None,
                               'metadata': {'key': 'value',
                                            'readonly': 'True'},
                               'id': '1',
                               'created_at': datetime.datetime(1900, 1, 1,
                                                               1, 1, 1),
                               'size': 1}}
        self.assertEqual(res_dict, expected)
Example #27
0
    def _attach_volume(self):
        """Attach volumes to an instance. This function also sets
           a fake log message."""
        volume_id_list = []
        for index in xrange(3):
            vol = {}
            vol['size'] = 0
            vol_ref = db.volume_create(self.context, vol)
            self.volume.create_volume(self.context, vol_ref['id'])
            vol_ref = db.volume_get(self.context, vol_ref['id'])

            # each volume has a different mountpoint
            mountpoint = "/dev/sd" + chr((ord('b') + index))
            instance_uuid = '12345678-1234-5678-1234-567812345678'
            db.volume_attached(self.context, vol_ref['id'], instance_uuid,
                               mountpoint)
            volume_id_list.append(vol_ref['id'])

        return volume_id_list
Example #28
0
def attach_volume(ctxt, volume_id, instance_uuid, attached_host, mountpoint, mode="rw"):

    now = timeutils.utcnow()
    values = {}
    values["volume_id"] = volume_id
    values["attached_host"] = attached_host
    values["mountpoint"] = mountpoint
    values["attach_time"] = now

    attachment = db.volume_attach(ctxt, values)
    return db.volume_attached(ctxt, attachment["id"], instance_uuid, attached_host, mountpoint, mode)
Example #29
0
 def finish_attach(self, instance_uuid, host_name,
                   mount_point, attach_mode='rw'):
     with self.obj_as_admin():
         db_volume, updated_values = db.volume_attached(
             self._context, self.id,
             instance_uuid, host_name,
             mount_point, attach_mode)
     self.update(updated_values)
     self.obj_reset_changes(updated_values.keys())
     return objects.Volume._from_db_object(self._context,
                                           objects.Volume(),
                                           db_volume)
 def finish_attach(self, instance_uuid, host_name,
                   mount_point, attach_mode='rw'):
     with self.obj_as_admin():
         db_volume, updated_values = db.volume_attached(
             self._context, self.id,
             instance_uuid, host_name,
             mount_point, attach_mode)
     self.update(updated_values)
     self.obj_reset_changes(updated_values.keys())
     return objects.Volume._from_db_object(self._context,
                                           objects.Volume(),
                                           db_volume)
Example #31
0
    def test_run_attach_detach_volume(self):
        """Make sure volume can be attached and detached from instance."""
        instance_id = 'fake-inst'
        mountpoint = "/dev/sdf"
        volume = self._create_volume()
        volume_id = volume['id']
        self.volume.create_volume(self.context, volume_id)
        if FLAGS.fake_tests:
            db.volume_attached(self.context, volume_id, instance_id,
                                mountpoint)
        else:
            self.compute.attach_volume(self.context,
                                       instance_id,
                                       volume_id,
                                       mountpoint)
        vol = db.volume_get(context.get_admin_context(), volume_id)
        self.assertEqual(vol['status'], "in-use")
        self.assertEqual(vol['attach_status'], "attached")
        self.assertEqual(vol['mountpoint'], mountpoint)
        self.assertEqual(vol['instance_id'], instance_id)

        self.assertRaises(exception.Error,
                          self.volume.delete_volume,
                          self.context,
                          volume_id)
        if FLAGS.fake_tests:
            db.volume_detached(self.context, volume_id)
        else:
            pass
            self.compute.detach_volume(self.context,
                                       instance_id,
                                       volume_id)
        vol = db.volume_get(self.context, volume_id)
        self.assertEqual(vol['status'], "available")

        self.volume.delete_volume(self.context, volume_id)
        self.assertRaises(exception.VolumeNotFound,
                          db.volume_get,
                          self.context,
                          volume_id)
Example #32
0
def attach_volume(ctxt, volume_id, instance_uuid, attached_host,
                  mountpoint, mode='rw'):

    now = timeutils.utcnow()
    values = {}
    values['volume_id'] = volume_id
    values['attached_host'] = attached_host
    values['mountpoint'] = mountpoint
    values['attach_time'] = now

    attachment = db.volume_attach(ctxt, values)
    return db.volume_attached(ctxt, attachment['id'], instance_uuid,
                              attached_host, mountpoint, mode)
Example #33
0
    def test_create_snapshot_force_host(self):
        # create volume and attach to the host
        volume = tests_utils.create_volume(self.context, **self.volume_params)
        self.volume.create_volume(self.context, volume)
        values = {'volume_id': volume['id'],
                  'attached_host': 'fake_host',
                  'attach_status': fields.VolumeAttachStatus.ATTACHING, }
        attachment = db.volume_attach(self.context, values)
        db.volume_attached(self.context, attachment['id'], None,
                           'fake_host', '/dev/sda1')

        volume_api = cinder.volume.api.API()
        volume = volume_api.get(self.context, volume['id'])
        self.assertRaises(exception.InvalidVolume,
                          volume_api.create_snapshot,
                          self.context, volume,
                          'fake_name', 'fake_description')
        snapshot_ref = volume_api.create_snapshot_force(self.context,
                                                        volume,
                                                        'fake_name',
                                                        'fake_description')
        snapshot_ref.destroy()
        db.volume_destroy(self.context, volume['id'])
    def test_run_attach_detach_volume(self):
        """Make sure volume can be attached and detached from instance."""
        instance_uuid = '12345678-1234-5678-1234-567812345678'
        mountpoint = "/dev/sdf"
        volume = self._create_volume()
        volume_id = volume['id']
        self.volume.create_volume(self.context, volume_id)
        db.volume_attached(self.context, volume_id, instance_uuid, mountpoint)
        vol = db.volume_get(context.get_admin_context(), volume_id)
        self.assertEqual(vol['status'], "in-use")
        self.assertEqual(vol['attach_status'], "attached")
        self.assertEqual(vol['mountpoint'], mountpoint)
        self.assertEqual(vol['instance_uuid'], instance_uuid)

        self.assertRaises(exception.VolumeAttached, self.volume.delete_volume,
                          self.context, volume_id)
        db.volume_detached(self.context, volume_id)
        vol = db.volume_get(self.context, volume_id)
        self.assertEqual(vol['status'], "available")

        self.volume.delete_volume(self.context, volume_id)
        self.assertRaises(exception.VolumeNotFound, db.volume_get,
                          self.context, volume_id)
    def test_volume_list_detail_with_admin_metadata(self):
        volume = stubs.stub_volume("1")
        del volume['name']
        del volume['volume_type']
        del volume['volume_type_id']
        volume['metadata'] = {'key': 'value'}
        db.volume_create(context.get_admin_context(), volume)
        db.volume_admin_metadata_update(context.get_admin_context(), "1", {
            "readonly": "True",
            "invisible_key": "invisible_value"
        }, False)
        values = {
            'volume_id': '1',
        }
        attachment = db.volume_attach(context.get_admin_context(), values)
        db.volume_attached(context.get_admin_context(), attachment['id'],
                           stubs.FAKE_UUID, None, '/')

        req = fakes.HTTPRequest.blank('/v1/volumes/detail')
        admin_ctx = context.RequestContext('admin', 'fakeproject', True)
        req.environ['cinder.context'] = admin_ctx
        res_dict = self.controller.index(req)
        expected = {
            'volumes': [{
                'status':
                'in-use',
                'display_description':
                'displaydesc',
                'availability_zone':
                'fakeaz',
                'display_name':
                'displayname',
                'encrypted':
                False,
                'attachments': [{
                    'attachment_id': attachment['id'],
                    'device': '/',
                    'server_id': stubs.FAKE_UUID,
                    'host_name': None,
                    'id': '1',
                    'volume_id': '1'
                }],
                'multiattach':
                'false',
                'bootable':
                'false',
                'volume_type':
                None,
                'snapshot_id':
                None,
                'source_volid':
                None,
                'metadata': {
                    'key': 'value',
                    'readonly': 'True'
                },
                'id':
                '1',
                'created_at':
                datetime.datetime(1900, 1, 1, 1, 1, 1),
                'size':
                1
            }]
        }
        self.assertEqual(expected, res_dict)
    def test_volume_update_with_admin_metadata(self):
        def stubs_volume_admin_metadata_get(context, volume_id):
            return {'key': 'value', 'readonly': 'True'}

        self.stubs.Set(db, 'volume_admin_metadata_get',
                       stubs_volume_admin_metadata_get)
        self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update)

        volume = stubs.stub_volume("1")
        del volume['name']
        del volume['volume_type']
        del volume['volume_type_id']
        volume['metadata'] = {'key': 'value'}
        db.volume_create(context.get_admin_context(), volume)
        db.volume_admin_metadata_update(context.get_admin_context(), "1", {
            "readonly": "True",
            "invisible_key": "invisible_value"
        }, False)
        values = {
            'volume_id': '1',
        }
        attachment = db.volume_attach(context.get_admin_context(), values)
        db.volume_attached(context.get_admin_context(), attachment['id'],
                           stubs.FAKE_UUID, None, '/')

        updates = {
            "display_name": "Updated Test Name",
        }
        body = {"volume": updates}
        req = fakes.HTTPRequest.blank('/v1/volumes/1')
        self.assertEqual(0, len(self.notifier.notifications))
        admin_ctx = context.RequestContext('admin', 'fakeproject', True)
        req.environ['cinder.context'] = admin_ctx
        res_dict = self.controller.update(req, '1', body)
        expected = {
            'volume': {
                'status':
                'in-use',
                'display_description':
                'displaydesc',
                'availability_zone':
                'fakeaz',
                'display_name':
                'Updated Test Name',
                'encrypted':
                False,
                'attachments': [{
                    'attachment_id': attachment['id'],
                    'id': '1',
                    'volume_id': '1',
                    'server_id': stubs.FAKE_UUID,
                    'host_name': None,
                    'device': '/'
                }],
                'multiattach':
                'false',
                'bootable':
                'false',
                'volume_type':
                None,
                'snapshot_id':
                None,
                'source_volid':
                None,
                'metadata': {
                    'key': 'value',
                    'readonly': 'True'
                },
                'id':
                '1',
                'created_at':
                datetime.datetime(1900, 1, 1, 1, 1, 1),
                'size':
                1
            }
        }
        self.assertEqual(expected, res_dict)
        self.assertEqual(2, len(self.notifier.notifications))
Example #37
0
 def _create_volume_attach(self, volume_id):
     values = {'volume_id': volume_id,
               'attach_status': 'attached', }
     attachment = db.volume_attach(self.ctxt, values)
     db.volume_attached(self.ctxt, attachment['id'], None, 'testhost',
                        '/dev/vd0')
Example #38
0
 def _create_volume_attach(self, volume_id):
     values = {"volume_id": volume_id, "attach_status": "attached"}
     attachment = db.volume_attach(self.ctxt, values)
     db.volume_attached(self.ctxt, attachment["id"], None, "testhost", "/dev/vd0")