Table of Contents
- 1. Class imports
- 2. Loading the job description
- 3. Creating the factory service stub
- 4. Loading a proxy from a file
- 5. Setting stub security parameters
- 6. Querying for factory resource properties
- 7. Delegating credentials (if needed)
- 8. Creating the job resource
- 9. Creating the job service stub
- 10. Subscribing for job state notifications
- 11. Releasing any state holds (if necessary)
- 12. Destroying resources
The following is a general scenario for submitting a job using the Java stubs and APIs. Please consult the Java WS Core API, Delegation API, Reliable File Transfer API, and WS-GRAM API documentation for details on classes referenced in the code excerpts.
Also, it will probably be helpful to look at the GramJob class source code as a functioning example.
The following imports will be needed for these examples:
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
import java.security.cert.X509Certificate;
import javax.xml.rpc.Stub;
import javax.xml.soap.SOAPElement;
import org.apache.axis.components.uuid.UUIDGenFactory;
import org.apache.axis.message.addressing.AttributedURI;
import org.apache.axis.message.addressing.EndpointReferenceType;
import org.globus.delegation.DelegationUtil;
import org.globus.exec.generated.CreateManagedJobInputType;
import org.globus.exec.generated.CreateManagedJobOutputType;
import org.globus.exec.generated.JobDescriptionType;
import org.globus.exec.generated.ManagedJobFactoryPortType;
import org.globus.exec.generated.ManagedJobPortType;
import org.globus.exec.generated.ReleaseInputType;
import org.globus.exec.utils.ManagedJobConstants;
import org.globus.exec.utils.ManagedJobFactoryConstants;
import org.globus.exec.utils.client.ManagedJobClientHelper;
import org.globus.exec.utils.client.ManagedJobFactoryClientHelper;
import org.globus.exec.utils.rsl.RSLHelper;
import org.globus.wsrf.NotificationConsumerManager;
import org.globus.wsrf.WSNConstants;
import org.globus.wsrf.encoding.ObjectDeserializer;
import org.globus.wsrf.impl.security.authentication.Constants;
import org.globus.wsrf.impl.security.authorization.Authorization;
import org.globus.wsrf.impl.security.authorization.HostAuthorization;
import org.globus.wsrf.impl.security.authorization.IdentityAuthorization;
import org.globus.wsrf.impl.security.authorization.SelfAuthorization;
import org.globus.wsrf.impl.security.descriptor.ClientSecurityDescriptor;
import org.globus.wsrf.impl.security.descriptor.GSISecureMsgAuthMethod;
import org.globus.wsrf.impl.security.descriptor.GSITransportAuthMethod;
import org.globus.wsrf.impl.security.descriptor.ResourceSecurityDescriptor;
import org.gridforum.jgss.ExtendedGSSManager;
import org.ietf.jgss.GSSCredential;
import org.oasis.wsn.Subscribe;
import org.oasis.wsn.SubscribeResponse;
import org.oasis.wsn.SubscriptionManager;
import org.oasis.wsn.TopicExpressionType;
import org.oasis.wsn.WSBaseNotificationServiceAddressingLocator;
import org.oasis.wsrf.lifetime.Destroy;
import org.oasis.wsrf.properties.GetMultipleResourceProperties_Element;
import org.oasis.wsrf.properties.GetMultipleResourcePropertiesResponse;
import org.oasis.wsrf.properties.GetResourcePropertyResponse;
File jobDescriptionFile = new File("myjobdesc.xml");
JobDescriptionType jobDescription = RSLHelper.readRSL(jobDescriptionFile);
The object jobDescription will be of sub-type
MultiJobDescriptionType if the file contents is a multi-job description.
URL factoryUrl = ManagedJobFactoryClientHelper.getServiceURL(
contactString).getURL();
String factoryType
= ManagedJobFactoryConstants.FACTORY_TYPE.<factory type constant>;
EndpointReferenceType factoryEndpoint
= ManagedJobFactoryClientHelper.getFactoryEndpoint(factoryUrl, factoryType);
ManagedJobFactoryPortType factoryPort
= ManagedJobFactoryClientHelper.getPort(factoryEndpoint);
The format of contactString is
[protocol://]host[:port][/servicepath].
Default proxy file:
ExtendedGSSManager manager = (ExtendedGSSManager)ExtendedGSSManager.getInstance(); GSSCredential cred = manager.createCredential( GSSCredential.INITIATE_AND_ACCEPT);Specific proxy file:
File proxyFile = new File("proxy_file"); byte[] proxyData = new byte[(int)proxyFile.length)]; FileInputStream inputStream = new FileInputStream(proxyFile); inputStream.read(proxyData); inputStream.close(); ExtendedGSSManager manager = (ExtendedGSSManager)ExtendedGSSManager.getInstance(); GSSCredential proxy = manager.createCredential( proxyData, ExtendedGSSCredential.IMPEXP_OPAQUE, GSSCredential.DEFAULT_LIFETIME, null, GSSCredential.ACCEPT_ONLY);
ClientSecurityDescriptor secDesc = new ClientSecurityDescriptor();
secDesc.setGSITransport(Constants.<protection level constant>);
secDesc.setAuthz(<Authorization sub-class instance>);
if (proxy != null) {
secDesc.setGSSCredential(proxy);
}
((Stub) port)._setProperty(Constants.CLIENT_DESCRIPTOR, secDesc);
Use setGSISecureMsg() for GSI Secure Message.
GetResourcePropertyResponse response
= factoryport.getResourceProperty(ManagedJobConstants.<RP constant>);
SOAPElement[] any = response.get_any();
... = ObjectDeserializer.toObject(any[0], <RP type>.class);
GetMultipleResourceProperties_Element rpRequest
= new GetMultipleResourceProperties_Element();
rpRequest.setResourceProperty(new QName[] {
ManagedJobFactoryConstants.<RP constant #1>,
ManagedJobFactoryConstants.<RP constant #2>,
ManagedJobFactoryConstants.<RP constant #N>
});
GetMultipleResourcePropertiesResponse response
= factoryPort.getMultipleResourceProperties(rpRequest);
SOAPElement[] any = response.get_any();
... = ObjectDeserializer.toObject(any[0], <RP #1 type>.class);
... = ObjectDeserializer.toObject(any[0], <RP #2 type>.class);
... = ObjectDeserializer.toObject(any[0], <RP #N type>.class);
X509Certificate certToSign = DelegationUtil.getCertificateChainRP(
delegFactoryEndpoint, //EndpointReferenceType
secDesc, //ClientSecurityDescriptor
)[0]; //first element in the returned array
EndpointReferenceType credentialEndpoint = DelegationUtil.delegate(
delegFactoryurl, //String
credential, //GlobusCredential
certToSign, //X509Certificate
lifetime, //int (seconds)
fullDelegation, //boolean
secDesc); //ClientSecurityDescriptor
There are three types of delegated credentials:
Credential used by the job to generate user-owned proxy:
jobDescription.setJobCredential(credentialEndpoint);
Credential used to contact RFT for staging and file clean up:
jobDescription.setStagingCredentialEndpoint(credentialEndpoint);
Credential used by RFT to contact GridFTP servers:
TransferRequestType stageOut = jobDescription.getFileStageOut(); stageOut.setTransferCredential(credentialEndpoint);Do the same for fileStageIn and fileCleanUp.
CreateManagedJobInputType jobInput = new CreateManagedJobInputType();
jobInput.setJobID(new AttributeURI("uuid: " + UUIDGenFactory.getUUIDGen().nextUUID()));
jobInput.setInitialTerminationTime(<Calendar instance>);
if (multiJob) jobInput.setMultiJob(jobDescription) else jobInput.setJob(jobDescription);
if (subscribeOnCreate) jobInput.setSubscribe(subscriptionReq);
CreateManagedJobOutputType createResponse
= factoryPort.createManagedJob(jobInput);
EndpointReferenceType jobEndpoint = createResponse.getManagedJobEndpoint();
ManagedJobPortType jobPort = ManagedJobClientHelper.getPort(jobEndpoint);
You must set the appropriate security parameters for the job service stub
(jobPort) as well.
NotificationConsumerManager notifConsumerManager
= NotificationConsumerManager.getInstance();
notifConsumerManager.startListening();
List topicPath = new LinkedList();
topicPath.add(ManagedJobConstants.RP_STATE);
ResourceSecurityDescriptor resourceSecDesc = new ResourceSecurityDescriptor();
resourceSecDesc.setAuthz(Authorization.<authz type constant>);
Vector authMethods = new Vector();
authMethods.add(GSITransportAuthMethod.BOTH);
resourceSecDesc.setAuthMethods(authMethods);
EndpointReferenceType notificationConsumerEndpoint
= notifConsumerManager.createNotificationConsumer(
topicPath,
this,
resourceSecDesc);
Subscribe subscriptionReq = new Subscribe();
subscriptionReq.setConsumerReference(
notificationConsumerEndpoint);
TopicExpressionType topicExpression = new TopicExpressionType(
WSNConstants.SIMPLE_TOPIC_DIALECT,
ManagedJobConstants.RP_STATE);
subscriptionReq.setTopicExpression(topicExpression);
EndpointReferenceType subscriptionEndpoint;
Subscribe on creation
jobInput.setSubscribe(subscriptionReq);
Subscribe after creation
SubscribeResponse subscribeResponse = jobPort.subscribe(subscriptionRequest); subscriptionEndpoint = subscribeResponse.getSubscriptionReference();
/*destroy subscription resource*/
SubscriptionManager subscriptionManagerPort
= new WSBaseNotificationServiceAddressingLocator()
.getSubscriptionManagerPort(subscriptionEndpoint);
//set stub security parameters on subscriptionManagerPort
subscriptionManagerPort.destroy(new Destroy());
/*destroy the job resource*/
jobPort.destroy(new Destroy());
