2 # Chris Lumens <clumens@redhat.com>
3 # David Lehman <dlehman@redhat.com>
5 # Copyright 2005, 2006, 2007, 2011 Red Hat, Inc.
7 # This copyrighted material is made available to anyone wishing to use, modify,
8 # copy, or redistribute it subject to the terms and conditions of the GNU
9 # General Public License v.2. This program is distributed in the hope that it
10 # will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
11 # implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 # See the GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License along with
15 # this program; if not, write to the Free Software Foundation, Inc., 51
16 # Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Any Red Hat
17 # trademarks that are incorporated in the source code or documentation are not
18 # subject to the GNU General Public License and may only be used or replicated
19 # with the express permission of Red Hat, Inc.
21 from pykickstart
.base
import BaseData
, KickstartCommand
22 from pykickstart
.errors
import KickstartValueError
, formatErrorMsg
23 from pykickstart
.options
import KSOptionParser
27 _
= lambda x
: gettext
.ldgettext("pykickstart", x
)
29 class F17_BTRFSData(BaseData
):
30 removedKeywords
= BaseData
.removedKeywords
31 removedAttrs
= BaseData
.removedAttrs
33 def __init__(self
, *args
, **kwargs
):
34 BaseData
.__init
__(self
, *args
, **kwargs
)
35 self
.format
= kwargs
.get("format", True)
36 self
.preexist
= kwargs
.get("preexist", False)
37 self
.label
= kwargs
.get("label", "")
38 self
.mountpoint
= kwargs
.get("mountpoint", "")
39 self
.devices
= kwargs
.get("devices", [])
40 self
.dataLevel
= kwargs
.get("data", None)
41 self
.metaDataLevel
= kwargs
.get("metadata", None)
44 self
.subvol
= kwargs
.get("subvol", False)
45 self
.name
= kwargs
.get("name", None) # required
51 return self
.mountpoint
== y
.mountpoint
56 def _getArgsAsStr(self
):
59 retval
+= " --noformat"
61 retval
+= " --useexisting"
63 retval
+= " --label=%s" % self
.label
65 retval
+= " --data=%s" % self
.dataLevel
66 if self
.metaDataLevel
:
67 retval
+= " --metadata=%s" % self
.metaDataLevel
69 retval
+= " --subvol --name=%s" % self
.name
74 retval
= BaseData
.__str
__(self
)
75 retval
+= "btrfs %s" % self
.mountpoint
76 retval
+= self
._getArgsAsStr
()
77 return retval
+ " " + " ".join(self
.devices
) + "\n"
79 class F17_BTRFS(KickstartCommand
):
80 removedKeywords
= KickstartCommand
.removedKeywords
81 removedAttrs
= KickstartCommand
.removedAttrs
83 def __init__(self
, writePriority
=132, *args
, **kwargs
):
84 KickstartCommand
.__init
__(self
, writePriority
, *args
, **kwargs
)
85 self
.op
= self
._getParser
()
87 # A dict of all the RAID levels we support. This means that if we
88 # support more levels in the future, subclasses don't have to
90 self
.levelMap
= { "RAID0": "raid0", "0": "raid0",
91 "RAID1": "raid1", "1": "raid1",
92 "RAID10": "raid10", "10": "raid10",
95 self
.btrfsList
= kwargs
.get("btrfsList", [])
99 for btr
in self
.btrfsList
:
100 retval
+= btr
.__str
__()
104 def _getParser(self
):
105 # Have to be a little more complicated to set two values.
106 def btrfs_cb (option
, opt_str
, value
, parser
):
107 parser
.values
.format
= False
108 parser
.values
.preexist
= True
110 def level_cb (option
, opt_str
, value
, parser
):
111 if value
in self
.levelMap
:
112 parser
.values
.ensure_value(option
.dest
, self
.levelMap
[value
])
114 op
= KSOptionParser()
115 op
.add_option("--noformat", action
="callback", callback
=btrfs_cb
,
116 dest
="format", default
=True, nargs
=0)
117 op
.add_option("--useexisting", action
="callback", callback
=btrfs_cb
,
118 dest
="preexist", default
=False, nargs
=0)
120 # label, data, metadata
121 op
.add_option("--label", dest
="label", default
="")
122 op
.add_option("--data", dest
="dataLevel", action
="callback",
123 callback
=level_cb
, type="string", nargs
=1)
124 op
.add_option("--metadata", dest
="metaDataLevel", action
="callback",
125 callback
=level_cb
, type="string", nargs
=1)
130 op
.add_option("--subvol", dest
="subvol", action
="store_true",
133 # parent must be a device spec (LABEL, UUID, &c)
134 op
.add_option("--parent", dest
="parent", default
="")
135 op
.add_option("--name", dest
="name", default
="")
139 def parse(self
, args
):
140 (opts
, extra
) = self
.op
.parse_args(args
=args
, lineno
=self
.lineno
)
141 data
= self
.handler
.BTRFSData()
142 self
._setToObj
(self
.op
, opts
, data
)
143 data
.lineno
= self
.lineno
146 raise KickstartValueError(formatErrorMsg(self
.lineno
, msg
=_("btrfs must be given a mountpoint")))
148 if len(extra
) == 1 and not data
.subvol
:
149 raise KickstartValueError(formatErrorMsg(self
.lineno
, msg
=_("btrfs must be given a list of partitions")))
150 elif len(extra
) == 1:
151 raise KickstartValueError(formatErrorMsg(self
.lineno
, msg
=_("btrfs subvol requires specification of parent volume")))
153 if data
.subvol
and not data
.name
:
154 raise KickstartValueError(formatErrorMsg(self
.lineno
, msg
=_("btrfs subvolume requires a name")))
156 data
.mountpoint
= extra
[0]
157 data
.devices
= extra
[1:]
159 # Check for duplicates in the data list.
160 if data
in self
.dataList():
161 warnings
.warn(_("A btrfs volume with the mountpoint %s has already been defined.") % data
.label
)
166 return self
.btrfsList