java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticOrgHandler.java | 35
++
java/code/src/com/redhat/rhn/manager/satellite/SystemCommandExecutor.java | 1
java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java | 140
++++++++++
java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java | 77
-----
java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java | 2
java/code/src/com/redhat/rhn/taskomatic/core/RhnJobFactory.java | 9
java/code/src/com/redhat/rhn/taskomatic/core/SchedulerKernel.java | 12
7 files changed, 186 insertions(+), 90 deletions(-)
New commits:
commit 8e6cdf72d1150408118b8d32d3ad0c81d4446d40
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Sun Jun 27 00:37:14 2010 +0200
add '\n' after every line when converting input stream to string
diff --git a/java/code/src/com/redhat/rhn/manager/satellite/SystemCommandExecutor.java
b/java/code/src/com/redhat/rhn/manager/satellite/SystemCommandExecutor.java
index 83310c3..bdfea75 100644
--- a/java/code/src/com/redhat/rhn/manager/satellite/SystemCommandExecutor.java
+++ b/java/code/src/com/redhat/rhn/manager/satellite/SystemCommandExecutor.java
@@ -116,6 +116,7 @@ public class SystemCommandExecutor implements Executor {
String line;
while ((line = input.readLine()) != null) {
sb.append(line);
+ sb.append('\n');
}
}
catch (IOException e) {
commit 1de8a1c3f32661d267b7b2ef3646886c1f54293c
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Sun Jun 27 00:27:19 2010 +0200
introduce TaskoJob as the main schedule executor class
TaskoSchedule cannot be the main executor class, because it's a hibernate DTO and
hibenrate would block all the other threads touching TaskoSchedule
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
new file mode 100644
index 0000000..3b9ae41
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
@@ -0,0 +1,140 @@
+/**
+ * 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;
+
+import com.redhat.rhn.common.hibernate.HibernateFactory;
+
+import org.apache.log4j.Logger;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TaskoJob implements Job {
+
+ private static Logger log = Logger.getLogger(TaskoJob.class);
+ private static Map<String, Integer> tasks = new HashMap<String,
Integer>();
+ private static Map<String, Object> locks = new HashMap<String,
Object>();
+
+ private Long scheduleId;
+
+ static {
+ for (TaskoTask task : TaskoFactory.listTasks()) {
+ tasks.put(task.getName(), 0);
+ locks.put(task.getName(), new Object());
+ }
+ }
+
+ public TaskoJob(Long scheduleIdIn) {
+ setScheduleId(scheduleIdIn);
+ }
+
+ private boolean isTaskRunning(TaskoTask task) {
+ return tasks.get(task.getName()) > 0;
+ }
+
+ synchronized private static void markTaskRunning(TaskoTask task) {
+ int count = tasks.get(task.getName());
+ count++;
+ tasks.put(task.getName(), count);
+ }
+
+ synchronized private static void unmarkTaskRunning(TaskoTask task) {
+ int count = tasks.get(task.getName());
+ count--;
+ tasks.put(task.getName(), count);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute(JobExecutionContext context)
+ throws JobExecutionException {
+ TaskoRun previousRun = null;
+
+ TaskoSchedule schedule = TaskoFactory.lookupScheduleById(scheduleId);
+ if (schedule == null) {
+ log.error("No such schedule with id " + scheduleId);
+ }
+
+ log.info(schedule.getJobLabel() + ":" + " bunch " +
schedule.getBunch().getName() +
+ " started");
+
+ // wait until the same schedule finishes
+ //synchronized (schedule) {
+ for (TaskoTemplate template : schedule.getBunch().getTemplates()) {
+ if ((previousRun == null) ||
+ (previousRun.getStatus() == template.getStartIf())) {
+ TaskoTask task = template.getTask();
+
+ Object lock = locks.get(task.getName());
+ synchronized (lock) {
+ if (!TaskoFactory.isTaskParalelizable(task)) {
+ while (isTaskRunning(task)) {
+ log.debug(schedule.getJobLabel() + ":" + "
task " + task.getName() +
+ " currenty running ... WAITING");
+ // TaskoFactory.sleep(10000);
+ try {
+ lock.wait();
+ log.debug(schedule.getJobLabel() + ":" +
" task " + task.getName() +
+ " ... AWAKE");
+ }
+ catch (InterruptedException e) {
+ // ok
+ }
+ }
+ }
+ markTaskRunning(task);
+ log.debug(schedule.getJobLabel() + ":" + " task
" + task.getName() +
+ " STARTED");
+ TaskoRun taskRun = new TaskoRun(schedule.getOrgId(), template,
scheduleId);
+ TaskoFactory.save(taskRun);
+ taskRun.execute(context);
+ TaskoFactory.commitTransaction();
+ log.debug(task.getName() +
+ " (" + schedule.getJobLabel() + ") ...
" + taskRun.getStatus());
+ previousRun = taskRun;
+ unmarkTaskRunning(task);
+ lock.notify();
+ }
+ }
+ else {
+ log.info("Interrupting " + schedule.getBunch().getName() +
+ " (" + schedule.getJobLabel() + ")");
+ break;
+ }
+ }
+ HibernateFactory.closeSession();
+ //}
+ log.info(schedule.getJobLabel() + ":" + " bunch " +
schedule.getBunch().getName() +
+ " finished");
+ }
+
+ /**
+ * @param scheduleId The scheduleId to set.
+ */
+ public void setScheduleId(Long scheduleIdIn) {
+ this.scheduleId = scheduleIdIn;
+ }
+
+ /**
+ * @return Returns the scheduleId.
+ */
+ public Long getScheduleId() {
+ return scheduleId;
+ }
+}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
index f48463c..d64eef5 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.java
@@ -14,13 +14,7 @@
*/
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;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -30,14 +24,10 @@ import java.io.ObjectOutputStream;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.Date;
-import java.util.HashMap;
import java.util.Map;
-public class TaskoSchedule implements Job {
-
- private static Logger log = Logger.getLogger(TaskoBunch.class);
- private static Map<String, Integer> tasks = new HashMap<String,
Integer>();
+public class TaskoSchedule {
private Long id;
private String jobLabel;
@@ -50,12 +40,6 @@ public class TaskoSchedule implements Job {
private Date created;
private Date modified;
- static {
- for (TaskoTask task : TaskoFactory.listTasks()) {
- tasks.put(task.getName(), 0);
- }
- }
-
public TaskoSchedule() {
}
@@ -81,65 +65,6 @@ public class TaskoSchedule implements Job {
}
}
- private boolean isTaskRunning(TaskoTask task) {
- return tasks.get(task.getName()) > 0;
- }
-
- private void markTaskRunning(TaskoTask task) {
- synchronized (getClass()) {
- int count = tasks.get(task.getName());
- count++;
- tasks.put(task.getName(), count);
- }
- }
-
- private void unmarkTaskRunning(TaskoTask task) {
- synchronized (getClass()) {
- int count = tasks.get(task.getName());
- count--;
- tasks.put(task.getName(), count);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void execute(JobExecutionContext context)
- throws JobExecutionException {
- TaskoRun previousRun = null;
-
- log.info("Starting " + bunch.getName() + " (" + jobLabel +
") at " + new Date());
-
- for (TaskoTemplate template : bunch.getTemplates()) {
- if ((previousRun == null) ||
- (previousRun.getStatus() == template.getStartIf())) {
-
- if (!TaskoFactory.isTaskParalelizable(template.getTask())) {
- while (isTaskRunning(template.getTask())) {
- log.info("Task " + template.getTask().getName() +
- " currently executing. Sleeping for 10 secs.");
- TaskoFactory.sleep(10000);
- }
- }
- markTaskRunning(template.getTask());
- 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;
- }
- else {
- log.info("Interrupting " + bunch.getName() + " (" +
jobLabel + ")");
- break;
- }
- }
- HibernateFactory.closeSession();
-
- log.info("Finishing " + bunch.getName() + " (" + jobLabel +
") at " + new Date());
- }
-
public void unschedule() {
setActiveTill(new Date());
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 2124216..73d5421 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -193,7 +193,7 @@ public class TaskoXmlRpcHandler {
}
// create job
JobDetail jobDetail = new JobDetail(schedule.getJobLabel(),
- schedule.getOrgId().toString(), TaskoSchedule.class);
+ schedule.getOrgId().toString(), TaskoJob.class);
// set job params
jobDetail.getJobDataMap().putAll(schedule.getDataMap());
jobDetail.getJobDataMap().put("schedule_id", schedule.getId());
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 a95d992..7eefc1d 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,7 @@
*/
package com.redhat.rhn.taskomatic.core;
-import com.redhat.rhn.taskomatic.TaskoFactory;
+import com.redhat.rhn.taskomatic.TaskoJob;
import com.redhat.rhn.taskomatic.TaskoSchedule;
import org.quartz.Job;
@@ -37,11 +37,6 @@ public class RhnJobFactory implements JobFactory {
TaskoSchedule schedule = null;
Long scheduleId =
trigger.getJobDetail().getJobDataMap().getLong("schedule_id");
- schedule = TaskoFactory.lookupScheduleById(scheduleId);
- if (schedule == null) {
- throw new SchedulerException("No such schedule with id " +
scheduleId);
- }
-
- return schedule;
+ return new TaskoJob(scheduleId);
}
}
commit 8017a9e3e5c4a7496e4b869e060d4802cd00d4ef
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Sun Jun 27 00:26:47 2010 +0200
adding org handler
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticOrgHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticOrgHandler.java
new file mode 100644
index 0000000..e7848db
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/taskomatic/TaskomaticOrgHandler.java
@@ -0,0 +1,35 @@
+/**
+ * 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.frontend.xmlrpc.taskomatic;
+
+import com.redhat.rhn.domain.role.RoleFactory;
+import com.redhat.rhn.domain.user.User;
+
+import java.util.List;
+
+
+/**
+ * TaskomaticOrgHandler
+ * @version $Rev$
+ */
+public class TaskomaticOrgHandler extends TaskomaticHandler {
+ protected void checkUserRole(User user) {
+ ensureUserRole(user, RoleFactory.ORG_ADMIN);
+ }
+
+ protected void addParameters(User user, List params) {
+ params.add(0, user.getOrg().getId());
+ }
+}
commit 595b3572977533955851bbd8da396e66eaa3e655
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Sun Jun 27 00:24:52 2010 +0200
rename chainedJobListener to chainedTriggerListener
because it is a trigger listener
diff --git a/java/code/src/com/redhat/rhn/taskomatic/core/SchedulerKernel.java
b/java/code/src/com/redhat/rhn/taskomatic/core/SchedulerKernel.java
index 3cf7548..41935fe 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/core/SchedulerKernel.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/core/SchedulerKernel.java
@@ -46,7 +46,7 @@ public class SchedulerKernel {
private static SchedulerFactory factory = null;
private static Scheduler scheduler = null;
private static TaskoXmlRpcServer xmlrpcServer = null;
- private ChainedListener chainedJobListener = null;
+ private ChainedListener chainedTriggerListener = null;
private String dataSourceConfigPath = "org.quartz.jobStore.dataSource";
private String dataSourcePrefix = "org.quartz.dataSource";
private String defaultDataSource = "rhnDs";
@@ -84,12 +84,12 @@ public class SchedulerKernel {
SchedulerKernel.scheduler.setJobFactory(new RhnJobFactory());
// Setup TriggerListener chain
- this.chainedJobListener = new ChainedListener();
- this.chainedJobListener.addListener(new TaskEnvironmentListener());
- this.chainedJobListener.addListener(new LoggingListener());
+ this.chainedTriggerListener = new ChainedListener();
+ this.chainedTriggerListener.addListener(new TaskEnvironmentListener());
+ this.chainedTriggerListener.addListener(new LoggingListener());
try {
- SchedulerKernel.scheduler.addTriggerListener(this.chainedJobListener);
+
SchedulerKernel.scheduler.addTriggerListener(this.chainedTriggerListener);
}
catch (SchedulerException e) {
throw new ConfigException(e.getLocalizedMessage(), e);
@@ -196,7 +196,7 @@ public class SchedulerKernel {
trigger = new CronTrigger(jobImpl,
TaskomaticConstants.TASK_GROUP, crontab);
trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
- trigger.addTriggerListener(this.chainedJobListener.getName());
+ trigger.addTriggerListener(this.chainedTriggerListener.getName());
this.scheduler.scheduleJob(detail, trigger);
if (log.isDebugEnabled()) {
log.debug("Scheduled " + detail.getFullName());