/** * Copyright (c) 2009--2015 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package com.redhat.rhn.domain.kickstart.builder.test; import com.redhat.rhn.common.util.FileUtils; import com.redhat.rhn.common.validator.ValidatorException; import com.redhat.rhn.domain.kickstart.KickstartCommand; import com.redhat.rhn.domain.kickstart.KickstartData; import com.redhat.rhn.domain.kickstart.KickstartFactory; import com.redhat.rhn.domain.kickstart.KickstartInstallType; import com.redhat.rhn.domain.kickstart.KickstartRawData; import com.redhat.rhn.domain.kickstart.KickstartScript; import com.redhat.rhn.domain.kickstart.KickstartVirtualizationType; import com.redhat.rhn.domain.kickstart.KickstartableTree; import com.redhat.rhn.domain.kickstart.builder.KickstartBuilder; import com.redhat.rhn.domain.kickstart.builder.KickstartParser; import com.redhat.rhn.domain.kickstart.builder.KickstartParsingException; import com.redhat.rhn.domain.kickstart.test.KickstartDataTest; import com.redhat.rhn.domain.kickstart.test.KickstartRawDataTest; import com.redhat.rhn.domain.kickstart.test.KickstartableTreeTest; import com.redhat.rhn.domain.role.RoleFactory; import com.redhat.rhn.frontend.action.kickstart.KickstartTreeUpdateType; import com.redhat.rhn.frontend.xmlrpc.kickstart.InvalidVirtualizationTypeException; import com.redhat.rhn.testing.BaseTestCaseWithUser; import com.redhat.rhn.testing.TestUtils; import com.redhat.rhn.testing.UserTestUtils; import java.util.LinkedList; import java.util.List; public class KickstartBuilderTest extends BaseTestCaseWithUser { private String kickstartFileContents; @Override public void setUp() throws Exception { super.setUp(); UserTestUtils.addUserRole(user, RoleFactory.ORG_ADMIN); } private KickstartParser createKickstartParser(String filename) throws Exception { kickstartFileContents = TestUtils.readAll( TestUtils.findTestData(filename)); return new KickstartParser(kickstartFileContents); } public void testCreate() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); tree.setInstallType(KickstartFactory. lookupKickstartInstallTypeByLabel(KickstartInstallType.RHEL_5)); KickstartData data = builder.create(TestUtils.randomString(), tree, KickstartVirtualizationType.XEN_PARAVIRT, "http://localhost/ks", "redhat", KickstartTreeUpdateType.NONE); assertNotNull(data); } // public void testDepricatedAnacondCommands() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); tree.setInstallType(KickstartFactory. lookupKickstartInstallTypeByLabel(KickstartInstallType.RHEL_4)); KickstartData rhel4data = builder.create(TestUtils.randomString(), tree, KickstartVirtualizationType.XEN_PARAVIRT, "http://localhost/ks", "redhat", KickstartTreeUpdateType.NONE); String contents = FileUtils.readStringFromFile(rhel4data.getCobblerFileName()); assertTrue(contents.indexOf("langsupport") > 0); assertTrue(contents.indexOf("mouse") > 0); assertTrue(contents.indexOf("zerombr yes") > 0); assertTrue(contents.indexOf("resolvedeps") > 0); System.out.println("Contents: " + contents); tree.setInstallType(KickstartFactory. lookupKickstartInstallTypeByLabel(KickstartInstallType.RHEL_5)); KickstartData rhel5data = builder.create(TestUtils.randomString(), tree, KickstartVirtualizationType.XEN_PARAVIRT, "http://localhost/ks", "redhat", KickstartTreeUpdateType.NONE); contents = FileUtils.readStringFromFile(rhel5data.getCobblerFileName()); System.out.println("Contents: " + contents); assertTrue(contents.indexOf("langsupport") < 0); assertTrue(contents.indexOf("mouse") < 0); assertTrue(contents.indexOf("zerombr yes") < 0); assertTrue(contents.indexOf("zerombr") > 0); assertTrue(contents.indexOf("resolvedeps") < 0); } public void testDirector() throws Exception { KickstartParser parser = createKickstartParser("samplekickstart1.ks"); assertEquals(27, parser.getOptionLines().size()); assertEquals(102, parser.getPackageLines().size()); assertTrue((parser.getPackageLines().get(0)).startsWith("%packages")); assertEquals(40, parser.getPreScriptLines().size()); assertEquals(0, parser.getPostScriptLines().size()); } public void testBuildCommands() throws Exception { KickstartParser parser = createKickstartParser("samplekickstart1.ks"); KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); List<String> lines = parser.getOptionLines(); KickstartData ksData = createBareKickstartData(); builder.buildCommands(ksData, lines, tree); KickstartCommand rootpw = ksData.getCommand("rootpw"); assertTrue(rootpw.getArguments().indexOf("--iscrypted") < 0); assertTrue(rootpw.getArguments().startsWith("$1$")); } private KickstartData createBareKickstartData() throws Exception { KickstartData ksData = new KickstartData(); ksData.setOrg(user.getOrg()); ksData.setLabel("testlabel"); ksData.setActive(Boolean.TRUE); ksData.setOrgDefault(false); ksData.setKickstartDefaults(KickstartDataTest.createDefaults(ksData, user)); KickstartFactory.saveKickstartData(ksData); return ksData; } public void testKickstartRawData() throws Exception { KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); try { KickstartRawDataTest.createRawData(user, "badvirttype", tree, "some contents", "whatever"); fail(); } catch (InvalidVirtualizationTypeException e) { // expected } KickstartRawDataTest.createRawData(user, "decent", tree, "some contents", KickstartVirtualizationType.XEN_PARAVIRT); KickstartRawData data = KickstartRawDataTest.createRawData(user, "boring", tree, "some contents", KickstartVirtualizationType.PARA_HOST); assertNotNull(data); } public void testEncryptRootpw() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); List<String> lines = new LinkedList<String>(); lines.add("rootpw blahblah"); KickstartData ksData = createBareKickstartData(); builder.buildCommands(ksData, lines, tree); KickstartCommand rootpw = ksData.getCommand("rootpw"); assertTrue(rootpw.getArguments().startsWith("--iscrypted $5$")); } public void testBuildPackages() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); lines.add("%packages"); lines.add("@office"); lines.add("@admin-tools"); lines.add("@editors"); lines.add("fuse"); lines.add("-zsh"); lines.add("awstats"); KickstartData ksData = createBareKickstartData(); builder.buildPackages(ksData, lines); assertEquals(6, ksData.getKsPackages().size()); } public void testBuidEmptyPackages() throws Exception { // No idea if this is valid or not but I see no reason why the builder shouldn't // be ready for it: KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); KickstartData ksData = createBareKickstartData(); builder.buildPackages(ksData, lines); assertEquals(0, ksData.getKsPackages().size()); } public void testBuildPreScripts() throws Exception { KickstartParser parser = createKickstartParser("samplekickstart1.ks"); KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = parser.getPreScriptLines(); KickstartData ksData = createBareKickstartData(); builder.buildPreScripts(ksData, lines); assertEquals(1, ksData.getScripts().size()); KickstartScript script = ksData.getScripts().iterator().next(); assertEquals(null, script.getInterpreter()); assertEquals(KickstartScript.TYPE_PRE, script.getScriptType()); assertEquals("Y", script.getChroot()); } public void testBuildPreScriptWithInterpreter() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); lines.add("%pre --interpreter /usr/bin/python"); KickstartData ksData = createBareKickstartData(); builder.buildPreScripts(ksData, lines); assertEquals(1, ksData.getScripts().size()); KickstartScript script = ksData.getScripts().iterator().next(); assertEquals("/usr/bin/python", script.getInterpreter()); } public void testBuildPreScriptNewlines() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); lines.add("%pre --interpreter /usr/bin/python"); lines.add("a"); lines.add("b"); KickstartData ksData = createBareKickstartData(); builder.buildPreScripts(ksData, lines); assertEquals(1, ksData.getScripts().size()); KickstartScript script = ksData.getScripts().iterator().next(); assertEquals("a\nb", script.getDataContents()); } public void testBuildPreScriptWithMissingInterpreter() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); lines.add("%pre --interpreter"); KickstartData ksData = createBareKickstartData(); try { builder.buildPreScripts(ksData, lines); fail(); } catch (KickstartParsingException e) { // expected } } public void testBuildMultiplePreScripts() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); lines.add("%pre"); lines.add("echo hello"); lines.add(""); lines.add("%pre"); lines.add("echo world"); KickstartData ksData = createBareKickstartData(); builder.buildPreScripts(ksData, lines); assertEquals(2, ksData.getScripts().size()); } public void testBuidPreScriptWithNochroot() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); // Should not parse: List<String> lines = new LinkedList<String>(); lines.add("%pre --nochroot"); KickstartData ksData = createBareKickstartData(); try { builder.buildPreScripts(ksData, lines); fail(); } catch (KickstartParsingException e) { // expected } } public void testBuildPostScriptWithNochroot() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); lines.add("%post --interpreter blah --nochroot"); lines.add("echo hello"); KickstartData ksData = createBareKickstartData(); builder.buildPostScripts(ksData, lines); assertEquals(1, ksData.getScripts().size()); KickstartScript script = ksData.getScripts().iterator().next(); assertEquals(KickstartScript.TYPE_POST, script.getScriptType()); assertEquals("N", script.getChroot()); } public void testBuildScriptWithEmptyLines() throws Exception { KickstartBuilder builder = new KickstartBuilder(user); List<String> lines = new LinkedList<String>(); KickstartData ksData = createBareKickstartData(); builder.buildPostScripts(ksData, lines); assertEquals(0, ksData.getScripts().size()); } public void testConstruct() throws Exception { KickstartParser parser = createKickstartParser("samplekickstart1.ks"); KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); //String randomLabel = RandomStringUtils.randomAlphabetic(10); KickstartData ksData = builder.createFromParser(parser, "mykslabel", KickstartVirtualizationType.XEN_PARAVIRT, tree, KickstartTreeUpdateType.NONE); assertEquals(100, ksData.getKsPackages().size()); assertEquals(1, ksData.getScripts().size()); KickstartScript preScript = ksData.getScripts().iterator().next(); assertEquals(KickstartScript.TYPE_PRE, preScript.getScriptType()); } public void testConstructWithExistingLabel() throws Exception { KickstartParser parser = createKickstartParser("samplekickstart1.ks"); KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); builder.createFromParser(parser, "mykslabel", KickstartVirtualizationType.XEN_PARAVIRT, tree, KickstartTreeUpdateType.NONE); try { builder.createFromParser(parser, "mykslabel", KickstartVirtualizationType.XEN_PARAVIRT, tree, KickstartTreeUpdateType.NONE); fail(); } catch (ValidatorException e) { // expected } } public void testConstructWithInvaidVirtType() throws Exception { KickstartParser parser = createKickstartParser("samplekickstart1.ks"); KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); try { builder.createFromParser(parser, "badvirttype", "whatever", tree, KickstartTreeUpdateType.NONE); fail(); } catch (InvalidVirtualizationTypeException e) { // expected } } public void testConstructUpgradeKickstart() throws Exception { KickstartParser parser = createKickstartParser("upgrade.ks"); KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); KickstartData data = builder.createFromParser(parser, "upgrade-ks", KickstartVirtualizationType.XEN_PARAVIRT, tree, KickstartTreeUpdateType.NONE); assertNotNull(data.getCommand("upgrade")); assertNull(data.getCommand("install")); } public void testImportUseDefautDownloadLocation() throws Exception { KickstartParser parser = createKickstartParser("samplekickstart1.ks"); KickstartBuilder builder = new KickstartBuilder(user); KickstartableTree tree = KickstartableTreeTest.createTestKickstartableTree(); KickstartData data = builder.createFromParser(parser, "testing-profile", KickstartVirtualizationType.XEN_PARAVIRT, tree, KickstartTreeUpdateType.NONE); assertNull(data.getCommand("nfs")); KickstartCommand urlCmd = data.getCommand("url"); assertNotNull(urlCmd); assertTrue(urlCmd.getArguments().startsWith("/ks/dist/org/")); } }