//$Id: LambdaStationTicket.java,v 1.3 2006/06/15 20:49:50 moibenko Exp $
package org.dcache.srm.qos.lambdastation;
//import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.StringTokenizer;
import org.dcache.srm.qos.QOSTicket;
import org.dcache.srm.util.ShellCommandExecuter;
// Lambda Station Ticket
public class LambdaStationTicket implements QOSTicket {
// The foolowing is taken from openSvcTicket input
// parameters list
public String SrcSite; //src site ID: "Fermilab"
public String SrcClient; // src client ID "CMS-SRM"
public String SrcIP; // src IP list in CIDR format: "131.225.207.0/25,
// 131.225.207.133, 131.225.207,134"
public String SrcPort; // list of ports: "tcp eq 25, tcp range 5000-6000, udp le 3200"
public String DstSite; //src site ID: "Caltech"
public String DstClient; // src client ID "CMS-SRM"
public String DstIP; // src IP list in CIDR format: "131.225.207.0/25,
// 131.225.207.133, 131.225.207,134"
public String DstPort; // list of ports: "tcp eq 25, tcp range 5000-6000, udp le 3200"
public String LocalPath; // StarLight10G
public String RemotePath; //
public String OutBW; // Requested outbound bandwidth: "5G", "500M"
public String InBW; // Requested inbound bandwidth: "5G", "500M"
public String DSCPrqOut; // request for outbound DSCP: "YES, NO, DESIRABLE"
public String DSCPrqIn; // request for inbound DSCP: "YES, NO, DESIRABLE"
public String BoardTime;
public String StartTime;
public String EndTime;
public String TravelTime; // for how long is path reserved (sec)
public int DSCPin;
public int DSCPout;
// The following may be needed
private String LambdaStationId;
private String credentialSubject;
private int localTicketID; // local ticket id returned by Lambda Station
private int remoteTicketID; // remote ticket id returned by Lambda Station
private long actualEndTime; // actual end time returned by Lambda Station
public boolean srcEnabled = true;
public boolean dstEnabled = true;
public Long bytes;// Jay
public LambdaStationTicket(){
}
public LambdaStationTicket(String credentialSubject){
this.credentialSubject = credentialSubject;
}
public LambdaStationTicket(
String credentialSubject,
long bytes,
String srcURL,
String srcClient,
String srcPorts,
String dstURL,
String dstClient,
String dstPorts,
LambdaStationMap map){
this.credentialSubject = credentialSubject;
SrcSite = map.getName(srcURL);
SrcClient = srcClient;
SrcPort = srcPorts;
DstSite = map.getName(dstURL);
DstClient = dstClient;
DstPort = dstPorts;
srcEnabled = map.enabled(srcURL);
dstEnabled = map.enabled(dstURL);
}
public LambdaStationTicket(
String credentialSubject,
String srcURL,
String srcClient,
String dstURL,
String dstClient,
LambdaStationMap map){
this.credentialSubject = credentialSubject;
SrcSite = map.getName(srcURL);
SrcClient = srcClient;
DstSite = map.getName(dstURL);
DstClient = dstClient;
srcEnabled = map.enabled(srcURL);
dstEnabled = map.enabled(dstURL);
}
public LambdaStationTicket(
String credentialSubject,
String srcURL,
String srcClient,
String dstURL,
String dstClient,
int TravelTime,
LambdaStationMap map){
this.credentialSubject = credentialSubject;
SrcSite = map.getName(srcURL);
SrcClient = srcClient;
DstSite = map.getName(dstURL);
DstClient = dstClient;
this.TravelTime = Integer.toString(TravelTime);
srcEnabled = map.enabled(srcURL);
dstEnabled = map.enabled(dstURL);
}
public void OpenTicket(String script){
/* This command is specialized to use ost2
All options are optional to overwrite defaults
Options are:
--statusWait - how long to show status of created ticket (in secs),
--srcSite - identifier of source site
--srcClient - identifer of source client
--dstSite - identifier of destination site
--dstClient - identifier of destination
--boardTime - YYYYMMDDHHMMSS
--travelTime - for how long request path (in secs)
--localPath - specify an alternative path
--remotePath - specify an alternative remote path
--srcIP - a comma separate list of srcIPs nnn.nnn.nnn.nnn/mask
--dstIP - a comma separate list of dstIPs nnn.nnn.nnn.nnn/mask
--verbose - show more diagnostics
--help - this message
*/
String c;
// first check for -Dlambda
if (System.getProperty("lambda") != null) {
c = System.getProperty("lambda");
}
// Then check configuration
else {
if (script != null) {
c = script;
}
else {
say("AM: NO LS COMMAND");
return;
}
}
if (!(srcEnabled&dstEnabled)) {
return;
}
String[] cmd = new String[2];
cmd[0] = c;
String arguments = "";
if (SrcSite != null) {
arguments = (arguments+"--srcSite "+SrcSite+" ");
}
if (SrcClient != null) {
//arguments = (arguments+"--srcClient "+SrcClient+" ");
}
if (DstSite != null) {
arguments = (arguments+"--dstSite "+DstSite+" ");
}
if (DstClient != null) {
//arguments = (arguments+"--dstClient "+DstClient+" ");
}
if (TravelTime != null) {
arguments = (arguments+"--travelTime "+TravelTime+" ");
}
// Add more if needed
cmd[1] = "'"+arguments+"'";
say("ARGS="+arguments);
StringWriter shell_out = new StringWriter();
StringWriter shell_err = new StringWriter();
int return_code = ShellCommandExecuter.execute(cmd,shell_out, shell_err);
// Do not check return code
//say("lambda output:");
//say(shell_out.getBuffer().toString());
//say("lambda error output:");
//say(shell_err.getBuffer().toString());
//System.out.println("lambda stdout:"+shell_out.getBuffer().toString());
StringTokenizer responseTokenizer
= new StringTokenizer(shell_out.getBuffer().toString(), ":");
//say("Tokens "+responseTokenizer.countTokens());
while ( responseTokenizer.hasMoreElements() ) {
String tok = (String) responseTokenizer.nextElement();
if (tok.equals("OK")) {
// skip "new"
tok = (String) responseTokenizer.nextElement();
// next token is a return value
tok = (String) responseTokenizer.nextElement();
StringTokenizer valTokenizer =
new StringTokenizer(tok, ",");
String tok1 = (String) valTokenizer.nextElement();
if (tok1 != null) {
localTicketID = Integer.parseInt(tok1);
}
else {
break;
}
tok1 = (String) valTokenizer.nextElement();
if (tok1 != null) {
remoteTicketID = Integer.parseInt(tok1);
}
else {
break;
}
tok1 = (String) valTokenizer.nextElement();
tok1 = tok1.trim();
if (tok1 != null) {
actualEndTime = Long.parseLong(tok1);
}
break;
}
else if (tok.equals("ERROR")) {
say("Lambda Station returned Error: "+shell_out.getBuffer().toString());
break;
}
}
}
public String getLambdaStationId(){
return LambdaStationId;
}
public void setLambdaStationId(String lambdaStationId){
this.LambdaStationId = lambdaStationId;
}
public String toString(){
return ("SrcSite="+SrcSite+" SrcClient="+SrcClient+" SrcIP="+SrcIP+
" SrcPort="+SrcPort+" DstSite="+DstSite+" DstClient="+DstClient+
" DstIP="+DstIP+" DstPort="+DstPort+" LocalPath="+LocalPath+
" RemotePath="+RemotePath+" OutBW="+OutBW+" InBW="+InBW+
" DSCPrqOut="+DSCPrqOut+" DSCPrqIn="+DSCPrqIn+" BoardTime="+BoardTime+" TravelTime="+TravelTime+
" StartTime="+StartTime+" EndTime="+EndTime+" DSCPin="+DSCPin+" DSCPout="+DSCPout+
" credentialSubject="+credentialSubject+" localTicketID="+localTicketID+
" remoteTicketID="+remoteTicketID+" actualEndTime="+actualEndTime);
}
public void say(String words) {
System.out.println("LS_Ticket: "+words);
}
/**
*
* @return credentialSubject
*/
public String getCredentialSubject() {
return credentialSubject;
}
public int getLocalTicketID() {
return localTicketID;
}
public void setLocalTicketID(int ID) {
localTicketID = ID;
}
public int getRemoteTicketID() {
return remoteTicketID;
}
public void setRemoteTicketID(int ID) {
localTicketID = ID;
}
public long getActualEndTime() {
return actualEndTime;
}
public boolean srcEnabled() {
return this.srcEnabled;
}
public boolean dstEnabled() {
return this.dstEnabled;
}
public long getStartTime() {
long l = 0;
if (this.StartTime != null) {
l = Long.parseLong(this.StartTime.trim());
}
return l;
}
}