/** * Copyright (c) 2009--2014 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.action.test; import com.redhat.rhn.common.util.test.TimeUtilsTest; import com.redhat.rhn.domain.action.Action; import com.redhat.rhn.domain.action.ActionFactory; import com.redhat.rhn.domain.action.ActionType; import com.redhat.rhn.domain.action.config.ConfigAction; import com.redhat.rhn.domain.action.config.ConfigDateDetails; import com.redhat.rhn.domain.action.config.ConfigDateFileAction; import com.redhat.rhn.domain.action.config.ConfigRevisionAction; import com.redhat.rhn.domain.action.config.ConfigRevisionActionResult; import com.redhat.rhn.domain.action.config.ConfigUploadAction; import com.redhat.rhn.domain.action.config.ConfigUploadMtimeAction; import com.redhat.rhn.domain.action.config.DaemonConfigAction; import com.redhat.rhn.domain.action.config.DaemonConfigDetails; import com.redhat.rhn.domain.action.errata.ErrataAction; import com.redhat.rhn.domain.action.kickstart.KickstartAction; import com.redhat.rhn.domain.action.kickstart.KickstartActionDetails; import com.redhat.rhn.domain.action.rhnpackage.PackageAction; import com.redhat.rhn.domain.action.rhnpackage.PackageActionDetails; import com.redhat.rhn.domain.action.script.ScriptActionDetails; import com.redhat.rhn.domain.action.script.ScriptRunAction; import com.redhat.rhn.domain.action.server.ServerAction; import com.redhat.rhn.domain.action.server.test.ServerActionTest; import com.redhat.rhn.domain.config.ConfigFileName; import com.redhat.rhn.domain.config.ConfigRevision; import com.redhat.rhn.domain.config.ConfigurationFactory; import com.redhat.rhn.domain.errata.Errata; import com.redhat.rhn.domain.errata.test.ErrataFactoryTest; import com.redhat.rhn.domain.rhnpackage.PackageArch; import com.redhat.rhn.domain.rhnpackage.PackageEvr; import com.redhat.rhn.domain.rhnpackage.PackageEvrFactory; import com.redhat.rhn.domain.rhnpackage.PackageName; import com.redhat.rhn.domain.role.RoleFactory; import com.redhat.rhn.domain.server.Server; import com.redhat.rhn.domain.server.test.ServerFactoryTest; import com.redhat.rhn.domain.user.User; import com.redhat.rhn.testing.ConfigTestUtils; import com.redhat.rhn.testing.RhnBaseTestCase; import com.redhat.rhn.testing.TestUtils; import com.redhat.rhn.testing.UserTestUtils; import java.util.Date; import java.util.Iterator; /** * ActionFactoryTest * @version $Rev$ */ public class ActionFactoryTest extends RhnBaseTestCase { /** * Test fetching an Action * @throws Exception */ public void testLookup() throws Exception { Action a = createAction(UserTestUtils.createUser("testUser", UserTestUtils .createOrg("testOrg" + this.getClass().getSimpleName())), ActionFactory.TYPE_HARDWARE_REFRESH_LIST); assertTrue(a.getActionType().equals(ActionFactory.TYPE_HARDWARE_REFRESH_LIST)); Long id = a.getId(); Action a2 = ActionFactory.lookupById(id); assertNotNull(a2); assertTrue(a2.getName().startsWith("RHN-JAVA Test Action")); } /** * Test fetching an Action * @throws Exception */ public void testLookupLastCompletedAction() throws Exception { final User user = UserTestUtils.createUser("testUser", UserTestUtils .createOrg("testOrg" + this.getClass().getSimpleName())); ConfigAction a = (ConfigAction)createAction(user, ActionFactory.TYPE_CONFIGFILES_DEPLOY); assertTrue(a.getActionType().equals(ActionFactory.TYPE_CONFIGFILES_DEPLOY)); //complete it assertNotNull(a.getServerActions()); for (Iterator itr = a.getServerActions().iterator(); itr.hasNext();) { ServerAction next = (ServerAction) itr.next(); next.setCompletionTime(new Date()); next.setStatus(ActionFactory.STATUS_COMPLETED); } ActionFactory.save(a); ConfigRevisionAction cra = a. getConfigRevisionActions(). iterator().next(); Server server = cra.getServer(); Action action = ActionFactory.lookupLastCompletedAction(user, ActionFactory.TYPE_CONFIGFILES_DEPLOY, server); assertEquals(a, action); } /** * Test fetching an Action with the logged in User * @throws Exception */ public void testLookupWithLoggedInUser() throws Exception { User user1 = UserTestUtils.findNewUser("testUser", "testOrg" + this.getClass().getSimpleName()); Action a = createAction(user1, ActionFactory.TYPE_HARDWARE_REFRESH_LIST); Long id = a.getId(); Action a2 = ActionFactory.lookupByUserAndId(user1, id); assertNotNull(a2); // Check to make sure it returns NULL // if we lookup with a User who isnt part of the // Org that owns that Action. Ignore for // Sat mode since there is only one Org. } /** * Test fetching a ScriptAction * @throws Exception */ public void testLookupScriptAction() throws Exception { Action newA = createAction(UserTestUtils.createUser("testUser", UserTestUtils .createOrg("testOrg" + this.getClass().getSimpleName())), ActionFactory.TYPE_SCRIPT_RUN); Long id = newA.getId(); Action a = ActionFactory.lookupById(id); assertNotNull(a); assertTrue(a instanceof ScriptRunAction); ScriptRunAction s = (ScriptRunAction) a; assertNotNull(s.getScriptActionDetails().getUsername()); assertNotNull(s.getEarliestAction()); } /** * Test fetching a ScriptAction * @throws Exception */ public void testSchedulerUser() throws Exception { User user1 = UserTestUtils.findNewUser("testUser", "testOrg" + this.getClass().getSimpleName()); Action newA = createAction(user1, ActionFactory.TYPE_REBOOT); newA.setSchedulerUser(user1); ActionFactory.save(newA); assertNotNull(newA.getSchedulerUser()); } /** * Test fetching a ConfigRevisionAction * @throws Exception */ public void testLookupErrataAction() throws Exception { Action newA = createAction(UserTestUtils.createUser("testUser", UserTestUtils .createOrg("testOrg" + this.getClass().getSimpleName())), ActionFactory.TYPE_ERRATA); assertNotNull(newA.getId()); assertTrue(newA instanceof ErrataAction); ErrataAction ea = (ErrataAction) newA; assertNotNull(ea.getErrata()); assertNotNull(((Errata) ea.getErrata().toArray()[0]).getId()); } /** * Test fetching a DaemonConfigDetails * @throws Exception */ public void testLookupDaemonConfig() throws Exception { Action newA = createAction(UserTestUtils.createUser("testUser", UserTestUtils .createOrg("testOrg" + this.getClass().getSimpleName())), ActionFactory.TYPE_DAEMON_CONFIG); Long id = newA.getId(); Action a = ActionFactory.lookupById(id); assertNotNull(a); assertTrue(a instanceof DaemonConfigAction); DaemonConfigAction dca = (DaemonConfigAction) a; assertNotNull(dca.getId()); assertNotNull(dca.getDaemonConfigDetails()); assertNotNull(dca.getDaemonConfigDetails().getActionId()); } public void testAddServerToAction() throws Exception { User usr = UserTestUtils.createUser("testUser", UserTestUtils.createOrg("testOrg" + this.getClass().getSimpleName())); Server s = ServerFactoryTest.createTestServer(usr); Action a = createAction(usr, ActionFactory.TYPE_ERRATA); ActionFactory.addServerToAction(s.getId(), a); assertNotNull(a.getServerActions()); assertEquals(a.getServerActions().size(), 1); Object[] array = a.getServerActions().toArray(); ServerAction sa = (ServerAction)array[0]; assertTrue(TimeUtilsTest.timeEquals(sa.getCreated().getTime(), sa.getModified().getTime())); assertTrue(sa.getStatus().equals(ActionFactory.STATUS_QUEUED)); assertTrue(sa.getServer().equals(s)); } public void testLookupConfigRevisionAction() throws Exception { User usr = UserTestUtils.createUser("testUser", UserTestUtils.createOrg("testOrg" + this.getClass().getSimpleName())); Action newA = ActionFactory.createAction(ActionFactory.TYPE_CONFIGFILES_DIFF); newA.setOrg(usr.getOrg()); newA.setSchedulerUser(usr); Server newS = ServerFactoryTest.createTestServer(usr, true); ConfigRevisionAction crad = new ConfigRevisionAction(); crad.setParentAction(newA); crad.setServer(newS); crad.setCreated(new Date()); crad.setModified(new Date()); // Create ConfigRevision ConfigRevision cr = ConfigTestUtils.createConfigRevision(usr.getOrg()); crad.setConfigRevision(cr); ConfigAction ca = (ConfigAction) newA; ca.addConfigRevisionAction(crad); ca.addServerAction(createServerAction(newS, newA)); ActionFactory.save(ca); Long id = crad.getId(); ConfigRevisionAction result = ActionFactory.lookupConfigRevisionAction(id); assertEquals(crad.getId(), result.getId()); assertEquals(crad.getServer(), result.getServer()); assertEquals(crad.getCreated(), result.getCreated()); } public void testLookupConfigRevisionResult() throws Exception { User usr = UserTestUtils.createUser("testUser", UserTestUtils.createOrg("testOrg" + this.getClass().getSimpleName())); Action newA = ActionFactory.createAction(ActionFactory.TYPE_CONFIGFILES_DIFF); newA.setOrg(usr.getOrg()); newA.setSchedulerUser(usr); Server newS = ServerFactoryTest.createTestServer(usr, true); ConfigRevisionAction crad = new ConfigRevisionAction(); crad.setParentAction(newA); crad.setServer(newS); crad.setCreated(new Date()); crad.setModified(new Date()); // Setup the CRAResult ConfigRevisionActionResult cresult = new ConfigRevisionActionResult(); cresult.setCreated(new Date()); cresult.setModified(new Date()); byte [] text = "Differed In Foo ".getBytes("UTF-8"); cresult.setResult(text); cresult.setConfigRevisionAction(crad); crad.setConfigRevisionActionResult(cresult); // Create ConfigRevision ConfigRevision cr = ConfigTestUtils.createConfigRevision(usr.getOrg()); crad.setConfigRevision(cr); ConfigAction ca = (ConfigAction) newA; ca.addConfigRevisionAction(crad); ca.addServerAction(createServerAction(newS, newA)); ActionFactory.save(ca); Long id = crad.getId(); ConfigRevisionActionResult newResult = ActionFactory. lookupConfigActionResult(id); assertEquals(cresult.getResultContents(), newResult.getResultContents()); assertEquals(cresult.getActionConfigRevisionId(), newResult.getActionConfigRevisionId()); } public void testRescheduleFailedServerActions() throws Exception { User user1 = UserTestUtils.findNewUser("testUser", "testOrg" + this.getClass().getSimpleName()); Action a1 = ActionFactoryTest.createAction(user1, ActionFactory.TYPE_REBOOT); ServerAction sa = (ServerAction) a1.getServerActions().toArray()[0]; sa.setStatus(ActionFactory.STATUS_FAILED); sa.setRemainingTries(new Long(0)); ActionFactory.save(a1); ActionFactory.rescheduleFailedServerActions(a1, 5L); sa = (ServerAction) ActionFactory.reload(sa); assertTrue(sa.getStatus().equals(ActionFactory.STATUS_QUEUED)); assertTrue(sa.getRemainingTries().longValue() > 0); } public void testRescheduleAllServerActions() throws Exception { User user1 = UserTestUtils.findNewUser("testUser", "testOrg" + this.getClass().getSimpleName()); Action a1 = ActionFactoryTest.createAction(user1, ActionFactory.TYPE_REBOOT); ServerAction sa = (ServerAction) a1.getServerActions().toArray()[0]; sa.setStatus(ActionFactory.STATUS_FAILED); sa.setRemainingTries(new Long(0)); ActionFactory.save(a1); ActionFactory.rescheduleAllServerActions(a1, 5L); sa = (ServerAction) ActionFactory.reload(sa); assertTrue(sa.getStatus().equals(ActionFactory.STATUS_QUEUED)); assertTrue(sa.getRemainingTries().longValue() > 0); } public void testCreateAction() throws Exception { Action a = createAction(UserTestUtils.createUser("testUser", UserTestUtils .createOrg("testOrg" + this.getClass().getSimpleName())), ActionFactory.TYPE_HARDWARE_REFRESH_LIST); assertNotNull(a); } public void testCheckActionArchType() throws Exception { Action newA = createAction(UserTestUtils.createUser("testUser", UserTestUtils .createOrg("testOrg" + this.getClass().getSimpleName())), ActionFactory.TYPE_PACKAGES_VERIFY); assertTrue(ActionFactory.checkActionArchType(newA, "verify")); } public static Action createAction(User usr, ActionType type) throws Exception { Action newA = ActionFactory.createAction(type); Long orgId = usr.getOrg().getId(); newA.setSchedulerUser(usr); if (type.equals(ActionFactory.TYPE_ERRATA)) { Errata e1 = ErrataFactoryTest.createTestErrata(orgId); Errata e2 = ErrataFactoryTest.createTestErrata(orgId); // add the errata ((ErrataAction) newA).addErrata(e1); ((ErrataAction) newA).addErrata(e2); } else if (type.equals(ActionFactory.TYPE_CONFIGFILES_MTIME_UPLOAD)) { ConfigUploadMtimeAction cua = (ConfigUploadMtimeAction) newA; ConfigDateFileAction cfda = new ConfigDateFileAction(); cfda.setFileName("/tmp/rhn-java-" + TestUtils.randomString()); cfda.setFileType("W"); cfda.setCreated(new Date()); cfda.setModified(new Date()); cua.addConfigDateFileAction(cfda); Server newS = ServerFactoryTest.createTestServer(usr); ConfigRevision cr = ConfigTestUtils.createConfigRevision(usr.getOrg()); cua.addConfigChannelAndServer(cr.getConfigFile().getConfigChannel(), newS); // rhnActionConfigChannel requires a ServerAction to exist cua.addServerAction(ServerActionTest.createServerAction(newS, newA)); ConfigDateDetails cdd = new ConfigDateDetails(); cdd.setCreated(new Date()); cdd.setModified(new Date()); cdd.setStartDate(new Date()); cdd.setImportContents("Y"); cdd.setParentAction(cua); cua.setConfigDateDetails(cdd); } else if (type.equals(ActionFactory.TYPE_CONFIGFILES_UPLOAD)) { ConfigUploadAction cua = (ConfigUploadAction) newA; Server newS = ServerFactoryTest.createTestServer(usr); ConfigRevision cr = ConfigTestUtils.createConfigRevision(usr.getOrg()); cua.addConfigChannelAndServer(cr.getConfigFile().getConfigChannel(), newS); cua.addServerAction(ServerActionTest.createServerAction(newS, newA)); ConfigFileName name1 = ConfigurationFactory.lookupOrInsertConfigFileName("/etc/foo"); ConfigFileName name2 = ConfigurationFactory.lookupOrInsertConfigFileName("/etc/bar"); cua.addConfigFileName(name1, newS); cua.addConfigFileName(name2, newS); } else if (type.equals(ActionFactory.TYPE_CONFIGFILES_DEPLOY)) { Server newS = ServerFactoryTest.createTestServer(usr, true); ConfigRevisionAction crad = new ConfigRevisionAction(); crad.setParentAction(newA); crad.setServer(newS); crad.setCreated(new Date()); crad.setModified(new Date()); // Setup the CRAResult ConfigRevisionActionResult cresult = new ConfigRevisionActionResult(); cresult.setCreated(new Date()); cresult.setModified(new Date()); cresult.setConfigRevisionAction(crad); crad.setConfigRevisionActionResult(cresult); // Create ConfigRevision ConfigRevision cr = ConfigTestUtils.createConfigRevision(usr.getOrg()); crad.setConfigRevision(cr); ConfigAction ca = (ConfigAction) newA; ca.addConfigRevisionAction(crad); ca.addServerAction(createServerAction(newS, newA)); } else if (type.equals(ActionFactory.TYPE_SCRIPT_RUN)) { ScriptActionDetails sad = new ScriptActionDetails(); sad.setUsername("AFTestTestUser"); sad.setGroupname("AFTestTestGroup"); String script = "#!/bin/csh\nls -al"; sad.setScript(script.getBytes("UTF-8")); sad.setTimeout(new Long(9999)); sad.setParentAction(newA); ((ScriptRunAction) newA).setScriptActionDetails(sad); } else if (type.equals(ActionFactory.TYPE_KICKSTART_INITIATE) || type.equals(ActionFactory.TYPE_KICKSTART_SCHEDULE_SYNC)) { KickstartActionDetails ksad = new KickstartActionDetails(); ksad.setStaticDevice("eth0"); ksad.setParentAction(newA); ((KickstartAction) newA).setKickstartActionDetails(ksad); } else if (type.equals(ActionFactory.TYPE_PACKAGES_AUTOUPDATE) || type.equals(ActionFactory.TYPE_PACKAGES_DELTA) || type.equals(ActionFactory.TYPE_PACKAGES_REFRESH_LIST) || type.equals(ActionFactory.TYPE_PACKAGES_REMOVE) || type.equals(ActionFactory.TYPE_PACKAGES_RUNTRANSACTION) || type.equals(ActionFactory.TYPE_PACKAGES_UPDATE) || type.equals(ActionFactory.TYPE_PACKAGES_VERIFY)) { PackageActionDetails d = new PackageActionDetails(); String parameter = "upgrade"; d.setParameter(parameter); //create packageArch Long testid = new Long(100); String query = "PackageArch.findById"; PackageArch arch = (PackageArch) TestUtils.lookupFromCacheById(testid, query); d.setArch(arch); //create packageName String testname = "Test Name " + TestUtils.randomString(); PackageName name = new PackageName(); name.setName(testname); d.setPackageName(name); TestUtils.saveAndFlush(name); //create packageEvr PackageEvr evr = PackageEvrFactory.lookupOrCreatePackageEvr("" + System.currentTimeMillis(), "2.0", "1.0"); d.setEvr(evr); ((PackageAction) newA).addDetail(d); } // Here we specifically want to test the addition of the ServerAction details // objects. else if (type.equals(ActionFactory.TYPE_REBOOT)) { usr.addPermanentRole(RoleFactory.ORG_ADMIN); Server newS = ServerFactoryTest.createTestServer(usr, true); newA.addServerAction(ServerActionTest.createServerAction(newS, newA)); } else if (type.equals(ActionFactory.TYPE_DAEMON_CONFIG)) { DaemonConfigDetails dcd = new DaemonConfigDetails(); dcd.setRestart("Y"); dcd.setInterval(new Long(1440)); dcd.setDaemonConfigCreated(new Date()); dcd.setDaemonConfigModified(new Date()); dcd.setParentAction(newA); ((DaemonConfigAction) newA).setDaemonConfigDetails(dcd); } newA.setName("RHN-JAVA Test Action"); newA.setActionType(type); newA.setOrg(usr.getOrg()); newA.setEarliestAction(new Date()); newA.setVersion(new Long(0)); newA.setArchived(new Long(0)); newA.setCreated(new Date()); newA.setModified(new Date()); ActionFactory.save(newA); return newA; } /** * Create a new ServerAction * @param newS * @param newA * @return ServerAction created * @throws Exception */ public static ServerAction createServerAction(Server newS, Action newA) throws Exception { ServerAction sa = new ServerAction(); sa.setStatus(ActionFactory.STATUS_QUEUED); sa.setRemainingTries(new Long(10)); sa.setCreated(new Date()); sa.setModified(new Date()); sa.setServer(newS); sa.setParentAction(newA); return sa; } }