java/code/src/com/redhat/rhn/frontend/xmlrpc/handler-manifest.xml | 1
java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java | 33 -
java/code/src/com/redhat/rhn/taskomatic/InvalidJobLabelException.java | 29 -
java/code/src/com/redhat/rhn/taskomatic/InvalidParamException.java | 28 +
java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml | 18
java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.java | 17
java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java | 149
+++--
java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml | 21
java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java | 77
+-
java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml | 21
java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java | 74
+-
java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java | 54 +
java/code/src/com/redhat/rhn/taskomatic/TaskoTask.hbm.xml | 4
java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml | 3
java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java | 278
++++++----
java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcInvocationInterceptor.java | 56
++
java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java | 20
java/code/src/com/redhat/rhn/taskomatic/core/RhnJobFactory.java | 7
java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoBunchSerializer.java | 56
++
java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java | 60
++
java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java | 61
++
java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoTemplateSerializer.java | 55 +
schema/spacewalk/common/tables/rhnTaskoRun.sql | 4
schema/spacewalk/common/tables/rhnTaskoSchedule.sql | 2
24 files changed, 834 insertions(+), 294 deletions(-)
New commits:
commit e435c952530c860c246ec4c79b06ded00382199b
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 24 16:49:32 2010 +0200
do not require jobLabel for singleRuns
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 838b36e..2124216 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -48,7 +48,7 @@ public class TaskoXmlRpcHandler {
try {
bunch = doBasicCheck(orgId, bunchName, jobLabel);
}
- catch (SchedulerException se){
+ catch (SchedulerException se) {
return null;
}
// create schedule
@@ -90,7 +90,8 @@ public class TaskoXmlRpcHandler {
throws NoSuchBunchTaskException, InvalidParamException, SchedulerException {
TaskoBunch bunch = checkBunchName(bunchName);
if (!TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel).isEmpty() ||
- (SchedulerKernel.getScheduler().getTrigger(jobLabel, orgId.toString()) !=
null)) {
+ (SchedulerKernel.getScheduler().getTrigger(jobLabel, orgId.toString())
!=
+ null)) {
throw new InvalidParamException("jobLabel already in use");
}
return bunch;
@@ -126,15 +127,17 @@ public class TaskoXmlRpcHandler {
return unscheduleBunch(null, jobLabel);
}
- public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
- Map params, Date start)
+ public Date scheduleSingleBunchRun(Integer orgId, String bunchName, Map params,
+ Date start)
throws NoSuchBunchTaskException,
InvalidParamException {
+ String jobLabel = null;
TaskoBunch bunch = null;
try {
+ jobLabel = getUniqueSingleJobLabel(orgId, bunchName);
bunch = doBasicCheck(orgId, bunchName, jobLabel);
}
- catch (SchedulerException se){
+ catch (SchedulerException se) {
return null;
}
// create schedule
@@ -143,29 +146,26 @@ public class TaskoXmlRpcHandler {
start, null, "");
TaskoFactory.save(schedule);
// create job
- Date scheduleDate= createJob(schedule);
+ Date scheduleDate = createJob(schedule);
if (scheduleDate == null) {
TaskoFactory.delete(schedule);
}
return scheduleDate;
}
- public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
- Map params)
- throws NoSuchBunchTaskException, InvalidParamException {
- return scheduleSingleBunchRun(orgId, bunchName, jobLabel, params, new Date());
- }
-
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, Map params)
throws NoSuchBunchTaskException, InvalidParamException {
- String jobLabel = getUniqueJobLabel(orgId, bunchName);
- return scheduleSingleBunchRun(orgId, bunchName, jobLabel, params, new Date());
+ return scheduleSingleBunchRun(orgId, bunchName, params, new Date());
}
- private String getUniqueJobLabel(Integer orgId, String bunchName) {
+ private String getUniqueSingleJobLabel(Integer orgId, String bunchName)
+ throws SchedulerException {
String jobLabel = "single-" + bunchName + "-";
Integer count = 0;
- while (!TaskoFactory.listSchedulesByOrgAndLabel(orgId, jobLabel).isEmpty()) {
+ while (!TaskoFactory.listSchedulesByOrgAndLabel(orgId,
+ jobLabel + count.toString()).isEmpty() ||
+ (SchedulerKernel.getScheduler().getTrigger(jobLabel + count.toString(),
+ orgId.toString()) != null)) {
count++;
}
return jobLabel + count.toString();
commit 367cc4c6f7cffc784bba197cb2442ff4ad6e10cb
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 24 16:25:24 2010 +0200
add extra consistency check
if job won't get scheduled by quartz, delete the schedule object
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index e242195..c39f04b 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -78,7 +78,7 @@ public class TaskoFactory extends HibernateFactory {
singleton.removeObject(taskoRun);
}
- private static void delete(TaskoSchedule taskoSchedule) {
+ public static void delete(TaskoSchedule taskoSchedule) {
singleton.removeObject(taskoSchedule);
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 957ddc4..838b36e 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -44,14 +44,24 @@ public class TaskoXmlRpcHandler {
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
Date startTime, Date endTime, String cronExpression, Map params)
throws NoSuchBunchTaskException, InvalidParamException {
- TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
+ TaskoBunch bunch = null;
+ try {
+ bunch = doBasicCheck(orgId, bunchName, jobLabel);
+ }
+ catch (SchedulerException se){
+ return null;
+ }
// create schedule
TaskoSchedule schedule = null;
schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
startTime, endTime, cronExpression);
TaskoFactory.save(schedule);
// create job
- return createJob(schedule);
+ Date scheduleDate = createJob(schedule);
+ if (scheduleDate == null) {
+ TaskoFactory.delete(schedule);
+ }
+ return scheduleDate;
}
public Date scheduleSatBunch(String bunchName, String jobLabel,
@@ -77,9 +87,10 @@ public class TaskoXmlRpcHandler {
private TaskoBunch doBasicCheck(Integer orgId, String bunchName,
String jobLabel)
- throws NoSuchBunchTaskException, InvalidParamException {
+ throws NoSuchBunchTaskException, InvalidParamException, SchedulerException {
TaskoBunch bunch = checkBunchName(bunchName);
- if (!TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel).isEmpty()) {
+ if (!TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel).isEmpty() ||
+ (SchedulerKernel.getScheduler().getTrigger(jobLabel, orgId.toString()) !=
null)) {
throw new InvalidParamException("jobLabel already in use");
}
return bunch;
@@ -119,14 +130,24 @@ public class TaskoXmlRpcHandler {
Map params, Date start)
throws NoSuchBunchTaskException,
InvalidParamException {
- TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
+ TaskoBunch bunch = null;
+ try {
+ bunch = doBasicCheck(orgId, bunchName, jobLabel);
+ }
+ catch (SchedulerException se){
+ return null;
+ }
// create schedule
TaskoSchedule schedule = null;
schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
start, null, "");
TaskoFactory.save(schedule);
// create job
- return createJob(schedule);
+ Date scheduleDate= createJob(schedule);
+ if (scheduleDate == null) {
+ TaskoFactory.delete(schedule);
+ }
+ return scheduleDate;
}
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
commit b1d0f20765bdd0c0c07e111fd2657be0e5af35a7
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 24 15:47:58 2010 +0200
separate sat and org api
diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/handler-manifest.xml
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/handler-manifest.xml
index 6d22964..e4fe763 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/handler-manifest.xml
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/handler-manifest.xml
@@ -36,4 +36,5 @@
<template name="schedule"
classname="com.redhat.rhn.frontend.xmlrpc.schedule.ScheduleHandler" />
<template name="distchannel"
classname="com.redhat.rhn.frontend.xmlrpc.distchannel.DistChannelHandler" />
<template name="taskomatic"
classname="com.redhat.rhn.frontend.xmlrpc.taskomatic.TaskomaticHandler" />
+ <template name="taskomatic.org"
classname="com.redhat.rhn.frontend.xmlrpc.taskomatic.TaskomaticOrgHandler"
/>
</factory>
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
index 92afe06..a97c775 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
@@ -53,9 +53,9 @@ public class TaskomaticHandler extends BaseHandler {
List params = new ArrayList(arguments);
String sessionKey = (String) params.remove(0);
User loggedInUser = getLoggedInUser(sessionKey);
- ensureUserRole(loggedInUser, RoleFactory.ORG_ADMIN);
+ checkUserRole(loggedInUser);
- params.add(0, loggedInUser.getOrg().getId());
+ addParameters(loggedInUser, params);
log.info("Translating " + methodCalled);
@@ -67,4 +67,12 @@ public class TaskomaticHandler extends BaseHandler {
throw new XmlRpcFault(1, e.getMessage());
}
}
+
+ protected void checkUserRole(User user) {
+ ensureUserRole(user, RoleFactory.SAT_ADMIN);
+ }
+
+ protected void addParameters(User user, List params) {
+ // empty
+ }
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
index acfd72e..e933523 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
@@ -24,7 +24,7 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<property name="modified" column="modified"
type="timestamp"
insert="false" update="false"/>
- <list name="templates" inverse="true"
table="rhnTaskoTemplate">
+ <list name="templates" inverse="true"
lazy="false" table="rhnTaskoTemplate">
<key column="bunch_id"/>
<index column="ordering"/>
<one-to-many
class="com.redhat.rhn.taskomatic.TaskoTemplate"/>
@@ -48,8 +48,12 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch WHERE orgBunch is null AND
name = :name]]>
</query>
- <query name="TaskoBunch.listBunches">
- <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch as b]]>
+ <query name="TaskoBunch.listOrgBunches">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch WHERE orgBunch is not
null]]>
+ </query>
+
+ <query name="TaskoBunch.listSatBunches">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch WHERE orgBunch is
null]]>
</query>
</hibernate-mapping>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index 47d29ba..e242195 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -60,9 +60,14 @@ public class TaskoFactory extends HibernateFactory {
"TaskoTemplate.lookupByBunchAndOrder",
params);
}
- public static List<TaskoBunch> listBunches() {
+ public static List<TaskoBunch> listOrgBunches() {
return (List) singleton.listObjectsByNamedQuery(
- "TaskoBunch.listBunches", null);
+ "TaskoBunch.listOrgBunches", null);
+ }
+
+ public static List<TaskoBunch> listSatBunches() {
+ return (List) singleton.listObjectsByNamedQuery(
+ "TaskoBunch.listSatBunches", null);
}
public static void save(TaskoRun taskoRun) {
@@ -107,7 +112,8 @@ public class TaskoFactory extends HibernateFactory {
"TaskoRun.listOlderThan", params);
}
- public static void clearRunHistory(Integer orgId, Date limitTime) throws
InvalidParamException {
+ public static void clearOrgRunHistory(Integer orgId, Date limitTime)
+ throws InvalidParamException {
if (limitTime == null) {
throw new InvalidParamException("Invalid limit date");
}
@@ -122,8 +128,8 @@ public class TaskoFactory extends HibernateFactory {
List<TaskoSchedule> scheduleList = listSchedulesByOrg(orgId);
for (TaskoSchedule schedule : scheduleList) {
Date endTime = schedule.getActiveTill();
- if ((endTime != null) && (endTime.before(limitTime))
- &&
TaskoFactory.listRunsBySchedule(schedule.getId()).isEmpty()) {
+ if ((endTime != null) && (endTime.before(limitTime)) &&
+ TaskoFactory.listRunsBySchedule(schedule.getId()).isEmpty()) {
TaskoFactory.delete(schedule);
}
}
@@ -198,7 +204,8 @@ public class TaskoFactory extends HibernateFactory {
"TaskoSchedule.listByOrgAndBunch",
params);
}
- public static List<TaskoSchedule> listSchedulesByOrgAndLabel(Integer orgId,
String jobLabel) {
+ public static List<TaskoSchedule> listSchedulesByOrgAndLabel(Integer orgId,
+ String jobLabel) {
Map params = new HashMap();
params.put("org_id", orgId);
params.put("job_label", jobLabel);
@@ -241,7 +248,8 @@ public class TaskoFactory extends HibernateFactory {
}
}
- public static TaskoRun getRunByOrgAndId(Integer orgId, Long runId) throws
InvalidParamException {
+ public static TaskoRun getRunByOrgAndId(Integer orgId, Long runId)
+ throws InvalidParamException {
TaskoRun run = lookupRunById(runId);
if ((run == null) || (!run.getOrgId().equals(orgId))) {
throw new InvalidParamException("No such run id");
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
index aea74dc..f3b4058 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
@@ -42,7 +42,7 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
</query>
<query name="TaskoRun.listRunsWithStatus">
- <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun AS r WHERE
r.template.task.id = :task_id AND (r.status = :status1 OR status = :status2)]]>
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun WHERE template.task.id =
:task_id AND (status = :status1 OR status = :status2)]]>
</query>
<query name="TaskoRun.listOlderThan">
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
index b04b263..387fe89 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
@@ -379,7 +379,7 @@ public class TaskoRun implements Job {
}
/**
- * @param jobLabelIn The jobLabel to set.
+ * @param scheduleIdIn The jobLabel to set.
*/
public void setScheduleId(Long scheduleIdIn) {
this.scheduleId = scheduleIdIn;
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 5065873..957ddc4 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -33,13 +33,12 @@ public class TaskoXmlRpcHandler {
return 1;
}
- public String[] listBunches(Integer orgId) {
- try {
- return SchedulerKernel.getScheduler().getTriggerNames(orgId.toString());
- }
- catch (SchedulerException e) {
- return null;
- }
+ public List<TaskoBunch> listBunches(Integer orgId) {
+ return TaskoFactory.listOrgBunches();
+ }
+
+ public List<TaskoBunch> listSatBunches() {
+ return TaskoFactory.listSatBunches();
}
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
@@ -55,6 +54,13 @@ public class TaskoXmlRpcHandler {
return createJob(schedule);
}
+ public Date scheduleSatBunch(String bunchName, String jobLabel,
+ Date startTime, Date endTime, String cronExpression, Map params)
+ throws NoSuchBunchTaskException, InvalidParamException {
+ return scheduleBunch(null, bunchName, jobLabel, startTime, endTime,
+ cronExpression, params);
+ }
+
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
String cronExpression, Map params)
throws NoSuchBunchTaskException, InvalidParamException {
@@ -62,6 +68,13 @@ public class TaskoXmlRpcHandler {
cronExpression, params);
}
+ public Date scheduleSatBunch(String bunchName, String jobLabel,
+ String cronExpression, Map params)
+ throws NoSuchBunchTaskException, InvalidParamException {
+ return scheduleBunch(null, bunchName, jobLabel,
+ cronExpression, params);
+ }
+
private TaskoBunch doBasicCheck(Integer orgId, String bunchName,
String jobLabel)
throws NoSuchBunchTaskException, InvalidParamException {
@@ -72,7 +85,8 @@ public class TaskoXmlRpcHandler {
return bunch;
}
- public Integer unscheduleBunch(Integer orgId, String jobLabel) throws
InvalidParamException {
+ public Integer unscheduleBunch(Integer orgId, String jobLabel)
+ throws InvalidParamException {
List<TaskoSchedule> scheduleList =
TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel);
Trigger trigger;
@@ -97,6 +111,10 @@ public class TaskoXmlRpcHandler {
return 1;
}
+ public Integer unscheduleSatBunch(String jobLabel) throws InvalidParamException {
+ return unscheduleBunch(null, jobLabel);
+ }
+
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
Map params, Date start)
throws NoSuchBunchTaskException,
@@ -117,6 +135,21 @@ public class TaskoXmlRpcHandler {
return scheduleSingleBunchRun(orgId, bunchName, jobLabel, params, new Date());
}
+ public Date scheduleSingleBunchRun(Integer orgId, String bunchName, Map params)
+ throws NoSuchBunchTaskException, InvalidParamException {
+ String jobLabel = getUniqueJobLabel(orgId, bunchName);
+ return scheduleSingleBunchRun(orgId, bunchName, jobLabel, params, new Date());
+ }
+
+ private String getUniqueJobLabel(Integer orgId, String bunchName) {
+ String jobLabel = "single-" + bunchName + "-";
+ Integer count = 0;
+ while (!TaskoFactory.listSchedulesByOrgAndLabel(orgId, jobLabel).isEmpty()) {
+ count++;
+ }
+ return jobLabel + count.toString();
+ }
+
private Date createJob(TaskoSchedule schedule) throws InvalidParamException {
// create trigger
Trigger trigger = null;
@@ -172,14 +205,13 @@ public class TaskoXmlRpcHandler {
return bunch;
}
- public int listBunchRuns(Integer orgId, String triggerName)
- throws SchedulerException {
- return SchedulerKernel.getScheduler().unscheduleJob(triggerName,
- orgId.toString()) ? 1 : 0;
+ public int clearRunHistory(Integer orgId, Date limitTime) throws
InvalidParamException {
+ TaskoFactory.clearOrgRunHistory(orgId, limitTime);
+ return 1;
}
- public int clearRunHistory(Integer orgId, Date limitTime) throws
InvalidParamException {
- TaskoFactory.clearRunHistory(orgId, limitTime);
+ public int clearSatRunHistory(Date limitTime) throws InvalidParamException {
+ TaskoFactory.clearOrgRunHistory(null, limitTime);
return 1;
}
@@ -187,23 +219,45 @@ public class TaskoXmlRpcHandler {
return TaskoFactory.listSchedulesByOrg(orgId);
}
+ public List<TaskoSchedule> listAllSatSchedules() {
+ return listAllSchedules(null);
+ }
+
public List<TaskoSchedule> listActiveSchedules(Integer orgId) {
return TaskoFactory.listActiveSchedulesByOrg(orgId);
}
+ public List<TaskoSchedule> listActiveSatSchedules() {
+ return listActiveSchedules(null);
+ }
+
public List<TaskoRun> listScheduleRuns(Integer orgId, Integer scheduleId) {
return TaskoFactory.getRunsByOrgAndSchedule(orgId, scheduleId);
}
+ public List<TaskoRun> listScheduleSatRuns(Integer scheduleId) {
+ return listScheduleRuns(null, scheduleId);
+ }
+
public String getRunStdOutputLog(Integer orgId, Long runId, Long nBytes)
throws InvalidParamException {
TaskoRun run = TaskoFactory.getRunByOrgAndId(orgId, runId);
return run.getTailOfStdOutput(nBytes);
}
+ public String getSatRunStdOutputLog(Long runId, Long nBytes)
+ throws InvalidParamException {
+ return getRunStdOutputLog(null, runId, nBytes);
+ }
+
public String getRunStdErrorLog(Integer orgId, Long runId, Long nBytes)
throws InvalidParamException {
TaskoRun run = TaskoFactory.getRunByOrgAndId(orgId, runId);
return run.getTailOfStdError(nBytes);
}
+
+ public String getSatRunStdErrorLog(Long runId, Long nBytes)
+ throws InvalidParamException {
+ return getRunStdErrorLog(null, runId, nBytes);
+ }
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
index 19ecdf8..6bf4c2d 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
@@ -102,7 +102,8 @@ public class TaskoXmlRpcServer {
private void addTaskoSerializers() {
for (Class clazz : TaskoSerializerRegistry.getSerializationClasses()) {
try {
-
xmlrpcServer.getSerializer().addCustomSerializer((XmlRpcCustomSerializer)clazz.newInstance());
+ xmlrpcServer.getSerializer().addCustomSerializer(
+ (XmlRpcCustomSerializer)clazz.newInstance());
}
catch (InstantiationException e) {
e.printStackTrace(System.out);
commit 0622da21741fe6fba2c726518b7f22a4dd8069c1
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 24 14:32:08 2010 +0200
add serializers for TaskoTemplate and TaskoBunch
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java
index cb815e6..ab0d19c 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java
@@ -14,8 +14,10 @@
*/
package com.redhat.rhn.taskomatic;
+import com.redhat.rhn.taskomatic.serializer.TaskoBunchSerializer;
import com.redhat.rhn.taskomatic.serializer.TaskoRunSerializer;
import com.redhat.rhn.taskomatic.serializer.TaskoScheduleSerializer;
+import com.redhat.rhn.taskomatic.serializer.TaskoTemplateSerializer;
import java.util.LinkedList;
import java.util.List;
@@ -34,6 +36,8 @@ public class TaskoSerializerRegistry {
TASKO_SERIALIZER_CLASSES = new LinkedList<Class>();
TASKO_SERIALIZER_CLASSES.add(TaskoScheduleSerializer.class);
TASKO_SERIALIZER_CLASSES.add(TaskoRunSerializer.class);
+ TASKO_SERIALIZER_CLASSES.add(TaskoBunchSerializer.class);
+ TASKO_SERIALIZER_CLASSES.add(TaskoTemplateSerializer.class);
}
private TaskoSerializerRegistry() {
diff --git a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoBunchSerializer.java
b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoBunchSerializer.java
new file mode 100644
index 0000000..6a0f459
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoBunchSerializer.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2010 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.taskomatic.serializer;
+
+import com.redhat.rhn.frontend.xmlrpc.serializer.util.SerializerHelper;
+import com.redhat.rhn.taskomatic.TaskoBunch;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import redstone.xmlrpc.XmlRpcCustomSerializer;
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcSerializer;
+
+
+/**
+ * TaskoBunchSerializer
+ * @version $Rev$
+ */
+public class TaskoBunchSerializer implements XmlRpcCustomSerializer {
+
+ /**
+ * {@inheritDoc}
+ */
+ public Class getSupportedClass() {
+ return TaskoBunch.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void serialize(Object value, Writer output,
+ XmlRpcSerializer builtInSerializer)
+ throws XmlRpcException, IOException {
+
+ TaskoBunch bunch = (TaskoBunch) value;
+ SerializerHelper helper = new SerializerHelper(builtInSerializer);
+
+ helper.add("name", bunch.getName());
+ helper.add("description", bunch.getDescription());
+ helper.add("templates", bunch.getTemplates());
+ helper.writeTo(output);
+ }
+}
diff --git
a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java
b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java
index e7885be..1ed24ee 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2008 Red Hat, Inc.
+ * Copyright (c) 2010 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
diff --git
a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoTemplateSerializer.java
b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoTemplateSerializer.java
new file mode 100644
index 0000000..4eea009
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoTemplateSerializer.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2010 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.taskomatic.serializer;
+
+import com.redhat.rhn.frontend.xmlrpc.serializer.util.SerializerHelper;
+import com.redhat.rhn.taskomatic.TaskoTemplate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import redstone.xmlrpc.XmlRpcCustomSerializer;
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcSerializer;
+
+
+/**
+ * TaskoTemplateSerializer
+ * @version $Rev$
+ */
+public class TaskoTemplateSerializer implements XmlRpcCustomSerializer {
+
+ /**
+ * {@inheritDoc}
+ */
+ public Class getSupportedClass() {
+ return TaskoTemplate.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void serialize(Object value, Writer output,
+ XmlRpcSerializer builtInSerializer)
+ throws XmlRpcException, IOException {
+
+ TaskoTemplate template = (TaskoTemplate) value;
+ SerializerHelper helper = new SerializerHelper(builtInSerializer);
+
+ helper.add("name", template.getTask().getName());
+ helper.writeTo(output);
+ }
+
+}
commit 59f52e53cdb9e22fdf5fee529ef6243143c24cfa
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 24 13:49:11 2010 +0200
remove orgTask
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.java
index 20872d9..780e0a7 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.java
@@ -27,7 +27,6 @@ public class TaskoBunch {
private Long id;
private String name;
private String description;
- private String orgTask;
private Date activeFrom;
private Date activeTill;
private String orgBunch;
@@ -147,22 +146,6 @@ public class TaskoBunch {
this.templates = templatesIn;
}
-
- /**
- * @return Returns the orgTask.
- */
- public String getOrgTask() {
- return orgTask;
- }
-
-
- /**
- * @param orgTaskIn The orgTask to set.
- */
- public void setOrgTask(String orgTaskIn) {
- this.orgTask = orgTaskIn;
- }
-
/**
* @return Returns the orgBunch.
*/
commit 70c7826446a890b5a13da91dd6eae4f8b1e7b22b
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 24 11:38:47 2010 +0200
make conform hibernate query names
rename find -> lookup/list
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
index 2b8a2df..acfd72e 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoBunch.hbm.xml
@@ -32,19 +32,19 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
</class>
- <query name="TaskoBunch.findById">
+ <query name="TaskoBunch.lookupById">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch WHERE id = :id]]>
</query>
- <query name="TaskoBunch.findByName">
+ <query name="TaskoBunch.lookupByName">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch WHERE name = :name]]>
</query>
- <query name="TaskoBunch.findOrgBunchByName">
+ <query name="TaskoBunch.lookupOrgBunchByName">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch WHERE orgBunch is not null
AND name = :name]]>
</query>
- <query name="TaskoBunch.findSatBunchByName">
+ <query name="TaskoBunch.lookupSatBunchByName">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoBunch WHERE orgBunch is null AND
name = :name]]>
</query>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index 040f884..47d29ba 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -49,7 +49,7 @@ public class TaskoFactory extends HibernateFactory {
Map params = new HashMap();
params.put("name", bunchName);
return (TaskoBunch) singleton.lookupObjectByNamedQuery(
- "TaskoBunch.findOrgBunchByName",
params);
+ "TaskoBunch.lookupOrgBunchByName",
params);
}
public static TaskoTemplate lookupTemplateByBunchAndOrder(Long bunchId, Long order)
{
@@ -57,7 +57,7 @@ public class TaskoFactory extends HibernateFactory {
params.put("bunch_id", bunchId);
params.put("order", order);
return (TaskoTemplate) singleton.lookupObjectByNamedQuery(
- "TaskoTemplate.findByBunchAndOrder",
params);
+ "TaskoTemplate.lookupByBunchAndOrder",
params);
}
public static List<TaskoBunch> listBunches() {
@@ -155,7 +155,7 @@ public class TaskoFactory extends HibernateFactory {
params.put("org_id", orgId);
params.put("timestamp", new Date()); // use server time, not DB
time
return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
- "TaskoSchedule.findActiveByOrg", params);
+ "TaskoSchedule.listActiveByOrg", params);
}
public static List<TaskoSchedule> listActiveSchedulesByOrgAndLabel(Integer
orgId,
@@ -165,7 +165,7 @@ public class TaskoFactory extends HibernateFactory {
params.put("job_label", jobLabel);
params.put("timestamp", new Date()); // use server time, not DB
time
return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
- "TaskoSchedule.findActiveByOrgAndLabel", params);
+ "TaskoSchedule.listActiveByOrgAndLabel", params);
}
public static TaskoSchedule lookupScheduleById(Long scheduleId) {
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
index a8bf72f..f8312f8 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
@@ -48,11 +48,11 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND bunch.id = :bunch_id]]>
</query>
- <query name="TaskoSchedule.findActiveByOrg">
+ <query name="TaskoSchedule.listActiveByOrg">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND (activeFrom < :timestamp AND (activeTill is null OR :timestamp <
activeTill))]]>
</query>
- <query name="TaskoSchedule.findActiveByOrgAndLabel">
+ <query name="TaskoSchedule.listActiveByOrgAndLabel">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND jobLabel = :job_label AND (activeFrom < :timestamp AND (activeTill is null
OR :timestamp < activeTill))]]>
</query>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoTask.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoTask.hbm.xml
index b127f30..990569c 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoTask.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoTask.hbm.xml
@@ -22,11 +22,11 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
insert="false" update="false"/>
</class>
- <query name="TaskoTask.findById">
+ <query name="TaskoTask.lookupById">
<![CDATA[from com.redhat.rhn.taskomatic.TaskoTask as t where t.id = :id]]>
</query>
- <query name="TaskoTask.findByName">
+ <query name="TaskoTask.lookupByName">
<![CDATA[from com.redhat.rhn.taskomatic.TaskoTask as t where t.name =
:name]]>
</query>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
index a18e358..2051d05 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
@@ -36,7 +36,7 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
insert="false" update="false"/>
</class>
- <query name="TaskoTemplate.findByBunchAndOrder">
+ <query name="TaskoTemplate.lookupByBunchAndOrder">
<![CDATA[from com.redhat.rhn.taskomatic.TaskoTemplate where bunch.id =
:bunch_id and ordering = :order]]>
</query>
commit b21323589957983f75c7cec2d0155da1221030f7
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 24 11:25:04 2010 +0200
change lookup for active schedules
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index 316e318..040f884 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -150,12 +150,21 @@ public class TaskoFactory extends HibernateFactory {
return false;
}
- public static TaskoSchedule lookupActiveScheduleByOrgAndLabel(Integer orgId,
+ public static List<TaskoSchedule> listActiveSchedulesByOrg(Integer orgId) {
+ Map params = new HashMap();
+ params.put("org_id", orgId);
+ params.put("timestamp", new Date()); // use server time, not DB
time
+ return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
+ "TaskoSchedule.findActiveByOrg", params);
+ }
+
+ public static List<TaskoSchedule> listActiveSchedulesByOrgAndLabel(Integer
orgId,
String jobLabel) {
Map params = new HashMap();
params.put("org_id", orgId);
params.put("job_label", jobLabel);
- return (TaskoSchedule) singleton.lookupObjectByNamedQuery(
+ params.put("timestamp", new Date()); // use server time, not DB
time
+ return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
"TaskoSchedule.findActiveByOrgAndLabel", params);
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
index 8c7f8f4..a8bf72f 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
@@ -48,8 +48,12 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND bunch.id = :bunch_id]]>
</query>
+ <query name="TaskoSchedule.findActiveByOrg">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND (activeFrom < :timestamp AND (activeTill is null OR :timestamp <
activeTill))]]>
+ </query>
+
<query name="TaskoSchedule.findActiveByOrgAndLabel">
- <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND jobLabel = :job_label AND (activeFrom < sysdate AND (activeTill is null OR
sysdate < activeTill))]]>
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND jobLabel = :job_label AND (activeFrom < :timestamp AND (activeTill is null
OR :timestamp < activeTill))]]>
</query>
</hibernate-mapping>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index bf62cf3..5065873 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -66,15 +66,15 @@ public class TaskoXmlRpcHandler {
String jobLabel)
throws NoSuchBunchTaskException, InvalidParamException {
TaskoBunch bunch = checkBunchName(bunchName);
- if (TaskoFactory.lookupActiveScheduleByOrgAndLabel(orgId, jobLabel) != null) {
+ if (!TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel).isEmpty()) {
throw new InvalidParamException("jobLabel already in use");
}
return bunch;
}
public Integer unscheduleBunch(Integer orgId, String jobLabel) throws
InvalidParamException {
- TaskoSchedule schedule =
- TaskoFactory.lookupActiveScheduleByOrgAndLabel(orgId, jobLabel);
+ List<TaskoSchedule> scheduleList =
+ TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel);
Trigger trigger;
try {
trigger = SchedulerKernel.getScheduler().getTrigger(jobLabel,
orgId.toString());
@@ -85,10 +85,10 @@ public class TaskoXmlRpcHandler {
// check for inconsistencies
// quartz unschedules job after trigger end time
// so better handle quartz and schedules separately
- if ((schedule == null) && (trigger == null)) {
+ if ((scheduleList.isEmpty()) && (trigger == null)) {
throw new InvalidParamException("No such jobLabel");
}
- if (schedule != null) {
+ for (TaskoSchedule schedule : scheduleList) {
schedule.unschedule();
}
if (trigger != null) {
@@ -183,10 +183,14 @@ public class TaskoXmlRpcHandler {
return 1;
}
- public List<TaskoSchedule> listSchedules(Integer orgId) {
+ public List<TaskoSchedule> listAllSchedules(Integer orgId) {
return TaskoFactory.listSchedulesByOrg(orgId);
}
+ public List<TaskoSchedule> listActiveSchedules(Integer orgId) {
+ return TaskoFactory.listActiveSchedulesByOrg(orgId);
+ }
+
public List<TaskoRun> listScheduleRuns(Integer orgId, Integer scheduleId) {
return TaskoFactory.getRunsByOrgAndSchedule(orgId, scheduleId);
}
commit 5d824c7b22883c9c39247f0907c3267b9338eee9
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Wed Jun 23 15:54:54 2010 +0200
adding TaskoXmlRpcInvocationInterceptor
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcInvocationInterceptor.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcInvocationInterceptor.java
new file mode 100644
index 0000000..4a6cdbb
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcInvocationInterceptor.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2010 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.taskomatic;
+
+import com.redhat.rhn.common.hibernate.HibernateFactory;
+
+import redstone.xmlrpc.XmlRpcInvocation;
+import redstone.xmlrpc.XmlRpcInvocationInterceptor;
+
+
+/**
+ * TaskoXmlRpcInvocationInterceptor
+ * @version $Rev$
+ */
+public class TaskoXmlRpcInvocationInterceptor implements
+ XmlRpcInvocationInterceptor {
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object after(XmlRpcInvocation invocation, Object returnValue) {
+ if (HibernateFactory.getSession().getTransaction().isActive()) {
+ HibernateFactory.commitTransaction();
+ }
+ HibernateFactory.closeSession();
+ return returnValue;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean before(XmlRpcInvocation invocation) {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void onException(XmlRpcInvocation incovation, Throwable exception) {
+ HibernateFactory.rollbackTransaction();
+ HibernateFactory.closeSession();
+ }
+
+}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
index d7b0413..19ecdf8 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
@@ -62,6 +62,7 @@ public class TaskoXmlRpcServer {
public void start() {
xmlrpcServer = new XmlRpcServer();
xmlrpcServer.addInvocationHandler("tasko", new TaskoXmlRpcHandler());
+ xmlrpcServer.addInvocationInterceptor(new TaskoXmlRpcInvocationInterceptor());
addTaskoSerializers();
TaskoXmlRpcInvoker invoker = new TaskoXmlRpcInvoker(xmlrpcServer);
@@ -81,6 +82,7 @@ public class TaskoXmlRpcServer {
catch (IOException e) {
throw new RuntimeException(e);
}
+
}
/**
commit cee762bf87eab3da9a9c1c1567d6afd5fac1bef6
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Wed Jun 23 15:36:15 2010 +0200
various backend changes
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index f65f88c..316e318 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -18,13 +18,13 @@ package com.redhat.rhn.taskomatic;
import com.redhat.rhn.common.hibernate.HibernateFactory;
import org.apache.log4j.Logger;
-import org.hibernate.Transaction;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -104,7 +104,7 @@ public class TaskoFactory extends HibernateFactory {
params.put("org_id", orgId);
params.put("limit_time", limitTime);
return (List<TaskoRun>) singleton.listObjectsByNamedQuery(
- "TaskoRun.listRunsOlderThan", params);
+ "TaskoRun.listOlderThan", params);
}
public static void clearRunHistory(Integer orgId, Date limitTime) throws
InvalidParamException {
@@ -112,24 +112,21 @@ public class TaskoFactory extends HibernateFactory {
throw new InvalidParamException("Invalid limit date");
}
List<TaskoRun> runList = listRunsOlderThan(orgId, limitTime);
- Transaction trns = TaskoFactory.getSession().beginTransaction();
for (TaskoRun run : runList) {
// delete history of runs
TaskoFactory.deleteLogFiles(run);
TaskoFactory.delete(run);
}
- trns.commit();
// delete outdated schedules
List<TaskoSchedule> scheduleList = listSchedulesByOrg(orgId);
- trns = TaskoFactory.getSession().beginTransaction();
for (TaskoSchedule schedule : scheduleList) {
Date endTime = schedule.getActiveTill();
- if ((endTime != null) && (endTime.before(limitTime))) {
+ if ((endTime != null) && (endTime.before(limitTime))
+ &&
TaskoFactory.listRunsBySchedule(schedule.getId()).isEmpty()) {
TaskoFactory.delete(schedule);
}
}
- trns.commit();
}
public static void deleteLogFiles(TaskoRun run) {
@@ -176,6 +173,13 @@ public class TaskoFactory extends HibernateFactory {
"TaskoSchedule.listByOrg", params);
}
+ public static List<TaskoRun> listRunsBySchedule(Long scheduleId) {
+ Map params = new HashMap();
+ params.put("schedule_id", scheduleId);
+ return singleton.listObjectsByNamedQuery(
+ "TaskoRun.listBySchedule", params);
+ }
+
public static List<TaskoSchedule> listSchedulesByOrgAndBunch(Integer orgId,
TaskoBunch bunch) {
Map params = new HashMap();
@@ -206,7 +210,7 @@ public class TaskoFactory extends HibernateFactory {
taskClass = Class.forName(task.getTaskClass());
Method isParallelizableMethod =
taskClass.getMethod("isParallelizable",
(Class[]) null);
- return (Boolean) isParallelizableMethod.invoke(null, null);
+ return (Boolean) isParallelizableMethod.invoke(null, (Object[]) null);
}
catch (ClassNotFoundException e) {
return false;
@@ -244,4 +248,16 @@ public class TaskoFactory extends HibernateFactory {
}
return schedule;
}
+
+ public static List<TaskoRun> getRunsByOrgAndSchedule(Integer orgId,
+ Integer scheduleId) {
+ List<TaskoRun> runs = listRunsBySchedule(scheduleId.longValue());
+ // verify it belongs to the right org
+ for (Iterator<TaskoRun> iter = runs.iterator(); iter.hasNext();) {
+ if (!iter.next().getOrgId().equals(orgId)) {
+ iter.remove();
+ }
+ }
+ return runs;
+ }
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
index 9b78d50..aea74dc 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
@@ -16,9 +16,10 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<property name="orgId" type="integer"
column="org_id"/>
<many-to-one
name="template"
+ lazy="false"
class="com.redhat.rhn.taskomatic.TaskoTemplate"
column="template_id"/>
- <property name="jobLabel" type="string"
column="job_label"/>
+ <property name="scheduleId" type="long"
column="schedule_id"/>
<property name="startTime" type="timestamp"
column="start_time"/>
<property name="endTime" type="timestamp"
column="end_time"/>
<property name="stdOutputPath" type="string"
column="std_output_path"/>
@@ -36,12 +37,16 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun WHERE id = :id]]>
</query>
+ <query name="TaskoRun.listBySchedule">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun WHERE scheduleId =
:schedule_id]]>
+ </query>
+
<query name="TaskoRun.listRunsWithStatus">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun AS r WHERE
r.template.task.id = :task_id AND (r.status = :status1 OR status = :status2)]]>
</query>
- <query name="TaskoRun.listRunsOlderThan">
- <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun AS r WHERE r.orgId =
:org_id and r.endTime < :limit_time]]>
+ <query name="TaskoRun.listOlderThan">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun WHERE orgId = :org_id AND
endTime < :limit_time]]>
</query>
</hibernate-mapping>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
index d59b8e6..b04b263 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
@@ -45,7 +45,7 @@ public class TaskoRun implements Job {
private Long id;
private Integer orgId;
private TaskoTemplate template;
- private String jobLabel;
+ private Long scheduleId;
private Date startTime;
private Date endTime;
private String stdOutputPath = null;
@@ -57,10 +57,10 @@ public class TaskoRun implements Job {
public TaskoRun() {
}
- public TaskoRun(Integer orgIdIn, TaskoTemplate templateIn, String jobLabelIn) {
+ public TaskoRun(Integer orgIdIn, TaskoTemplate templateIn, Long scheduleIdIn) {
setOrgId(orgIdIn);
setTemplate(templateIn);
- setJobLabel(jobLabelIn);
+ setScheduleId(scheduleIdIn);
File logDir = new File(getStdLogDirName(orgId));
if (!logDir.isDirectory()) {
if (!logDir.exists()) {
@@ -71,13 +71,6 @@ public class TaskoRun implements Job {
}
public void start() {
- if (new File(getStdLogDirName(orgId)).isDirectory()) {
- setStdOutputPath(getStdOutputLog(orgId, template, this));
- setStdErrorPath(getStdErrorLog(orgId, template, this));
- }
- else {
- log.warn("Logging disabled. No directory " + STD_LOG_PREFIX);
- }
setStartTime(new Date());
saveStatus(STATUS_RUNNING);
}
@@ -85,18 +78,25 @@ public class TaskoRun implements Job {
public void finished(JobExecutionContext context) {
setEndTime(new Date());
String out = (String)
context.getJobDetail().getJobDataMap().get("stdOutput");
- if ((out != null) && (!out.isEmpty())) {
- saveLogToFile(getStdOutputPath(), out);
- }
- else {
- setStdOutputPath("");
- }
- String err = (String)
context.getJobDetail().getJobDataMap().get("stdError");
- if ((err != null) && (!err.isEmpty())) {
- saveLogToFile(getStdErrorPath(), err);
+ if (new File(getStdLogDirName(orgId)).isDirectory()) {
+ if ((out != null) && (!out.isEmpty())) {
+ setStdOutputPath(getStdOutputLog(orgId, template, this));
+ saveLogToFile(getStdOutputPath(), out);
+ }
+ else {
+ setStdOutputPath("");
+ }
+ String err = (String)
context.getJobDetail().getJobDataMap().get("stdError");
+ if ((err != null) && (!err.isEmpty())) {
+ setStdErrorPath(getStdErrorLog(orgId, template, this));
+ saveLogToFile(getStdErrorPath(), err);
+ }
+ else {
+ setStdErrorPath("");
+ }
}
else {
- setStdErrorPath("");
+ log.warn("Logging disabled. No directory " +
getStdLogDirName(orgId));
}
saveStatus(STATUS_FINISHED);
}
@@ -374,14 +374,14 @@ public class TaskoRun implements Job {
/**
* @return Returns the jobLabel.
*/
- public String getJobLabel() {
- return jobLabel;
+ public Long getScheduleId() {
+ return scheduleId;
}
/**
* @param jobLabelIn The jobLabel to set.
*/
- public void setJobLabel(String jobLabelIn) {
- this.jobLabel = jobLabelIn;
+ public void setScheduleId(Long scheduleIdIn) {
+ this.scheduleId = scheduleIdIn;
}
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
index 5547e53..8c7f8f4 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
@@ -16,10 +16,10 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<property name="jobLabel" type="string"
column="job_label"/>
<many-to-one
name="bunch"
+ lazy="false"
class="com.redhat.rhn.taskomatic.TaskoBunch"
column="bunch_id"/>
<property name="orgId" type="integer"
column="org_id"/>
- <property name="active" type="string"
column="active"/>
<property name="activeFrom" type="timestamp"
column="active_from"/>
<property name="activeTill" type="timestamp"
column="active_till"/>
<property name="cronExpr" type="string"
column="cron_expr"/>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
index ec63175..f48463c 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
@@ -14,6 +14,8 @@
*/
package com.redhat.rhn.taskomatic;
+import com.redhat.rhn.common.hibernate.HibernateFactory;
+
import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.quartz.Job;
@@ -27,15 +29,13 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Blob;
import java.sql.SQLException;
-import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
public class TaskoSchedule implements Job {
- private static final String TASKO_SCHEDULE_ACTIVE = "Y";
+
private static Logger log = Logger.getLogger(TaskoBunch.class);
private static Map<String, Integer> tasks = new HashMap<String,
Integer>();
@@ -43,12 +43,10 @@ public class TaskoSchedule implements Job {
private String jobLabel;
private TaskoBunch bunch;
private Integer orgId;
- private String active;
private Date activeFrom;
private Date activeTill;
private String cronExpr;
private byte[] data;
- private List<TaskoRun> runs = new ArrayList<TaskoRun>();
private Date created;
private Date modified;
@@ -67,7 +65,6 @@ public class TaskoSchedule implements Job {
setBunch(bunchIn);
setJobLabel(jobLabelIn);
data = serializeMap(dataIn);
- setActive(TASKO_SCHEDULE_ACTIVE);
setCronExpr(cronExprIn);
if (activeFromIn == null) {
setActiveFrom(new Date());
@@ -125,8 +122,10 @@ public class TaskoSchedule implements Job {
}
}
markTaskRunning(template.getTask());
- TaskoRun taskRun = new TaskoRun(this.orgId, template, this.jobLabel);
+ TaskoRun taskRun = new TaskoRun(this.orgId, template, this.id);
+ TaskoFactory.save(taskRun);
taskRun.execute(context);
+ TaskoFactory.commitTransaction();
unmarkTaskRunning(template.getTask());
log.debug(template.getTask().getName() + " ... " +
taskRun.getStatus());
previousRun = taskRun;
@@ -136,14 +135,13 @@ public class TaskoSchedule implements Job {
break;
}
}
- TaskoFactory.commitTransaction();
+ HibernateFactory.closeSession();
log.info("Finishing " + bunch.getName() + " (" + jobLabel +
") at " + new Date());
}
public void unschedule() {
setActiveTill(new Date());
- setActive(null);
}
private byte[] serializeMap(Map dataMap) {
@@ -320,20 +318,6 @@ public class TaskoSchedule implements Job {
}
/**
- * @return Returns the runs.
- */
- public List<TaskoRun> getRuns() {
- return runs;
- }
-
- /**
- * @param runsIn The runs to set.
- */
- public void setRuns(List<TaskoRun> runsIn) {
- runs = runsIn;
- }
-
- /**
* @return Returns the created.
*/
public Date getCreated() {
@@ -362,20 +346,6 @@ public class TaskoSchedule implements Job {
}
/**
- * @return Returns the active.
- */
- public String getActive() {
- return active;
- }
-
- /**
- * @param activeIn The active to set.
- */
- public void setActive(String activeIn) {
- active = activeIn;
- }
-
- /**
* @return Returns the cronExpr.
*/
public String getCronExpr() {
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
index edcaed8..a18e358 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoTemplate.hbm.xml
@@ -19,6 +19,7 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
column="bunch_id"/>
<many-to-one
name="task"
+ lazy="false"
class="com.redhat.rhn.taskomatic.TaskoTask"
column="task_id"/>
<property name="ordering" type="long"
column="ordering"/>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 73d01e0..bf62cf3 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -16,7 +16,6 @@ package com.redhat.rhn.taskomatic;
import com.redhat.rhn.taskomatic.core.SchedulerKernel;
-import org.hibernate.HibernateException;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
@@ -30,11 +29,6 @@ import java.util.Map;
public class TaskoXmlRpcHandler {
- private Boolean checkUniqueName(String name, String group) throws SchedulerException
{
- return ((SchedulerKernel.getScheduler().getTrigger(name, group) == null)
&&
- (SchedulerKernel.getScheduler().getJobDetail(name, group) == null));
- }
-
public int one(Integer orgId) {
return 1;
}
@@ -51,26 +45,14 @@ public class TaskoXmlRpcHandler {
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
Date startTime, Date endTime, String cronExpression, Map params)
throws NoSuchBunchTaskException, InvalidParamException {
- try {
- TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
- // create schedule
- TaskoSchedule schedule = null;
- try {
- schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
- startTime, endTime, cronExpression);
- TaskoFactory.save(schedule);
- TaskoFactory.commitTransaction();
- }
- catch (HibernateException he) {
- TaskoFactory.rollbackTransaction();
- return null;
- }
- // create job
- return createJob(schedule);
- }
- catch (SchedulerException e) {
- return null;
- }
+ TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
+ // create schedule
+ TaskoSchedule schedule = null;
+ schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
+ startTime, endTime, cronExpression);
+ TaskoFactory.save(schedule);
+ // create job
+ return createJob(schedule);
}
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
@@ -82,29 +64,15 @@ public class TaskoXmlRpcHandler {
private TaskoBunch doBasicCheck(Integer orgId, String bunchName,
String jobLabel)
- throws NoSuchBunchTaskException, SchedulerException,
- InvalidParamException {
+ throws NoSuchBunchTaskException, InvalidParamException {
TaskoBunch bunch = checkBunchName(bunchName);
- if (!checkUniqueName(jobLabel, orgId.toString())) {
+ if (TaskoFactory.lookupActiveScheduleByOrgAndLabel(orgId, jobLabel) != null) {
throw new InvalidParamException("jobLabel already in use");
}
return bunch;
}
public Integer unscheduleBunch(Integer orgId, String jobLabel) throws
InvalidParamException {
- /*
- try {
- Trigger trigger = SchedulerKernel.getScheduler().getTrigger(
- jobLabel, orgId.toString());
- Trigger newTrigger = (Trigger) trigger.clone();
- newTrigger.setEndTime(new Date());
- SchedulerKernel.getScheduler().rescheduleJob(jobLabel, orgId.toString(),
- newTrigger);
- }
- catch (SchedulerException e) {
- throw new NoSuchTaskoTriggerException();
- }
- */
TaskoSchedule schedule =
TaskoFactory.lookupActiveScheduleByOrgAndLabel(orgId, jobLabel);
Trigger trigger;
@@ -121,10 +89,7 @@ public class TaskoXmlRpcHandler {
throw new InvalidParamException("No such jobLabel");
}
if (schedule != null) {
- Transaction trns = TaskoFactory.getSession().beginTransaction();
schedule.unschedule();
- TaskoFactory.save(schedule);
- trns.commit();
}
if (trigger != null) {
return destroyJob(orgId, jobLabel);
@@ -136,26 +101,14 @@ public class TaskoXmlRpcHandler {
Map params, Date start)
throws NoSuchBunchTaskException,
InvalidParamException {
- try {
- TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
- // create schedule
- TaskoSchedule schedule = null;
- try {
- schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
- start, null, "");
- TaskoFactory.save(schedule);
- TaskoFactory.commitTransaction();
- }
- catch (HibernateException he) {
- TaskoFactory.rollbackTransaction();
- return null;
- }
- // create job
- return createJob(schedule);
- }
- catch (SchedulerException e) {
- return null;
- }
+ TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
+ // create schedule
+ TaskoSchedule schedule = null;
+ schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
+ start, null, "");
+ TaskoFactory.save(schedule);
+ // create job
+ return createJob(schedule);
}
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
@@ -234,9 +187,8 @@ public class TaskoXmlRpcHandler {
return TaskoFactory.listSchedulesByOrg(orgId);
}
- public List<TaskoRun> listScheduleRuns(Integer orgId, Long scheduleId) throws
InvalidParamException {
- TaskoSchedule schedule = TaskoFactory.getScheduleByOrgAndId(orgId, scheduleId);
- return schedule.getRuns();
+ public List<TaskoRun> listScheduleRuns(Integer orgId, Integer scheduleId) {
+ return TaskoFactory.getRunsByOrgAndSchedule(orgId, scheduleId);
}
public String getRunStdOutputLog(Integer orgId, Long runId, Long nBytes)
diff --git a/java/code/src/com/redhat/rhn/taskomatic/core/RhnJobFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/core/RhnJobFactory.java
index 4886aae..a95d992 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/core/RhnJobFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/core/RhnJobFactory.java
@@ -14,7 +14,6 @@
*/
package com.redhat.rhn.taskomatic.core;
-import com.redhat.rhn.common.hibernate.HibernateRuntimeException;
import com.redhat.rhn.taskomatic.TaskoFactory;
import com.redhat.rhn.taskomatic.TaskoSchedule;
@@ -38,10 +37,8 @@ public class RhnJobFactory implements JobFactory {
TaskoSchedule schedule = null;
Long scheduleId =
trigger.getJobDetail().getJobDataMap().getLong("schedule_id");
- try {
- schedule = TaskoFactory.lookupScheduleById(scheduleId);
- }
- catch (HibernateRuntimeException re) {
+ schedule = TaskoFactory.lookupScheduleById(scheduleId);
+ if (schedule == null) {
throw new SchedulerException("No such schedule with id " +
scheduleId);
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java
b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java
index 0e9d0cc..139a360 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java
@@ -49,7 +49,7 @@ public class TaskoRunSerializer implements XmlRpcCustomSerializer {
SerializerHelper helper = new SerializerHelper(builtInSerializer);
helper.add("id", run.getId());
- helper.add("job_label", run.getJobLabel());
+ helper.add("schedule_id", run.getScheduleId());
helper.add("task", run.getTemplate().getTask().getName());
helper.add("start_time", run.getStartTime());
helper.add("end_time", run.getEndTime());
diff --git a/schema/spacewalk/common/tables/rhnTaskoRun.sql
b/schema/spacewalk/common/tables/rhnTaskoRun.sql
index d068775..32f5b9a 100644
--- a/schema/spacewalk/common/tables/rhnTaskoRun.sql
+++ b/schema/spacewalk/common/tables/rhnTaskoRun.sql
@@ -21,7 +21,9 @@ CREATE TABLE rhnTaskoRun
template_id NUMBER NOT NULL
CONSTRAINT rhn_tasko_run_template_fk
REFERENCES rhnTaskoTemplate (id),
- job_label VARCHAR(50),
+ schedule_id NUMBER NOT NULL
+ CONSTRAINT rhn_tasko_run_schedule_fk
+ REFERENCES rhnTaskoSchedule (id),
org_id NUMBER,
start_time DATE,
end_time DATE,
diff --git a/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
b/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
index 1152dcf..09ae6de 100644
--- a/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
+++ b/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
@@ -23,7 +23,6 @@ CREATE TABLE rhnTaskoSchedule
CONSTRAINT rhn_tasko_schedule_bunch_fk
REFERENCES rhnTaskoBunch (id),
org_id NUMBER,
- active VARCHAR2(1),
active_from DATE,
active_till DATE,
cron_expr VARCHAR2(20),
commit 3b340cb98f653238901bed2fd94931a795331941
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Tue Jun 22 18:10:48 2010 +0200
store xmlrpcclient as a private attribute of TaskomaticHandler
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
index 88be05f..92afe06 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticHandler.java
@@ -37,8 +37,18 @@ import redstone.xmlrpc.XmlRpcFault;
public class TaskomaticHandler extends BaseHandler {
private String TASKOMATIC_NAMESPACE = "tasko";
+ private XmlRpcClient client;
private static Logger log = Logger.getLogger(TaskomaticHandler.class);
+ public TaskomaticHandler() {
+ try {
+ client = new XmlRpcClient(ConfigDefaults.get().getTaskoServerUrl(), false);
+ }
+ catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
public Object invoke(String methodCalled, List arguments) throws XmlRpcFault {
List params = new ArrayList(arguments);
String sessionKey = (String) params.remove(0);
@@ -47,23 +57,14 @@ public class TaskomaticHandler extends BaseHandler {
params.add(0, loggedInUser.getOrg().getId());
- XmlRpcClient client;
log.info("Translating " + methodCalled);
try {
- client = new XmlRpcClient(ConfigDefaults.get().getTaskoServerUrl(), false);
- }
- catch (MalformedURLException e) {
- e.printStackTrace();
- throw new XmlRpcFault(0, "Malformed URL");
- }
-
- try {
Object obj = client.invoke(TASKOMATIC_NAMESPACE + "." +
methodCalled, params);
return obj;
}
catch (XmlRpcException e) {
- throw new XmlRpcFault(1, "Taskomatic not accessible");
+ throw new XmlRpcFault(1, e.getMessage());
}
}
}
commit 6b8a84e8cd5284991b78453f1d186d90c6f14e25
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri Jun 18 11:15:45 2010 +0200
add more apis
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 3bab5af..73d01e0 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -25,6 +25,7 @@ import org.quartz.Trigger;
import java.text.ParseException;
import java.util.Date;
+import java.util.List;
import java.util.Map;
public class TaskoXmlRpcHandler {
@@ -224,8 +225,29 @@ public class TaskoXmlRpcHandler {
orgId.toString()) ? 1 : 0;
}
- public int clearRunHistory(Integer orgId, Date limitTime) {
+ public int clearRunHistory(Integer orgId, Date limitTime) throws
InvalidParamException {
TaskoFactory.clearRunHistory(orgId, limitTime);
return 1;
}
+
+ public List<TaskoSchedule> listSchedules(Integer orgId) {
+ return TaskoFactory.listSchedulesByOrg(orgId);
+ }
+
+ public List<TaskoRun> listScheduleRuns(Integer orgId, Long scheduleId) throws
InvalidParamException {
+ TaskoSchedule schedule = TaskoFactory.getScheduleByOrgAndId(orgId, scheduleId);
+ return schedule.getRuns();
+ }
+
+ public String getRunStdOutputLog(Integer orgId, Long runId, Long nBytes)
+ throws InvalidParamException {
+ TaskoRun run = TaskoFactory.getRunByOrgAndId(orgId, runId);
+ return run.getTailOfStdOutput(nBytes);
+ }
+
+ public String getRunStdErrorLog(Integer orgId, Long runId, Long nBytes)
+ throws InvalidParamException {
+ TaskoRun run = TaskoFactory.getRunByOrgAndId(orgId, runId);
+ return run.getTailOfStdError(nBytes);
+ }
}
commit 8c1042caf9aee999e9939f8cd52b524e176d1998
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri Jun 18 11:14:42 2010 +0200
change unscheduleBunch
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 809223b..3bab5af 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -90,7 +90,7 @@ public class TaskoXmlRpcHandler {
return bunch;
}
- public Integer unscheduleBunch(Integer orgId, String jobLabel) {
+ public Integer unscheduleBunch(Integer orgId, String jobLabel) throws
InvalidParamException {
/*
try {
Trigger trigger = SchedulerKernel.getScheduler().getTrigger(
@@ -106,9 +106,29 @@ public class TaskoXmlRpcHandler {
*/
TaskoSchedule schedule =
TaskoFactory.lookupActiveScheduleByOrgAndLabel(orgId, jobLabel);
- schedule.unschedule();
- TaskoFactory.commitTransaction();
- return destroyJob(schedule);
+ Trigger trigger;
+ try {
+ trigger = SchedulerKernel.getScheduler().getTrigger(jobLabel,
orgId.toString());
+ }
+ catch (SchedulerException e) {
+ trigger = null;
+ }
+ // check for inconsistencies
+ // quartz unschedules job after trigger end time
+ // so better handle quartz and schedules separately
+ if ((schedule == null) && (trigger == null)) {
+ throw new InvalidParamException("No such jobLabel");
+ }
+ if (schedule != null) {
+ Transaction trns = TaskoFactory.getSession().beginTransaction();
+ schedule.unschedule();
+ TaskoFactory.save(schedule);
+ trns.commit();
+ }
+ if (trigger != null) {
+ return destroyJob(orgId, jobLabel);
+ }
+ return 1;
}
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
@@ -179,10 +199,9 @@ public class TaskoXmlRpcHandler {
}
}
- private Integer destroyJob(TaskoSchedule schedule) {
+ private Integer destroyJob(Integer orgId, String jobLabel) {
try {
- SchedulerKernel.getScheduler().unscheduleJob(schedule.getJobLabel(),
- schedule.getOrgId().toString());
+ SchedulerKernel.getScheduler().unscheduleJob(jobLabel, orgId.toString());
return 1;
}
catch (SchedulerException e) {
commit 1c811e5b777ccef3bb67a03fa831d201f7fc660d
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri Jun 18 11:09:26 2010 +0200
sett activeTill for single runs
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
index c88d0bf..ec63175 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
@@ -75,6 +75,10 @@ public class TaskoSchedule implements Job {
else {
setActiveFrom(activeFromIn);
}
+ if (cronExprIn.isEmpty()) {
+ // set activeFrom for single runs
+ setActiveTill(getActiveFrom());
+ }
if (activeTillIn != null) {
setActiveTill(activeTillIn);
}
commit c8a351d9d03ee6f1f335842113bf8137f2d59ebb
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri Jun 18 10:49:40 2010 +0200
update queries
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index 86e0aec..f65f88c 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -16,11 +16,9 @@ package com.redhat.rhn.taskomatic;
import com.redhat.rhn.common.hibernate.HibernateFactory;
-import com.redhat.rhn.taskomatic.core.SchedulerKernel;
import org.apache.log4j.Logger;
-import org.quartz.SchedulerException;
-import org.quartz.Trigger;
+import org.hibernate.Transaction;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
@@ -75,6 +73,10 @@ public class TaskoFactory extends HibernateFactory {
singleton.removeObject(taskoRun);
}
+ private static void delete(TaskoSchedule taskoSchedule) {
+ singleton.removeObject(taskoSchedule);
+ }
+
public static void save(TaskoTemplate taskoTemplate) {
singleton.saveObject(taskoTemplate);
}
@@ -105,34 +107,29 @@ public class TaskoFactory extends HibernateFactory {
"TaskoRun.listRunsOlderThan", params);
}
- public static void clearRunHistory(Integer orgId, Date limitTime) {
- try {
- String[] triggerNames = SchedulerKernel.getScheduler().
- getTriggerNames(orgId.toString());
- // triggerName == jobLabel
- for (String jobLabel : triggerNames) {
- // delete history of runs
- List<TaskoRun> runList =
- TaskoFactory.listRunsOlderThan(orgId, limitTime);
- for (TaskoRun run : runList) {
- TaskoFactory.deleteLogFiles(run);
- TaskoFactory.delete(run);
- }
-
- // unschedule outdated jobs
- Trigger trigger = SchedulerKernel.getScheduler().getTrigger(
- jobLabel, orgId.toString());
- Date endTime = trigger.getEndTime();
- if ((endTime != null) && (endTime.before(limitTime))) {
- SchedulerKernel.getScheduler().unscheduleJob(trigger.getName(),
- orgId.toString());
- }
- }
- TaskoFactory.commitTransaction();
+ public static void clearRunHistory(Integer orgId, Date limitTime) throws
InvalidParamException {
+ if (limitTime == null) {
+ throw new InvalidParamException("Invalid limit date");
+ }
+ List<TaskoRun> runList = listRunsOlderThan(orgId, limitTime);
+ Transaction trns = TaskoFactory.getSession().beginTransaction();
+ for (TaskoRun run : runList) {
+ // delete history of runs
+ TaskoFactory.deleteLogFiles(run);
+ TaskoFactory.delete(run);
}
- catch (SchedulerException e) {
- TaskoFactory.rollbackTransaction();
+ trns.commit();
+
+ // delete outdated schedules
+ List<TaskoSchedule> scheduleList = listSchedulesByOrg(orgId);
+ trns = TaskoFactory.getSession().beginTransaction();
+ for (TaskoSchedule schedule : scheduleList) {
+ Date endTime = schedule.getActiveTill();
+ if ((endTime != null) && (endTime.before(limitTime))) {
+ TaskoFactory.delete(schedule);
+ }
}
+ trns.commit();
}
public static void deleteLogFiles(TaskoRun run) {
@@ -162,7 +159,7 @@ public class TaskoFactory extends HibernateFactory {
params.put("org_id", orgId);
params.put("job_label", jobLabel);
return (TaskoSchedule) singleton.lookupObjectByNamedQuery(
- "TaskoSchedule.findActiveScheduleByOrgAndLabel", params);
+ "TaskoSchedule.findActiveByOrgAndLabel", params);
}
public static TaskoSchedule lookupScheduleById(Long scheduleId) {
@@ -172,23 +169,37 @@ public class TaskoFactory extends HibernateFactory {
"TaskoSchedule.lookupById", params);
}
- public static TaskoSchedule listSchedulesByOrgAndBunch(Integer orgId,
+ public static List<TaskoSchedule> listSchedulesByOrg(Integer orgId) {
+ Map params = new HashMap();
+ params.put("org_id", orgId);
+ return singleton.listObjectsByNamedQuery(
+ "TaskoSchedule.listByOrg", params);
+ }
+
+ public static List<TaskoSchedule> listSchedulesByOrgAndBunch(Integer orgId,
TaskoBunch bunch) {
Map params = new HashMap();
params.put("org_id", orgId);
params.put("bunch_id", bunch.getId());
- return (TaskoSchedule) singleton.listObjectsByNamedQuery(
+ return singleton.listObjectsByNamedQuery(
"TaskoSchedule.listByOrgAndBunch",
params);
}
- public static TaskoSchedule listSchedulesByOrgAndLabel(Integer orgId, String
jobLabel) {
+ public static List<TaskoSchedule> listSchedulesByOrgAndLabel(Integer orgId,
String jobLabel) {
Map params = new HashMap();
params.put("org_id", orgId);
params.put("job_label", jobLabel);
- return (TaskoSchedule) singleton.listObjectsByNamedQuery(
+ return singleton.listObjectsByNamedQuery(
"TaskoSchedule.listByOrgAndLabel",
params);
}
+ public static TaskoRun lookupRunById(Long runId) {
+ Map params = new HashMap();
+ params.put("run_id", runId);
+ return (TaskoRun) singleton.lookupObjectByNamedQuery(
+ "TaskoRun.lookupById", params);
+ }
+
public static Boolean isTaskParalelizable(TaskoTask task) {
Class taskClass;
try {
@@ -216,4 +227,21 @@ public class TaskoFactory extends HibernateFactory {
return false;
}
}
+
+ public static TaskoRun getRunByOrgAndId(Integer orgId, Long runId) throws
InvalidParamException {
+ TaskoRun run = lookupRunById(runId);
+ if ((run == null) || (!run.getOrgId().equals(orgId))) {
+ throw new InvalidParamException("No such run id");
+ }
+ return run;
+ }
+
+ public static TaskoSchedule getScheduleByOrgAndId(Integer orgId,
+ Long scheduleId) throws InvalidParamException {
+ TaskoSchedule schedule = lookupScheduleById(scheduleId);
+ if ((schedule == null) || (!schedule.getOrgId().equals(orgId))) {
+ throw new InvalidParamException("No such schedule id");
+ }
+ return schedule;
+ }
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
index bb316e3..9b78d50 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
@@ -19,8 +19,8 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
class="com.redhat.rhn.taskomatic.TaskoTemplate"
column="template_id"/>
<property name="jobLabel" type="string"
column="job_label"/>
- <property name="startTime" type="date"
column="start_time"/>
- <property name="endTime" type="date"
column="end_time"/>
+ <property name="startTime" type="timestamp"
column="start_time"/>
+ <property name="endTime" type="timestamp"
column="end_time"/>
<property name="stdOutputPath" type="string"
column="std_output_path"/>
<property name="stdErrorPath" type="string"
column="std_error_path"/>
<property name="status" type="string"
column="status"/>
@@ -32,6 +32,10 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
</class>
+ <query name="TaskoRun.lookupById">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun WHERE id = :id]]>
+ </query>
+
<query name="TaskoRun.listRunsWithStatus">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun AS r WHERE
r.template.task.id = :task_id AND (r.status = :status1 OR status = :status2)]]>
</query>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
index 36b650e..d59b8e6 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
@@ -21,8 +21,10 @@ import org.quartz.JobExecutionException;
import java.io.BufferedWriter;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.RandomAccessFile;
import java.util.Date;
@@ -149,6 +151,31 @@ public class TaskoRun implements Job {
TaskoFactory.save(this);
}
+ public String getTailOfStdOutput(Long nBytes) {
+ return getTailOfFile(getStdOutputPath(), nBytes);
+ }
+
+ public String getTailOfStdError(Long nBytes) {
+ return getTailOfFile(getStdErrorPath(), nBytes);
+ }
+
+ private String getTailOfFile(String fileName, Long nBytes) {
+ RandomAccessFile file;
+ try {
+ file = new RandomAccessFile(fileName, "r");
+ file.seek(file.length() - nBytes);
+ String tail = file.readLine();
+ file.close();
+ return tail;
+ }
+ catch (FileNotFoundException e) {
+ return "";
+ }
+ catch (IOException e) {
+ return "";
+ }
+ }
+
public static String getStdOutputLog(Integer orgId, TaskoTemplate templ, TaskoRun
run) {
return getStdLogDirName(orgId) + getStdLogFileName(templ, run) +
"_out";
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
index 7bf5111..5547e53 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
@@ -20,8 +20,8 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
column="bunch_id"/>
<property name="orgId" type="integer"
column="org_id"/>
<property name="active" type="string"
column="active"/>
- <property name="activeFrom" type="date"
column="active_from"/>
- <property name="activeTill" type="date"
column="active_till"/>
+ <property name="activeFrom" type="timestamp"
column="active_from"/>
+ <property name="activeTill" type="timestamp"
column="active_till"/>
<property name="cronExpr" type="string"
column="cron_expr"/>
<property name="data" type="blob"
column="data"/>
@@ -36,16 +36,20 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE id =
:schedule_id]]>
</query>
+ <query name="TaskoSchedule.listByOrg">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id]]>
+ </query>
+
<query name="TaskoSchedule.listByOrgAndLabel">
- <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE org_id =
:org_id AND jobLabel = :job_label]]>
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND jobLabel = :job_label]]>
</query>
<query name="TaskoSchedule.listByOrgAndBunch">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND bunch.id = :bunch_id]]>
</query>
- <query name="TaskoSchedule.findActiveScheduleByOrgAndLabel">
- <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND active is not null AND jobLabel = :job_label]]>
+ <query name="TaskoSchedule.findActiveByOrgAndLabel">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND jobLabel = :job_label AND (activeFrom < sysdate AND (activeTill is null OR
sysdate < activeTill))]]>
</query>
</hibernate-mapping>
commit 8d015f46abd172aa7315ff39a4eff1c787a3cc48
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri Jun 18 10:41:49 2010 +0200
add tasko serializers
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java
new file mode 100644
index 0000000..cb815e6
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSerializerRegistry.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2010 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.taskomatic;
+
+import com.redhat.rhn.taskomatic.serializer.TaskoRunSerializer;
+import com.redhat.rhn.taskomatic.serializer.TaskoScheduleSerializer;
+
+import java.util.LinkedList;
+import java.util.List;
+
+
+/**
+ * TaskoSerializerFactory
+ * @version $Rev$
+ */
+// Note: Cannot extend SerializerRegistry, had to define a new class
+// it's not possible to override static methods / attributes
+public class TaskoSerializerRegistry {
+
+ private static final List<Class> TASKO_SERIALIZER_CLASSES;
+ static {
+ TASKO_SERIALIZER_CLASSES = new LinkedList<Class>();
+ TASKO_SERIALIZER_CLASSES.add(TaskoScheduleSerializer.class);
+ TASKO_SERIALIZER_CLASSES.add(TaskoRunSerializer.class);
+ }
+
+ private TaskoSerializerRegistry() {
+ // hide contructor
+ }
+
+ /**
+ * Returns the list of all available custom XMLRPC serializers.
+ * @return List of serializer classes.
+ */
+ public static List<Class> getSerializationClasses() {
+ return TASKO_SERIALIZER_CLASSES;
+ }
+}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
index 062be3e..d7b0413 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcServer.java
@@ -15,7 +15,6 @@
package com.redhat.rhn.taskomatic;
import com.redhat.rhn.common.conf.Config;
-
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
@@ -23,6 +22,7 @@ import java.net.ServerSocket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
+import redstone.xmlrpc.XmlRpcCustomSerializer;
import redstone.xmlrpc.XmlRpcServer;
import simple.http.connect.Connection;
import simple.http.connect.ConnectionFactory;
@@ -62,6 +62,7 @@ public class TaskoXmlRpcServer {
public void start() {
xmlrpcServer = new XmlRpcServer();
xmlrpcServer.addInvocationHandler("tasko", new TaskoXmlRpcHandler());
+ addTaskoSerializers();
TaskoXmlRpcInvoker invoker = new TaskoXmlRpcInvoker(xmlrpcServer);
Connection connection = ConnectionFactory.getConnection(invoker);
@@ -95,4 +96,18 @@ public class TaskoXmlRpcServer {
throw new RuntimeException(e);
}
}
+
+ private void addTaskoSerializers() {
+ for (Class clazz : TaskoSerializerRegistry.getSerializationClasses()) {
+ try {
+
xmlrpcServer.getSerializer().addCustomSerializer((XmlRpcCustomSerializer)clazz.newInstance());
+ }
+ catch (InstantiationException e) {
+ e.printStackTrace(System.out);
+ }
+ catch (IllegalAccessException e) {
+ e.printStackTrace(System.out);
+ }
+ }
+ }
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java
b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java
new file mode 100644
index 0000000..0e9d0cc
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoRunSerializer.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2010 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.taskomatic.serializer;
+
+import com.redhat.rhn.frontend.xmlrpc.serializer.util.SerializerHelper;
+import com.redhat.rhn.taskomatic.TaskoRun;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import redstone.xmlrpc.XmlRpcCustomSerializer;
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcSerializer;
+
+
+/**
+ * TaskoRunSerializer
+ * @version $Rev$
+ */
+public class TaskoRunSerializer implements XmlRpcCustomSerializer {
+
+ /**
+ * {@inheritDoc}
+ */
+ public Class getSupportedClass() {
+ return TaskoRun.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void serialize(Object value, Writer output,
+ XmlRpcSerializer builtInSerializer)
+ throws XmlRpcException, IOException {
+
+ TaskoRun run = (TaskoRun) value;
+ SerializerHelper helper = new SerializerHelper(builtInSerializer);
+
+ helper.add("id", run.getId());
+ helper.add("job_label", run.getJobLabel());
+ helper.add("task", run.getTemplate().getTask().getName());
+ helper.add("start_time", run.getStartTime());
+ helper.add("end_time", run.getEndTime());
+ helper.add("status", run.getStatus());
+
+ helper.writeTo(output);
+ }
+}
diff --git
a/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java
b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java
new file mode 100644
index 0000000..e7885be
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/serializer/TaskoScheduleSerializer.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2008 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.taskomatic.serializer;
+
+import com.redhat.rhn.frontend.xmlrpc.serializer.util.SerializerHelper;
+import com.redhat.rhn.taskomatic.TaskoSchedule;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import redstone.xmlrpc.XmlRpcCustomSerializer;
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcSerializer;
+
+
+/**
+ * TaskoScheduleSerializer
+ * @version $Rev$
+ */
+public class TaskoScheduleSerializer implements XmlRpcCustomSerializer {
+
+ /**
+ * {@inheritDoc}
+ */
+ public Class getSupportedClass() {
+ return TaskoSchedule.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void serialize(Object value, Writer output,
+ XmlRpcSerializer builtInSerializer)
+ throws XmlRpcException, IOException {
+
+ TaskoSchedule schedule = (TaskoSchedule) value;
+ SerializerHelper helper = new SerializerHelper(builtInSerializer);
+
+ helper.add("id", schedule.getId());
+ helper.add("job_label", schedule.getJobLabel());
+ helper.add("bunch", schedule.getBunch().getName());
+ helper.add("active_from", schedule.getActiveFrom());
+ helper.add("active_till", schedule.getActiveTill());
+ helper.add("cron_expr", schedule.getCronExpr());
+ helper.add("data_map", schedule.getDataMap());
+
+ helper.writeTo(output);
+ }
+}
commit 380b6df94a4f019d0db2305b6e63a09aec80b9c5
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 17 10:38:02 2010 +0200
replace InvalidJobLabelException by InvalidParamException
diff --git a/java/code/src/com/redhat/rhn/taskomatic/InvalidJobLabelException.java
b/java/code/src/com/redhat/rhn/taskomatic/InvalidJobLabelException.java
deleted file mode 100644
index b6dd32e..0000000
--- a/java/code/src/com/redhat/rhn/taskomatic/InvalidJobLabelException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Copyright (c) 2010 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.taskomatic;
-
-
-public class InvalidJobLabelException extends Exception {
-
- public InvalidJobLabelException(String message) {
- super(message);
- }
-
- /**
- * Comment for <code>serialVersionUID</code>
- */
- private static final long serialVersionUID = -7535142850830686483L;
-
-}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index e9d7ba0..809223b 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -49,8 +49,7 @@ public class TaskoXmlRpcHandler {
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
Date startTime, Date endTime, String cronExpression, Map params)
- throws InvalidJobLabelException, NoSuchBunchTaskException,
- InvalidParamException {
+ throws NoSuchBunchTaskException, InvalidParamException {
try {
TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
// create schedule
@@ -75,8 +74,7 @@ public class TaskoXmlRpcHandler {
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
String cronExpression, Map params)
- throws InvalidJobLabelException, NoSuchBunchTaskException,
- InvalidParamException {
+ throws NoSuchBunchTaskException, InvalidParamException {
return scheduleBunch(orgId, bunchName, jobLabel, new Date(), null,
cronExpression, params);
}
@@ -84,10 +82,10 @@ public class TaskoXmlRpcHandler {
private TaskoBunch doBasicCheck(Integer orgId, String bunchName,
String jobLabel)
throws NoSuchBunchTaskException, SchedulerException,
- InvalidJobLabelException {
+ InvalidParamException {
TaskoBunch bunch = checkBunchName(bunchName);
if (!checkUniqueName(jobLabel, orgId.toString())) {
- throw new InvalidJobLabelException("jobLabel already in use");
+ throw new InvalidParamException("jobLabel already in use");
}
return bunch;
}
@@ -115,7 +113,7 @@ public class TaskoXmlRpcHandler {
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
Map params, Date start)
- throws InvalidJobLabelException, NoSuchBunchTaskException,
+ throws NoSuchBunchTaskException,
InvalidParamException {
try {
TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
@@ -141,8 +139,7 @@ public class TaskoXmlRpcHandler {
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
Map params)
- throws InvalidJobLabelException, NoSuchBunchTaskException,
- InvalidParamException {
+ throws NoSuchBunchTaskException, InvalidParamException {
return scheduleSingleBunchRun(orgId, bunchName, jobLabel, params, new Date());
}
commit c687677523d8724b947ee9f626f6cd33f5b5d5d8
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jun 17 10:34:43 2010 +0200
store also cron expression to DB
diff --git a/java/code/src/com/redhat/rhn/taskomatic/InvalidParamException.java
b/java/code/src/com/redhat/rhn/taskomatic/InvalidParamException.java
new file mode 100644
index 0000000..8e34c6d
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/InvalidParamException.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2010 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.taskomatic;
+
+
+public class InvalidParamException extends Exception {
+
+ /**
+ * Comment for <code>serialVersionUID</code>
+ */
+ private static final long serialVersionUID = -3100819288563720249L;
+
+ public InvalidParamException(String message) {
+ super(message);
+ }
+}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index 1758287..86e0aec 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -172,7 +172,8 @@ public class TaskoFactory extends HibernateFactory {
"TaskoSchedule.lookupById", params);
}
- public static TaskoSchedule listSchedulesByOrgAndBunch(Integer orgId, TaskoBunch
bunch) {
+ public static TaskoSchedule listSchedulesByOrgAndBunch(Integer orgId,
+ TaskoBunch bunch) {
Map params = new HashMap();
params.put("org_id", orgId);
params.put("bunch_id", bunch.getId());
@@ -192,7 +193,8 @@ public class TaskoFactory extends HibernateFactory {
Class taskClass;
try {
taskClass = Class.forName(task.getTaskClass());
- Method isParallelizableMethod =
taskClass.getMethod("isParallelizable", null);
+ Method isParallelizableMethod =
taskClass.getMethod("isParallelizable",
+ (Class[]) null);
return (Boolean) isParallelizableMethod.invoke(null, null);
}
catch (ClassNotFoundException e) {
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
index 7ff114f..7bf5111 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
@@ -22,6 +22,7 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<property name="active" type="string"
column="active"/>
<property name="activeFrom" type="date"
column="active_from"/>
<property name="activeTill" type="date"
column="active_till"/>
+ <property name="cronExpr" type="string"
column="cron_expr"/>
<property name="data" type="blob"
column="data"/>
<property name="created" column="created"
type="timestamp"
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
index 4b82d34..c88d0bf 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
@@ -19,7 +19,6 @@ import org.hibernate.Hibernate;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
-import org.quartz.Trigger;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -47,28 +46,37 @@ public class TaskoSchedule implements Job {
private String active;
private Date activeFrom;
private Date activeTill;
+ private String cronExpr;
private byte[] data;
private List<TaskoRun> runs = new ArrayList<TaskoRun>();
private Date created;
private Date modified;
+ static {
+ for (TaskoTask task : TaskoFactory.listTasks()) {
+ tasks.put(task.getName(), 0);
+ }
+ }
+
public TaskoSchedule() {
}
- public TaskoSchedule(Integer orgIdIn, TaskoBunch bunchIn,
- String jobLabelIn, Map dataIn, Trigger trigger) {
+ public TaskoSchedule(Integer orgIdIn, TaskoBunch bunchIn, String jobLabelIn,
+ Map dataIn, Date activeFromIn, Date activeTillIn, String cronExprIn) {
setOrgId(orgIdIn);
setBunch(bunchIn);
setJobLabel(jobLabelIn);
data = serializeMap(dataIn);
setActive(TASKO_SCHEDULE_ACTIVE);
- setActiveFrom(trigger.getStartTime());
- setActiveTill(trigger.getEndTime());
- }
-
- static {
- for (TaskoTask task : TaskoFactory.listTasks()) {
- tasks.put(task.getName(), 0);
+ setCronExpr(cronExprIn);
+ if (activeFromIn == null) {
+ setActiveFrom(new Date());
+ }
+ else {
+ setActiveFrom(activeFromIn);
+ }
+ if (activeTillIn != null) {
+ setActiveTill(activeTillIn);
}
}
@@ -362,4 +370,18 @@ public class TaskoSchedule implements Job {
public void setActive(String activeIn) {
active = activeIn;
}
+
+ /**
+ * @return Returns the cronExpr.
+ */
+ public String getCronExpr() {
+ return cronExpr;
+ }
+
+ /**
+ * @param cronExprIn The cronExpr to set.
+ */
+ public void setCronExpr(String cronExprIn) {
+ cronExpr = cronExprIn;
+ }
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 34a641f..e9d7ba0 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -49,25 +49,15 @@ public class TaskoXmlRpcHandler {
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
Date startTime, Date endTime, String cronExpression, Map params)
- throws InvalidJobLabelException, NoSuchBunchTaskException, ParseException {
+ throws InvalidJobLabelException, NoSuchBunchTaskException,
+ InvalidParamException {
try {
TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
- // create trigger
- CronTrigger ct = new CronTrigger(jobLabel, orgId.toString(),
- cronExpression);
- if (startTime == null) {
- ct.setStartTime(startTime);
- }
- else {
- ct.setStartTime(new Date());
- }
- if (endTime != null) {
- ct.setEndTime(endTime);
- }
// create schedule
TaskoSchedule schedule = null;
try {
- schedule = new TaskoSchedule(orgId, bunch, jobLabel, params, ct);
+ schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
+ startTime, endTime, cronExpression);
TaskoFactory.save(schedule);
TaskoFactory.commitTransaction();
}
@@ -76,7 +66,7 @@ public class TaskoXmlRpcHandler {
return null;
}
// create job
- return createJob(schedule, ct);
+ return createJob(schedule);
}
catch (SchedulerException e) {
return null;
@@ -85,9 +75,10 @@ public class TaskoXmlRpcHandler {
public Date scheduleBunch(Integer orgId, String bunchName, String jobLabel,
String cronExpression, Map params)
- throws ParseException, InvalidJobLabelException, NoSuchBunchTaskException {
- return scheduleBunch(orgId, bunchName, jobLabel, new Date(), null,
cronExpression,
- params);
+ throws InvalidJobLabelException, NoSuchBunchTaskException,
+ InvalidParamException {
+ return scheduleBunch(orgId, bunchName, jobLabel, new Date(), null,
+ cronExpression, params);
}
private TaskoBunch doBasicCheck(Integer orgId, String bunchName,
@@ -124,15 +115,15 @@ public class TaskoXmlRpcHandler {
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
Map params, Date start)
- throws InvalidJobLabelException, NoSuchBunchTaskException {
+ throws InvalidJobLabelException, NoSuchBunchTaskException,
+ InvalidParamException {
try {
TaskoBunch bunch = doBasicCheck(orgId, bunchName, jobLabel);
- SimpleTrigger st = new SimpleTrigger(jobLabel, orgId.toString(), 1, 1);
- st.setEndTime(new Date());
// create schedule
TaskoSchedule schedule = null;
try {
- schedule = new TaskoSchedule(orgId, bunch, jobLabel, params, st);
+ schedule = new TaskoSchedule(orgId, bunch, jobLabel, params,
+ start, null, "");
TaskoFactory.save(schedule);
TaskoFactory.commitTransaction();
}
@@ -141,7 +132,7 @@ public class TaskoXmlRpcHandler {
return null;
}
// create job
- return createJob(schedule, st);
+ return createJob(schedule);
}
catch (SchedulerException e) {
return null;
@@ -150,14 +141,34 @@ public class TaskoXmlRpcHandler {
public Date scheduleSingleBunchRun(Integer orgId, String bunchName, String jobLabel,
Map params)
- throws InvalidJobLabelException, NoSuchBunchTaskException {
+ throws InvalidJobLabelException, NoSuchBunchTaskException,
+ InvalidParamException {
return scheduleSingleBunchRun(orgId, bunchName, jobLabel, params, new Date());
}
- private Date createJob(TaskoSchedule schedule, Trigger trigger) {
+ private Date createJob(TaskoSchedule schedule) throws InvalidParamException {
+ // create trigger
+ Trigger trigger = null;
+ if (schedule.getCronExpr().isEmpty()) {
+ trigger = new SimpleTrigger(schedule.getJobLabel(),
+ schedule.getOrgId().toString(), 1, 1);
+ trigger.setEndTime(new Date());
+ }
+ else {
+ try {
+ trigger = new CronTrigger(schedule.getJobLabel(),
+ schedule.getOrgId().toString(), schedule.getCronExpr());
+ trigger.setStartTime(schedule.getActiveFrom());
+ trigger.setEndTime(schedule.getActiveTill());
+ }
+ catch (ParseException e) {
+ throw new InvalidParamException("Invalid cron expression");
+ }
+
+ }
// create job
- JobDetail jobDetail = new JobDetail(schedule.getJobLabel(),
schedule.getOrgId().toString(),
- TaskoSchedule.class);
+ JobDetail jobDetail = new JobDetail(schedule.getJobLabel(),
+ schedule.getOrgId().toString(), TaskoSchedule.class);
// set job params
jobDetail.getJobDataMap().putAll(schedule.getDataMap());
jobDetail.getJobDataMap().put("schedule_id", schedule.getId());
diff --git a/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
b/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
index fe69ab3..1152dcf 100644
--- a/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
+++ b/schema/spacewalk/common/tables/rhnTaskoSchedule.sql
@@ -26,6 +26,7 @@ CREATE TABLE rhnTaskoSchedule
active VARCHAR2(1),
active_from DATE,
active_till DATE,
+ cron_expr VARCHAR2(20),
data BLOB,
created DATE
DEFAULT (sysdate) NOT NULL,