Beispiel #1
0
    def destroy_volume(self, id):
        volume = self.describe_volume(id)
        attached_to = volume.get('attached_to')

        if attached_to:
            raise StorageError('Can not destroy volume: volume attached to instance %s' % attached_to)
        lvm2.lvremove(volume['host_path'])
Beispiel #2
0
    def create_snapshot(self, volume_id):
        assert volume_id in self.volumes, 'Volume "%s" not found' % volume_id
        volume = self.volumes[volume_id]

        snapshot_id = str(uuid.uuid4())[:7]
        if not os.path.isdir(snapshot_dir):
            os.makedirs(snapshot_dir)
        snap_path = self._get_snapshot_path(snapshot_id)

        lvm2.lvcreate(os.path.join('/dev', vg_name, volume['id']),
                      snapshot=True,
                      name=snapshot_id,
                      size=snap_size)
        lv_info = None
        try:
            lv_info = lvm2.lvs(lvm2.lvpath(vg_name, snapshot_id)).values()[0]
            system('dd if=%s | cp --sparse=always /dev/stdin %s' %
                   (lv_info.lv_path, snap_path),
                   shell=True)
        finally:
            if lv_info:
                lvm2.lvremove(lv_info.lv_path)
            else:
                lvm2.lvremove(os.path.join('/dev', vg_name, snapshot_id))

        snapshot = dict(id=snapshot_id, size=volume['size'])
        self.snapshots[snapshot_id] = snapshot
        return snapshot
Beispiel #3
0
    def lvm_snapshot(self, name=None, size=None):
        long_kwds = {
                'name': name or '%ssnap' % self.name,
                'snapshot': '%s/%s' % (self.vg, self.name)
        }
        if size:
            size=str(size)
            if '%' in size:
                long_kwds['extents'] = size
            else:
                long_kwds['size'] = size
        else:
            long_kwds['extents'] = '1%ORIGIN'

        lvol = '%s/%s' % (self.vg, long_kwds['name'])
        if lvol in lvm2.lvs():
            lvm2.lvremove(lvol)
        lvm2.lvcreate(**long_kwds)
        lv_info = lvm2.lvs(lvol).values()[0]

        return storage2.snapshot(
                        type='lvm_native',
                        name=lv_info.lv_name,
                        vg=lv_info.vg_name,
                        device=lv_info.lv_path)
Beispiel #4
0
    def destroy_volume(self, id):
        volume = self.describe_volume(id)
        attached_to = volume.get('attached_to')

        if attached_to:
            raise StorageError(
                'Can not destroy volume: volume attached to instance %s' %
                attached_to)
        lvm2.lvremove(volume['host_path'])
Beispiel #5
0
	def _destroy(self, force, **kwds):
		try:
			lvm2.lvremove(self.device)
		except lvm2.NotFound:
			pass

		if force:
			try:
				vg_info = lvm2.vgs(self.vg).values()[0]
			except lvm2.NotFound:
				pass
			else:
				if not (int(vg_info.snap_count) and not int(vg_info.lv_count)):
					pv_disks = [device for device, pv_info in lvm2.pvs().items()
								if pv_info.vg_name == self.vg]
					lvm2.vgremove(self.vg)
					for device in pv_disks:
						lvm2.pvremove(device)

					for pv in self.pvs:
						pv.destroy(force=True)
Beispiel #6
0
    def create_snapshot(self, volume_id):
        assert volume_id in self.volumes, 'Volume "%s" not found' % volume_id
        volume = self.volumes[volume_id]

        snapshot_id = str(uuid.uuid4())[:7]
        if not os.path.isdir(snapshot_dir):
            os.makedirs(snapshot_dir)
        snap_path = self._get_snapshot_path(snapshot_id)

        lvm2.lvcreate(os.path.join('/dev', vg_name, volume['id']), snapshot=True, name=snapshot_id, size=snap_size)
        lv_info = None
        try:
            lv_info = lvm2.lvs(lvm2.lvpath(vg_name, snapshot_id)).values()[0]
            system('dd if=%s | cp --sparse=always /dev/stdin %s' % (lv_info.lv_path, snap_path), shell=True)
        finally:
            if lv_info:
                lvm2.lvremove(lv_info.lv_path)
            else:
                lvm2.lvremove(os.path.join('/dev', vg_name, snapshot_id))

        snapshot = dict(id=snapshot_id, size=volume['size'])
        self.snapshots[snapshot_id] = snapshot
        return snapshot
Beispiel #7
0
    def _destroy(self, force, **kwds):
        try:
            lvm2.lvremove(self.device)
        except lvm2.NotFound:
            pass

        if force:
            try:
                vg_info = lvm2.vgs(self.vg).values()[0]
            except lvm2.NotFound:
                pass
            else:
                if not (int(vg_info.snap_count) and not int(vg_info.lv_count)):
                    pv_disks = [
                        device for device, pv_info in lvm2.pvs().items()
                        if pv_info.vg_name == self.vg
                    ]
                    lvm2.vgremove(self.vg)
                    for device in pv_disks:
                        lvm2.pvremove(device)

                    for pv in self.pvs:
                        pv.destroy(force=True)
Beispiel #8
0
    def lvm_snapshot(self, name=None, size=None):
        long_kwds = {
            'name': name or '%ssnap' % self.name,
            'snapshot': '%s/%s' % (self.vg, self.name)
        }
        if size:
            size = str(size)
            if '%' in size:
                long_kwds['extents'] = size
            else:
                long_kwds['size'] = size
        else:
            long_kwds['extents'] = '1%ORIGIN'

        lvol = '%s/%s' % (self.vg, long_kwds['name'])
        if lvol in lvm2.lvs():
            lvm2.lvremove(lvol)
        lvm2.lvcreate(**long_kwds)
        lv_info = lvm2.lvs(lvol).values()[0]

        return storage2.snapshot(type='lvm_native',
                                 name=lv_info.lv_name,
                                 vg=lv_info.vg_name,
                                 device=lv_info.lv_path)
Beispiel #9
0
 def _destroy(self):
     lvm2.lvremove(self.device)
Beispiel #10
0
	def _destroy(self):
		lvm2.lvremove(self.device)