Exemple #1
0
    def test_remove_removes_volume(self, lvsystem):
        lvsystem.add_volume_group('VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7')
        lvsystem.get_volume_group('VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7').add_volume('volume', 100)

        lvutil.remove('VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7/volume')

        self.assertEquals([], lvsystem.get_logical_volumes_with_name('volume'))
Exemple #2
0
    def test_remove_removes_volume(self, lvsystem):
        lvsystem.add_volume_group('VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7')
        lvsystem.get_volume_group('VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7').add_volume('volume', 100)

        lvutil.remove('VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7/volume')

        self.assertEquals([], lvsystem.get_logical_volumes_with_name('volume'))
Exemple #3
0
    def test_remove_removes_volume(self, lvsystem):
        lvsystem.add_volume_group('vgroup')
        lvsystem.get_volume_group('vgroup').add_volume('volume', 100)

        lvutil.remove('vgroup/volume')

        self.assertEquals([], lvsystem.get_logical_volumes_with_name('volume'))
Exemple #4
0
    def test_remove_removes_volume(self, lvsystem):
        lvsystem.add_volume_group('vgroup')
        lvsystem.get_volume_group('vgroup').add_volume('volume', 100)

        lvutil.remove('vgroup/volume')

        self.assertEquals([], lvsystem.get_logical_volumes_with_name('volume'))
Exemple #5
0
def do_trim(session, args):
    """Attempt to trim the given LVHDSR"""
    util.SMlog("do_trim: %s" % args)
    sr_uuid = args["sr_uuid"]
    os.environ['LVM_SYSTEM_DIR'] = MASTER_LVM_CONF

    if TRIM_CAP not in util.sr_get_capability(sr_uuid):
        util.SMlog("Trim command ignored on unsupported SR %s" % sr_uuid)
        err_msg = {
            ERROR_CODE_KEY: 'UnsupportedSRForTrim',
            ERROR_MSG_KEY: 'Trim on [%s] not supported' % sr_uuid
        }
        return to_xml(err_msg)

    # Lock SR, get vg empty space details
    sr_lock = lock.Lock(vhdutil.LOCK_TYPE_SR, sr_uuid)
    got_lock = False
    for i in range(LOCK_RETRY_ATTEMPTS):
        got_lock = sr_lock.acquireNoblock()
        if got_lock:
            break
        time.sleep(LOCK_RETRY_INTERVAL)

    if got_lock:
        try:
            vg_name = _vg_by_sr_uuid(sr_uuid)
            lv_name = sr_uuid + TRIM_LV_TAG
            lv_path = _lvpath_by_vg_lv_name(vg_name, lv_name)

            # Clean trim LV in case the previous trim attemp failed
            if lvutil.exists(lv_path):
                lvutil.remove(lv_path)

            #Check if VG limits are enough for creating LV.
            stats = lvutil._getVGstats(vg_name)
            if (stats['freespace'] < lvutil.LVM_SIZE_INCREMENT):
                util.SMlog("No space to claim on a full SR %s" % sr_uuid)
                err_msg = {
                    ERROR_CODE_KEY: 'Trim failed on full SR',
                    ERROR_MSG_KEY: 'No space to claim on a full SR'
                }
                result = to_xml(err_msg)
            else:
                # Perform a lvcreate, blkdiscard and lvremove to
                # trigger trim on the array
                lvutil.create(lv_name, 0, vg_name, size_in_percentage="100%F")
                cmd = ["/usr/sbin/blkdiscard", "-v", lv_path]
                stdout = util.pread2(cmd)
                util.SMlog("Stdout is %s" % stdout)
                util.SMlog("Trim on SR: %s complete. " % sr_uuid)
                result = str(True)
        except util.CommandException, e:
            err_msg = {
                ERROR_CODE_KEY: 'TrimException',
                ERROR_MSG_KEY: e.reason
            }
            result = to_xml(err_msg)
        except:
Exemple #6
0
 def test_remove_additional_config_param(self, mock_pread, _bugCleanup):
     lvutil.remove(
         'VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7/volume',
         config_param="blah")
     mock_pread.assert_called_once_with(
         [os.path.join(lvutil.LVM_BIN, lvutil.CMD_LVREMOVE)] +
         "-f VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7/volume --config devices{blah}"
         .split(),
         quiet=False)
