def create(self, sr_uuid, vdi_uuid, size): if not self.sr.isMaster: util.SMlog('vdi_create blocked for non-master') raise xs_errors.XenError('LVMMaster') try: mb = 1024L * 1024L size_mb = (long(size) + mb - 1L) / mb # round up # Rather than bailing out for small sizes, just round up to 1 MiB. The # LVM code will round up to the nearest PE size anyway (probably 4 MiB) if size_mb == 0: size_mb = 1 if lvutil._checkLV(self.path): raise xs_errors.XenError('VDIExists') # Verify there's sufficient space for the VDI stats = lvutil._getVGstats(self.sr.vgname) freespace = stats['physical_size'] - stats['physical_utilisation'] if freespace < long(size): raise xs_errors.XenError('SRNoSpace') cmd = ["lvcreate", "-n", self.lvname, "-L", str(size_mb), \ self.sr.vgname] text = util.pread2(cmd) cmd = ["lvchange", "-an", self.path] text = util.pread2(cmd) self.size = lvutil._getLVsize(self.path) self.utilisation = self.size except util.CommandException, inst: raise xs_errors.XenError('LVMCreate', \ opterr='lv operation failed error is %d' % inst.code)
def resize(self, sr_uuid, vdi_uuid, size): if not self.sr.isMaster: util.SMlog('vdi_resize blocked for non-master') raise xs_errors.XenError('LVMMaster') try: self.size = lvutil._getLVsize(self.path) except: raise xs_errors.XenError('VDIUnavailable', \ opterr='no such VDI %s' % self.path) size_mb = long(size) / (1024 * 1024) try: assert(size_mb >= self.size/(1024 * 1024)) if size == self.size: self.size = lvutil._getLVsize(self.path) self.utilisation = self.size return super(LVMVDI, self).get_params() # Verify there's sufficient space for the VDI stats = lvutil._getVGstats(self.sr.vgname) freespace = stats['physical_size'] - stats['physical_utilisation'] if freespace < long(size) - self.size: raise xs_errors.XenError('SRNoSpace') cmd = ["lvresize", "-L", str(size_mb), self.path] text = util.pread2(cmd) self.size = lvutil._getLVsize(self.path) self.utilisation = self.size self._db_update() return super(LVMVDI, self).get_params() except util.CommandException, inst: raise xs_errors.XenError('LVMResize', \ opterr='lvresize failed error is %d' % inst.code)