Validate network interface name when parsing the kickstart (#1081982)
[pykickstart.git] / tests / commands / logvol.py
blob6c0978d21eeaee7a7ed1e0a52a436246ddc94df3
1 import unittest, shlex
2 from tests.baseclass import *
4 from pykickstart.base import *
5 from pykickstart.errors import *
6 from pykickstart.version import *
7 from pykickstart.commands.logvol import *
9 class FC3_TestCase(CommandTest):
10 command = "logvol"
12 def runTest(self):
13 if "--bytes-per-inode" in self.optionList:
14 self.bytesPerInode = "--bytes-per-inode=4096 "
15 else:
16 self.bytesPerInode = ""
18 # --name and --vgname
19 self.assert_parse("logvol / --size=10240 --name=NAME --vgname=VGNAME",
20 "logvol / --size=10240 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
21 # --fstype
22 self.assert_parse("logvol / --fstype=\"BLAFS\" --size=10240 --name=NAME --vgname=VGNAME",
23 "logvol / --fstype=\"BLAFS\" --size=10240 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
24 # --grow
25 self.assert_parse("logvol / --grow --size=10240 --name=NAME --vgname=VGNAME",
26 "logvol / --grow --size=10240 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
27 # --size
28 self.assert_parse("logvol / --size=1024 --name=NAME --vgname=VGNAME",
29 "logvol / --size=1024 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
30 # --maxsize
31 self.assert_parse("logvol / --maxsize=2048 --size=1024 --name=NAME --vgname=VGNAME",
32 "logvol / --maxsize=2048 --size=1024 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
33 # --recommended
34 self.assert_parse("logvol / --maxsize=2048 --recommended --size=1024 --name=NAME --vgname=VGNAME",
35 "logvol / --maxsize=2048 --recommended --size=1024 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
36 # --percent
37 self.assert_parse("logvol / --percent=10 --name=NAME --vgname=VGNAME",
38 "logvol / --percent=10 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
39 # --noformat
40 # FIXME - should --noformat also be adding --useexisting (seems counter
41 # to posted documentation
42 # http://fedoraproject.org/wiki/Anaconda/Kickstart)
43 self.assert_parse("logvol / --noformat --name=NAME --vgname=VGNAME",
44 "logvol / --noformat --useexisting %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
45 # --useexisting
46 self.assert_parse("logvol / --useexisting --name=NAME --vgname=VGNAME",
47 "logvol / --useexisting %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
49 # assert data types
50 self.assert_type("logvol", "size", "int")
51 self.assert_type("logvol", "maxsize", "int")
52 self.assert_type("logvol", "percent", "int")
54 # fail - incorrect type
55 self.assert_parse_error("logvol / --name=NAME --vgname=VGNAME --size=SIZE", KickstartParseError, "option --size: invalid integer value: 'SIZE'")
56 self.assert_parse_error("logvol / --name=NAME --vgname=VGNAME --maxsize=MAXSIZE", KickstartParseError, "option --maxsize: invalid integer value: 'MAXSIZE'")
57 self.assert_parse_error("logvol / --name=NAME --vgname=VGNAME --percent=PCT", KickstartParseError, "option --percent: invalid integer value: 'PCT'")
59 # assert required options
60 self.assert_required("logvol", "name")
61 self.assert_required("logvol", "vgname")
63 # fail - missing required
64 self.assert_parse_error("logvol / --name=NAME", KickstartValueError, "Option --vgname is required")
65 self.assert_parse_error("logvol / --vgname=NAME", KickstartValueError, "Option --name is required")
67 # fail - missing a mountpoint
68 self.assert_parse_error("logvol", KickstartValueError, "Option --name is required")
69 self.assert_parse_error("logvol --name=NAME", KickstartValueError, "Option --vgname is required")
70 self.assert_parse_error("logvol --vgname=NAME", KickstartValueError, "Option --name is required")
72 class FC4_TestCase(FC3_TestCase):
73 def runTest(self):
75 # run our baseclass tests first ... but add --bytes-per-inode to each
76 # expected result
77 FC3_TestCase.runTest(self)
79 # --fsoptions
80 if "--fsoptions" in self.optionList:
81 self.assert_parse("logvol / --fstype=\"BLAFS\" --size=1024 --fsoptions=\"ABC 123\" --name=NAME --vgname=VGNAME",
82 "logvol / --fstype=\"BLAFS\" --size=1024 %s--fsoptions=\"ABC 123\" --name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
84 if "--bytes-per-inode" in self.optionList:
85 # --bytes-per-inode explicit
86 self.assert_parse("logvol / --bytes-per-inode=123 --name=NAME --vgname=VGNAME",
87 "logvol / --bytes-per-inode=123 --name=NAME --vgname=VGNAME\n")
89 # assert data types
90 self.assert_type("logvol", "bytes-per-inode", "int")
92 # fail - incorrect type
93 self.assert_parse_error("logvol / --bytes-per-inode B --name=NAME --vgname=VGNAME", KickstartParseError, "option --bytes-per-inode: invalid integer value: 'B'")
95 # fail - missing value
96 self.assert_parse_error("logvol / --bytes-per-inode --name=NAME --vgname=VGNAME", KickstartParseError, "option --bytes-per-inode: invalid integer value: '--name=NAME'")
97 self.assert_parse_error("logvol / --name=NAME --vgname=VGNAME --bytes-per-inode", KickstartParseError, "--bytes-per-inode option requires an argument")
99 if "--encrypted" in self.optionList:
100 # Just --encrypted
101 self.assert_parse("logvol / --size=1024 --encrypted --name=NAME --vgname=VGNAME",
102 "logvol / --size=1024 %s--encrypted --name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
104 # Both --encrypted and --passphrase
105 self.assert_parse("logvol / --size=1024 --encrypted --passphrase PASSPHRASE --name=NAME --vgname=VGNAME",
106 "logvol / --size=1024 %s--encrypted --passphrase=\"PASSPHRASE\" --name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
108 # Using --encrypted with --passphrase=<empty>
109 self.assert_parse("logvol / --size=1024 --encrypted --passphrase= --name=NAME --vgname=VGNAME",
110 "logvol / --size=1024 %s--encrypted --name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
111 self.assert_parse("logvol / --size=1024 --encrypted --passphrase=\"\" --name=NAME --vgname=VGNAME",
112 "logvol / --size=1024 %s--encrypted --name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
113 self.assert_parse("logvol / --size=1024 --encrypted --passphrase \"\" --name=NAME --vgname=VGNAME",
114 "logvol / --size=1024 %s--encrypted --name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
116 # Just --passphrase without --encrypted
117 self.assert_parse("logvol / --size=1024 --passphrase=\"PASSPHRASE\" --name=NAME --vgname=VGNAME",
118 "logvol / --size=1024 %s--name=NAME --vgname=VGNAME\n" % self.bytesPerInode)
120 # fail - missing value
121 self.assert_parse_error("logvol / --name=NAME --vgname=VGNAME --encrypted --passphrase", KickstartParseError, "--passphrase option requires an argument")
123 # fail - --encrypted does not take a value
124 self.assert_parse_error("logvol / --encrypted=1 --name=NAME --vgname=VGNAME", KickstartParseError, "--encrypted option does not take a value")
126 RHEL5_TestCase = FC4_TestCase
128 class F9_TestCase(FC4_TestCase):
129 def runTest(self):
130 # Run our baseclass tests first
131 FC4_TestCase.runTest(self)
133 # assert data types
134 self.assert_type("logvol", "fsprofile", "string")
136 # fail - missing value
137 self.assert_parse_error("logvol / --name=NAME --vgname=VGNAME --fsprofile", KickstartParseError, "--fsprofile option requires an argument")
139 # Using --fsprofile
140 self.assert_parse("logvol / --size=1024 --fsprofile \"FS_PROFILE\" --name=NAME --vgname=VGNAME",
141 "logvol / --size=1024 --fsprofile=\"FS_PROFILE\" --name=NAME --vgname=VGNAME\n")
143 # Ensure --bytes-per-inode has been deprecated
144 self.assert_deprecated("logvol", "bytes-per-inode")
146 class F12_TestCase(F9_TestCase):
147 def runTest(self):
148 # Run our baseclass tests first
149 F9_TestCase.runTest(self)
151 # pass
152 self.assert_parse("logvol / --size=1024 --name=NAME --vgname=VGNAME "
153 "--escrowcert=\"http://x/y\"",
154 "logvol / --size=1024 --name=NAME --vgname=VGNAME\n")
155 self.assert_parse("logvol / --size=1024 --encrypted --backuppassphrase --name=NAME "
156 "--vgname=VGNAME",
157 "logvol / --size=1024 --encrypted --name=NAME --vgname=VGNAME\n")
158 self.assert_parse("logvol / --size=1024 --encrypted --escrowcert=\"http://x/y\" "
159 "--name=NAME --vgname=VGNAME",
160 "logvol / --size=1024 --encrypted --escrowcert=\"http://x/y\" "
161 "--name=NAME --vgname=VGNAME\n")
162 self.assert_parse("logvol / --size=1024 --encrypted --escrowcert=\"http://x/y\" "
163 "--backuppassphrase --name=NAME --vgname=VGNAME",
164 "logvol / --size=1024 --encrypted --escrowcert=\"http://x/y\" "
165 "--backuppassphrase --name=NAME --vgname=VGNAME\n")
166 self.assert_parse("logvol / --size=1024 --encrypted --escrowcert=http://x/y "
167 "--name=NAME --vgname=VGNAME",
168 "logvol / --size=1024 --encrypted --escrowcert=\"http://x/y\" "
169 "--name=NAME --vgname=VGNAME\n")
171 # fail
172 self.assert_parse_error("logvol / --escrowcert --name=NAME "
173 "--vgname=VGNAME",
174 regex="Option --escrowcert: invalid string value: '--name=NAME'")
175 self.assert_parse_error("logvol / --escrowcert --backuppassphrase "
176 "--name=NAME --vgname=VGNAME",
177 regex="Option --escrowcert: invalid string value: '--backuppassphrase'")
178 self.assert_parse_error("logvol / --encrypted --escrowcert "
179 "--backuppassphrase --name=NAME "
180 "--vgname=VGNAME",
181 regex="Option --escrowcert: invalid string value: '--backuppassphrase'")
182 self.assert_parse_error("logvol / --backuppassphrase=False --name=NAME "
183 "--vgname=VGNAME",
184 regex="--backuppassphrase option does not take a value")
185 self.assert_parse_error("logvol / --backuppassphrase=True --name=NAME "
186 "--vgname=VGNAME",
187 regex="--backuppassphrase option does not take a value")
189 class RHEL6_TestCase(F12_TestCase):
190 def runTest(self):
191 F12_TestCase.runTest(self)
193 self.assert_parse("logvol / --encrypted --cipher=3-rot13 --name=NAME --vgname=VGNAME",
194 "logvol / --encrypted --cipher=\"3-rot13\" --name=NAME --vgname=VGNAME\n")
195 # Allowed here, but anaconda should complain. Note how we throw out
196 # cipher from the output if there's no --encrypted.
197 self.assert_parse("logvol / --cipher=3-rot13 --name=NAME --vgname=VGNAME",
198 "logvol / --name=NAME --vgname=VGNAME\n")
200 self.assert_parse_error("logvol / --cipher --name=NAME --vgname=VGNAME", regex="Option --cipher: invalid string value: '--name=NAME'")
202 self.assert_parse("logvol swap --hibernation "
203 "--name=NAME --vgname=VGNAME")
204 self.assert_parse("logvol swap --recommended --hibernation "
205 "--name=NAME --vgname=VGNAME")
207 class F14_TestCase(F12_TestCase):
208 def runTest(self):
209 F12_TestCase.runTest(self)
210 self.assert_removed("logvol", "--bytes-per-inode")
212 class F15_TestCase(F14_TestCase):
213 def runTest(self):
214 F14_TestCase.runTest(self)
215 self.assert_parse("logvol / --size=1024 --name=NAME --vgname=VGNAME --label=ROOT",
216 "logvol / --size=1024 --label=\"ROOT\" --name=NAME --vgname=VGNAME\n")
218 class F17_TestCase(F15_TestCase):
219 def runTest(self):
220 F15_TestCase.runTest(self)
221 self.assert_parse("logvol /x --name=NAME --size 1000 --vgname=VGNAME "
222 "--useexisting --resize",
223 "logvol /x --size=1000 --useexisting --resize "
224 "--name=NAME --vgname=VGNAME\n")
225 self.assert_parse_error("logvol /x --name=NAME --vgname=VGNAME --resize", regex="--resize can only be used in conjunction with --useexisting")
227 # no useexisting
228 self.assert_parse_error("logvol /x --name=NAME --vgname=VGNAME --resize --size=500", regex="--resize can only be used in conjunction with --useexisting")
230 # no size
231 self.assert_parse_error("logvol /x --name=NAME --vgname=VGNAME --resize --useexisting", regex="--resize requires --size to indicate new size")
233 class F18_TestCase(F17_TestCase):
234 def runTest(self):
235 F17_TestCase.runTest(self)
237 self.assert_parse("logvol swap --name=NAME --vgname=VGNAME "\
238 "--hibernation --size=1024")
239 self.assert_parse("logvol swap --name=NAME --vgname=VGNAME "\
240 "--recommended --hibernation --size=1024")
242 self.assert_parse("logvol / --size=1024 --encrypted --cipher=3-rot13 --name=NAME --vgname=VGNAME",
243 "logvol / --size=1024 --encrypted --cipher=\"3-rot13\" --name=NAME --vgname=VGNAME\n")
244 # Allowed here, but anaconda should complain. Note how we throw out
245 # cipher from the output if there's no --encrypted.
246 self.assert_parse("logvol / --size=1024 --cipher=3-rot13 --name=NAME --vgname=VGNAME",
247 "logvol / --size=1024 --name=NAME --vgname=VGNAME\n")
249 self.assert_parse_error("logvol / --cipher --name=NAME --vgname=VGNAME", regex="Option --cipher: invalid string value: '--name=NAME'")
251 class F20_TestCase(F18_TestCase):
252 def runTest(self):
253 F18_TestCase.runTest(self)
255 self.assert_parse("logvol none --size=1024 --name=pool1 --vgname=vg --thinpool",
256 "logvol none --size=1024 --thinpool --name=pool1 --vgname=vg\n")
257 self.assert_parse("logvol none --size=1024 --name=pool1 --vgname=vg "
258 "--thinpool --chunksize=512",
259 "logvol none --size=1024 --thinpool --chunksize=512 "
260 "--name=pool1 --vgname=vg\n")
261 self.assert_parse("logvol none --size=1024 --name=pool1 --vgname=vg "
262 "--thinpool --metadatasize=4 --chunksize=1024",
263 "logvol none --size=1024 --thinpool "
264 "--metadatasize=4 --chunksize=1024 --name=pool1 "
265 "--vgname=vg\n")
266 self.assert_parse("logvol /home --size=1024 --name=home --vgname=vg "
267 "--thin --poolname=pool1",
268 "logvol /home --size=1024 --thin --poolname=pool1 "
269 "--name=home --vgname=vg\n")
271 # missing pool name
272 self.assert_parse_error("logvol /home --name=home --vgname=vg --thin",
273 regex="--thin requires --poolname to specify pool name")
275 # chunksize is an int
276 self.assert_parse_error("logvol none --name=pool1 --vgname=vg "
277 "--thinpool --chunksize=foo",
278 regex="option --chunksize: invalid integer value: 'foo'")
280 # both --thin and --thinpool
281 self.assert_parse_error("logvol /home --name=home --thin --thinpool --vgname=vg --size=10000", regex="--thin and --thinpool cannot both be specified for the same logvol")
283 # chunksize and/or metadata size and not thinpool
284 self.assert_parse_error("logvol none --name=pool1 --vgname=vg "
285 "--chunksize=512",
286 regex="--chunksize and --metadatasize are for thin pools only")
288 # logvol w/out specified size
289 self.assert_parse_error("logvol none --name=pool1 --vgname=vg --thinpool",
290 regex="No size given for logical volume")
292 # use existing logvol, which must have a size
293 self.assert_parse("logvol none --name=pool1 --vgname=vg --thinpool --useexisting")
295 # logvol with a disallowed percent value
296 self.assert_parse_error("logvol / --percent=1000 --name=NAME --vgname=VGNAME",
297 KickstartValueError,
298 "Percentage must be between 0 and 100.")
300 class F21_TestCase(F20_TestCase):
301 def runTest(self):
302 F20_TestCase.runTest(self)
304 self.assert_parse_error("logvol /home --name=home --vgname=vg --size=2 --percent=30")
306 class RHEL7_TestCase(F20_TestCase):
307 def runTest(self):
308 F20_TestCase.runTest(self)
310 self.assert_parse_error("logvol /home --name=home --vgname=vg --size=2 --percent=30")
312 if __name__ == "__main__":
313 unittest.main()