[PATCH][pykickstart] Add support for lvm thin provisioning.

David Lehman dlehman at redhat.com
Wed Jun 26 17:03:16 UTC 2013


On Wed, 2013-06-26 at 12:11 +0200, Vratislav Podzimek wrote:
> On Tue, 2013-06-25 at 15:41 -0500, David Lehman wrote:
> > This adds a new autopart type and options to the logvol command.
> > ---
> >  pykickstart/commands/autopart.py | 18 ++++++++------
> >  pykickstart/commands/logvol.py   | 54 ++++++++++++++++++++++++++++++++++++++++
> >  pykickstart/constants.py         |  1 +
> >  pykickstart/handlers/control.py  | 10 ++++----
> >  tests/commands/autopart.py       |  2 ++
> >  tests/commands/logvol.py         | 34 +++++++++++++++++++++++++
> >  6 files changed, 107 insertions(+), 12 deletions(-)
> > 
> > diff --git a/pykickstart/commands/autopart.py b/pykickstart/commands/autopart.py
> > index c31e014..308ff25 100644
> > --- a/pykickstart/commands/autopart.py
> > +++ b/pykickstart/commands/autopart.py
> > @@ -184,7 +184,8 @@ class F17_AutoPart(F16_AutoPart):
> >          self.typeMap = { "lvm": AUTOPART_TYPE_LVM,
> >                           "btrfs": AUTOPART_TYPE_BTRFS,
> >                           "plain": AUTOPART_TYPE_PLAIN,
> > -                         "partition": AUTOPART_TYPE_PLAIN }
> > +                         "partition": AUTOPART_TYPE_PLAIN,
> > +                         "thinp": AUTOPART_TYPE_LVM_THINP }
> >  
> >      def __str__(self):
> >          retval = F16_AutoPart.__str__(self)
> > @@ -195,12 +196,10 @@ class F17_AutoPart(F16_AutoPart):
> >              # remove any trailing newline
> >              retval = retval.strip()
> >              retval += " --type="
> > -            if self.type == AUTOPART_TYPE_LVM:
> > -                retval += "lvm"
> > -            elif self.type == AUTOPART_TYPE_BTRFS:
> > -                retval += "btrfs"
> > -            else:
> > -                retval += "plain"
> > +            for s, n in self.typeMap.items():
> > +                if self.type == n:
> > +                    retval += s
> > +                    break
> >              retval += "\n"
> >  
> >          return retval
> > @@ -259,3 +258,8 @@ class F18_AutoPart(F17_AutoPart):
> >          op = F17_AutoPart._getParser(self)
> >          op.add_option("--cipher")
> >          return op
> > +
> > +class F19_AutoPart(F18_AutoPart):
> > +    def __init__(self, writePriority=100, *args, **kwargs):
> > +        F18_AutoPart.__init__(self, writePriority=writePriority, *args, **kwargs)
> > +        self.typeMap["thinp"] = AUTOPART_TYPE_LVM_THINP
> > diff --git a/pykickstart/commands/logvol.py b/pykickstart/commands/logvol.py
> > index 9a7b54c..28b8b50 100644
> > --- a/pykickstart/commands/logvol.py
> > +++ b/pykickstart/commands/logvol.py
> > @@ -233,6 +233,34 @@ class F18_LogVolData(F17_LogVolData):
> >  
> >          return retval
> >  
> > +class F19_LogVolData(F18_LogVolData):
> I believe the new classes should be F20_* classes.

Good catch. When I wrote it I was targeting F19, but it ended up taking
too long to get it right. I'll change this.

> 
> > +    def __init__(self, *args, **kwargs):
> > +        F18_LogVolData.__init__(self, *args, **kwargs)
> > +        self.thin_pool = kwargs.get("thin_pool", False)
> > +        self.thin_volume = kwargs.get("thin_volume", False)
> > +        self.pool_name = kwargs.get("pool_name", "")
> > +
> > +        # these are only for thin pools
> > +        self.chunk_size = kwargs.get("chunk_size", None)        # kilobytes
> > +        self.metadata_size = kwargs.get("metadata_size", None)  # megabytes
> > +
> > +    def _getArgsAsStr(self):
> > +        retval = F18_LogVolData._getArgsAsStr(self)
> > +
> > +        if self.thin_pool:
> > +            retval += " --thinpool"
> > +
> > +            if self.metadata_size:
> > +                retval += " --metadatasize=%d" % self.metadata_size
> > +
> > +            if self.chunk_size:
> > +                retval += " --chunksize=%d" % self.chunk_size
> > +
> > +        if self.thin_volume:
> > +            retval += " --thin --poolname=%s" % self.pool_name
> > +
> > +        return retval
> > +
> >  class FC3_LogVol(KickstartCommand):
> >      removedKeywords = KickstartCommand.removedKeywords
> >      removedAttrs = KickstartCommand.removedAttrs
> > @@ -394,3 +422,29 @@ class F18_LogVol(F17_LogVol):
> >          op.add_option("--cipher")
> >          return op
> >  
> > +class F19_LogVol(F18_LogVol):
> > +    def _getParser(self):
> > +        op = F18_LogVol._getParser(self)
> > +        op.add_option("--thinpool", action="store_true", dest="thin_pool",
> > +                      default=False)
> > +        op.add_option("--thin", action="store_true", dest="thin_volume",
> > +                      default=False)
> > +        op.add_option("--poolname", dest="pool_name")
> > +        op.add_option("--chunksize", type="int", dest="chunk_size")
> > +        op.add_option("--metadatasize", type="int", dest="metadata_size")
> > +        return op
> > +
> > +    def parse(self, args):
> > +        retval = F18_LogVol.parse(self, args)
> > +
> > +        if retval.thin_volume and retval.thin_pool:
> > +            raise KickstartParseError(formatErrorMsg(self.lineno, msg=_("--thin and --thinpool cannot both be specified for the same logvol")))
> > +
> > +        if retval.thin_volume and not retval.pool_name:
> > +            raise KickstartParseError(formatErrorMsg(self.lineno, msg=_("--thin requires --poolname to specify pool name")))
> > +
> > +        if (retval.chunk_size or retval.metadata_size) and \
> > +           not retval.thin_pool:
> > +            raise KickstartParseError(formatErrorMsg(self.lineno, msg=_("--chunksize and --metadatasize are for thin pools only")))
> Could you please split these long lines?

Yeah, I just continue the trend of not breaking the long lines when
raising exceptions from kickstart since they are all like that.

> 
> Other than that and Brian's comments this looks good to me.
> 




More information about the anaconda-patches mailing list