void test1(void) { std::cout<<"------ Testing simple file download ------"<<std::endl; Arc::URL url("http://grid.uio.no/index.html"); Arc::NS ns; Arc::Config c(ns); Arc::XMLNode cfg = c; Arc::XMLNode mgr = cfg.NewChild("ModuleManager"); Arc::XMLNode pth1 = mgr.NewChild("Path"); pth1 = "../tcp/.libs"; Arc::XMLNode pth2 = mgr.NewChild("Path"); pth2 = ".libs"; Arc::XMLNode plg1 = cfg.NewChild("Plugins"); Arc::XMLNode mcctcp = plg1.NewChild("Name"); mcctcp = "mcctcp"; Arc::XMLNode plg2 = cfg.NewChild("Plugins"); Arc::XMLNode mcchttp = plg2.NewChild("Name"); mcchttp = "mcchttp"; Arc::XMLNode chn = cfg.NewChild("Chain"); Arc::XMLNode tcp = chn.NewChild("Component"); Arc::XMLNode tcpname = tcp.NewAttribute("name"); tcpname = "tcp.client"; Arc::XMLNode tcpid = tcp.NewAttribute("id"); tcpid = "tcp"; Arc::XMLNode tcpcnt = tcp.NewChild("Connect"); Arc::XMLNode tcphost = tcpcnt.NewChild("Host"); tcphost = url.Host(); Arc::XMLNode tcpport = tcpcnt.NewChild("Port"); tcpport = Arc::tostring(url.Port()); Arc::XMLNode http = chn.NewChild("Component"); Arc::XMLNode httpname = http.NewAttribute("name"); httpname = "http.client"; Arc::XMLNode httpid = http.NewAttribute("id"); httpid = "http"; Arc::XMLNode httpentry = http.NewAttribute("entry"); httpentry = "http"; Arc::XMLNode httpnext = http.NewChild("next"); Arc::XMLNode httpnextid = httpnext.NewAttribute("id"); httpnextid = "tcp"; Arc::XMLNode httpmeth = http.NewChild("Method"); httpmeth = "GET"; Arc::XMLNode httpep = http.NewChild("Endpoint"); httpep = url.str(); std::cout<<"------ Configuration ------"<<std::endl; std::string cfgstr; c.GetXML(cfgstr); std::cerr << cfgstr << std::endl; Arc::Loader l(c); Arc::Message request; Arc::PayloadRaw msg; Arc::MessageAttributes attributes; Arc::MessageContext context; request.Payload(&msg); request.Attributes(&attributes); request.Context(&context); Arc::Message response; //!! l["http"]->process(request,response); std::cout<<"*** RESPONSE ***"<<std::endl; Arc::PayloadRaw& payload = dynamic_cast<Arc::PayloadRaw&>(*response.Payload()); for(int n = 0;n<payload.Size();++n) std::cout<<payload[n]; std::cout<<std::endl; }
Arc::MCC_Status ARexService::ChangeActivityStatus(ARexGMConfig& config,Arc::XMLNode in,Arc::XMLNode out) { /* ChangeActivityStatus ActivityIdentifier (wsa:EndpointReferenceType) OldStatus (a-rex,optional) attribute = state (bes-factory:ActivityStateEnumeration) NewStatus (a-rex) attribute = state (bes-factory:ActivityStateEnumeration) ChangeActivityStatusResponse NewStatus (a-rex) attribute = state (bes-factory:ActivityStateEnumeration) NotAuthorizedFault InvalidActivityIdentifierFault CantApplyOperationToCurrentStateFault */ { std::string s; in.GetXML(s); logger_.msg(Arc::VERBOSE, "ChangeActivityStatus: request = \n%s", s); }; Arc::WSAEndpointReference id(in["ActivityIdentifier"]); if(!(Arc::XMLNode)id) { // Wrong request logger_.msg(Arc::ERROR, "ChangeActivityStatus: no ActivityIdentifier found"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Can't find ActivityIdentifier element in request"); InvalidRequestMessageFault(fault,"jsdl:ActivityIdentifier","Element is missing"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; std::string jobid = Arc::WSAEndpointReference(id).ReferenceParameters()["a-rex:JobID"]; if(jobid.empty()) { // EPR is wrongly formated or not an A-REX EPR logger_.msg(Arc::ERROR, "ChangeActivityStatus: EPR contains no JobID"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Can't find JobID element in ActivityIdentifier"); InvalidRequestMessageFault(fault,"a-rex:JobID","Element is missing"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; ARexJob job(jobid,config,logger_); if(!job) { // There is no such job std::string failure = job.Failure(); logger_.msg(Arc::ERROR, "ChangeActivityStatus: no job found: %s",failure); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Can't find requested Activity"); UnknownActivityIdentifierFault(fault,"No corresponding Activity found"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; // Old State Arc::XMLNode old_state = in["OldStatus"]; std::string old_bes_state = old_state.Attribute("state"); std::string old_arex_state = old_state["a-rex:state"]; // New state Arc::XMLNode new_state = in["NewStatus"]; if(!new_state) { // Wrong request logger_.msg(Arc::ERROR, "ChangeActivityStatus: missing NewStatus element"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Missing NewStatus element in request"); InvalidRequestMessageFault(fault,"a-rex:NewStatus","Element is missing"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; std::string new_bes_state = new_state.Attribute("state"); std::string new_arex_state = new_state["a-rex:state"]; // Take renewed proxy if supplied std::string delegation; Arc::XMLNode delegated_token = new_state["arcdeleg:DelegatedToken"]; if(delegated_token) { if(!delegation_stores_.DelegatedToken(config.GmConfig().DelegationDir(),delegated_token,config.GridName(),delegation)) { // Failed to accept delegation (report as bad request) logger_.msg(Arc::ERROR, "ChangeActivityStatus: Failed to accept delegation"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Failed to accept delegation"); InvalidRequestMessageFault(fault,"arcdeleg:DelegatedToken","This token does not exist"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; }; bool pending = false; std::string gm_state = job.State(pending); bool failed = job.Failed(); std::string bes_state(""); std::string arex_state(""); convertActivityStatus(gm_state,bes_state,arex_state,failed,pending); // Old state in request must be checked against current one if((!old_bes_state.empty()) && (old_bes_state != bes_state)) { logger_.msg(Arc::ERROR, "ChangeActivityStatus: old BES state does not match"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"OldStatus is not same as current status"); CantApplyOperationToCurrentStateFault(fault,gm_state,failed,"OldStatus does not match"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; if((!old_arex_state.empty()) && (old_arex_state != arex_state)) { logger_.msg(Arc::ERROR, "ChangeActivityStatus: old A-REX state does not match"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"OldStatus is not same as current status"); CantApplyOperationToCurrentStateFault(fault,gm_state,failed,"OldStatus does not match"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; // Check for allowed combinations if((new_bes_state == "Finished") && ((new_arex_state.empty()) || (new_arex_state == "Killing"))) { // Request to cancel job if((gm_state != "FINISHED") && (gm_state != "CANCELING") && (gm_state != "DELETED")) job.Cancel(); } else if((new_bes_state == "Finished") && (new_arex_state == "Deleted")) { // Request to clean job if((gm_state != "FINISHED") && (gm_state != "CANCELING") && (gm_state != "DELETED")) job.Cancel(); job.Clean(); } else if((new_bes_state == "Running") && (new_arex_state.empty())) { // Not supporting resume into user-defined state // Request to resume job if(!job.UpdateCredentials(delegation)) { logger_.msg(Arc::ERROR, "ChangeActivityStatus: Failed to update credentials"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Internal error: Failed to update credentials"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; if(!job.Resume()) { logger_.msg(Arc::ERROR, "ChangeActivityStatus: Failed to resume job"); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Internal error: Failed to resume activity"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; } else { logger_.msg(Arc::ERROR, "ChangeActivityStatus: State change not allowed: from %s/%s to %s/%s", bes_state.c_str(),arex_state.c_str(),new_bes_state.c_str(),new_arex_state.c_str()); Arc::SOAPFault fault(out.Parent(),Arc::SOAPFault::Sender,"Requested status transition is not supported"); CantApplyOperationToCurrentStateFault(fault,gm_state,failed,"Requested status transition is not supported"); out.Destroy(); return Arc::MCC_Status(Arc::STATUS_OK); }; // Make response // TODO: // Updating currenst job state gm_state=job.State(pending); failed=job.Failed(); convertActivityStatus(gm_state,bes_state,arex_state,failed,pending); Arc::XMLNode state = out.NewChild("a-rex:NewStatus"); state.NewAttribute("bes-factory:state")=bes_state; state.NewChild("a-rex:state")=arex_state; { std::string s; out.GetXML(s); logger_.msg(Arc::VERBOSE, "ChangeActivityStatus: response = \n%s", s); }; return Arc::MCC_Status(Arc::STATUS_OK); }