def changelv(vg, lvs, attrs): """ Change multiple attributes on multiple LVs. vg: VG name lvs: a single LV name or iterable of LV names. attrs: an iterable of (attr, value) pairs), e.g. (('--available', 'y'), ('--permission', 'rw') Note: You may activate an activated LV without error but lvchange returns an error (RC=5) when activating rw if already rw """ lvs = _normalizeargs(lvs) # If it fails or not we (may be) change the lv, # so we invalidate cache to reload these volumes on first occasion lvnames = tuple("%s/%s" % (vg, lv) for lv in lvs) cmd = ["lvchange"] cmd.extend(LVM_NOBACKUP) if isinstance(attrs[0], str): # ("--attribute", "value") cmd.extend(attrs) else: # (("--aa", "v1"), ("--ab", "v2")) for attr in attrs: cmd.extend(attr) cmd.extend(lvnames) rc, out, err = _lvminfo.cmd(tuple(cmd), _lvminfo._getVGDevs((vg, ))) _lvminfo._invalidatelvs(vg, lvs) if rc != 0 and len(out) < 1: raise se.StorageException("%d %s %s\n%s/%s" % (rc, out, err, vg, lvs))
def changelv(vg, lvs, attrName, attrValue): # Note: # You may activate an activated LV without error # but lvchange returns an error (RC=5) when activating rw if already rw lvs = _normalizeargs(lvs) # If it fails or not we (may be) change the lv, # so we invalidate cache to reload these volumes on first occasion lvnames = tuple("%s/%s" % (vg, lv) for lv in lvs) cmd = ("lvchange", ) + LVM_NOBACKUP + (attrName, attrValue) + lvnames rc, out, err = _lvminfo.cmd(cmd) _lvminfo._invalidatelvs(vg, lvs) if rc != 0 and len(out) < 1: raise se.StorageException("%d %s %s\n%s/%s" % (rc, out, err, vg, lvs))
def copyToImage(dstImgPath, methodArgs): totalSize = getLengthFromArgs(methodArgs) fileObj = methodArgs['fileObj'] cmd = [constants.EXT_DD, "of=%s" % dstImgPath, "bs=%s" % constants.MEGAB] p = utils.execCmd(cmd, sudo=False, sync=False, deathSignal=signal.SIGKILL) try: _copyData(fileObj, p.stdin, totalSize) p.stdin.close() if not p.wait(WAIT_TIMEOUT): log.error("timeout waiting for dd process") raise se.StorageException() if p.returncode != 0: log.error("dd error - code %s, stderr %s", p.returncode, p.stderr.read(1000)) raise se.MiscFileWriteException() except Exception: if p.returncode is None: p.kill() raise
def _extendSizeRaw(self, newSize): volPath = self.getVolumePath() curSizeBytes = self.oop.os.stat(volPath).st_size newSizeBytes = newSize * BLOCK_SIZE # No real sanity checks here, they should be included in the calling # function/method. We just validate the sizes to be consistent since # they're computed and used in the pre-allocated case. if newSizeBytes == curSizeBytes: return # Nothing to do elif curSizeBytes <= 0: raise se.StorageException("Volume size is impossible: %s" % curSizeBytes) elif newSizeBytes < curSizeBytes: raise se.VolumeResizeValueError(newSize) if self.getType() == volume.PREALLOCATED_VOL: # for pre-allocated we need to zero to the file size misc.ddWatchCopy("/dev/zero", volPath, vars.task.aborting, newSizeBytes - curSizeBytes, curSizeBytes) else: # for sparse files we can just truncate to the correct size self.oop.truncateFile(volPath, newSizeBytes)