java/code/src/com/redhat/rhn/domain/server/ServerGroup.hbm.xml | 1
java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java | 55
-------
java/code/src/com/redhat/rhn/frontend/xmlrpc/systemgroup/ServerGroupHandler.java | 51
++++++
java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java | 77
++++++++++
4 files changed, 134 insertions(+), 50 deletions(-)
New commits:
commit ccfcba8ade7cf3e257bd6458eea7cb88ee187c2e
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri May 14 12:06:39 2010 +0200
588367 - introducing systemgroup.scheduleApplyErrataToActive API call
diff --git a/java/code/src/com/redhat/rhn/domain/server/ServerGroup.hbm.xml
b/java/code/src/com/redhat/rhn/domain/server/ServerGroup.hbm.xml
index f1f6763..046ca4c 100644
--- a/java/code/src/com/redhat/rhn/domain/server/ServerGroup.hbm.xml
+++ b/java/code/src/com/redhat/rhn/domain/server/ServerGroup.hbm.xml
@@ -167,6 +167,7 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
</query>
<sql-query name="ServerGroup.lookupActiveServerIds">
+ <return-scalar type="long" column="id"/>
<![CDATA[
SELECT S.id
FROM rhnServerGroupMembers SGM
diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
index 212fd50..90d054d 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
@@ -2605,7 +2605,8 @@ public class SystemHandler extends BaseHandler {
* @xmlrpc.returntype #return_int_success()
*/
public int scheduleApplyErrata(String sessionKey, Integer sid, List errataIds) {
- ErrataManager.applyErrataHelper(getLoggedInUser(sessionKey), sid, errataIds,
null);
+ ErrataManager.applyErrataHelper(getLoggedInUser(sessionKey), sid.longValue(),
+ errataIds, null);
return 1;
}
@@ -2625,10 +2626,10 @@ public class SystemHandler extends BaseHandler {
* @xmlrpc.param dateTime.iso8601 earliestOccurrence
* @xmlrpc.returntype #return_int_success()
*/
- public int scheduleApplyErrata(String sessionKey, Integer sid, List errataIds,
+ public int scheduleApplyErrata(String sessionKey, Integer sid, List errataIds,
Date earliestOccurrence) {
ErrataManager.applyErrataHelper(getLoggedInUser(sessionKey),
- sid, errataIds, earliestOccurrence);
+ sid.longValue(), errataIds, earliestOccurrence);
return 1;
}
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/systemgroup/ServerGroupHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/systemgroup/ServerGroupHandler.java
index 2abaec8..4d4f7c6 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/systemgroup/ServerGroupHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/systemgroup/ServerGroupHandler.java
@@ -30,9 +30,11 @@ import com.redhat.rhn.frontend.xmlrpc.LookupServerGroupException;
import com.redhat.rhn.frontend.xmlrpc.ServerGroupAccessChangeException;
import com.redhat.rhn.frontend.xmlrpc.ServerNotInGroupException;
import com.redhat.rhn.frontend.xmlrpc.system.XmlRpcSystemHelper;
+import com.redhat.rhn.manager.errata.ErrataManager;
import com.redhat.rhn.manager.system.ServerGroupManager;
import java.util.ArrayList;
+import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -410,11 +412,14 @@ public class ServerGroupHandler extends BaseHandler {
*/
public List<Long> listActiveSystemsInGroup(String sessionKey, String
systemGroupName) {
User loggedInUser = getLoggedInUser(sessionKey);
+ return activeSystemsInGroup(loggedInUser, systemGroupName);
+ }
+
+ private List<Long> activeSystemsInGroup(User loggedInUser, String
systemGroupName) {
ServerGroup sg = lookup(systemGroupName, loggedInUser);
Long threshold = new Long(Config.get().getInt(
ConfigDefaults.SYSTEM_CHECKIN_THRESHOLD));
return ServerGroupManager.getInstance().listActiveServers(sg, threshold);
-
}
/**
@@ -466,5 +471,49 @@ public class ServerGroupHandler extends BaseHandler {
return listInactiveSystemsInGroup(sessionKey, systemGroupName,
threshold.intValue());
}
+
+ /**
+ * Schedules an action to apply errata updates to active systems from a group.
+ * @param sessionKey The user's session key.
+ * @param systemGroupName the system group
+ * @param errataIds List of errata IDs to apply (as Integers)
+ * @return 1 if successful, exception thrown otherwise
+ *
+ * @xmlrpc.doc Schedules an action to apply errata updates to active systems
+ * from a group.
+ * @xmlrpc.param #param("string", "sessionKey")
+ * @xmlrpc.param #param("string", "systemGroupName")
+ * @xmlrpc.param #array_single("int", "errataId")
+ * @xmlrpc.returntype #return_int_success()
+ */
+ public int scheduleApplyErrataToActive(String sessionKey, String systemGroupName,
+ List errataIds) {
+ return scheduleApplyErrataToActive(sessionKey, systemGroupName, errataIds,
null);
+ }
+ /**
+ * Schedules an action to apply errata updates to active systems from a group
+ * at a specified time.
+ * @param sessionKey The user's session key.
+ * @param systemGroupName the system group
+ * @param errataIds List of errata IDs to apply (as Integers)
+ * @param earliestOccurrence Earliest occurrence of the errata update
+ * @return 1 if successful, exception thrown otherwise
+ *
+ * @xmlrpc.doc Schedules an action to apply errata updates to active systems
+ * from a group at a given date/time.
+ * @xmlrpc.param #param("string", "sessionKey")
+ * @xmlrpc.param #param("string", "systemGroupName")
+ * @xmlrpc.param #array_single("int", "errataId")
+ * @xmlrpc.param dateTime.iso8601 earliestOccurrence
+ * @xmlrpc.returntype #return_int_success()
+ */
+ public int scheduleApplyErrataToActive(String sessionKey, String systemGroupName,
+ List<Integer> errataIds, Date earliestOccurrence)
{
+ User loggedInUser = getLoggedInUser(sessionKey);
+ List<Long> systemIds = activeSystemsInGroup(loggedInUser,
systemGroupName);
+ ErrataManager.applyErrataHelper(loggedInUser, systemIds, errataIds,
+ earliestOccurrence);
+ return 1;
+ }
}
diff --git a/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
b/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
index 3f45dd9..a347040 100644
--- a/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
+++ b/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
@@ -1345,39 +1345,69 @@ public class ErrataManager extends BaseManager {
* @param errataIds List of errata IDs to apply (as Integers)
* @param earliestOccurrence Earliest occurrence of the errata update
*/
- public static void applyErrataHelper(User loggedInUser, Integer sid, List errataIds,
+ public static void applyErrataHelper(User loggedInUser, Long sid, List errataIds,
Date earliestOccurrence) {
Server server = SystemManager.lookupByIdAndUser(new Long(sid.longValue()),
loggedInUser);
+ // check whether the whole errata list applicable to the system
+ checkApplicableErrata(loggedInUser, errataIds, sid);
+ // apply it
+ applyErrata(loggedInUser, errataIds, earliestOccurrence, sid);
+ }
+
+ /**
+ * Apply errata updates to a system list at a specified time.
+ * @param loggedInUser The logged in user
+ * @param systemIds list of system IDs
+ * @param errataIds List of errata IDs to apply (as Integers)
+ * @param earliestOccurrence Earliest occurrence of the errata update
+ */
+ public static void applyErrataHelper(User loggedInUser, List<Long> systemIds,
+ List<Integer> errataIds, Date
earliestOccurrence) {
+ // first check, whether the errata list is applicable to the whole system list
+ // if not, exception is thrown
+ for (Long sid : systemIds) {
+ checkApplicableErrata(loggedInUser, errataIds, sid);
+ }
+ // at this point all errata is applicable to all systems, so let's apply
+ for (Long sid : systemIds) {
+ applyErrata(loggedInUser, errataIds, earliestOccurrence, sid);
+ }
+ }
+ private static void checkApplicableErrata(User loggedInUser, List<Integer>
errataIds,
+ Long serverId) {
// Check to make sure the given errata are applicable to and unscheduled for the
// system in question. This catches three scenarios, errata that don't apply
to
// this system, are already scheduled, or don't exist in the first place.
// TODO: fail silently in some of these cases?
Set unscheduledErrataIds = new HashSet();
List unscheduledErrata = SystemManager.unscheduledErrata(loggedInUser,
- server.getId(), null);
+ serverId, null);
for (Iterator it = unscheduledErrata.iterator(); it.hasNext();) {
Errata e = (Errata)it.next();
- unscheduledErrataIds.add(new Integer(e.getId().intValue()));
+ unscheduledErrataIds.add(e.getId());
}
for (Iterator it = errataIds.iterator(); it.hasNext();) {
Integer currentId = (Integer)it.next();
- if (!unscheduledErrataIds.contains(currentId)) {
+ if (!unscheduledErrataIds.contains(currentId.longValue())) {
throw new InvalidErrataException();
}
}
-
- for (Iterator it = errataIds.iterator(); it.hasNext();) {
- Integer currentId = (Integer)it.next();
- Errata errata = ErrataManager.lookupErrata(new Long(currentId.longValue()),
- loggedInUser);
- Action update = ActionManager.createErrataAction(loggedInUser, errata);
- if (earliestOccurrence != null) {
- update.setEarliestAction(earliestOccurrence);
- }
- ActionManager.addServerToAction(server.getId(), update);
- ActionManager.storeAction(update);
- }
}
+
+ private static void applyErrata(User loggedInUser, List errataIds,
+ Date earliestOccurrence, Long serverId) {
+ for (Iterator it = errataIds.iterator(); it.hasNext();) {
+ Integer currentId = (Integer)it.next();
+ Errata errata = ErrataManager.lookupErrata(currentId.longValue(),
+ loggedInUser);
+ Action update = ActionManager.createErrataAction(loggedInUser, errata);
+ if (earliestOccurrence != null) {
+ update.setEarliestAction(earliestOccurrence);
+ }
+ ActionManager.addServerToAction(serverId, update);
+ ActionManager.storeAction(update);
+ }
+ }
}
commit 388a9248a06e9bc21f41af50b353416d6c0c1748
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu May 13 11:44:11 2010 +0200
588367 move applyErrataHelper to ErrataManager
to share the method
diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
index 9c3ae09..212fd50 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/SystemHandler.java
@@ -79,7 +79,6 @@ import com.redhat.rhn.frontend.xmlrpc.InvalidActionTypeException;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelLabelException;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelListException;
import com.redhat.rhn.frontend.xmlrpc.InvalidEntitlementException;
-import com.redhat.rhn.frontend.xmlrpc.InvalidErrataException;
import com.redhat.rhn.frontend.xmlrpc.InvalidPackageException;
import com.redhat.rhn.frontend.xmlrpc.InvalidProfileLabelException;
import com.redhat.rhn.frontend.xmlrpc.InvalidSystemException;
@@ -2606,7 +2605,7 @@ public class SystemHandler extends BaseHandler {
* @xmlrpc.returntype #return_int_success()
*/
public int scheduleApplyErrata(String sessionKey, Integer sid, List errataIds) {
- applyErrataHelper(sessionKey, sid, errataIds, null);
+ ErrataManager.applyErrataHelper(getLoggedInUser(sessionKey), sid, errataIds,
null);
return 1;
}
@@ -2628,54 +2627,11 @@ public class SystemHandler extends BaseHandler {
*/
public int scheduleApplyErrata(String sessionKey, Integer sid, List errataIds,
Date earliestOccurrence) {
- applyErrataHelper(sessionKey, sid, errataIds, earliestOccurrence);
+ ErrataManager.applyErrataHelper(getLoggedInUser(sessionKey),
+ sid, errataIds, earliestOccurrence);
return 1;
}
-
- /**
- * Apply errata updates to a system at a specified time.
- * @param sessionKey The user's session key.
- * @param sid ID of the server
- * @param errataIds List of errata IDs to apply (as Integers)
- * @param earliestOccurrence Earliest occurrence of the errata update
- */
- private void applyErrataHelper(String sessionKey, Integer sid, List errataIds,
- Date earliestOccurrence) {
- User loggedInUser = getLoggedInUser(sessionKey);
- Server server = SystemManager.lookupByIdAndUser(new Long(sid.longValue()),
- loggedInUser);
-
- // Check to make sure the given errata are applicable to and unscheduled for the
- // system in question. This catches three scenarios, errata that don't apply
to
- // this system, are already scheduled, or don't exist in the first place.
- // TODO: fail silently in some of these cases?
- Set unscheduledErrataIds = new HashSet();
- List unscheduledErrata = SystemManager.unscheduledErrata(loggedInUser,
- server.getId(), null);
- for (Iterator it = unscheduledErrata.iterator(); it.hasNext();) {
- Errata e = (Errata)it.next();
- unscheduledErrataIds.add(new Integer(e.getId().intValue()));
- }
- for (Iterator it = errataIds.iterator(); it.hasNext();) {
- Integer currentId = (Integer)it.next();
- if (!unscheduledErrataIds.contains(currentId)) {
- throw new InvalidErrataException();
- }
- }
-
- for (Iterator it = errataIds.iterator(); it.hasNext();) {
- Integer currentId = (Integer)it.next();
- Errata errata = ErrataManager.lookupErrata(new Long(currentId.longValue()),
- loggedInUser);
- Action update = ActionManager.createErrataAction(loggedInUser, errata);
- if (earliestOccurrence != null) {
- update.setEarliestAction(earliestOccurrence);
- }
- ActionManager.addServerToAction(server.getId(), update);
- ActionManager.storeAction(update);
- }
- }
-
+
/**
* Compares the packages installed on two systems.
*
diff --git a/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
b/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
index a7ebfde..3f45dd9 100644
--- a/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
+++ b/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
@@ -25,6 +25,7 @@ import com.redhat.rhn.common.hibernate.LookupException;
import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.common.messaging.MessageQueue;
import com.redhat.rhn.common.security.PermissionException;
+import com.redhat.rhn.domain.action.Action;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.channel.ChannelFactory;
import com.redhat.rhn.domain.errata.Bug;
@@ -36,6 +37,7 @@ import com.redhat.rhn.domain.errata.impl.PublishedClonedErrata;
import
com.redhat.rhn.domain.org.Org;
import com.redhat.rhn.domain.rhnset.RhnSet;
import com.redhat.rhn.domain.role.RoleFactory;
+import com.redhat.rhn.domain.server.Server;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.dto.ChannelOverview;
import com.redhat.rhn.frontend.dto.ErrataOverview;
@@ -44,11 +46,14 @@ import com.redhat.rhn.frontend.dto.PackageOverview;
import com.redhat.rhn.frontend.events.CloneErrataAction;
import com.redhat.rhn.frontend.events.CloneErrataEvent;
import com.redhat.rhn.frontend.listview.PageControl;
+import com.redhat.rhn.frontend.xmlrpc.InvalidErrataException;
import com.redhat.rhn.manager.BaseManager;
+import com.redhat.rhn.manager.action.ActionManager;
import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.errata.cache.ErrataCacheManager;
import com.redhat.rhn.manager.rhnset.RhnSetDecl;
import com.redhat.rhn.manager.rhnset.RhnSetManager;
+import com.redhat.rhn.manager.system.SystemManager;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
@@ -59,6 +64,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -1332,5 +1338,46 @@ public class ErrataManager extends BaseManager {
ErrataFactory.syncErrataDetails(cloned);
}
+ /**
+ * Apply errata updates to a system at a specified time.
+ * @param loggedInUser The logged in user
+ * @param sid ID of the server
+ * @param errataIds List of errata IDs to apply (as Integers)
+ * @param earliestOccurrence Earliest occurrence of the errata update
+ */
+ public static void applyErrataHelper(User loggedInUser, Integer sid, List errataIds,
+ Date earliestOccurrence) {
+ Server server = SystemManager.lookupByIdAndUser(new Long(sid.longValue()),
+ loggedInUser);
+ // Check to make sure the given errata are applicable to and unscheduled for the
+ // system in question. This catches three scenarios, errata that don't apply
to
+ // this system, are already scheduled, or don't exist in the first place.
+ // TODO: fail silently in some of these cases?
+ Set unscheduledErrataIds = new HashSet();
+ List unscheduledErrata = SystemManager.unscheduledErrata(loggedInUser,
+ server.getId(), null);
+ for (Iterator it = unscheduledErrata.iterator(); it.hasNext();) {
+ Errata e = (Errata)it.next();
+ unscheduledErrataIds.add(new Integer(e.getId().intValue()));
+ }
+ for (Iterator it = errataIds.iterator(); it.hasNext();) {
+ Integer currentId = (Integer)it.next();
+ if (!unscheduledErrataIds.contains(currentId)) {
+ throw new InvalidErrataException();
+ }
+ }
+
+ for (Iterator it = errataIds.iterator(); it.hasNext();) {
+ Integer currentId = (Integer)it.next();
+ Errata errata = ErrataManager.lookupErrata(new Long(currentId.longValue()),
+ loggedInUser);
+ Action update = ActionManager.createErrataAction(loggedInUser, errata);
+ if (earliestOccurrence != null) {
+ update.setEarliestAction(earliestOccurrence);
+ }
+ ActionManager.addServerToAction(server.getId(), update);
+ ActionManager.storeAction(update);
+ }
+ }
}