Exemple #7
0
def do_trim(session, args):
    """Attempt to trim the given LVHDSR"""
    util.SMlog("do_trim: %s" % args)
    sr_uuid = args["sr_uuid"]
    os.environ['LVM_SYSTEM_DIR'] = MASTER_LVM_CONF

    if TRIM_CAP not in util.sr_get_capability(sr_uuid):
        util.SMlog("Trim command ignored on unsupported SR %s" % sr_uuid)
        err_msg = {ERROR_CODE_KEY: 'UnsupportedSRForTrim',
                   ERROR_MSG_KEY: 'Trim on [%s] not supported' % sr_uuid}
        return to_xml(err_msg)

    # Lock SR, get vg empty space details
    sr_lock = lock.Lock(vhdutil.LOCK_TYPE_SR, sr_uuid)
    got_lock = False
    for i in range(LOCK_RETRY_ATTEMPTS):
        got_lock = sr_lock.acquireNoblock()
        if got_lock:
            break
        time.sleep(LOCK_RETRY_INTERVAL)

    if got_lock:
        try:
            vg_name = _vg_by_sr_uuid(sr_uuid)
            lv_name = sr_uuid + TRIM_LV_TAG
            lv_path = _lvpath_by_vg_lv_name(vg_name, lv_name)

            # Clean trim LV in case the previous trim attemp failed
            if lvutil.exists(lv_path):
               lvutil.remove(lv_path)

            #Check if VG limits are enough for creating LV.
            stats = lvutil._getVGstats(vg_name)
            if (stats['freespace'] < lvutil.LVM_SIZE_INCREMENT):
                util.SMlog("No space to claim on a full SR %s" % sr_uuid)
                err_msg = {ERROR_CODE_KEY: 'Trim failed on full SR',
                           ERROR_MSG_KEY: 'No space to claim on a full SR'}
                result = to_xml(err_msg)
            else:
                # Perform a lvcreate, blkdiscard and lvremove to
                # trigger trim on the array
                lvutil.create(lv_name, 0, vg_name, size_in_percentage="100%F")
                cmd = ["/usr/sbin/blkdiscard", "-v", lv_path]
                stdout = util.pread2(cmd)
                util.SMlog("Stdout is %s" % stdout)
                util.SMlog("Trim on SR: %s complete. " % sr_uuid)
                result = str(True)
        except util.CommandException, e:
            err_msg = {
                ERROR_CODE_KEY: 'TrimException',
                ERROR_MSG_KEY: e.reason
            }
            result = to_xml(err_msg)
        except:
Exemple #8
0
def do_trim(session, args):
    """Attempt to trim the given LVHDSR"""
    util.SMlog("do_trim: %s" % args)
    sr_uuid = args["sr_uuid"]

    if TRIM_CAP not in util.sr_get_capability(sr_uuid):
        util.SMlog("Trim command ignored on unsupported SR %s" % sr_uuid)
        err_msg = {ERROR_CODE_KEY: 'UnsupportedSRForTrim',
                   ERROR_MSG_KEY: 'Trim on [%s] not supported' % sr_uuid}
        return to_xml(err_msg)

    # Lock SR, get vg empty space details
    sr_lock = lock.Lock(vhdutil.LOCK_TYPE_SR, sr_uuid)
    got_lock = False
    for i in range(LOCK_RETRY_ATTEMPTS):
        got_lock = sr_lock.acquireNoblock()
        if got_lock:
            break
        time.sleep(LOCK_RETRY_INTERVAL)

    if got_lock:
        try:
            vg_name = _vg_by_sr_uuid(sr_uuid)
            lv_name = sr_uuid + TRIM_LV_TAG
            lv_path = _lvpath_by_vg_lv_name(vg_name, lv_name)

            # Clean trim LV in case the previous trim attemp failed
            if lvutil.exists(lv_path):
                lvutil.remove(lv_path)

            # Perform a lvcreate and lvremove to trigger trim on the array
            lvutil.create(lv_name, 0, vg_name, size_in_percentage="100%F")
            lvutil.remove(lv_path,  config_param="issue_discards=1")
            util.SMlog("Trim on SR: %s complete. " % sr_uuid)
            result = str(True)
        except:
            err_msg = {
                ERROR_CODE_KEY: 'UnknownTrimException',
                ERROR_MSG_KEY: 'Unknown Exception: trim failed on SR [%s]'
                % sr_uuid
            }
            result = to_xml(err_msg)

        _log_last_triggered(session, sr_uuid)

        sr_lock.release()
        return result
    else:
        util.SMlog("Could not complete Trim on %s, Lock unavailable !" \
                   % sr_uuid)
        err_msg = {ERROR_CODE_KEY: 'SRUnavailable',
                   ERROR_MSG_KEY: 'Unable to get SR lock [%s]' % sr_uuid}
        return to_xml(err_msg)
