You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sh...@apache.org on 2015/04/08 23:06:43 UTC

[1/2] airavata git commit: Modified computer resource.thrift file to support email based monitoring.

Repository: airavata
Updated Branches:
  refs/heads/emailMonitoring bf0fddb05 -> 66ac6b928


http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/SSHJobSubmission.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/SSHJobSubmission.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/SSHJobSubmission.java
index 4c19d31..a9bf275 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/SSHJobSubmission.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/SSHJobSubmission.java
@@ -67,6 +67,7 @@ import org.slf4j.LoggerFactory;
   private static final org.apache.thrift.protocol.TField ALTERNATIVE_SSHHOST_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("alternativeSSHHostName", org.apache.thrift.protocol.TType.STRING, (short)4);
   private static final org.apache.thrift.protocol.TField SSH_PORT_FIELD_DESC = new org.apache.thrift.protocol.TField("sshPort", org.apache.thrift.protocol.TType.I32, (short)5);
   private static final org.apache.thrift.protocol.TField MONITOR_MODE_FIELD_DESC = new org.apache.thrift.protocol.TField("monitorMode", org.apache.thrift.protocol.TType.I32, (short)6);
+  private static final org.apache.thrift.protocol.TField EMAIL_MONITOR_FIELD_DESC = new org.apache.thrift.protocol.TField("emailMonitor", org.apache.thrift.protocol.TType.STRUCT, (short)7);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -80,6 +81,7 @@ import org.slf4j.LoggerFactory;
   private String alternativeSSHHostName; // optional
   private int sshPort; // optional
   private MonitorMode monitorMode; // optional
+  private EmailMonitorProperty emailMonitor; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   @SuppressWarnings("all") public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -96,7 +98,8 @@ import org.slf4j.LoggerFactory;
      * 
      * @see MonitorMode
      */
-    MONITOR_MODE((short)6, "monitorMode");
+    MONITOR_MODE((short)6, "monitorMode"),
+    EMAIL_MONITOR((short)7, "emailMonitor");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -123,6 +126,8 @@ import org.slf4j.LoggerFactory;
           return SSH_PORT;
         case 6: // MONITOR_MODE
           return MONITOR_MODE;
+        case 7: // EMAIL_MONITOR
+          return EMAIL_MONITOR;
         default:
           return null;
       }
@@ -165,7 +170,7 @@ import org.slf4j.LoggerFactory;
   // isset id assignments
   private static final int __SSHPORT_ISSET_ID = 0;
   private byte __isset_bitfield = 0;
-  private _Fields optionals[] = {_Fields.ALTERNATIVE_SSHHOST_NAME,_Fields.SSH_PORT,_Fields.MONITOR_MODE};
+  private _Fields optionals[] = {_Fields.ALTERNATIVE_SSHHOST_NAME,_Fields.SSH_PORT,_Fields.MONITOR_MODE,_Fields.EMAIL_MONITOR};
   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -181,6 +186,8 @@ import org.slf4j.LoggerFactory;
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
     tmpMap.put(_Fields.MONITOR_MODE, new org.apache.thrift.meta_data.FieldMetaData("monitorMode", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, MonitorMode.class)));
+    tmpMap.put(_Fields.EMAIL_MONITOR, new org.apache.thrift.meta_data.FieldMetaData("emailMonitor", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, EmailMonitorProperty.class)));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(SSHJobSubmission.class, metaDataMap);
   }
@@ -224,6 +231,9 @@ import org.slf4j.LoggerFactory;
     if (other.isSetMonitorMode()) {
       this.monitorMode = other.monitorMode;
     }
+    if (other.isSetEmailMonitor()) {
+      this.emailMonitor = new EmailMonitorProperty(other.emailMonitor);
+    }
   }
 
   public SSHJobSubmission deepCopy() {
@@ -240,6 +250,7 @@ import org.slf4j.LoggerFactory;
     this.sshPort = 22;
 
     this.monitorMode = null;
+    this.emailMonitor = null;
   }
 
   public String getJobSubmissionInterfaceId() {
@@ -395,6 +406,29 @@ import org.slf4j.LoggerFactory;
     }
   }
 
+  public EmailMonitorProperty getEmailMonitor() {
+    return this.emailMonitor;
+  }
+
+  public void setEmailMonitor(EmailMonitorProperty emailMonitor) {
+    this.emailMonitor = emailMonitor;
+  }
+
+  public void unsetEmailMonitor() {
+    this.emailMonitor = null;
+  }
+
+  /** Returns true if field emailMonitor is set (has been assigned a value) and false otherwise */
+  public boolean isSetEmailMonitor() {
+    return this.emailMonitor != null;
+  }
+
+  public void setEmailMonitorIsSet(boolean value) {
+    if (!value) {
+      this.emailMonitor = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case JOB_SUBMISSION_INTERFACE_ID:
@@ -445,6 +479,14 @@ import org.slf4j.LoggerFactory;
       }
       break;
 
+    case EMAIL_MONITOR:
+      if (value == null) {
+        unsetEmailMonitor();
+      } else {
+        setEmailMonitor((EmailMonitorProperty)value);
+      }
+      break;
+
     }
   }
 
@@ -468,6 +510,9 @@ import org.slf4j.LoggerFactory;
     case MONITOR_MODE:
       return getMonitorMode();
 
+    case EMAIL_MONITOR:
+      return getEmailMonitor();
+
     }
     throw new IllegalStateException();
   }
@@ -491,6 +536,8 @@ import org.slf4j.LoggerFactory;
       return isSetSshPort();
     case MONITOR_MODE:
       return isSetMonitorMode();
+    case EMAIL_MONITOR:
+      return isSetEmailMonitor();
     }
     throw new IllegalStateException();
   }
@@ -562,6 +609,15 @@ import org.slf4j.LoggerFactory;
         return false;
     }
 
+    boolean this_present_emailMonitor = true && this.isSetEmailMonitor();
+    boolean that_present_emailMonitor = true && that.isSetEmailMonitor();
+    if (this_present_emailMonitor || that_present_emailMonitor) {
+      if (!(this_present_emailMonitor && that_present_emailMonitor))
+        return false;
+      if (!this.emailMonitor.equals(that.emailMonitor))
+        return false;
+    }
+
     return true;
   }
 
@@ -638,6 +694,16 @@ import org.slf4j.LoggerFactory;
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetEmailMonitor()).compareTo(other.isSetEmailMonitor());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetEmailMonitor()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.emailMonitor, other.emailMonitor);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -707,6 +773,16 @@ import org.slf4j.LoggerFactory;
       }
       first = false;
     }
+    if (isSetEmailMonitor()) {
+      if (!first) sb.append(", ");
+      sb.append("emailMonitor:");
+      if (this.emailMonitor == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.emailMonitor);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -729,6 +805,9 @@ import org.slf4j.LoggerFactory;
     if (resourceJobManager != null) {
       resourceJobManager.validate();
     }
+    if (emailMonitor != null) {
+      emailMonitor.validate();
+    }
   }
 
   private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
@@ -816,6 +895,15 @@ import org.slf4j.LoggerFactory;
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 7: // EMAIL_MONITOR
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+              struct.emailMonitor = new EmailMonitorProperty();
+              struct.emailMonitor.read(iprot);
+              struct.setEmailMonitorIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -863,6 +951,13 @@ import org.slf4j.LoggerFactory;
           oprot.writeFieldEnd();
         }
       }
+      if (struct.emailMonitor != null) {
+        if (struct.isSetEmailMonitor()) {
+          oprot.writeFieldBegin(EMAIL_MONITOR_FIELD_DESC);
+          struct.emailMonitor.write(oprot);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -893,7 +988,10 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetMonitorMode()) {
         optionals.set(2);
       }
-      oprot.writeBitSet(optionals, 3);
+      if (struct.isSetEmailMonitor()) {
+        optionals.set(3);
+      }
+      oprot.writeBitSet(optionals, 4);
       if (struct.isSetAlternativeSSHHostName()) {
         oprot.writeString(struct.alternativeSSHHostName);
       }
@@ -903,6 +1001,9 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetMonitorMode()) {
         oprot.writeI32(struct.monitorMode.getValue());
       }
+      if (struct.isSetEmailMonitor()) {
+        struct.emailMonitor.write(oprot);
+      }
     }
 
     @Override
@@ -915,7 +1016,7 @@ import org.slf4j.LoggerFactory;
       struct.resourceJobManager = new ResourceJobManager();
       struct.resourceJobManager.read(iprot);
       struct.setResourceJobManagerIsSet(true);
-      BitSet incoming = iprot.readBitSet(3);
+      BitSet incoming = iprot.readBitSet(4);
       if (incoming.get(0)) {
         struct.alternativeSSHHostName = iprot.readString();
         struct.setAlternativeSSHHostNameIsSet(true);
@@ -928,6 +1029,11 @@ import org.slf4j.LoggerFactory;
         struct.monitorMode = MonitorMode.findByValue(iprot.readI32());
         struct.setMonitorModeIsSet(true);
       }
