You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2013/03/19 16:58:03 UTC
svn commit: r1458363 - in
/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc:
api/test/ cli/
Author: degenaro
Date: Tue Mar 19 15:58:02 2013
New Revision: 1458363
URL: http://svn.apache.org/r1458363
Log:
UIMA-2732 DUCC support for monitoring of Managed Reservations, CLI enhancements
Added:
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java
Modified:
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java Tue Mar 19 15:58:02 2013
@@ -21,13 +21,12 @@ package org.apache.uima.ducc.api.test;
import org.apache.uima.ducc.api.IDuccMessageProcessor;
import org.apache.uima.ducc.cli.DuccJobMonitor;
-
public class Test {
public static void main(String[] args) {
try {
IDuccMessageProcessor messageHandler = new MessageHandler();
- DuccJobMonitor duccJobMonitor = new DuccJobMonitor(messageHandler, false);
+ DuccJobMonitor duccJobMonitor = new DuccJobMonitor(messageHandler);
duccJobMonitor.run(args);
} catch (Exception e) {
e.printStackTrace();
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java Tue Mar 19 15:58:02 2013
@@ -46,6 +46,7 @@ import org.apache.uima.ducc.common.utils
import org.apache.uima.ducc.common.utils.Utils;
import org.apache.uima.ducc.transport.dispatcher.DuccEventHttpDispatcher;
import org.apache.uima.ducc.transport.event.AbstractDuccOrchestratorEvent;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
public abstract class CliBase
implements IUiOptions
@@ -601,7 +602,7 @@ public abstract class CliBase
}
// TODO TODO TODO - do we have to support lots of these for multi-threaded stuff? Hope not ...
- protected synchronized void startMonitors(boolean start_stdin)
+ protected synchronized void startMonitors(boolean start_stdin, DuccContext context)
throws Exception
{
int wait_count = 0;
@@ -611,16 +612,17 @@ public abstract class CliBase
wait_count++;
}
- if ( cli_props.containsKey(UiOption.ServiceTypeOther.pname() ) ) {
- if ( debug ) addMessage("Bypassing monitor for ducclet.");
- } else {
- boolean monitor_attach =
- (cli_props.containsKey(UiOption.WaitForCompletion.pname()) || ( console_attach ));
+ boolean monitor_attach =
+ (
+ cli_props.containsKey(UiOption.WaitForCompletion.pname()) ||
+ cli_props.containsKey(UiOption.CancelJobOnInterrupt.pname()) ||
+ cli_props.containsKey(UiOption.CancelManagedReservationOnInterrupt.pname()) ||
+ console_attach
+ );
- if ( monitor_attach ) {
- wait_count++;
- startJobMonitor(console_attach && !cli_props.containsKey(UiOption.WaitForCompletion.pname()));
- }
+ if ( monitor_attach ) {
+ wait_count++;
+ startMonitor(context);
}
if ( wait_count > 0 ) {
@@ -628,11 +630,15 @@ public abstract class CliBase
}
}
- protected synchronized void startJobMonitor(boolean quiet)
+ protected synchronized void startMonitor(DuccContext context)
{
- monitor_listener = new MonitorListener(this, friendlyId, cli_props, quiet);
+ monitor_listener = new MonitorListener(this, friendlyId, cli_props, context);
- if (cli_props.containsKey(UiOption.WaitForCompletion.pname()) || ( console_listener != null) ) {
+ if ( cli_props.containsKey(UiOption.WaitForCompletion.pname()) ||
+ cli_props.containsKey(UiOption.CancelJobOnInterrupt.pname()) ||
+ cli_props.containsKey(UiOption.CancelManagedReservationOnInterrupt.pname()) ||
+ (console_listener != null)
+ ) {
Thread mlt = new Thread(monitor_listener); //MonitorListenerThread
mlt.start();
}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java Tue Mar 19 15:58:02 2013
@@ -18,445 +18,82 @@
*/
package org.apache.uima.ducc.cli;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.lang.management.ManagementFactory;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
-import org.apache.commons.cli.PosixParser;
-import org.apache.uima.ducc.api.DuccMessage;
import org.apache.uima.ducc.api.IDuccMessageProcessor;
-import org.apache.uima.ducc.common.json.MonitorInfo;
-import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
-import org.apache.uima.ducc.common.utils.Utils;
+import org.apache.uima.ducc.cli.IUiOptions.UiOption;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
-import com.google.gson.Gson;
+public class DuccJobMonitor extends DuccMonitor implements IDuccMonitor {
-/**
- * Monitor a DUCC job
- */
-
-public class DuccJobMonitor extends DuccUi {
-private Thread main = null;
-
- private static final int RC_UNKNOWN = -1;
- private static final int RC_SUCCESS = 0;
- private static final int RC_FAILURE = 1;
-
- private static final int RC_HELP = RC_SUCCESS;
-
- private static final String NotFound = "NotFound";
-
- private static final String StateRunning = "Running";
- private static final String StateCompleting = "Completing";
- private static final String StateCompleted = "Completed";
-
- private AtomicInteger rc = new AtomicInteger(RC_UNKNOWN);
- private AtomicBoolean cancel_job_on_interrupt = new AtomicBoolean(false);
-
- private String jobId = null;
-
- private boolean info = true;
- private boolean error = true;
- private boolean debug = false;
- private boolean quiet = false;
- private boolean timestamp = false;
-
- private int milliseconds = 1;
- private int seconds = 1000*milliseconds;
- private int wakeupInterval = 15*seconds;
-
- private int urlTimeout = 60*seconds;
+ public static String servlet = "/ducc-servlet/proxy-job-status";
- private IDuccMessageProcessor duccMessageProcessor = new DuccMessage();
-
- DuccPropertiesResolver duccPropertiesResolver;
-
- private void debug(String message) {
- if(debug) {
- duccMessageProcessor.out(timestamp(message));
- }
+ public DuccJobMonitor() {
+ super(DuccContext.Job, true);
}
- private void debug(Exception e) {
- if(debug) {
- duccMessageProcessor.exception(e);
- }
- }
-
- private void info(String message) {
- if(info && !quiet) {
- duccMessageProcessor.out(timestamp(message));
- }
- }
-
- private void error(String message) {
- if(error) {
- duccMessageProcessor.out(timestamp(message));
- }
- }
-
- private String timestamp(String message) {
- String tMessage = message;
- if(timestamp) {
- String date = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date());
- tMessage = date+" "+message;
- }
- return tMessage;
+ public DuccJobMonitor(IDuccMessageProcessor messageProcessor) {
+ super(DuccContext.Job, true, messageProcessor);
}
+ @Deprecated
public DuccJobMonitor(boolean quiet) {
- this.quiet = quiet;
+ super(DuccContext.Job, true);
}
- public DuccJobMonitor(IDuccMessageProcessor duccMessageProcessor, boolean quiet) {
- this.quiet = quiet;
- this.duccMessageProcessor = duccMessageProcessor;
+ @Deprecated
+ public DuccJobMonitor(IDuccMessageProcessor messageProcessor, boolean quiet) {
+ super(DuccContext.Job, true, messageProcessor);
}
- @SuppressWarnings("static-access")
- private void addOptions(Options options) {
- options.addOption(OptionBuilder
- .withDescription(DuccUiConstants.desc_help).hasArg(false)
- .withLongOpt(DuccUiConstants.name_help).create());
- options.addOption(OptionBuilder
- .withDescription(DuccUiConstants.desc_debug).hasArg(false)
- .withLongOpt(DuccUiConstants.name_debug).create());
- options.addOption(OptionBuilder
- .withDescription(DuccUiConstants.desc_timestamp).hasArg(false)
- .withLongOpt(DuccUiConstants.name_timestamp).create());
- options.addOption(OptionBuilder
- .withArgName(DuccUiConstants.parm_job_id)
- .withDescription(makeDesc(DuccUiConstants.desc_job_id,DuccUiConstants.exmp_job_id)).hasArg()
- .withLongOpt(DuccUiConstants.name_job_id).create());
- options.addOption(OptionBuilder
- .withDescription(DuccUiConstants.desc_monitor_cancel_job_on_interrupt).hasArg(false)
- .withLongOpt(DuccUiConstants.name_monitor_cancel_job_on_interrupt).create());
- }
-
- protected void help(Options options) {
- HelpFormatter formatter = new HelpFormatter();
- formatter.setWidth(DuccUiConstants.help_width);
- formatter.printHelp(DuccJobMonitor.class.getName(), options);
- rc.set(RC_HELP);
- return;
+ private DuccJobMonitor(String uniqueSignature) {
+ super(DuccContext.Job, false);
}
-
- private String getSingleLineStatus(String urlString) {
- String line = null;
- URL url = null;
+
+ public static void main(String[] args) {
+ int code = RC_FAILURE;
try {
- url = new URL(urlString);
- URLConnection uc = url.openConnection();
- uc.setReadTimeout(urlTimeout);
- BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
- line = br.readLine();
- br.close();
+ String unique = null;
+ DuccJobMonitor jobMonitor = new DuccJobMonitor(unique);
+ code = jobMonitor.run(args);
}
- catch (MalformedURLException e) {
- e.printStackTrace();
- }
- catch(IOException e) {
+ catch (Exception e) {
e.printStackTrace();
- }
- return line;
- }
-
- private String getUrlString(String id) {
- String host = duccPropertiesResolver.getFileProperty("ducc.ws.node");
- if(host == null) {
- host = duccPropertiesResolver.getFileProperty("ducc.head");
}
- String port = duccPropertiesResolver.getFileProperty("ducc.ws.port");
- String urlString = "http://"+host+":"+port+"/ducc-servlet/proxy-job-status?id="+id;
- debug(urlString);
- return urlString;
- }
-
- private void adjustWakeupInterval() {
- String rate = duccPropertiesResolver.getFileProperty("ducc.orchestrator.state.publish.rate");
- try {
- wakeupInterval = Integer.parseInt(rate);
- }
- catch(Exception e) {
- debug(e);
- }
- }
-
- private String details(MonitorInfo monitorInfo) {
- StringBuffer sb = new StringBuffer();
- sb.append(" ");
- sb.append("total:");
- sb.append(monitorInfo.total);
- sb.append(" ");
- sb.append("done:");
- sb.append(monitorInfo.done);
- sb.append(" ");
- sb.append("error:");
- sb.append(monitorInfo.error);
- sb.append(" ");
- sb.append("retry:");
- sb.append(monitorInfo.retry);
- sb.append(" ");
- sb.append("procs:");
- sb.append(monitorInfo.procs);
- return sb.toString();
- }
-
- private int runInternal(String[] args) throws Exception {
- /*
- * require DUCC_HOME
- */
- String ducc_home = Utils.findDuccHome();
- if(ducc_home == null) {
- duccMessageProcessor.err("missing required environment variable: DUCC_HOME");
- rc.set(RC_FAILURE);
- return rc.get();
- }
- /*
- * parser is not thread safe?
- */
- synchronized(DuccUi.class) {
- Options options = new Options();
- addOptions(options);
- CommandLineParser parser = new PosixParser();
- CommandLine commandLine = parser.parse(options, args);
- /*
- * give help & exit when requested
- */
- if (commandLine.hasOption(DuccUiConstants.name_help)) {
- help(options);
- return rc.get();
- }
- if(commandLine.getOptions().length == 0) {
- help(options);
- return rc.get();
- }
-// /*
-// * detect duplicate options
-// */
-// if (DuccUiUtilities.duplicate_options(duccMessageProcessor, commandLine)) {
-// return 1;
-// }
- /*
- * timestamp
- */
- if (commandLine.hasOption(DuccUiConstants.name_timestamp)) {
- timestamp = true;
- }
- /*
- * verbosity
- */
- if (commandLine.hasOption(DuccUiConstants.name_debug)) {
- debug = true;
- }
- /*
- * cancel job enabled
- */
- if (commandLine.hasOption(DuccUiConstants.name_monitor_cancel_job_on_interrupt)) {
- cancel_job_on_interrupt.set(true);
- }
- /*
- * job id
- */
- if (commandLine.hasOption(DuccUiConstants.name_job_id)) {
- jobId = commandLine.getOptionValue(DuccUiConstants.name_job_id);
- }
- else {
- HelpFormatter formatter = new HelpFormatter();
- formatter.setWidth(110);
- formatter.printHelp(DuccJobMonitor.class.getName(), options);
- rc.set(RC_HELP);
- return rc.get();
- }
- }
-
- main = Thread.currentThread();
-
- Thread killer = new Killer(main);
- Runtime.getRuntime().addShutdownHook(killer);
-
- duccPropertiesResolver = DuccPropertiesResolver.getInstance();
-
- adjustWakeupInterval();
-
- boolean observer = true;
- String urlString = getUrlString(jobId);
- String lastMessage = "";
- String thisMessage = "";
-
- StringBuffer message = new StringBuffer();
-
- message.append("id:"+jobId);
- message.append(" ");
- message.append("location:");
- message.append(ManagementFactory.getRuntimeMXBean().getName());
- info(message.toString());
-
- while(observer) {
-
- String json = getSingleLineStatus(urlString);
- debug(json);
-
- if(json != null) {
- Gson gson = new Gson();
- MonitorInfo monitorInfo = gson.fromJson(json, MonitorInfo.class);
-
- int stateCount = monitorInfo.stateSequence.size();
- debug("states:"+stateCount);
- if(stateCount <= 0) {
- message = new StringBuffer();
- message.append("id:"+jobId);
- message.append(" ");
- message.append("state:"+NotFound);
- thisMessage = message.toString();
- info(thisMessage);
- message = new StringBuffer();
- message.append("id:"+jobId);
- message.append(" ");
- message.append("rc:"+RC_FAILURE);
- thisMessage = message.toString();
- info(thisMessage);
- rc.set(RC_FAILURE);
- return rc.get();
- }
-
- String state = "";
- Iterator<String> states = monitorInfo.stateSequence.iterator();
- while(states.hasNext()) {
- state = states.next();
- }
-
- message = new StringBuffer();
- message.append("id:"+jobId);
- message.append(" ");
- message.append("state:"+state);
-
- if(state.equals(StateRunning)) {
- message.append(details(monitorInfo));
- }
- else if(state.equals(StateCompleting)) {
- cancel_job_on_interrupt.set(false);
- message.append(details(monitorInfo));
- }
- else if(state.equals(StateCompleted)) {
- cancel_job_on_interrupt.set(false);
- message.append(details(monitorInfo));
- }
-
- thisMessage = message.toString();
- if(!thisMessage.equals(lastMessage)) {
- info(thisMessage);
- lastMessage = thisMessage;
- }
-
- if(state.equals(StateCompleted)) {
- if(monitorInfo.procs.equals("0")) {
- if(monitorInfo.total.equals(monitorInfo.done)) {
- message = new StringBuffer();
- message.append("id:"+jobId);
- message.append(" ");
- message.append("rc:"+RC_SUCCESS);
- thisMessage = message.toString();
- info(thisMessage);
- rc.set(RC_SUCCESS);
- return rc.get();
- }
- else {
- message = new StringBuffer();
- message.append("id:"+jobId);
- message.append(" ");
- message.append("rc:"+RC_FAILURE);
- thisMessage = message.toString();
- info(thisMessage);
- rc.set(RC_FAILURE);
- return rc.get();
- }
- }
- }
- }
- else {
- error("error: timeout accessing "+urlString);
- }
-
- try {
- Thread.sleep(wakeupInterval);
- } catch (InterruptedException e) {
- debug(e);
- }
- }
-
- return rc.get();
+ System.exit(code);
}
- private class Killer extends Thread {
-
- public Killer(Thread thread) {
- }
-
- public void run() {
- StringBuffer message = new StringBuffer();
- if(cancel_job_on_interrupt.get()) {
- message.append("killer: cancel");
- cancel();
- }
- else {
- message.append("killer: no cancel");
- }
- debug(message.toString());
- }
+ @Override
+ public void help(Options options) {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.setWidth(DuccUiConstants.help_width);
+ formatter.printHelp(DuccJobMonitor.class.getName(), options);
+ return;
}
+ @Override
public void cancel() {
- try {
+ try {
ArrayList<String> arrayList = new ArrayList<String>();
- arrayList.add("--"+DuccUiConstants.name_job_id);
- arrayList.add(jobId);
- arrayList.add("--"+DuccUiConstants.name_reason);
+ arrayList.add("--"+UiOption.JobId);
+ arrayList.add(getId());
+ arrayList.add("--"+UiOption.Reason);
arrayList.add("\"submitter was terminated via interrupt\"");
String[] argList = arrayList.toArray(new String[0]);
- DuccJobCancel duccJobCancel = new DuccJobCancel(argList);
- boolean retVal = duccJobCancel.execute();
- if(retVal) {
- }
- else {
- }
+ DuccJobCancel jobCancel = new DuccJobCancel(argList);
+ boolean retVal = jobCancel.execute();
+ debug("cancel rc:"+retVal);
} catch (Exception e) {
- duccMessageProcessor.exception(e);
+ messageProcessor.exception(e);
}
}
-
- public int run(String[] args) {
- try {
- runInternal(args);
- } catch (Exception e) {
- duccMessageProcessor.exception(e);
- }
- return rc.get();
- }
-
- public static void main(String[] args) {
- try {
- DuccJobMonitor duccJobMonitor = new DuccJobMonitor(false);
- int rc = duccJobMonitor.run(args);
- System.exit(rc == 0 ? 0 : 1);
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- return;
- }
+ @Override
+ public String getUrl(String id) {
+ String urlString = "http://"+getHost()+":"+getPort()+servlet+"?id="+id;
+ debug(urlString);
+ return urlString;
+ }
}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java Tue Mar 19 15:58:02 2013
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Properties;
import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
import org.apache.uima.ducc.transport.event.SubmitJobDuccEvent;
import org.apache.uima.ducc.transport.event.SubmitJobReplyDuccEvent;
import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
@@ -379,7 +380,7 @@ public class DuccJobSubmit
if ( rc ) {
saveSpec("job-specification.properties", jobRequestProperties);
- startMonitors(false); // starts conditionally, based on job spec and console listener present
+ startMonitors(false, DuccContext.Job); // starts conditionally, based on job spec and console listener present
}
return rc;
Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.uima.ducc.transport.event.CancelServiceDuccEvent;
+import org.apache.uima.ducc.transport.event.CancelServiceReplyDuccEvent;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
+
+public class DuccManagedReservationCancel extends CliBase {
+
+ JobRequestProperties requestProperties = new JobRequestProperties();
+ static String or_port = "ducc.orchestrator.http.port";
+ static String or_host = "ducc.orchestrator.node";
+
+ long canceledPid = -1;
+ String responseMessage = null;
+
+ UiOption[] opts = new UiOption []
+ {
+ UiOption.Help,
+ UiOption.Debug,
+
+ UiOption.ManagedReservationId,
+ UiOption.Reason,
+ UiOption.RoleAdministrator,
+ };
+
+ public DuccManagedReservationCancel(String [] args)
+ throws Exception
+ {
+ init(this.getClass().getName(), opts, args, requestProperties, or_host, or_port, "or");
+ }
+
+ public DuccManagedReservationCancel(List<String> args)
+ throws Exception
+ {
+ String[] arg_array = args.toArray(new String[args.size()]);
+ init(this.getClass().getName(), opts, arg_array, requestProperties, or_host, or_port, "or");
+ }
+
+ public DuccManagedReservationCancel(Properties props)
+ throws Exception
+ {
+ for ( Object k : props.keySet() ) {
+ Object v = props.get(k);
+ requestProperties.put(k, v);
+ }
+ init(this.getClass().getName(), opts, null, requestProperties, or_host, or_port, "or");
+ }
+
+ public String getResponseMessage()
+ {
+ return responseMessage;
+ }
+
+ public boolean execute()
+ throws Exception
+ {
+ CancelServiceDuccEvent cancelServiceDuccEvent = new CancelServiceDuccEvent(requestProperties, DuccContext.ManagedReservation);
+ CancelServiceReplyDuccEvent cancelServiceReplyDuccEvent = null;
+ try {
+ cancelServiceReplyDuccEvent = (CancelServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelServiceDuccEvent);
+ } catch (Exception e) {
+ addError("Cancel not submitted: " + e.getMessage());
+ return false;
+ } finally {
+ dispatcher.close();
+ }
+
+ /*
+ * process reply
+ */
+ boolean rc = extractReply(cancelServiceReplyDuccEvent);
+ responseMessage = cancelServiceReplyDuccEvent.getProperties().getProperty(UiOption.Message.pname());
+
+ return rc;
+ }
+
+ public static void main(String[] args) {
+ try {
+ DuccManagedReservationCancel dsc = new DuccManagedReservationCancel(args);
+ boolean rc = dsc.execute();
+
+ // Fetch messages if any. null means none
+ String [] messages = dsc.getMessages();
+ String [] warnings = dsc.getWarnings();
+ String [] errors = dsc.getErrors();
+
+ if ( messages != null ) {
+ for (String s : messages ) {
+ System.out.println(s);
+ }
+ }
+
+ if ( warnings != null ) {
+ for (String s : warnings ) {
+ System.out.println("WARN: " + s);
+ }
+ }
+
+ if ( errors != null ) {
+ for (String s : errors ) {
+ System.out.println("ERROR: " + s);
+ }
+ }
+
+ long id = dsc.getDuccId();
+ String msg = dsc.getResponseMessage();
+ String dtype = "Managed Reservation";
+ System.out.println(dtype + " " + id + " " + msg);
+ System.exit(rc ? 0 : 1);
+
+ } catch (Exception e) {
+ System.out.println("Cannot cancel: " + e.getMessage());
+ System.exit(1);
+ }
+ }
+}
Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.util.ArrayList;
+
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.apache.uima.ducc.api.IDuccMessageProcessor;
+import org.apache.uima.ducc.cli.IUiOptions.UiOption;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+
+public class DuccManagedReservationMonitor extends DuccMonitor implements IDuccMonitor {
+
+ public static String servlet = "/ducc-servlet/proxy-managed-reservation-status";
+
+ protected DuccManagedReservationMonitor() {
+ super(DuccContext.ManagedReservation, true);
+ }
+
+ protected DuccManagedReservationMonitor(IDuccMessageProcessor messageProcessor) {
+ super(DuccContext.ManagedReservation, true, messageProcessor);
+ }
+
+ private DuccManagedReservationMonitor(boolean submit) {
+ super(DuccContext.ManagedReservation, submit);
+ }
+
+ public static void main(String[] args) {
+ int code = RC_FAILURE;
+ try {
+ DuccManagedReservationMonitor managedReservationMonitor = new DuccManagedReservationMonitor(false);
+ code = managedReservationMonitor.run(args);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.exit(code);
+ }
+
+ @Override
+ public void help(Options options) {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.setWidth(DuccUiConstants.help_width);
+ formatter.printHelp(DuccManagedReservationMonitor.class.getName(), options);
+ return;
+ }
+
+ @Override
+ public void cancel() {
+ try {
+ ArrayList<String> arrayList = new ArrayList<String>();
+ arrayList.add("--"+UiOption.ManagedReservationId.pname());
+ arrayList.add(getId());
+ arrayList.add("--"+UiOption.Reason.pname());
+ arrayList.add("\"submitter was terminated via interrupt\"");
+ String[] argList = arrayList.toArray(new String[0]);
+ DuccManagedReservationCancel managedReservationCancel = new DuccManagedReservationCancel(argList);
+ boolean retVal = managedReservationCancel.execute();
+ debug("cancel rc:"+retVal);
+ } catch (Exception e) {
+ messageProcessor.exception(e);
+ }
+ }
+
+ @Override
+ public String getUrl(String id) {
+ String urlString = "http://"+getHost()+":"+getPort()+servlet+"?id="+id;
+ debug(urlString);
+ return urlString;
+ }
+
+}
Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.util.ArrayList;
+import java.util.Properties;
+
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+import org.apache.uima.ducc.transport.event.SubmitServiceDuccEvent;
+import org.apache.uima.ducc.transport.event.SubmitServiceReplyDuccEvent;
+import org.apache.uima.ducc.transport.event.cli.ServiceRequestProperties;
+
+
+/**
+ * Submit a DUCC Managed Reservation
+ */
+
+public class DuccManagedReservationSubmit
+ extends CliBase
+{
+ private static String dt = "Managed Reservation";
+
+ private static String or_port = "ducc.orchestrator.http.port";
+ private static String or_host = "ducc.orchestrator.node";
+
+ private ServiceRequestProperties serviceRequestProperties;
+
+ private UiOption[] opts = new UiOption[] {
+ UiOption.Help,
+ UiOption.Debug,
+ UiOption.Description,
+ UiOption.LogDirectory,
+ UiOption.ProcessAttachConsole,
+ UiOption.ProcessEnvironment,
+ UiOption.ProcessExecutable,
+ UiOption.ProcessExecutableArgs,
+ UiOption.ProcessFailuresLimit,
+ UiOption.ProcessMemorySize,
+ UiOption.SchedulingClass,
+ UiOption.Specification,
+ UiOption.WorkingDirectory,
+ UiOption.WaitForCompletion,
+ UiOption.CancelManagedReservationOnInterrupt,
+ };
+
+
+ public DuccManagedReservationSubmit(String[] args)
+ throws Exception
+ {
+ this(args, null);
+ }
+
+ public DuccManagedReservationSubmit(ArrayList<String> args)
+ throws Exception
+ {
+ this(args, null);
+ }
+
+ public DuccManagedReservationSubmit(Properties props)
+ throws Exception
+ {
+ this(props, null);
+ }
+
+ public DuccManagedReservationSubmit(String[] args, IConsoleCallback consoleCb)
+ throws Exception
+ {
+ serviceRequestProperties = new ServiceRequestProperties();
+ init(this.getClass().getName(), opts, args, serviceRequestProperties, or_host, or_port, "or", consoleCb);
+ }
+
+ public DuccManagedReservationSubmit(ArrayList<String> args, IConsoleCallback consoleCb)
+ throws Exception
+ {
+ String[] arg_array = args.toArray(new String[args.size()]);
+ serviceRequestProperties = new ServiceRequestProperties();
+ init(this.getClass().getName(), opts, arg_array, serviceRequestProperties, or_host, or_port, "or", consoleCb);
+ }
+
+ public DuccManagedReservationSubmit(Properties props, IConsoleCallback consoleCb)
+ throws Exception
+ {
+ serviceRequestProperties = new ServiceRequestProperties();
+ // TODO - can we get OR to just use properties and not these specialized classes?
+ // Until then, we need to pass in the right kind of props, sigh.
+ for ( Object k : props.keySet() ) {
+ Object v = props.get(k);
+ serviceRequestProperties.put(k, v);
+ }
+ init(this.getClass().getName(), opts, null, serviceRequestProperties, or_host, or_port, "or", consoleCb);
+ }
+
+
+ public boolean execute() throws Exception
+ {
+
+ // These must be enforced for "ducclets"
+ serviceRequestProperties.setProperty(UiOption.ProcessThreadCount.pname(), "1");
+ serviceRequestProperties.setProperty(UiOption.ProcessDeploymentsMax.pname(), "1");
+ serviceRequestProperties.put(UiOption.ServiceTypeOther.pname(), "");
+
+ /*
+ * set DUCC_LD_LIBRARY_PATH in process environment
+ */
+ adjustLdLibraryPath(serviceRequestProperties, UiOption.ProcessEnvironment.pname());
+
+
+ SubmitServiceDuccEvent ev = new SubmitServiceDuccEvent(serviceRequestProperties);
+ SubmitServiceReplyDuccEvent reply = null;
+
+ try {
+ reply = (SubmitServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(ev);
+ } catch (Exception e) {
+ addError(dt+" not submitted: " + e.getMessage());
+ return false;
+ } finally {
+ dispatcher.close();
+ }
+
+ /*
+ * process reply
+ */
+ boolean retval = true;
+ Properties properties = reply.getProperties();
+ @SuppressWarnings("unchecked")
+ ArrayList<String> or_warnings = (ArrayList<String>) properties.get(UiOption.SubmitWarnings.pname());
+ if (or_warnings != null) {
+ addWarnings(or_warnings);
+ }
+
+ @SuppressWarnings("unchecked")
+ ArrayList<String> or_errors = (ArrayList<String>) properties.get(UiOption.SubmitErrors.pname());
+ if(or_errors != null) {
+ addErrors(or_errors);
+ retval = false;
+ }
+
+ if ( retval ) {
+ String pid = reply.getProperties().getProperty(UiOption.JobId.pname());
+ if (pid == null ) {
+ retval = false;
+ } else {
+ friendlyId = Long.parseLong(pid);
+ if ( friendlyId < 0 ) {
+ retval = false;
+ } else {
+ saveSpec("process.properties", serviceRequestProperties);
+ startMonitors(true, DuccContext.ManagedReservation); // starts conditionally, based on job spec and console listener present
+ }
+ }
+ }
+
+ return retval;
+ }
+
+ public static void main(String[] args)
+ {
+ try {
+ // Instantiate the object with args similar to the CLI, or a pre-built properties file
+ DuccManagedReservationSubmit ds = new DuccManagedReservationSubmit(args);
+
+ // Run the API. If process_attach_console was specified in the args, a console listener is
+ // started but this call does NOT block on it.
+ boolean rc = ds.execute();
+
+ // Fetch messages if any. null means none
+ String [] messages = ds.getMessages();
+ String [] warnings = ds.getWarnings();
+ String [] errors = ds.getErrors();
+
+ if ( messages != null ) {
+ for (String s : messages ) {
+ System.out.println(s);
+ }
+ }
+
+ if ( warnings != null ) {
+ for (String s : warnings ) {
+ System.out.println("WARN: " + s);
+ }
+ }
+
+ if ( errors != null ) {
+ for (String s : errors ) {
+ System.out.println("ERROR: " + s);
+ }
+ }
+
+ // If the return is 'true' then as best the API can tell, the submit worked
+ if ( rc ) {
+ // Fetch the Ducc ID
+ System.out.println(dt+" "+ds.getDuccId()+" submitted.");
+ ds.waitForCompletion();
+ System.out.println(dt+" return code: "+ds.getReturnCode());
+ System.exit(0);
+ } else {
+ System.out.println("Could not submit "+dt);
+ System.exit(1);
+ }
+ } catch (Exception e) {
+ System.out.println("Cannot initialize: " + e.getMessage());
+ System.exit(1);
+ }
+ }
+
+}
Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,509 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.management.ManagementFactory;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.OptionBuilder;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.PosixParser;
+import org.apache.uima.ducc.api.DuccMessage;
+import org.apache.uima.ducc.api.IDuccMessageProcessor;
+import org.apache.uima.ducc.cli.IUiOptions.UiOption;
+import org.apache.uima.ducc.common.json.MonitorInfo;
+import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
+import org.apache.uima.ducc.common.utils.SynchronizedSimpleDateFormat;
+import org.apache.uima.ducc.common.utils.Utils;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+
+import com.google.gson.Gson;
+
+public abstract class DuccMonitor {
+
+ protected static final int RC_SUCCESS = 0;
+ protected static final int RC_FAILURE = 1;
+ protected static final int RC_HELP = RC_FAILURE;
+
+ protected static final String NotFound = "NotFound";
+ protected static final String StateRunning = "Running";
+ protected static final String StateCompleting = "Completing";
+ protected static final String StateCompleted = "Completed";
+
+ protected IDuccMessageProcessor messageProcessor = new DuccMessage();
+
+ private Options options = new Options();
+
+ private UiOption[] opts = new UiOption[0];
+
+ private String id = null;
+
+ private AtomicBoolean flag_cancel_on_interrupt = new AtomicBoolean(false);
+ private AtomicBoolean flag_debug = new AtomicBoolean(false);
+ private AtomicBoolean flag_error = new AtomicBoolean(true);
+ private AtomicBoolean flag_info = new AtomicBoolean(true);
+ private AtomicBoolean flag_trace = new AtomicBoolean(false);
+ private AtomicBoolean flag_timestamp = new AtomicBoolean(false);
+
+ private AtomicBoolean flag_observer = new AtomicBoolean(true);
+
+ private int milliseconds = 1;
+ private int seconds = 1000*milliseconds;
+ private int wakeupInterval = 15*seconds;
+ private int urlTimeout = 1*60*seconds;
+
+ private Thread main = null;
+ private DuccPropertiesResolver duccPropertiesResolver = null;
+
+ private DuccContext context = null;
+
+ private SynchronizedSimpleDateFormat sdf = new SynchronizedSimpleDateFormat("dd/MM/yyyy HH:mm:ss");
+
+ private UiOption[] optsSubmitJob = new UiOption []
+ {
+ UiOption.Help,
+ UiOption.Debug,
+ UiOption.Quiet,
+ UiOption.Timestamp,
+ UiOption.JobId,
+ UiOption.CancelJobOnInterrupt,
+ };
+
+ private UiOption[] optsMonitorJob = new UiOption []
+ {
+ UiOption.Help,
+ UiOption.Debug,
+ UiOption.Quiet,
+ UiOption.Timestamp,
+ UiOption.JobId,
+ };
+
+ private UiOption[] optsSubmitManagedReservation = new UiOption []
+ {
+ UiOption.Help,
+ UiOption.Debug,
+ UiOption.Quiet,
+ UiOption.Timestamp,
+ UiOption.ManagedReservationId,
+ UiOption.CancelManagedReservationOnInterrupt,
+ };
+
+ private UiOption[] optsMonitorManagedReservation = new UiOption []
+ {
+ UiOption.Help,
+ UiOption.Debug,
+ UiOption.Quiet,
+ UiOption.Timestamp,
+ UiOption.ManagedReservationId,
+ };
+
+ protected DuccMonitor(DuccContext context, boolean submit) {
+ initialize(context, submit, null);
+ }
+
+ protected DuccMonitor(DuccContext context, boolean submit, IDuccMessageProcessor messageProcessor) {
+ initialize(context, submit, messageProcessor);
+ }
+
+ public abstract void help(Options options);
+ public abstract void cancel();
+ public abstract String getUrl(String id);
+
+ public String getHost() {
+ String host = duccPropertiesResolver.getFileProperty("ducc.ws.node");
+ if(host == null) {
+ host = duccPropertiesResolver.getFileProperty("ducc.head");
+ }
+ return host;
+ }
+
+ public String getPort() {
+ String port = duccPropertiesResolver.getFileProperty("ducc.ws.port");
+ return port;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ private void initialize(DuccContext context, boolean submit, IDuccMessageProcessor messageProcessor) {
+ // context
+ this.context = context;
+ // submit
+ if(context != null) {
+ switch(context) {
+ case Job:
+ if(submit) {
+ opts = optsSubmitJob;
+ }
+ else {
+ opts = optsMonitorJob;
+ }
+ break;
+ case ManagedReservation:
+ if(submit) {
+ opts = optsSubmitManagedReservation;
+ }
+ else {
+ opts = optsMonitorManagedReservation;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ options = makeOptions(opts,false);
+ // message processor
+ if(messageProcessor != null) {
+ this.messageProcessor = messageProcessor;
+ }
+ }
+
+ protected Options makeOptions(UiOption[] optlist, boolean strict) {
+ Options opts = new Options();
+ for ( UiOption opt : optlist ) {
+ OptionBuilder.withDescription(opt.makeDesc());
+ OptionBuilder.withLongOpt (opt.pname());
+ if ( opt.argname() == null ) {
+ OptionBuilder.hasArg(false);
+ }
+ else {
+ OptionBuilder.withArgName(opt.argname());
+ if ( opt.multiargs() ) {
+ OptionBuilder.hasArgs();
+ }
+ else {
+ OptionBuilder.hasArgs(1);
+ }
+ }
+ if ( strict && opt.required() ) {
+ OptionBuilder.isRequired();
+ }
+ Option o = OptionBuilder.create();
+ opts.addOption(o);
+ }
+ return opts;
+ }
+
+ protected void trace(String message) {
+ if(flag_trace.get()) {
+ messageProcessor.out(timestamp(message));
+ }
+ }
+
+ protected void debug(String message) {
+ if(flag_debug.get()) {
+ messageProcessor.out(timestamp(message));
+ }
+ }
+
+ protected void debug(Exception e) {
+ if(flag_debug.get()) {
+ messageProcessor.exception(e);
+ }
+ }
+
+ private void info(String message) {
+ if(flag_info.get()) {
+ messageProcessor.out(timestamp(message));
+ }
+ }
+
+ private void error(String message) {
+ if(flag_error.get()) {
+ messageProcessor.out(timestamp(message));
+ }
+ }
+
+ protected String timestamp(String message) {
+ String tMessage = message;
+ if(flag_timestamp.get()) {
+ String date = sdf.format(new java.util.Date());
+ tMessage = date+" "+message;
+ }
+ return tMessage;
+ }
+
+ private String details(MonitorInfo monitorInfo) {
+ StringBuffer sb = new StringBuffer();
+ switch(context) {
+ case Job:
+ sb.append(" ");
+ sb.append("total:");
+ sb.append(monitorInfo.total);
+ sb.append(" ");
+ sb.append("done:");
+ sb.append(monitorInfo.done);
+ sb.append(" ");
+ sb.append("error:");
+ sb.append(monitorInfo.error);
+ sb.append(" ");
+ sb.append("retry:");
+ sb.append(monitorInfo.retry);
+ sb.append(" ");
+ sb.append("procs:");
+ sb.append(monitorInfo.procs);
+ break;
+ }
+ return sb.toString();
+ }
+
+ private void adjustWakeupInterval() {
+ String rate = duccPropertiesResolver.getFileProperty("ducc.orchestrator.state.publish.rate");
+ try {
+ wakeupInterval = Integer.parseInt(rate);
+ }
+ catch(Exception e) {
+ debug(e);
+ }
+ }
+
+ private int runInternal(String[] args) throws Exception {
+ // DUCC_HOME
+ String ducc_home = Utils.findDuccHome();
+ if(ducc_home == null) {
+ messageProcessor.err("missing required environment variable: DUCC_HOME");
+ return RC_FAILURE;
+ }
+ // Ingest ducc.properties
+ duccPropertiesResolver = DuccPropertiesResolver.getInstance();
+ // Parse
+ synchronized(DuccMonitor.class) {
+ CommandLineParser parser = new PosixParser();
+ CommandLine commandLine = parser.parse(options, args);
+ if (commandLine.hasOption(DuccUiConstants.name_help)) {
+ help(options);
+ return RC_HELP;
+ }
+ if(commandLine.getOptions().length == 0) {
+ help(options);
+ return RC_HELP;
+ }
+ if (commandLine.hasOption(UiOption.Timestamp.pname())) {
+ flag_timestamp.set(true);
+ }
+ if (commandLine.hasOption(UiOption.Quiet.pname())) {
+ flag_info.set(false);
+ flag_error.set(false);
+ }
+ if (commandLine.hasOption(UiOption.Debug.pname())) {
+ flag_debug.set(true);
+ }
+ if (commandLine.hasOption(UiOption.CancelJobOnInterrupt.pname())) {
+ flag_cancel_on_interrupt.set(true);
+ }
+ if (commandLine.hasOption(UiOption.CancelManagedReservationOnInterrupt.pname())) {
+ flag_cancel_on_interrupt.set(true);
+ }
+ if (commandLine.hasOption(UiOption.JobId.pname())) {
+ id = commandLine.getOptionValue(UiOption.JobId.pname());
+ }
+ else if (commandLine.hasOption(UiOption.ManagedReservationId.pname())) {
+ id = commandLine.getOptionValue(UiOption.ManagedReservationId.pname());
+ }
+ else {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.setWidth(110);
+ formatter.printHelp(DuccJobMonitor.class.getName(), options);
+ return RC_HELP;
+ }
+ }
+ // Handle Ctl-C
+ main = Thread.currentThread();
+ Thread killer = new Killer(main);
+ Runtime.getRuntime().addShutdownHook(killer);
+ // Setup polling
+ adjustWakeupInterval();
+ String urlString = getUrl(id);
+ String lastMessage = "";
+ String thisMessage = "";
+ StringBuffer message = new StringBuffer();
+ message.append("id:"+id);
+ message.append(" ");
+ message.append("location:");
+ message.append(ManagementFactory.getRuntimeMXBean().getName());
+ info(message.toString());
+ // Poll until finished
+ while(flag_observer.get()) {
+ String json = getSingleLineStatus(urlString);
+ if(json != null) {
+ debug(json);
+ Gson gson = new Gson();
+ MonitorInfo monitorInfo = gson.fromJson(json, MonitorInfo.class);
+ int stateCount = monitorInfo.stateSequence.size();
+ debug("states:"+stateCount);
+ if(stateCount <= 0) {
+ message = new StringBuffer();
+ message.append("id:"+id);
+ message.append(" ");
+ message.append("state:"+NotFound);
+ thisMessage = message.toString();
+ info(thisMessage);
+ message = new StringBuffer();
+ message.append("id:"+id);
+ message.append(" ");
+ message.append("rc:"+RC_FAILURE);
+ thisMessage = message.toString();
+ info(thisMessage);
+ return RC_FAILURE;
+ }
+ String state = "";
+ Iterator<String> states = monitorInfo.stateSequence.iterator();
+ while(states.hasNext()) {
+ state = states.next();
+ debug("list:"+state);
+ }
+ message = new StringBuffer();
+ message.append("id:"+id);
+ message.append(" ");
+ message.append("state:"+state);
+ if(state.equals(StateRunning)) {
+ message.append(details(monitorInfo));
+ }
+ else if(state.equals(StateCompleting)) {
+ flag_cancel_on_interrupt.set(false);
+ message.append(details(monitorInfo));
+ }
+ else if(state.equals(StateCompleted)) {
+ flag_cancel_on_interrupt.set(false);
+ message.append(details(monitorInfo));
+ }
+ thisMessage = message.toString();
+ if(!thisMessage.equals(lastMessage)) {
+ info(thisMessage);
+ lastMessage = thisMessage;
+ }
+ if(state.equals(StateCompleted)) {
+ if(monitorInfo.procs.equals("0")) {
+ if(monitorInfo.total.equals(monitorInfo.done)) {
+ message = new StringBuffer();
+ message.append("id:"+id);
+ message.append(" ");
+ message.append("rc:"+RC_SUCCESS);
+ thisMessage = message.toString();
+ info(thisMessage);
+ return RC_SUCCESS;
+ }
+ else {
+ message = new StringBuffer();
+ message.append("id:"+id);
+ message.append(" ");
+ message.append("rc:"+RC_FAILURE);
+ thisMessage = message.toString();
+ info(thisMessage);
+ return RC_SUCCESS;
+ }
+ }
+ }
+ }
+ else {
+ error("error: accessing "+urlString);
+ }
+ long start = System.currentTimeMillis();
+ long end = start;
+ while(!isTimeExpired(start,end,wakeupInterval)) {
+ if(!flag_observer.get()) {
+ break;
+ }
+ try {
+ Thread.sleep(wakeupInterval);
+ }
+ catch (InterruptedException e) {
+ debug(e);
+ }
+ end = System.currentTimeMillis();
+ }
+
+ }
+ return RC_SUCCESS;
+ }
+
+ private boolean isTimeExpired(long start, long end, long interval) {
+ boolean retVal = false;
+ long diff = end - start;
+ if(diff >= interval) {
+ retVal = true;
+ }
+ trace("start:"+start+" "+"end:"+end+" "+"diff:"+diff+" "+"interval:"+interval+" "+"result:"+retVal);
+ return retVal;
+ }
+
+ private String getSingleLineStatus(String urlString) {
+ String line = null;
+ URL url = null;
+ try {
+ url = new URL(urlString);
+ URLConnection uc = url.openConnection();
+ uc.setReadTimeout(urlTimeout);
+ BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
+ line = br.readLine();
+ br.close();
+ }
+ catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ catch(IOException e) {
+ e.printStackTrace();
+ }
+ return line;
+ }
+
+ private class Killer extends Thread {
+
+ public Killer(Thread thread) {
+ }
+
+ public void run() {
+ StringBuffer message = new StringBuffer();
+ if(flag_cancel_on_interrupt.get()) {
+ message.append("killer: cancel");
+ cancel();
+ }
+ else {
+ message.append("killer: no cancel");
+ }
+ debug(message.toString());
+ flag_observer.set(false);
+ }
+ }
+
+ public int run(String[] args) {
+ int code = RC_FAILURE;
+ try {
+ code = runInternal(args);
+ }
+ catch (Exception e) {
+ messageProcessor.exception(e);
+ }
+ debug("rc="+code);
+ return code;
+ }
+
+}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java Tue Mar 19 15:58:02 2013
@@ -23,6 +23,7 @@ import java.util.Properties;
import org.apache.uima.ducc.transport.event.CancelServiceDuccEvent;
import org.apache.uima.ducc.transport.event.CancelServiceReplyDuccEvent;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
/**
@@ -91,7 +92,7 @@ public class DuccServiceCancel
throws Exception
{
- CancelServiceDuccEvent cancelServiceDuccEvent = new CancelServiceDuccEvent(requestProperties);
+ CancelServiceDuccEvent cancelServiceDuccEvent = new CancelServiceDuccEvent(requestProperties, DuccContext.Service);
CancelServiceReplyDuccEvent cancelServiceReplyDuccEvent = null;
try {
cancelServiceReplyDuccEvent = (CancelServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelServiceDuccEvent);
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java Tue Mar 19 15:58:02 2013
@@ -424,6 +424,28 @@ public class DuccUiConstants {
public static final String dval_monitor_cancel_job_on_interrupt = dval_submit_cancel_job_on_interrupt;
/*
+ * submit Managed Reservation
+ */
+
+ public static final String name_submit_cancel_managed_reservation_on_interrupt = "cancel_managed_reservation_on_interrupt";
+ public static final String parm_submit_cancel_managed_reservation_on_interrupt = null;
+ public static final String desc_submit_cancel_managed_reservation_on_interrupt = "Cancel managed_reservation on interrupt (Ctrl-C); only possible when --"+name_wait_for_completion+" is also specified.";
+ public static final String labl_submit_cancel_managed_reservation_on_interrupt = null;
+ public static final String exmp_submit_cancel_managed_reservation_on_interrupt = null;
+ public static final String dval_submit_cancel_managed_reservation_on_interrupt = null;
+
+ /*
+ * monitor Managed Reservation
+ */
+
+ public static final String name_monitor_cancel_managed_reservation_on_interrupt = name_submit_cancel_managed_reservation_on_interrupt;
+ public static final String parm_monitor_cancel_managed_reservation_on_interrupt = parm_submit_cancel_managed_reservation_on_interrupt;
+ public static final String desc_monitor_cancel_managed_reservation_on_interrupt = "Cancel managed_reservation on interrupt (Ctrl-C).";
+ public static final String labl_monitor_cancel_managed_reservation_on_interrupt = labl_submit_cancel_managed_reservation_on_interrupt;
+ public static final String exmp_monitor_cancel_managed_reservation_on_interrupt = exmp_submit_cancel_managed_reservation_on_interrupt;
+ public static final String dval_monitor_cancel_managed_reservation_on_interrupt = dval_submit_cancel_managed_reservation_on_interrupt;
+
+ /*
* submit Service
*/
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java Tue Mar 19 15:58:02 2013
@@ -21,6 +21,7 @@ package org.apache.uima.ducc.cli;
import java.util.ArrayList;
import java.util.Properties;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
import org.apache.uima.ducc.transport.event.SubmitServiceDuccEvent;
import org.apache.uima.ducc.transport.event.SubmitServiceReplyDuccEvent;
import org.apache.uima.ducc.transport.event.cli.ServiceRequestProperties;
@@ -29,7 +30,7 @@ import org.apache.uima.ducc.transport.ev
/**
* Submit a DUCC service
*/
-
+@Deprecated
public class DuccletSubmit
extends CliBase
{
@@ -159,7 +160,7 @@ public class DuccletSubmit
retval = false;
} else {
saveSpec("process.properties", serviceRequestProperties);
- startMonitors(true); // starts conditionally, based on job spec and console listener present
+ startMonitors(true, DuccContext.ManagedReservation); // starts conditionally, based on job spec and console listener present
}
}
}
Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import org.apache.commons.cli.Options;
+
+public interface IDuccMonitor {
+
+ public void help(Options options);
+ public void cancel();
+ public String getUrl(String id);
+}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java Tue Mar 19 15:58:02 2013
@@ -71,7 +71,7 @@ public interface IUiOptions
CancelJobOnInterrupt {
public String pname() { return "cancel_job_on_interrupt"; }
public String argname() { return null; }
- public String description() { return "Cancel job on interrupt (Ctrl-C); only possible when --" + WaitForCompletion.pname() +" is also specified."; }
+ public String description() { return "Cancel job on interrupt (Ctrl-C)"; }
public String example() { return null; }
public String deflt() { return null; }
public String label() { return name(); }
@@ -79,6 +79,17 @@ public interface IUiOptions
public boolean required() { return false; }
},
+ CancelManagedReservationOnInterrupt {
+ public String pname() { return "cancel_managed_reservation_on_interrupt"; }
+ public String argname() { return null; }
+ public String description() { return "Cancel managed reservation on interrupt (Ctrl-C)"; }
+ public String example() { return null; }
+ public String deflt() { return null; }
+ public String label() { return name(); }
+ public boolean multiargs() { return false; }
+ public boolean required() { return false; }
+ },
+
ClasspathOrder {
public String pname() { return JobSpecificationProperties.key_classpath_order; }
public String argname() { return ClasspathOrderParms.UserBeforeDucc.name() + " or " + ClasspathOrderParms.DuccBeforeUser.name(); }
@@ -244,6 +255,17 @@ public interface IUiOptions
public boolean required() { return true; }
},
+ ManagedReservationId {
+ public String pname() { return JobRequestProperties.key_id; }
+ public String argname() { return "string"; }
+ public String description() { return "The id of the managed reservation"; }
+ public String example() { return null; }
+ public String deflt() { return null; }
+ public String label() { return null; }
+ public boolean multiargs() { return false; }
+ public boolean required() { return true; }
+ },
+
Jvm {
public String pname() { return JobSpecificationProperties.key_jvm; }
public String argname() { return "path-name-to-java"; }
@@ -297,8 +319,19 @@ public interface IUiOptions
public String label() { return "Number of instances"; }
public boolean multiargs() { return false; }
public boolean required() { return false; }
- },
-
+ },
+
+ Quiet {
+ public String pname() { return "quiet"; }
+ public String argname() { return null; }
+ public String description() { return "Disable CLI Informational messages."; }
+ public String example() { return null; }
+ public String deflt() { return null; }
+ public String label() { return null; }
+ public boolean multiargs() { return false; }
+ public boolean required() { return false; }
+ },
+
Register {
public String pname() { return "register"; }
public String argname() { return null; }
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java Tue Mar 19 15:58:02 2013
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import org.apache.uima.ducc.cli.IUiOptions.UiOption;
import org.apache.uima.ducc.common.utils.DuccProperties;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
class MonitorListener
@@ -31,16 +32,16 @@ class MonitorListener
CliBase base = null;
long jobid = 0;
DuccProperties props = null;
- boolean quiet = false;
+ DuccContext context = null;
+
+ DuccMonitor monitor = null;
- DuccJobMonitor monitor = null;
-
- MonitorListener(CliBase base, long jobid, DuccProperties props, boolean quiet)
+ MonitorListener(CliBase base, long jobid, DuccProperties props, DuccContext context)
{
- this.base = base;
+ this.base = base;
this.jobid = jobid;
this.props = props;
- this.quiet = quiet;
+ this.context = context;
}
public void run()
@@ -55,6 +56,10 @@ class MonitorListener
arrayList.add("--" + UiOption.Debug.pname());
}
+ if(props.containsKey(UiOption.Quiet.pname())) {
+ arrayList.add("--" + UiOption.Quiet.pname());
+ }
+
if(props.containsKey(DuccUiConstants.name_timestamp)) {
arrayList.add("--"+DuccUiConstants.name_timestamp);
}
@@ -63,8 +68,19 @@ class MonitorListener
arrayList.add("--"+DuccUiConstants.name_monitor_cancel_job_on_interrupt);
}
+ if(props.containsKey(DuccUiConstants.name_submit_cancel_managed_reservation_on_interrupt)) {
+ arrayList.add("--"+DuccUiConstants.name_monitor_cancel_managed_reservation_on_interrupt);
+ }
+
String[] argList = arrayList.toArray(new String[0]);
- monitor = new DuccJobMonitor(quiet);
+ switch(context) {
+ case ManagedReservation:
+ monitor = new DuccManagedReservationMonitor();
+ break;
+ case Job:
+ monitor = new DuccJobMonitor();
+ break;
+ }
retVal = monitor.run(argList);
} catch (Exception e) {
base.addMessage(e.getMessage());