Exemple #9
0
 def remove(self, lvName):
     path = self._getPath(lvName)
     lvutil.remove(path)
     for tag in self.lvs[lvName].tags:
         self._removeTag(lvName, tag)
     del self.lvs[lvName]
Exemple #10
0
 def test_remove_additional_config_param(self, mock_pread, _bugCleanup):
     lvutil.remove('VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7/volume', config_param="blah")
     mock_pread.assert_called_once_with(
         [os.path.join(lvutil.LVM_BIN, lvutil.CMD_LVREMOVE)]
         + "-f VG_XenStorage-b3b18d06-b2ba-5b67-f098-3cdd5087a2a7/volume --config devices{blah}".split(),
        quiet= False)
Exemple #11
0
            util.SMlog("Stdout is %s" % stdout)
            util.SMlog("Trim on SR: %s complete. " % sr_uuid)
            result = str(True)
        except util.CommandException, e:
            err_msg = {
                ERROR_CODE_KEY: 'TrimException',
                ERROR_MSG_KEY: e.reason
            }
            result = to_xml(err_msg)
        except:
            err_msg = {
                ERROR_CODE_KEY: 'UnknownTrimException',
                ERROR_MSG_KEY: 'Unknown Exception: trim failed on SR [%s]'
                % sr_uuid
            }
            result = to_xml(err_msg)
        finally:
            if lvutil.exists(lv_path):
                lvutil.remove(lv_path)

        _log_last_triggered(session, sr_uuid)

        sr_lock.release()
        return result
    else:
        util.SMlog("Could not complete Trim on %s, Lock unavailable !" \
                   % sr_uuid)
        err_msg = {ERROR_CODE_KEY: 'SRUnavailable',
                   ERROR_MSG_KEY: 'Unable to get SR lock [%s]' % sr_uuid}
        return to_xml(err_msg)
Exemple #12
0
 def remove(self, lvName):
     path = self._getPath(lvName)
     lvutil.remove(path)
     for tag in self.lvs[lvName].tags:
         self._removeTag(lvName, tag)
     del self.lvs[lvName]
Exemple #13
0
 def test_remove_additional_config_param(self, mock_pread2, _bugCleanup):
     lvutil.remove('vgroup/volume', config_param="blah")
     mock_pread2.assert_called_once_with(
         [lvutil.CMD_LVREMOVE] +
         "-f vgroup/volume --config devices{blah}".split())
Exemple #14
0
        except util.CommandException, e:
            err_msg = {
                ERROR_CODE_KEY: 'TrimException',
                ERROR_MSG_KEY: e.reason
            }
            result = to_xml(err_msg)
        except:
            err_msg = {
                ERROR_CODE_KEY:
                'UnknownTrimException',
                ERROR_MSG_KEY:
                'Unknown Exception: trim failed on SR [%s]' % sr_uuid
            }
            result = to_xml(err_msg)
        finally:
            if lvutil.exists(lv_path):
                lvutil.remove(lv_path)

        _log_last_triggered(session, sr_uuid)

        sr_lock.release()
        return result
    else:
        util.SMlog("Could not complete Trim on %s, Lock unavailable !" \
                   % sr_uuid)
        err_msg = {
            ERROR_CODE_KEY: 'SRUnavailable',
            ERROR_MSG_KEY: 'Unable to get SR lock [%s]' % sr_uuid
        }
        return to_xml(err_msg)
Exemple #15
0
 def test_remove_additional_config_param(self, mock_pread2, _bugCleanup):
     lvutil.remove('vgroup/volume', config_param="blah")
     mock_pread2.assert_called_once_with(
         [lvutil.CMD_LVREMOVE]
         + "-f vgroup/volume --config devices{blah}".split()
     )