+      if (incoming.get(3)) {
+        struct.emailMonitor = new EmailMonitorProperty();
+        struct.emailMonitor.read(iprot);
+        struct.setEmailMonitorIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/thrift-interface-descriptions/computeResourceModel.thrift
----------------------------------------------------------------------
diff --git a/airavata-api/thrift-interface-descriptions/computeResourceModel.thrift b/airavata-api/thrift-interface-descriptions/computeResourceModel.thrift
index 929e677..cf9b06c 100644
--- a/airavata-api/thrift-interface-descriptions/computeResourceModel.thrift
+++ b/airavata-api/thrift-interface-descriptions/computeResourceModel.thrift
@@ -208,10 +208,37 @@ enum JobSubmissionProtocol {
 **/
 enum MonitorMode {
    POLL_JOB_MANAGER,
+   JOB_EMAIL_NOTIFICATION_MONITOR,
    XSEDE_AMQP_SUBSCRIBE
 }
 
 /**
+* Email protocol
+**/
+enum EmailProtocol{
+    POP3,
+    IMAPS
+}
+
+
+/**
+* Email Monitoring Properties
+*
+* host : email host address
+* emailAddress : address which should get email notification
+* password : password to access email address
+* folderName : email folder name default is INBOX
+* storeProtocol : type of store protocol
+**/
+struct EmailMonitorProperty {
+    1: required string host,
+    2: required string emailAddress,
+    3: required string password,
+    4: required string folderName = "INBOX",
+    5: required EmailProtocol storeProtocol
+}
+
+/**
  * Enumeration of data movement supported by Airavata
  *
  * SCP:
@@ -320,7 +347,8 @@ struct SSHJobSubmission {
     3: required ResourceJobManager resourceJobManager,
     4: optional string alternativeSSHHostName,
     5: optional i32 sshPort = 22,
-    6: optional MonitorMode monitorMode
+    6: optional MonitorMode monitorMode,
+    7: optional EmailMonitorProperty emailMonitor
 }
 
 struct GlobusJobSubmission {


[2/2] airavata git commit: Modified computer resource.thrift file to support email based monitoring.

Posted by sh...@apache.org.
Modified computer resource.thrift file to support email based monitoring.


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/66ac6b92
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/66ac6b92
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/66ac6b92

Branch: refs/heads/emailMonitoring
Commit: 66ac6b9287f7971f5e01901c8ada37ed669cb587
Parents: bf0fddb
Author: shamrath <sh...@gmail.com>
Authored: Wed Apr 8 17:06:37 2015 -0400
Committer: shamrath <sh...@gmail.com>
Committed: Wed Apr 8 17:06:37 2015 -0400

----------------------------------------------------------------------
 .../lib/airavata/computeResourceModel_types.cpp | 400 ++++++---
 .../lib/airavata/computeResourceModel_types.h   |  94 ++-
 .../Model/AppCatalog/ComputeResource/Types.php  | 192 ++++-
 .../model/appcatalog/computeresource/ttypes.py  | 169 +++-
 .../airavata/model/messaging/event/ttypes.py    |  79 ++
 .../computeresource/EmailMonitorProperty.java   | 805 +++++++++++++++++++
 .../computeresource/EmailProtocol.java          |  66 ++
 .../appcatalog/computeresource/MonitorMode.java |   5 +-
 .../computeresource/SSHJobSubmission.java       | 114 ++-
 .../computeResourceModel.thrift                 |  30 +-
 10 files changed, 1816 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.cpp
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.cpp b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.cpp
index d54c519..8b83573 100644
--- a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.cpp
+++ b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.cpp
@@ -113,13 +113,25 @@ const std::map<int, const char*> _JobSubmissionProtocol_VALUES_TO_NAMES(::apache
 
 int _kMonitorModeValues[] = {
   MonitorMode::POLL_JOB_MANAGER,
+  MonitorMode::JOB_EMAIL_NOTIFICATION_MONITOR,
   MonitorMode::XSEDE_AMQP_SUBSCRIBE
 };
 const char* _kMonitorModeNames[] = {
   "POLL_JOB_MANAGER",
+  "JOB_EMAIL_NOTIFICATION_MONITOR",
   "XSEDE_AMQP_SUBSCRIBE"
 };
-const std::map<int, const char*> _MonitorMode_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(2, _kMonitorModeValues, _kMonitorModeNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL));
+const std::map<int, const char*> _MonitorMode_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(3, _kMonitorModeValues, _kMonitorModeNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL));
+
+int _kEmailProtocolValues[] = {
+  EmailProtocol::POP3,
+  EmailProtocol::IMAPS
+};
+const char* _kEmailProtocolNames[] = {
+  "POP3",
+  "IMAPS"
+};
+const std::map<int, const char*> _EmailProtocol_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(2, _kEmailProtocolValues, _kEmailProtocolNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL));
 
 int _kDataMovementProtocolValues[] = {
   DataMovementProtocol::LOCAL,
@@ -449,6 +461,136 @@ void swap(BatchQueue &a, BatchQueue &b) {
   swap(a.__isset, b.__isset);
 }
 
+const char* EmailMonitorProperty::ascii_fingerprint = "1991A6BD46E68BF843F10524459D65B1";
+const uint8_t EmailMonitorProperty::binary_fingerprint[16] = {0x19,0x91,0xA6,0xBD,0x46,0xE6,0x8B,0xF8,0x43,0xF1,0x05,0x24,0x45,0x9D,0x65,0xB1};
+
+uint32_t EmailMonitorProperty::read(::apache::thrift::protocol::TProtocol* iprot) {
+
+  uint32_t xfer = 0;
+  std::string fname;
+  ::apache::thrift::protocol::TType ftype;
+  int16_t fid;
+
+  xfer += iprot->readStructBegin(fname);
+
+  using ::apache::thrift::protocol::TProtocolException;
+
+  bool isset_host = false;
+  bool isset_emailAddress = false;
+  bool isset_password = false;
+  bool isset_folderName = false;
+  bool isset_storeProtocol = false;
+
+  while (true)
+  {
+    xfer += iprot->readFieldBegin(fname, ftype, fid);
+    if (ftype == ::apache::thrift::protocol::T_STOP) {
+      break;
+    }
+    switch (fid)
+    {
+      case 1:
+        if (ftype == ::apache::thrift::protocol::T_STRING) {
+          xfer += iprot->readString(this->host);
+          isset_host = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      case 2:
+        if (ftype == ::apache::thrift::protocol::T_STRING) {
+          xfer += iprot->readString(this->emailAddress);
+          isset_emailAddress = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      case 3:
+        if (ftype == ::apache::thrift::protocol::T_STRING) {
+          xfer += iprot->readString(this->password);
+          isset_password = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      case 4:
+        if (ftype == ::apache::thrift::protocol::T_STRING) {
+          xfer += iprot->readString(this->folderName);
+          isset_folderName = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      case 5:
+        if (ftype == ::apache::thrift::protocol::T_I32) {
+          int32_t ecast10;
+          xfer += iprot->readI32(ecast10);
+          this->storeProtocol = (EmailProtocol::type)ecast10;
+          isset_storeProtocol = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      default:
+        xfer += iprot->skip(ftype);
+        break;
+    }
+    xfer += iprot->readFieldEnd();
+  }
+
+  xfer += iprot->readStructEnd();
+
+  if (!isset_host)
+    throw TProtocolException(TProtocolException::INVALID_DATA);
+  if (!isset_emailAddress)
+    throw TProtocolException(TProtocolException::INVALID_DATA);
+  if (!isset_password)
+    throw TProtocolException(TProtocolException::INVALID_DATA);
+  if (!isset_folderName)
+    throw TProtocolException(TProtocolException::INVALID_DATA);
+  if (!isset_storeProtocol)
+    throw TProtocolException(TProtocolException::INVALID_DATA);
+  return xfer;
+}
+
+uint32_t EmailMonitorProperty::write(::apache::thrift::protocol::TProtocol* oprot) const {
+  uint32_t xfer = 0;
+  xfer += oprot->writeStructBegin("EmailMonitorProperty");
+
+  xfer += oprot->writeFieldBegin("host", ::apache::thrift::protocol::T_STRING, 1);
+  xfer += oprot->writeString(this->host);
+  xfer += oprot->writeFieldEnd();
+
+  xfer += oprot->writeFieldBegin("emailAddress", ::apache::thrift::protocol::T_STRING, 2);
+  xfer += oprot->writeString(this->emailAddress);
+  xfer += oprot->writeFieldEnd();
+
+  xfer += oprot->writeFieldBegin("password", ::apache::thrift::protocol::T_STRING, 3);
+  xfer += oprot->writeString(this->password);
+  xfer += oprot->writeFieldEnd();
+
+  xfer += oprot->writeFieldBegin("folderName", ::apache::thrift::protocol::T_STRING, 4);
+  xfer += oprot->writeString(this->folderName);
+  xfer += oprot->writeFieldEnd();
+
+  xfer += oprot->writeFieldBegin("storeProtocol", ::apache::thrift::protocol::T_I32, 5);
+  xfer += oprot->writeI32((int32_t)this->storeProtocol);
+  xfer += oprot->writeFieldEnd();
+
+  xfer += oprot->writeFieldStop();
+  xfer += oprot->writeStructEnd();
+  return xfer;
+}
+
+void swap(EmailMonitorProperty &a, EmailMonitorProperty &b) {
+  using ::std::swap;
+  swap(a.host, b.host);
+  swap(a.emailAddress, b.emailAddress);
+  swap(a.password, b.password);
+  swap(a.folderName, b.folderName);
+  swap(a.storeProtocol, b.storeProtocol);
+}
+
 const char* SCPDataMovement::ascii_fingerprint = "63CAE6EE336A7DBD91CCCD6E22628F4A";
 const uint8_t SCPDataMovement::binary_fingerprint[16] = {0x63,0xCA,0xE6,0xEE,0x33,0x6A,0x7D,0xBD,0x91,0xCC,0xCD,0x6E,0x22,0x62,0x8F,0x4A};
 
@@ -484,9 +626,9 @@ uint32_t SCPDataMovement::read(::apache::thrift::protocol::TProtocol* iprot) {
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast10;
-          xfer += iprot->readI32(ecast10);
-          this->securityProtocol = (SecurityProtocol::type)ecast10;
+          int32_t ecast11;
+          xfer += iprot->readI32(ecast11);
+          this->securityProtocol = (SecurityProtocol::type)ecast11;
           isset_securityProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -596,9 +738,9 @@ uint32_t GridFTPDataMovement::read(::apache::thrift::protocol::TProtocol* iprot)
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast11;
-          xfer += iprot->readI32(ecast11);
-          this->securityProtocol = (SecurityProtocol::type)ecast11;
+          int32_t ecast12;
+          xfer += iprot->readI32(ecast12);
+          this->securityProtocol = (SecurityProtocol::type)ecast12;
           isset_securityProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -608,14 +750,14 @@ uint32_t GridFTPDataMovement::read(::apache::thrift::protocol::TProtocol* iprot)
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->gridFTPEndPoints.clear();
-            uint32_t _size12;
-            ::apache::thrift::protocol::TType _etype15;
-            xfer += iprot->readListBegin(_etype15, _size12);
-            this->gridFTPEndPoints.resize(_size12);
-            uint32_t _i16;
-            for (_i16 = 0; _i16 < _size12; ++_i16)
+            uint32_t _size13;
+            ::apache::thrift::protocol::TType _etype16;
+            xfer += iprot->readListBegin(_etype16, _size13);
+            this->gridFTPEndPoints.resize(_size13);
+            uint32_t _i17;
+            for (_i17 = 0; _i17 < _size13; ++_i17)
             {
-              xfer += iprot->readString(this->gridFTPEndPoints[_i16]);
+              xfer += iprot->readString(this->gridFTPEndPoints[_i17]);
             }
             xfer += iprot->readListEnd();
           }
@@ -657,10 +799,10 @@ uint32_t GridFTPDataMovement::write(::apache::thrift::protocol::TProtocol* oprot
   xfer += oprot->writeFieldBegin("gridFTPEndPoints", ::apache::thrift::protocol::T_LIST, 3);
   {
     xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast<uint32_t>(this->gridFTPEndPoints.size()));
-    std::vector<std::string> ::const_iterator _iter17;
-    for (_iter17 = this->gridFTPEndPoints.begin(); _iter17 != this->gridFTPEndPoints.end(); ++_iter17)
+    std::vector<std::string> ::const_iterator _iter18;
+    for (_iter18 = this->gridFTPEndPoints.begin(); _iter18 != this->gridFTPEndPoints.end(); ++_iter18)
     {
-      xfer += oprot->writeString((*_iter17));
+      xfer += oprot->writeString((*_iter18));
     }
     xfer += oprot->writeListEnd();
   }
@@ -714,9 +856,9 @@ uint32_t UnicoreDataMovement::read(::apache::thrift::protocol::TProtocol* iprot)
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast18;
-          xfer += iprot->readI32(ecast18);
-          this->securityProtocol = (SecurityProtocol::type)ecast18;
+          int32_t ecast19;
+          xfer += iprot->readI32(ecast19);
+          this->securityProtocol = (SecurityProtocol::type)ecast19;
           isset_securityProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -920,8 +1062,8 @@ void swap(LOCALDataMovement &a, LOCALDataMovement &b) {
   swap(a.dataMovementInterfaceId, b.dataMovementInterfaceId);
 }
 
-const char* SSHJobSubmission::ascii_fingerprint = "A62183DAA7AFF027173705420A9D99D0";
-const uint8_t SSHJobSubmission::binary_fingerprint[16] = {0xA6,0x21,0x83,0xDA,0xA7,0xAF,0xF0,0x27,0x17,0x37,0x05,0x42,0x0A,0x9D,0x99,0xD0};
+const char* SSHJobSubmission::ascii_fingerprint = "C2237B7244CABB71130AEE137701206F";
+const uint8_t SSHJobSubmission::binary_fingerprint[16] = {0xC2,0x23,0x7B,0x72,0x44,0xCA,0xBB,0x71,0x13,0x0A,0xEE,0x13,0x77,0x01,0x20,0x6F};
 
 uint32_t SSHJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot) {
 
@@ -956,9 +1098,9 @@ uint32_t SSHJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot) {
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast19;
-          xfer += iprot->readI32(ecast19);
-          this->securityProtocol = (SecurityProtocol::type)ecast19;
+          int32_t ecast20;
+          xfer += iprot->readI32(ecast20);
+          this->securityProtocol = (SecurityProtocol::type)ecast20;
           isset_securityProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -990,14 +1132,22 @@ uint32_t SSHJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot) {
         break;
       case 6:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast20;
-          xfer += iprot->readI32(ecast20);
-          this->monitorMode = (MonitorMode::type)ecast20;
+          int32_t ecast21;
+          xfer += iprot->readI32(ecast21);
+          this->monitorMode = (MonitorMode::type)ecast21;
           this->__isset.monitorMode = true;
         } else {
           xfer += iprot->skip(ftype);
         }
         break;
+      case 7:
+        if (ftype == ::apache::thrift::protocol::T_STRUCT) {
+          xfer += this->emailMonitor.read(iprot);
+          this->__isset.emailMonitor = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
       default:
         xfer += iprot->skip(ftype);
         break;
@@ -1047,6 +1197,11 @@ uint32_t SSHJobSubmission::write(::apache::thrift::protocol::TProtocol* oprot) c
     xfer += oprot->writeI32((int32_t)this->monitorMode);
     xfer += oprot->writeFieldEnd();
   }
+  if (this->__isset.emailMonitor) {
+    xfer += oprot->writeFieldBegin("emailMonitor", ::apache::thrift::protocol::T_STRUCT, 7);
+    xfer += this->emailMonitor.write(oprot);
+    xfer += oprot->writeFieldEnd();
+  }
   xfer += oprot->writeFieldStop();
   xfer += oprot->writeStructEnd();
   return xfer;
@@ -1060,6 +1215,7 @@ void swap(SSHJobSubmission &a, SSHJobSubmission &b) {
   swap(a.alternativeSSHHostName, b.alternativeSSHHostName);
   swap(a.sshPort, b.sshPort);
   swap(a.monitorMode, b.monitorMode);
+  swap(a.emailMonitor, b.emailMonitor);
   swap(a.__isset, b.__isset);
 }
 
@@ -1098,9 +1254,9 @@ uint32_t GlobusJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot)
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast21;
-          xfer += iprot->readI32(ecast21);
-          this->securityProtocol = (SecurityProtocol::type)ecast21;
+          int32_t ecast22;
+          xfer += iprot->readI32(ecast22);
+          this->securityProtocol = (SecurityProtocol::type)ecast22;
           isset_securityProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -1110,14 +1266,14 @@ uint32_t GlobusJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot)
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->globusGateKeeperEndPoint.clear();
-            uint32_t _size22;
-            ::apache::thrift::protocol::TType _etype25;
-            xfer += iprot->readListBegin(_etype25, _size22);
-            this->globusGateKeeperEndPoint.resize(_size22);
-            uint32_t _i26;
-            for (_i26 = 0; _i26 < _size22; ++_i26)
+            uint32_t _size23;
+            ::apache::thrift::protocol::TType _etype26;
+            xfer += iprot->readListBegin(_etype26, _size23);
+            this->globusGateKeeperEndPoint.resize(_size23);
+            uint32_t _i27;
+            for (_i27 = 0; _i27 < _size23; ++_i27)
             {
-              xfer += iprot->readString(this->globusGateKeeperEndPoint[_i26]);
+              xfer += iprot->readString(this->globusGateKeeperEndPoint[_i27]);
             }
             xfer += iprot->readListEnd();
           }
@@ -1158,10 +1314,10 @@ uint32_t GlobusJobSubmission::write(::apache::thrift::protocol::TProtocol* oprot
     xfer += oprot->writeFieldBegin("globusGateKeeperEndPoint", ::apache::thrift::protocol::T_LIST, 3);
     {
       xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast<uint32_t>(this->globusGateKeeperEndPoint.size()));
-      std::vector<std::string> ::const_iterator _iter27;
-      for (_iter27 = this->globusGateKeeperEndPoint.begin(); _iter27 != this->globusGateKeeperEndPoint.end(); ++_iter27)
+      std::vector<std::string> ::const_iterator _iter28;
+      for (_iter28 = this->globusGateKeeperEndPoint.begin(); _iter28 != this->globusGateKeeperEndPoint.end(); ++_iter28)
       {
-        xfer += oprot->writeString((*_iter27));
+        xfer += oprot->writeString((*_iter28));
       }
       xfer += oprot->writeListEnd();
     }
@@ -1216,9 +1372,9 @@ uint32_t UnicoreJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast28;
-          xfer += iprot->readI32(ecast28);
-          this->securityProtocol = (SecurityProtocol::type)ecast28;
+          int32_t ecast29;
+          xfer += iprot->readI32(ecast29);
+          this->securityProtocol = (SecurityProtocol::type)ecast29;
           isset_securityProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -1317,9 +1473,9 @@ uint32_t CloudJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot)
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast29;
-          xfer += iprot->readI32(ecast29);
-          this->securityProtocol = (SecurityProtocol::type)ecast29;
+          int32_t ecast30;
+          xfer += iprot->readI32(ecast30);
+          this->securityProtocol = (SecurityProtocol::type)ecast30;
           isset_securityProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -1343,9 +1499,9 @@ uint32_t CloudJobSubmission::read(::apache::thrift::protocol::TProtocol* iprot)
         break;
       case 5:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast30;
-          xfer += iprot->readI32(ecast30);
-          this->providerName = (ProviderName::type)ecast30;
+          int32_t ecast31;
+          xfer += iprot->readI32(ecast31);
+          this->providerName = (ProviderName::type)ecast31;
           isset_providerName = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -1462,9 +1618,9 @@ uint32_t JobSubmissionInterface::read(::apache::thrift::protocol::TProtocol* ipr
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast31;
-          xfer += iprot->readI32(ecast31);
-          this->jobSubmissionProtocol = (JobSubmissionProtocol::type)ecast31;
+          int32_t ecast32;
+          xfer += iprot->readI32(ecast32);
+          this->jobSubmissionProtocol = (JobSubmissionProtocol::type)ecast32;
           isset_jobSubmissionProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -1560,9 +1716,9 @@ uint32_t DataMovementInterface::read(::apache::thrift::protocol::TProtocol* ipro
         break;
       case 2:
         if (ftype == ::apache::thrift::protocol::T_I32) {
-          int32_t ecast32;
-          xfer += iprot->readI32(ecast32);
-          this->dataMovementProtocol = (DataMovementProtocol::type)ecast32;
+          int32_t ecast33;
+          xfer += iprot->readI32(ecast33);
+          this->dataMovementProtocol = (DataMovementProtocol::type)ecast33;
           isset_dataMovementProtocol = true;
         } else {
           xfer += iprot->skip(ftype);
@@ -1667,14 +1823,14 @@ uint32_t ComputeResourceDescription::read(::apache::thrift::protocol::TProtocol*
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->hostAliases.clear();
-            uint32_t _size33;
-            ::apache::thrift::protocol::TType _etype36;
-            xfer += iprot->readListBegin(_etype36, _size33);
-            this->hostAliases.resize(_size33);
-            uint32_t _i37;
-            for (_i37 = 0; _i37 < _size33; ++_i37)
+            uint32_t _size34;
+            ::apache::thrift::protocol::TType _etype37;
+            xfer += iprot->readListBegin(_etype37, _size34);
+            this->hostAliases.resize(_size34);
+            uint32_t _i38;
+            for (_i38 = 0; _i38 < _size34; ++_i38)
             {
-              xfer += iprot->readString(this->hostAliases[_i37]);
+              xfer += iprot->readString(this->hostAliases[_i38]);
             }
             xfer += iprot->readListEnd();
           }
@@ -1687,14 +1843,14 @@ uint32_t ComputeResourceDescription::read(::apache::thrift::protocol::TProtocol*
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->ipAddresses.clear();
-            uint32_t _size38;
-            ::apache::thrift::protocol::TType _etype41;
-            xfer += iprot->readListBegin(_etype41, _size38);
-            this->ipAddresses.resize(_size38);
-            uint32_t _i42;
-            for (_i42 = 0; _i42 < _size38; ++_i42)
+            uint32_t _size39;
+            ::apache::thrift::protocol::TType _etype42;
+            xfer += iprot->readListBegin(_etype42, _size39);
+            this->ipAddresses.resize(_size39);
+            uint32_t _i43;
+            for (_i43 = 0; _i43 < _size39; ++_i43)
             {
-              xfer += iprot->readString(this->ipAddresses[_i42]);
+              xfer += iprot->readString(this->ipAddresses[_i43]);
             }
             xfer += iprot->readListEnd();
           }
@@ -1715,14 +1871,14 @@ uint32_t ComputeResourceDescription::read(::apache::thrift::protocol::TProtocol*
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->batchQueues.clear();
-            uint32_t _size43;
-            ::apache::thrift::protocol::TType _etype46;
-            xfer += iprot->readListBegin(_etype46, _size43);
-            this->batchQueues.resize(_size43);
-            uint32_t _i47;
-            for (_i47 = 0; _i47 < _size43; ++_i47)
+            uint32_t _size44;
+            ::apache::thrift::protocol::TType _etype47;
+            xfer += iprot->readListBegin(_etype47, _size44);
+            this->batchQueues.resize(_size44);
+            uint32_t _i48;
+            for (_i48 = 0; _i48 < _size44; ++_i48)
             {
-              xfer += this->batchQueues[_i47].read(iprot);
+              xfer += this->batchQueues[_i48].read(iprot);
             }
             xfer += iprot->readListEnd();
           }
@@ -1735,19 +1891,19 @@ uint32_t ComputeResourceDescription::read(::apache::thrift::protocol::TProtocol*
         if (ftype == ::apache::thrift::protocol::T_MAP) {
           {
             this->fileSystems.clear();
-            uint32_t _size48;
-            ::apache::thrift::protocol::TType _ktype49;
-            ::apache::thrift::protocol::TType _vtype50;
-            xfer += iprot->readMapBegin(_ktype49, _vtype50, _size48);
-            uint32_t _i52;
-            for (_i52 = 0; _i52 < _size48; ++_i52)
+            uint32_t _size49;
+            ::apache::thrift::protocol::TType _ktype50;
+            ::apache::thrift::protocol::TType _vtype51;
+            xfer += iprot->readMapBegin(_ktype50, _vtype51, _size49);
+            uint32_t _i53;
+            for (_i53 = 0; _i53 < _size49; ++_i53)
             {
-              FileSystems::type _key53;
-              int32_t ecast55;
-              xfer += iprot->readI32(ecast55);
-              _key53 = (FileSystems::type)ecast55;
-              std::string& _val54 = this->fileSystems[_key53];
-              xfer += iprot->readString(_val54);
+              FileSystems::type _key54;
+              int32_t ecast56;
+              xfer += iprot->readI32(ecast56);
+              _key54 = (FileSystems::type)ecast56;
+              std::string& _val55 = this->fileSystems[_key54];
+              xfer += iprot->readString(_val55);
             }
             xfer += iprot->readMapEnd();
           }
@@ -1760,14 +1916,14 @@ uint32_t ComputeResourceDescription::read(::apache::thrift::protocol::TProtocol*
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->jobSubmissionInterfaces.clear();
-            uint32_t _size56;
-            ::apache::thrift::protocol::TType _etype59;
-            xfer += iprot->readListBegin(_etype59, _size56);
-            this->jobSubmissionInterfaces.resize(_size56);
-            uint32_t _i60;
-            for (_i60 = 0; _i60 < _size56; ++_i60)
+            uint32_t _size57;
+            ::apache::thrift::protocol::TType _etype60;
+            xfer += iprot->readListBegin(_etype60, _size57);
+            this->jobSubmissionInterfaces.resize(_size57);
+            uint32_t _i61;
+            for (_i61 = 0; _i61 < _size57; ++_i61)
             {
-              xfer += this->jobSubmissionInterfaces[_i60].read(iprot);
+              xfer += this->jobSubmissionInterfaces[_i61].read(iprot);
             }
             xfer += iprot->readListEnd();
           }
@@ -1780,14 +1936,14 @@ uint32_t ComputeResourceDescription::read(::apache::thrift::protocol::TProtocol*
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->dataMovementInterfaces.clear();
-            uint32_t _size61;
-            ::apache::thrift::protocol::TType _etype64;
-            xfer += iprot->readListBegin(_etype64, _size61);
-            this->dataMovementInterfaces.resize(_size61);
-            uint32_t _i65;
-            for (_i65 = 0; _i65 < _size61; ++_i65)
+            uint32_t _size62;
+            ::apache::thrift::protocol::TType _etype65;
+            xfer += iprot->readListBegin(_etype65, _size62);
+            this->dataMovementInterfaces.resize(_size62);
+            uint32_t _i66;
+            for (_i66 = 0; _i66 < _size62; ++_i66)
             {
-              xfer += this->dataMovementInterfaces[_i65].read(iprot);
+              xfer += this->dataMovementInterfaces[_i66].read(iprot);
             }
             xfer += iprot->readListEnd();
           }
@@ -1836,10 +1992,10 @@ uint32_t ComputeResourceDescription::write(::apache::thrift::protocol::TProtocol
     xfer += oprot->writeFieldBegin("hostAliases", ::apache::thrift::protocol::T_LIST, 3);
     {
       xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast<uint32_t>(this->hostAliases.size()));
-      std::vector<std::string> ::const_iterator _iter66;
-      for (_iter66 = this->hostAliases.begin(); _iter66 != this->hostAliases.end(); ++_iter66)
+      std::vector<std::string> ::const_iterator _iter67;
+      for (_iter67 = this->hostAliases.begin(); _iter67 != this->hostAliases.end(); ++_iter67)
       {
-        xfer += oprot->writeString((*_iter66));
+        xfer += oprot->writeString((*_iter67));
       }
       xfer += oprot->writeListEnd();
     }
@@ -1849,10 +2005,10 @@ uint32_t ComputeResourceDescription::write(::apache::thrift::protocol::TProtocol
     xfer += oprot->writeFieldBegin("ipAddresses", ::apache::thrift::protocol::T_LIST, 4);
     {
       xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast<uint32_t>(this->ipAddresses.size()));
-      std::vector<std::string> ::const_iterator _iter67;
-      for (_iter67 = this->ipAddresses.begin(); _iter67 != this->ipAddresses.end(); ++_iter67)
+      std::vector<std::string> ::const_iterator _iter68;
+      for (_iter68 = this->ipAddresses.begin(); _iter68 != this->ipAddresses.end(); ++_iter68)
       {
-        xfer += oprot->writeString((*_iter67));
+        xfer += oprot->writeString((*_iter68));
       }
       xfer += oprot->writeListEnd();
     }
@@ -1867,10 +2023,10 @@ uint32_t ComputeResourceDescription::write(::apache::thrift::protocol::TProtocol
     xfer += oprot->writeFieldBegin("batchQueues", ::apache::thrift::protocol::T_LIST, 6);
     {
       xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast<uint32_t>(this->batchQueues.size()));
-      std::vector<BatchQueue> ::const_iterator _iter68;
-      for (_iter68 = this->batchQueues.begin(); _iter68 != this->batchQueues.end(); ++_iter68)
+      std::vector<BatchQueue> ::const_iterator _iter69;
+      for (_iter69 = this->batchQueues.begin(); _iter69 != this->batchQueues.end(); ++_iter69)
       {
-        xfer += (*_iter68).write(oprot);
+        xfer += (*_iter69).write(oprot);
       }
       xfer += oprot->writeListEnd();
     }
@@ -1880,11 +2036,11 @@ uint32_t ComputeResourceDescription::write(::apache::thrift::protocol::TProtocol
     xfer += oprot->writeFieldBegin("fileSystems", ::apache::thrift::protocol::T_MAP, 7);
     {
       xfer += oprot->writeMapBegin(::apache::thrift::protocol::T_I32, ::apache::thrift::protocol::T_STRING, static_cast<uint32_t>(this->fileSystems.size()));
-      std::map<FileSystems::type, std::string> ::const_iterator _iter69;
-      for (_iter69 = this->fileSystems.begin(); _iter69 != this->fileSystems.end(); ++_iter69)
+      std::map<FileSystems::type, std::string> ::const_iterator _iter70;
+      for (_iter70 = this->fileSystems.begin(); _iter70 != this->fileSystems.end(); ++_iter70)
       {
-        xfer += oprot->writeI32((int32_t)_iter69->first);
-        xfer += oprot->writeString(_iter69->second);
+        xfer += oprot->writeI32((int32_t)_iter70->first);
+        xfer += oprot->writeString(_iter70->second);
       }
       xfer += oprot->writeMapEnd();
     }
@@ -1894,10 +2050,10 @@ uint32_t ComputeResourceDescription::write(::apache::thrift::protocol::TProtocol
     xfer += oprot->writeFieldBegin("jobSubmissionInterfaces", ::apache::thrift::protocol::T_LIST, 8);
     {
       xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast<uint32_t>(this->jobSubmissionInterfaces.size()));
-      std::vector<JobSubmissionInterface> ::const_iterator _iter70;
-      for (_iter70 = this->jobSubmissionInterfaces.begin(); _iter70 != this->jobSubmissionInterfaces.end(); ++_iter70)
+      std::vector<JobSubmissionInterface> ::const_iterator _iter71;
+      for (_iter71 = this->jobSubmissionInterfaces.begin(); _iter71 != this->jobSubmissionInterfaces.end(); ++_iter71)
       {
-        xfer += (*_iter70).write(oprot);
+        xfer += (*_iter71).write(oprot);
       }
       xfer += oprot->writeListEnd();
     }
@@ -1907,10 +2063,10 @@ uint32_t ComputeResourceDescription::write(::apache::thrift::protocol::TProtocol
     xfer += oprot->writeFieldBegin("dataMovementInterfaces", ::apache::thrift::protocol::T_LIST, 9);
     {
       xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast<uint32_t>(this->dataMovementInterfaces.size()));
-      std::vector<DataMovementInterface> ::const_iterator _iter71;
-      for (_iter71 = this->dataMovementInterfaces.begin(); _iter71 != this->dataMovementInterfaces.end(); ++_iter71)
+      std::vector<DataMovementInterface> ::const_iterator _iter72;
+      for (_iter72 = this->dataMovementInterfaces.begin(); _iter72 != this->dataMovementInterfaces.end(); ++_iter72)
       {
-        xfer += (*_iter71).write(oprot);
+        xfer += (*_iter72).write(oprot);
       }
       xfer += oprot->writeListEnd();
     }

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.h
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.h b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.h
index 76037b2..05a2dfd 100644
--- a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.h
+++ b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/computeResourceModel_types.h
@@ -99,12 +99,22 @@ extern const std::map<int, const char*> _JobSubmissionProtocol_VALUES_TO_NAMES;
 struct MonitorMode {
   enum type {
     POLL_JOB_MANAGER = 0,
-    XSEDE_AMQP_SUBSCRIBE = 1
+    JOB_EMAIL_NOTIFICATION_MONITOR = 1,
+    XSEDE_AMQP_SUBSCRIBE = 2
   };
 };
 
 extern const std::map<int, const char*> _MonitorMode_VALUES_TO_NAMES;
 
+struct EmailProtocol {
+  enum type {
+    POP3 = 0,
+    IMAPS = 1
+  };
+};
+
+extern const std::map<int, const char*> _EmailProtocol_VALUES_TO_NAMES;
+
 struct DataMovementProtocol {
   enum type {
     LOCAL = 0,
@@ -317,6 +327,71 @@ class BatchQueue {
 
 void swap(BatchQueue &a, BatchQueue &b);
 
+
+class EmailMonitorProperty {
+ public:
+
+  static const char* ascii_fingerprint; // = "1991A6BD46E68BF843F10524459D65B1";
+  static const uint8_t binary_fingerprint[16]; // = {0x19,0x91,0xA6,0xBD,0x46,0xE6,0x8B,0xF8,0x43,0xF1,0x05,0x24,0x45,0x9D,0x65,0xB1};
+
+  EmailMonitorProperty() : host(), emailAddress(), password(), folderName("INBOX"), storeProtocol((EmailProtocol::type)0) {
+  }
+
+  virtual ~EmailMonitorProperty() throw() {}
+
+  std::string host;
+  std::string emailAddress;
+  std::string password;
+  std::string folderName;
+  EmailProtocol::type storeProtocol;
+
+  void __set_host(const std::string& val) {
+    host = val;
+  }
+
+  void __set_emailAddress(const std::string& val) {
+    emailAddress = val;
+  }
+
+  void __set_password(const std::string& val) {
+    password = val;
+  }
+
+  void __set_folderName(const std::string& val) {
+    folderName = val;
+  }
+
+  void __set_storeProtocol(const EmailProtocol::type val) {
+    storeProtocol = val;
+  }
+
+  bool operator == (const EmailMonitorProperty & rhs) const
+  {
+    if (!(host == rhs.host))
+      return false;
+    if (!(emailAddress == rhs.emailAddress))
+      return false;
+    if (!(password == rhs.password))
+      return false;
+    if (!(folderName == rhs.folderName))
+      return false;
+    if (!(storeProtocol == rhs.storeProtocol))
+      return false;
+    return true;
+  }
+  bool operator != (const EmailMonitorProperty &rhs) const {
+    return !(*this == rhs);
+  }
+
+  bool operator < (const EmailMonitorProperty & ) const;
+
+  uint32_t read(::apache::thrift::protocol::TProtocol* iprot);
+  uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const;
+
+};
+
+void swap(EmailMonitorProperty &a, EmailMonitorProperty &b);
+
 typedef struct _SCPDataMovement__isset {
   _SCPDataMovement__isset() : alternativeSCPHostName(false), sshPort(true) {}
   bool alternativeSCPHostName;
@@ -572,17 +647,18 @@ class LOCALDataMovement {
 void swap(LOCALDataMovement &a, LOCALDataMovement &b);
 
 typedef struct _SSHJobSubmission__isset {
-  _SSHJobSubmission__isset() : alternativeSSHHostName(false), sshPort(true), monitorMode(false) {}
+  _SSHJobSubmission__isset() : alternativeSSHHostName(false), sshPort(true), monitorMode(false), emailMonitor(false) {}
   bool alternativeSSHHostName;
   bool sshPort;
   bool monitorMode;
+  bool emailMonitor;
 } _SSHJobSubmission__isset;
 
 class SSHJobSubmission {
  public:
 
-  static const char* ascii_fingerprint; // = "A62183DAA7AFF027173705420A9D99D0";
-  static const uint8_t binary_fingerprint[16]; // = {0xA6,0x21,0x83,0xDA,0xA7,0xAF,0xF0,0x27,0x17,0x37,0x05,0x42,0x0A,0x9D,0x99,0xD0};
+  static const char* ascii_fingerprint; // = "C2237B7244CABB71130AEE137701206F";
+  static const uint8_t binary_fingerprint[16]; // = {0xC2,0x23,0x7B,0x72,0x44,0xCA,0xBB,0x71,0x13,0x0A,0xEE,0x13,0x77,0x01,0x20,0x6F};
 
   SSHJobSubmission() : jobSubmissionInterfaceId("DO_NOT_SET_AT_CLIENTS"), securityProtocol((SecurityProtocol::type)0), alternativeSSHHostName(), sshPort(22), monitorMode((MonitorMode::type)0) {
   }
@@ -595,6 +671,7 @@ class SSHJobSubmission {
   std::string alternativeSSHHostName;
   int32_t sshPort;
   MonitorMode::type monitorMode;
+  EmailMonitorProperty emailMonitor;
 
   _SSHJobSubmission__isset __isset;
 
@@ -625,6 +702,11 @@ class SSHJobSubmission {
     __isset.monitorMode = true;
   }
 
+  void __set_emailMonitor(const EmailMonitorProperty& val) {
+    emailMonitor = val;
+    __isset.emailMonitor = true;
+  }
+
   bool operator == (const SSHJobSubmission & rhs) const
   {
     if (!(jobSubmissionInterfaceId == rhs.jobSubmissionInterfaceId))
@@ -645,6 +727,10 @@ class SSHJobSubmission {
       return false;
     else if (__isset.monitorMode && !(monitorMode == rhs.monitorMode))
       return false;
+    if (__isset.emailMonitor != rhs.__isset.emailMonitor)
+      return false;
+    else if (__isset.emailMonitor && !(emailMonitor == rhs.emailMonitor))
+      return false;
     return true;
   }
   bool operator != (const SSHJobSubmission &rhs) const {

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/ComputeResource/Types.php
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/ComputeResource/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/ComputeResource/Types.php
index 2280d94..e488087 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/ComputeResource/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/ComputeResource/Types.php
@@ -98,10 +98,21 @@ final class JobSubmissionProtocol {
 
 final class MonitorMode {
   const POLL_JOB_MANAGER = 0;
-  const XSEDE_AMQP_SUBSCRIBE = 1;
+  const JOB_EMAIL_NOTIFICATION_MONITOR = 1;
+  const XSEDE_AMQP_SUBSCRIBE = 2;
   static public $__names = array(
     0 => 'POLL_JOB_MANAGER',
-    1 => 'XSEDE_AMQP_SUBSCRIBE',
+    1 => 'JOB_EMAIL_NOTIFICATION_MONITOR',
+    2 => 'XSEDE_AMQP_SUBSCRIBE',
+  );
+}
+
+final class EmailProtocol {
+  const POP3 = 0;
+  const IMAPS = 1;
+  static public $__names = array(
+    0 => 'POP3',
+    1 => 'IMAPS',
   );
 }
 
@@ -509,6 +520,158 @@ class BatchQueue {
 
 }
 
+class EmailMonitorProperty {
+  static $_TSPEC;
+
+  public $host = null;
+  public $emailAddress = null;
+  public $password = null;
+  public $folderName = "INBOX";
+  public $storeProtocol = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'host',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'emailAddress',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'password',
+          'type' => TType::STRING,
+          ),
+        4 => array(
+          'var' => 'folderName',
+          'type' => TType::STRING,
+          ),
+        5 => array(
+          'var' => 'storeProtocol',
+          'type' => TType::I32,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['host'])) {
+        $this->host = $vals['host'];
+      }
+      if (isset($vals['emailAddress'])) {
+        $this->emailAddress = $vals['emailAddress'];
+      }
+      if (isset($vals['password'])) {
+        $this->password = $vals['password'];
+      }
+      if (isset($vals['folderName'])) {
+        $this->folderName = $vals['folderName'];
+      }
+      if (isset($vals['storeProtocol'])) {
+        $this->storeProtocol = $vals['storeProtocol'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'EmailMonitorProperty';
+  }
+
+  public function read($input)
+  {
+    $xfer = 0;
+    $fname = null;
+    $ftype = 0;
+    $fid = 0;
+    $xfer += $input->readStructBegin($fname);
+    while (true)
+    {
+      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
+      if ($ftype == TType::STOP) {
+        break;
+      }
+      switch ($fid)
+      {
+        case 1:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->host);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->emailAddress);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->password);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->folderName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->storeProtocol);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        default:
+          $xfer += $input->skip($ftype);
+          break;
+      }
+      $xfer += $input->readFieldEnd();
+    }
+    $xfer += $input->readStructEnd();
+    return $xfer;
+  }
+
+  public function write($output) {
+    $xfer = 0;
+    $xfer += $output->writeStructBegin('EmailMonitorProperty');
+    if ($this->host !== null) {
+      $xfer += $output->writeFieldBegin('host', TType::STRING, 1);
+      $xfer += $output->writeString($this->host);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->emailAddress !== null) {
+      $xfer += $output->writeFieldBegin('emailAddress', TType::STRING, 2);
+      $xfer += $output->writeString($this->emailAddress);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->password !== null) {
+      $xfer += $output->writeFieldBegin('password', TType::STRING, 3);
+      $xfer += $output->writeString($this->password);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->folderName !== null) {
+      $xfer += $output->writeFieldBegin('folderName', TType::STRING, 4);
+      $xfer += $output->writeString($this->folderName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->storeProtocol !== null) {
+      $xfer += $output->writeFieldBegin('storeProtocol', TType::I32, 5);
+      $xfer += $output->writeI32($this->storeProtocol);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
 class SCPDataMovement {
   static $_TSPEC;
 
@@ -1069,6 +1232,7 @@ class SSHJobSubmission {
   public $alternativeSSHHostName = null;
   public $sshPort = 22;
   public $monitorMode = null;
+  public $emailMonitor = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -1098,6 +1262,11 @@ class SSHJobSubmission {
           'var' => 'monitorMode',
           'type' => TType::I32,
           ),
+        7 => array(
+          'var' => 'emailMonitor',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\Model\AppCatalog\ComputeResource\EmailMonitorProperty',
+          ),
         );
     }
     if (is_array($vals)) {
@@ -1119,6 +1288,9 @@ class SSHJobSubmission {
       if (isset($vals['monitorMode'])) {
         $this->monitorMode = $vals['monitorMode'];
       }
+      if (isset($vals['emailMonitor'])) {
+        $this->emailMonitor = $vals['emailMonitor'];
+      }
     }
   }
 
@@ -1184,6 +1356,14 @@ class SSHJobSubmission {
             $xfer += $input->skip($ftype);
           }
           break;
+        case 7:
+          if ($ftype == TType::STRUCT) {
+            $this->emailMonitor = new \Airavata\Model\AppCatalog\ComputeResource\EmailMonitorProperty();
+            $xfer += $this->emailMonitor->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -1230,6 +1410,14 @@ class SSHJobSubmission {
       $xfer += $output->writeI32($this->monitorMode);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->emailMonitor !== null) {
+      if (!is_object($this->emailMonitor)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('emailMonitor', TType::STRUCT, 7);
+      $xfer += $this->emailMonitor->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/appcatalog/computeresource/ttypes.py
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/appcatalog/computeresource/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/appcatalog/computeresource/ttypes.py
index 7f70c25..e635472 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/appcatalog/computeresource/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/appcatalog/computeresource/ttypes.py
@@ -237,16 +237,37 @@ class MonitorMode:
 
   """
   POLL_JOB_MANAGER = 0
-  XSEDE_AMQP_SUBSCRIBE = 1
+  JOB_EMAIL_NOTIFICATION_MONITOR = 1
+  XSEDE_AMQP_SUBSCRIBE = 2
 
   _VALUES_TO_NAMES = {
     0: "POLL_JOB_MANAGER",
-    1: "XSEDE_AMQP_SUBSCRIBE",
+    1: "JOB_EMAIL_NOTIFICATION_MONITOR",
+    2: "XSEDE_AMQP_SUBSCRIBE",
   }
 
   _NAMES_TO_VALUES = {
     "POLL_JOB_MANAGER": 0,
-    "XSEDE_AMQP_SUBSCRIBE": 1,
+    "JOB_EMAIL_NOTIFICATION_MONITOR": 1,
+    "XSEDE_AMQP_SUBSCRIBE": 2,
+  }
+
+class EmailProtocol:
+  """
+  Email protocol
+
+  """
+  POP3 = 0
+  IMAPS = 1
+
+  _VALUES_TO_NAMES = {
+    0: "POP3",
+    1: "IMAPS",
+  }
+
+  _NAMES_TO_VALUES = {
+    "POP3": 0,
+    "IMAPS": 1,
   }
 
 class DataMovementProtocol:
@@ -587,6 +608,133 @@ class BatchQueue:
   def __ne__(self, other):
     return not (self == other)
 
+class EmailMonitorProperty:
+  """
+  Email Monitoring Properties
+
+  host : email host address
+  emailAddress : address which should get email notification
+  password : password to access email address
+  folderName : email folder name default is INBOX
+  storeProtocol : type of store protocol
+
+
+  Attributes:
+   - host
+   - emailAddress
+   - password
+   - folderName
+   - storeProtocol
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'host', None, None, ), # 1
+    (2, TType.STRING, 'emailAddress', None, None, ), # 2
+    (3, TType.STRING, 'password', None, None, ), # 3
+    (4, TType.STRING, 'folderName', None, "INBOX", ), # 4
+    (5, TType.I32, 'storeProtocol', None, None, ), # 5
+  )
+
+  def __init__(self, host=None, emailAddress=None, password=None, folderName=thrift_spec[4][4], storeProtocol=None,):
+    self.host = host
+    self.emailAddress = emailAddress
+    self.password = password
+    self.folderName = folderName
+    self.storeProtocol = storeProtocol
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.host = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.emailAddress = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.password = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.STRING:
+          self.folderName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.I32:
+          self.storeProtocol = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('EmailMonitorProperty')
+    if self.host is not None:
+      oprot.writeFieldBegin('host', TType.STRING, 1)
+      oprot.writeString(self.host)
+      oprot.writeFieldEnd()
+    if self.emailAddress is not None:
+      oprot.writeFieldBegin('emailAddress', TType.STRING, 2)
+      oprot.writeString(self.emailAddress)
+      oprot.writeFieldEnd()
+    if self.password is not None:
+      oprot.writeFieldBegin('password', TType.STRING, 3)
+      oprot.writeString(self.password)
+      oprot.writeFieldEnd()
+    if self.folderName is not None:
+      oprot.writeFieldBegin('folderName', TType.STRING, 4)
+      oprot.writeString(self.folderName)
+      oprot.writeFieldEnd()
+    if self.storeProtocol is not None:
+      oprot.writeFieldBegin('storeProtocol', TType.I32, 5)
+      oprot.writeI32(self.storeProtocol)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    if self.host is None:
+      raise TProtocol.TProtocolException(message='Required field host is unset!')
+    if self.emailAddress is None:
+      raise TProtocol.TProtocolException(message='Required field emailAddress is unset!')
+    if self.password is None:
+      raise TProtocol.TProtocolException(message='Required field password is unset!')
+    if self.folderName is None:
+      raise TProtocol.TProtocolException(message='Required field folderName is unset!')
+    if self.storeProtocol is None:
+      raise TProtocol.TProtocolException(message='Required field storeProtocol is unset!')
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
 class SCPDataMovement:
   """
   Data Movement through Secured Copy
@@ -1068,6 +1216,7 @@ class SSHJobSubmission:
    - alternativeSSHHostName
    - sshPort
    - monitorMode
+   - emailMonitor
   """
 
   thrift_spec = (
@@ -1078,15 +1227,17 @@ class SSHJobSubmission:
     (4, TType.STRING, 'alternativeSSHHostName', None, None, ), # 4
     (5, TType.I32, 'sshPort', None, 22, ), # 5
     (6, TType.I32, 'monitorMode', None, None, ), # 6
+    (7, TType.STRUCT, 'emailMonitor', (EmailMonitorProperty, EmailMonitorProperty.thrift_spec), None, ), # 7
   )
 
-  def __init__(self, jobSubmissionInterfaceId=thrift_spec[1][4], securityProtocol=None, resourceJobManager=None, alternativeSSHHostName=None, sshPort=thrift_spec[5][4], monitorMode=None,):
+  def __init__(self, jobSubmissionInterfaceId=thrift_spec[1][4], securityProtocol=None, resourceJobManager=None, alternativeSSHHostName=None, sshPort=thrift_spec[5][4], monitorMode=None, emailMonitor=None,):
     self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
     self.securityProtocol = securityProtocol
     self.resourceJobManager = resourceJobManager
     self.alternativeSSHHostName = alternativeSSHHostName
     self.sshPort = sshPort
     self.monitorMode = monitorMode
+    self.emailMonitor = emailMonitor
 
   def read(self, iprot):
     if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
@@ -1128,6 +1279,12 @@ class SSHJobSubmission:
           self.monitorMode = iprot.readI32();
         else:
           iprot.skip(ftype)
+      elif fid == 7:
+        if ftype == TType.STRUCT:
+          self.emailMonitor = EmailMonitorProperty()
+          self.emailMonitor.read(iprot)
+        else:
+          iprot.skip(ftype)
       else:
         iprot.skip(ftype)
       iprot.readFieldEnd()
@@ -1162,6 +1319,10 @@ class SSHJobSubmission:
       oprot.writeFieldBegin('monitorMode', TType.I32, 6)
       oprot.writeI32(self.monitorMode)
       oprot.writeFieldEnd()
+    if self.emailMonitor is not None:
+      oprot.writeFieldBegin('emailMonitor', TType.STRUCT, 7)
+      self.emailMonitor.write(oprot)
+      oprot.writeFieldEnd()
     oprot.writeFieldStop()
     oprot.writeStructEnd()
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/messaging/event/ttypes.py
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/messaging/event/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/messaging/event/ttypes.py
index 279231b..5cfac76 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/messaging/event/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/messaging/event/ttypes.py
@@ -46,6 +46,7 @@ class MessageType:
   JOB = 3
   LAUNCHTASK = 4
   TERMINATETASK = 5
+  TASKOUTPUT = 6
 
   _VALUES_TO_NAMES = {
     0: "EXPERIMENT",
@@ -54,6 +55,7 @@ class MessageType:
     3: "JOB",
     4: "LAUNCHTASK",
     5: "TERMINATETASK",
+    6: "TASKOUTPUT",
   }
 
   _NAMES_TO_VALUES = {
@@ -63,6 +65,7 @@ class MessageType:
     "JOB": 3,
     "LAUNCHTASK": 4,
     "TERMINATETASK": 5,
+    "TASKOUTPUT": 6,
   }
 
 
@@ -785,6 +788,82 @@ class JobIdentifier:
   def __ne__(self, other):
     return not (self == other)
 
+class ProcessSubmitEvent:
+  """
+  Attributes:
+   - taskId
+   - credentialToken
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'taskId', None, None, ), # 1
+    (2, TType.STRING, 'credentialToken', None, None, ), # 2
+  )
+
+  def __init__(self, taskId=None, credentialToken=None,):
+    self.taskId = taskId
+    self.credentialToken = credentialToken
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.taskId = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.credentialToken = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('ProcessSubmitEvent')
+    if self.taskId is not None:
+      oprot.writeFieldBegin('taskId', TType.STRING, 1)
+      oprot.writeString(self.taskId)
+      oprot.writeFieldEnd()
+    if self.credentialToken is not None:
+      oprot.writeFieldBegin('credentialToken', TType.STRING, 2)
+      oprot.writeString(self.credentialToken)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    if self.taskId is None:
+      raise TProtocol.TProtocolException(message='Required field taskId is unset!')
+    if self.credentialToken is None:
+      raise TProtocol.TProtocolException(message='Required field credentialToken is unset!')
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
 class TaskSubmitEvent:
   """
   Attributes:

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailMonitorProperty.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailMonitorProperty.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailMonitorProperty.java
new file mode 100644
index 0000000..bad6eee
--- /dev/null
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailMonitorProperty.java
@@ -0,0 +1,805 @@
+/**
+ * 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.
+ */
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.model.appcatalog.computeresource;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Email Monitoring Properties
+ * 
+ * host : email host address
+ * emailAddress : address which should get email notification
+ * password : password to access email address
+ * folderName : email folder name default is INBOX
+ * storeProtocol : type of store protocol
+ * 
+ */
+@SuppressWarnings("all") public class EmailMonitorProperty implements org.apache.thrift.TBase<EmailMonitorProperty, EmailMonitorProperty._Fields>, java.io.Serializable, Cloneable, Comparable<EmailMonitorProperty> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("EmailMonitorProperty");
+
+  private static final org.apache.thrift.protocol.TField HOST_FIELD_DESC = new org.apache.thrift.protocol.TField("host", org.apache.thrift.protocol.TType.STRING, (short)1);
+  private static final org.apache.thrift.protocol.TField EMAIL_ADDRESS_FIELD_DESC = new org.apache.thrift.protocol.TField("emailAddress", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField PASSWORD_FIELD_DESC = new org.apache.thrift.protocol.TField("password", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField FOLDER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("folderName", org.apache.thrift.protocol.TType.STRING, (short)4);
+  private static final org.apache.thrift.protocol.TField STORE_PROTOCOL_FIELD_DESC = new org.apache.thrift.protocol.TField("storeProtocol", org.apache.thrift.protocol.TType.I32, (short)5);
+
+  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+  static {
+    schemes.put(StandardScheme.class, new EmailMonitorPropertyStandardSchemeFactory());
+    schemes.put(TupleScheme.class, new EmailMonitorPropertyTupleSchemeFactory());
+  }
+
+  private String host; // required
+  private String emailAddress; // required
+  private String password; // required
+  private String folderName; // required
+  private EmailProtocol storeProtocol; // required
+
+  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+  @SuppressWarnings("all") public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+    HOST((short)1, "host"),
+    EMAIL_ADDRESS((short)2, "emailAddress"),
+    PASSWORD((short)3, "password"),
+    FOLDER_NAME((short)4, "folderName"),
+    /**
+     * 
+     * @see EmailProtocol
+     */
+    STORE_PROTOCOL((short)5, "storeProtocol");
+
+    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+    static {
+      for (_Fields field : EnumSet.allOf(_Fields.class)) {
+        byName.put(field.getFieldName(), field);
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, or null if its not found.
+     */
+    public static _Fields findByThriftId(int fieldId) {
+      switch(fieldId) {
+        case 1: // HOST
+          return HOST;
+        case 2: // EMAIL_ADDRESS
+          return EMAIL_ADDRESS;
+        case 3: // PASSWORD
+          return PASSWORD;
+        case 4: // FOLDER_NAME
+          return FOLDER_NAME;
+        case 5: // STORE_PROTOCOL
+          return STORE_PROTOCOL;
+        default:
+          return null;
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, throwing an exception
+     * if it is not found.
+     */
+    public static _Fields findByThriftIdOrThrow(int fieldId) {
+      _Fields fields = findByThriftId(fieldId);
+      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+      return fields;
+    }
+
+    /**
+     * Find the _Fields constant that matches name, or null if its not found.
+     */
+    public static _Fields findByName(String name) {
+      return byName.get(name);
+    }
+
+    private final short _thriftId;
+    private final String _fieldName;
+
+    _Fields(short thriftId, String fieldName) {
+      _thriftId = thriftId;
+      _fieldName = fieldName;
+    }
+
+    public short getThriftFieldId() {
+      return _thriftId;
+    }
+
+    public String getFieldName() {
+      return _fieldName;
+    }
+  }
+
+  // isset id assignments
+  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+  static {
+    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+    tmpMap.put(_Fields.HOST, new org.apache.thrift.meta_data.FieldMetaData("host", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.EMAIL_ADDRESS, new org.apache.thrift.meta_data.FieldMetaData("emailAddress", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.PASSWORD, new org.apache.thrift.meta_data.FieldMetaData("password", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.FOLDER_NAME, new org.apache.thrift.meta_data.FieldMetaData("folderName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STORE_PROTOCOL, new org.apache.thrift.meta_data.FieldMetaData("storeProtocol", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, EmailProtocol.class)));
+    metaDataMap = Collections.unmodifiableMap(tmpMap);
+    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(EmailMonitorProperty.class, metaDataMap);
+  }
+
+  public EmailMonitorProperty() {
+    this.folderName = "INBOX";
+
+  }
+
+  public EmailMonitorProperty(
+    String host,
+    String emailAddress,
+    String password,
+    String folderName,
+    EmailProtocol storeProtocol)
+  {
+    this();
+    this.host = host;
+    this.emailAddress = emailAddress;
+    this.password = password;
+    this.folderName = folderName;
+    this.storeProtocol = storeProtocol;
+  }
+
+  /**
+   * Performs a deep copy on <i>other</i>.
+   */
+  public EmailMonitorProperty(EmailMonitorProperty other) {
+    if (other.isSetHost()) {
+      this.host = other.host;
+    }
+    if (other.isSetEmailAddress()) {
+      this.emailAddress = other.emailAddress;
+    }
+    if (other.isSetPassword()) {
+      this.password = other.password;
+    }
+    if (other.isSetFolderName()) {
+      this.folderName = other.folderName;
+    }
+    if (other.isSetStoreProtocol()) {
+      this.storeProtocol = other.storeProtocol;
+    }
+  }
+
+  public EmailMonitorProperty deepCopy() {
+    return new EmailMonitorProperty(this);
+  }
+
+  @Override
+  public void clear() {
+    this.host = null;
+    this.emailAddress = null;
+    this.password = null;
+    this.folderName = "INBOX";
+
+    this.storeProtocol = null;
+  }
+
+  public String getHost() {
+    return this.host;
+  }
+
+  public void setHost(String host) {
+    this.host = host;
+  }
+
+  public void unsetHost() {
+    this.host = null;
+  }
+
+  /** Returns true if field host is set (has been assigned a value) and false otherwise */
+  public boolean isSetHost() {
+    return this.host != null;
+  }
+
+  public void setHostIsSet(boolean value) {
+    if (!value) {
+      this.host = null;
+    }
+  }
+
+  public String getEmailAddress() {
+    return this.emailAddress;
+  }
+
+  public void setEmailAddress(String emailAddress) {
+    this.emailAddress = emailAddress;
+  }
+
+  public void unsetEmailAddress() {
+    this.emailAddress = null;
+  }
+
+  /** Returns true if field emailAddress is set (has been assigned a value) and false otherwise */
+  public boolean isSetEmailAddress() {
+    return this.emailAddress != null;
+  }
+
+  public void setEmailAddressIsSet(boolean value) {
+    if (!value) {
+      this.emailAddress = null;
+    }
+  }
+
+  public String getPassword() {
+    return this.password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  public void unsetPassword() {
+    this.password = null;
+  }
+
+  /** Returns true if field password is set (has been assigned a value) and false otherwise */
+  public boolean isSetPassword() {
+    return this.password != null;
+  }
+
+  public void setPasswordIsSet(boolean value) {
+    if (!value) {
+      this.password = null;
+    }
+  }
+
+  public String getFolderName() {
+    return this.folderName;
+  }
+
+  public void setFolderName(String folderName) {
+    this.folderName = folderName;
+  }
+
+  public void unsetFolderName() {
+    this.folderName = null;
+  }
+
+  /** Returns true if field folderName is set (has been assigned a value) and false otherwise */
+  public boolean isSetFolderName() {
+    return this.folderName != null;
+  }
+
+  public void setFolderNameIsSet(boolean value) {
+    if (!value) {
+      this.folderName = null;
+    }
+  }
+
+  /**
+   * 
+   * @see EmailProtocol
+   */
+  public EmailProtocol getStoreProtocol() {
+    return this.storeProtocol;
+  }
+
+  /**
+   * 
+   * @see EmailProtocol
+   */
+  public void setStoreProtocol(EmailProtocol storeProtocol) {
+    this.storeProtocol = storeProtocol;
+  }
+
+  public void unsetStoreProtocol() {
+    this.storeProtocol = null;
+  }
+
+  /** Returns true if field storeProtocol is set (has been assigned a value) and false otherwise */
+  public boolean isSetStoreProtocol() {
+    return this.storeProtocol != null;
+  }
+
+  public void setStoreProtocolIsSet(boolean value) {
+    if (!value) {
+      this.storeProtocol = null;
+    }
+  }
+
+  public void setFieldValue(_Fields field, Object value) {
+    switch (field) {
+    case HOST:
+      if (value == null) {
+        unsetHost();
+      } else {
+        setHost((String)value);
+      }
+      break;
+
+    case EMAIL_ADDRESS:
+      if (value == null) {
+        unsetEmailAddress();
+      } else {
+        setEmailAddress((String)value);
+      }
+      break;
+
+    case PASSWORD:
+      if (value == null) {
+        unsetPassword();
+      } else {
+        setPassword((String)value);
+      }
+      break;
+
+    case FOLDER_NAME:
+      if (value == null) {
+        unsetFolderName();
+      } else {
+        setFolderName((String)value);
+      }
+      break;
+
+    case STORE_PROTOCOL:
+      if (value == null) {
+        unsetStoreProtocol();
+      } else {
+        setStoreProtocol((EmailProtocol)value);
+      }
+      break;
+
+    }
+  }
+
+  public Object getFieldValue(_Fields field) {
+    switch (field) {
+    case HOST:
+      return getHost();
+
+    case EMAIL_ADDRESS:
+      return getEmailAddress();
+
+    case PASSWORD:
+      return getPassword();
+
+    case FOLDER_NAME:
+      return getFolderName();
+
+    case STORE_PROTOCOL:
+      return getStoreProtocol();
+
+    }
+    throw new IllegalStateException();
+  }
+
+  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+  public boolean isSet(_Fields field) {
+    if (field == null) {
+      throw new IllegalArgumentException();
+    }
+
+    switch (field) {
+    case HOST:
+      return isSetHost();
+    case EMAIL_ADDRESS:
+      return isSetEmailAddress();
+    case PASSWORD:
+      return isSetPassword();
+    case FOLDER_NAME:
+      return isSetFolderName();
+    case STORE_PROTOCOL:
+      return isSetStoreProtocol();
+    }
+    throw new IllegalStateException();
+  }
+
+  @Override
+  public boolean equals(Object that) {
+    if (that == null)
+      return false;
+    if (that instanceof EmailMonitorProperty)
+      return this.equals((EmailMonitorProperty)that);
+    return false;
+  }
+
+  public boolean equals(EmailMonitorProperty that) {
+    if (that == null)
+      return false;
+
+    boolean this_present_host = true && this.isSetHost();
+    boolean that_present_host = true && that.isSetHost();
+    if (this_present_host || that_present_host) {
+      if (!(this_present_host && that_present_host))
+        return false;
+      if (!this.host.equals(that.host))
+        return false;
+    }
+
+    boolean this_present_emailAddress = true && this.isSetEmailAddress();
+    boolean that_present_emailAddress = true && that.isSetEmailAddress();
+    if (this_present_emailAddress || that_present_emailAddress) {
+      if (!(this_present_emailAddress && that_present_emailAddress))
+        return false;
+      if (!this.emailAddress.equals(that.emailAddress))
+        return false;
+    }
+
+    boolean this_present_password = true && this.isSetPassword();
+    boolean that_present_password = true && that.isSetPassword();
+    if (this_present_password || that_present_password) {
+      if (!(this_present_password && that_present_password))
+        return false;
+      if (!this.password.equals(that.password))
+        return false;
+    }
+
+    boolean this_present_folderName = true && this.isSetFolderName();
+    boolean that_present_folderName = true && that.isSetFolderName();
+    if (this_present_folderName || that_present_folderName) {
+      if (!(this_present_folderName && that_present_folderName))
+        return false;
+      if (!this.folderName.equals(that.folderName))
+        return false;
+    }
+
+    boolean this_present_storeProtocol = true && this.isSetStoreProtocol();
+    boolean that_present_storeProtocol = true && that.isSetStoreProtocol();
+    if (this_present_storeProtocol || that_present_storeProtocol) {
+      if (!(this_present_storeProtocol && that_present_storeProtocol))
+        return false;
+      if (!this.storeProtocol.equals(that.storeProtocol))
+        return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return 0;
+  }
+
+  @Override
+  public int compareTo(EmailMonitorProperty other) {
+    if (!getClass().equals(other.getClass())) {
+      return getClass().getName().compareTo(other.getClass().getName());
+    }
+
+    int lastComparison = 0;
+
+    lastComparison = Boolean.valueOf(isSetHost()).compareTo(other.isSetHost());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetHost()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.host, other.host);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetEmailAddress()).compareTo(other.isSetEmailAddress());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetEmailAddress()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.emailAddress, other.emailAddress);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetPassword()).compareTo(other.isSetPassword());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetPassword()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.password, other.password);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetFolderName()).compareTo(other.isSetFolderName());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetFolderName()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.folderName, other.folderName);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetStoreProtocol()).compareTo(other.isSetStoreProtocol());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStoreProtocol()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.storeProtocol, other.storeProtocol);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    return 0;
+  }
+
+  public _Fields fieldForId(int fieldId) {
+    return _Fields.findByThriftId(fieldId);
+  }
+
+  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+  }
+
+  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder("EmailMonitorProperty(");
+    boolean first = true;
+
+    sb.append("host:");
+    if (this.host == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.host);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("emailAddress:");
+    if (this.emailAddress == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.emailAddress);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("password:");
+    if (this.password == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.password);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("folderName:");
+    if (this.folderName == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.folderName);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("storeProtocol:");
+    if (this.storeProtocol == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.storeProtocol);
+    }
+    first = false;
+    sb.append(")");
+    return sb.toString();
+  }
+
+  public void validate() throws org.apache.thrift.TException {
+    // check for required fields
+    if (!isSetHost()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'host' is unset! Struct:" + toString());
+    }
+
+    if (!isSetEmailAddress()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'emailAddress' is unset! Struct:" + toString());
+    }
+
+    if (!isSetPassword()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'password' is unset! Struct:" + toString());
+    }
+
+    if (!isSetFolderName()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'folderName' is unset! Struct:" + toString());
+    }
+
+    if (!isSetStoreProtocol()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'storeProtocol' is unset! Struct:" + toString());
+    }
+
+    // check for sub-struct validity
+  }
+
+  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+    try {
+      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+    try {
+      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private static class EmailMonitorPropertyStandardSchemeFactory implements SchemeFactory {
+    public EmailMonitorPropertyStandardScheme getScheme() {
+      return new EmailMonitorPropertyStandardScheme();
+    }
+  }
+
+  private static class EmailMonitorPropertyStandardScheme extends StandardScheme<EmailMonitorProperty> {
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot, EmailMonitorProperty struct) throws org.apache.thrift.TException {
+      org.apache.thrift.protocol.TField schemeField;
+      iprot.readStructBegin();
+      while (true)
+      {
+        schemeField = iprot.readFieldBegin();
+        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+          break;
+        }
+        switch (schemeField.id) {
+          case 1: // HOST
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.host = iprot.readString();
+              struct.setHostIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 2: // EMAIL_ADDRESS
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.emailAddress = iprot.readString();
+              struct.setEmailAddressIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 3: // PASSWORD
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.password = iprot.readString();
+              struct.setPasswordIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 4: // FOLDER_NAME
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.folderName = iprot.readString();
+              struct.setFolderNameIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 5: // STORE_PROTOCOL
+            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
+              struct.storeProtocol = EmailProtocol.findByValue(iprot.readI32());
+              struct.setStoreProtocolIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          default:
+            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+        }
+        iprot.readFieldEnd();
+      }
+      iprot.readStructEnd();
+      struct.validate();
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot, EmailMonitorProperty struct) throws org.apache.thrift.TException {
+      struct.validate();
+
+      oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.host != null) {
+        oprot.writeFieldBegin(HOST_FIELD_DESC);
+        oprot.writeString(struct.host);
+        oprot.writeFieldEnd();
+      }
+      if (struct.emailAddress != null) {
+        oprot.writeFieldBegin(EMAIL_ADDRESS_FIELD_DESC);
+        oprot.writeString(struct.emailAddress);
+        oprot.writeFieldEnd();
+      }
+      if (struct.password != null) {
+        oprot.writeFieldBegin(PASSWORD_FIELD_DESC);
+        oprot.writeString(struct.password);
+        oprot.writeFieldEnd();
+      }
+      if (struct.folderName != null) {
+        oprot.writeFieldBegin(FOLDER_NAME_FIELD_DESC);
+        oprot.writeString(struct.folderName);
+        oprot.writeFieldEnd();
+      }
+      if (struct.storeProtocol != null) {
+        oprot.writeFieldBegin(STORE_PROTOCOL_FIELD_DESC);
+        oprot.writeI32(struct.storeProtocol.getValue());
+        oprot.writeFieldEnd();
+      }
+      oprot.writeFieldStop();
+      oprot.writeStructEnd();
+    }
+
+  }
+
+  private static class EmailMonitorPropertyTupleSchemeFactory implements SchemeFactory {
+    public EmailMonitorPropertyTupleScheme getScheme() {
+      return new EmailMonitorPropertyTupleScheme();
+    }
+  }
+
+  private static class EmailMonitorPropertyTupleScheme extends TupleScheme<EmailMonitorProperty> {
+
+    @Override
+    public void write(org.apache.thrift.protocol.TProtocol prot, EmailMonitorProperty struct) throws org.apache.thrift.TException {
+      TTupleProtocol oprot = (TTupleProtocol) prot;
+      oprot.writeString(struct.host);
+      oprot.writeString(struct.emailAddress);
+      oprot.writeString(struct.password);
+      oprot.writeString(struct.folderName);
+      oprot.writeI32(struct.storeProtocol.getValue());
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol prot, EmailMonitorProperty struct) throws org.apache.thrift.TException {
+      TTupleProtocol iprot = (TTupleProtocol) prot;
+      struct.host = iprot.readString();
+      struct.setHostIsSet(true);
+      struct.emailAddress = iprot.readString();
+      struct.setEmailAddressIsSet(true);
+      struct.password = iprot.readString();
+      struct.setPasswordIsSet(true);
+      struct.folderName = iprot.readString();
+      struct.setFolderNameIsSet(true);
+      struct.storeProtocol = EmailProtocol.findByValue(iprot.readI32());
+      struct.setStoreProtocolIsSet(true);
+    }
+  }
+
+}
+

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailProtocol.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailProtocol.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailProtocol.java
new file mode 100644
index 0000000..d646f8a
--- /dev/null
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/EmailProtocol.java
@@ -0,0 +1,66 @@
+/**
+ * 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.
+ */
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.model.appcatalog.computeresource;
+
+
+import java.util.Map;
+import java.util.HashMap;
+import org.apache.thrift.TEnum;
+
+/**
+ * Email protocol
+ * 
+ */
+@SuppressWarnings("all") public enum EmailProtocol implements org.apache.thrift.TEnum {
+  POP3(0),
+  IMAPS(1);
+
+  private final int value;
+
+  private EmailProtocol(int value) {
+    this.value = value;
+  }
+
+  /**
+   * Get the integer value of this enum value, as defined in the Thrift IDL.
+   */
+  public int getValue() {
+    return value;
+  }
+
+  /**
+   * Find a the enum type by its integer value, as defined in the Thrift IDL.
+   * @return null if the value is not found.
+   */
+  public static EmailProtocol findByValue(int value) { 
+    switch (value) {
+      case 0:
+        return POP3;
+      case 1:
+        return IMAPS;
+      default:
+        return null;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/66ac6b92/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/MonitorMode.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/MonitorMode.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/MonitorMode.java
index 2545711..53cadd7 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/MonitorMode.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/computeresource/MonitorMode.java
@@ -41,7 +41,8 @@ import org.apache.thrift.TEnum;
  */
 @SuppressWarnings("all") public enum MonitorMode implements org.apache.thrift.TEnum {
   POLL_JOB_MANAGER(0),
-  XSEDE_AMQP_SUBSCRIBE(1);
+  JOB_EMAIL_NOTIFICATION_MONITOR(1),
+  XSEDE_AMQP_SUBSCRIBE(2);
 
   private final int value;
 
@@ -65,6 +66,8 @@ import org.apache.thrift.TEnum;
       case 0:
         return POLL_JOB_MANAGER;
       case 1:
+        return JOB_EMAIL_NOTIFICATION_MONITOR;
+      case 2:
         return XSEDE_AMQP_SUBSCRIBE;
       default:
         return null;