vre-modeler/src/org/gcube/vremanagement/vremodeler/impl/thread/DeployVRE.java

320 lines
12 KiB
Java

package org.gcube.vremanagement.vremodeler.impl.thread;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.gcube.common.core.contexts.GHNContext;
import org.gcube.common.core.faults.GCUBEFault;
import org.gcube.common.core.informationsystem.publisher.ISPublisher;
import org.gcube.common.core.resources.GCUBECollection;
import org.gcube.common.core.resources.GCUBEGenericResource;
import org.gcube.common.core.resources.GCUBEMCollection;
import org.gcube.common.core.resources.impl.kxml.KGCUBEResource;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.core.utils.handlers.GCUBEServiceClientImpl;
import org.gcube.common.core.utils.logging.GCUBELog;
import org.gcube.common.vremanagement.ghnmanager.impl.contexts.ServiceContext;
import org.gcube.vremanagement.vremanager.stubs.vremanager.AddResourcesParameters;
import org.gcube.vremanagement.vremanager.stubs.vremanager.OptionsParameters;
import org.gcube.vremanagement.vremanager.stubs.vremanager.ResourceItem;
import org.gcube.vremanagement.vremanager.stubs.vremanager.ResourceList;
import org.gcube.vremanagement.vremanager.stubs.vremanager.ScopeOption;
import org.gcube.vremanagement.vremanager.stubs.vremanager.ServiceItem;
import org.gcube.vremanagement.vremanager.stubs.vremanager.ServiceList;
import org.gcube.vremanagement.vremanager.stubs.vremanager.VREManagerPortType;
import org.gcube.vremanagement.vremodeler.db.DBInterface;
import org.gcube.vremanagement.vremodeler.impl.ModelerContext;
import org.gcube.vremanagement.vremodeler.impl.ModelerResource;
import org.gcube.vremanagement.vremodeler.impl.util.Couple;
import org.gcube.vremanagement.vremodeler.impl.util.VREManagerServiceHandler;
import org.globus.wsrf.ResourceException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DeployVRE extends Thread{
private static GCUBELog logger= new GCUBELog(DeployVRE.class);
private ISPublisher publisher;
private ModelerResource wsResource= null;
private String resourceId;
private GCUBEScope startingScope;
private String vreName=null;
public DeployVRE(String resourceId, GCUBEScope scope){
this.resourceId=resourceId;
this.startingScope= scope;
}
private ModelerResource getResource() throws ResourceException{
if (wsResource==null) wsResource= (ModelerResource)ModelerContext.getPortTypeContext().getWSHome().find(ModelerContext.getPortTypeContext().makeKey(resourceId));
return wsResource;
}
public void run() {
try {
deployManagerOnVRE();
ServiceContext.getContext().setScope(GCUBEScope.getScope(this.startingScope+"/"+this.vreName));
createVRE();
logger.info("FINISHED");
}catch(Exception e){
e.printStackTrace();
}
}
private void deployManagerOnVRE() throws GCUBEFault{
String firstGHNId= null, vreName= null;
try {
DBInterface.ExecuteUpdate("UPDATE VRE SET STATUS='Deploying' WHERE VRE.id='"+this.resourceId+"';");
ResultSet resGenericInfo = DBInterface.queryDB("select VRE.name from VRE where VRE.id='"+this.resourceId+"'; ");
if (!resGenericInfo.next()) {
throw new GCUBEFault("The VRE with ID "+this.resourceId+" cannot be retrieved on the DB");
}
vreName= resGenericInfo.getString(1);
ResultSet resRelatedGHN=DBInterface.queryDB("select VRERELATEDGHN.ghnid from VRERELATEDGHN where VRERELATEDGHN.vreid='"+this.resourceId+"'; ");
if (!resRelatedGHN.next()){
DBInterface.ExecuteUpdate("UPDATE VRE SET STATUS='Failed' WHERE VRE.id='"+this.resourceId+"';");
}
firstGHNId= resRelatedGHN.getString(1);
} catch (SQLException e) {
logger.error("HSQLDB Error "+e);
throw new GCUBEFault(e);
}
// Couple<GCUBEScope,Couple<String, String>>> is a triple with first GCUBEScope, second couple: first String is the VREName, second string is the GHNId
VREManagerServiceHandler<String, Couple<String, String>> vreManagerHandler= new VREManagerServiceHandler<String,Couple<String, String>>(){
@SuppressWarnings("static-access")
@Override
protected String makeCall(VREManagerPortType mbportType)
throws Exception {
System.out.println("makeCall called");
try{
AddResourcesParameters arp= new AddResourcesParameters();
ServiceList services= new ServiceList();
ServiceItem[] service= new ServiceItem[1];
service[0]=new ServiceItem();
service[0].setServiceClass("VREManagement");
service[0].setServiceName("VREManager");
service[0].setServiceVersion("1.00.00");
services.setService(service);
services.setGHN(new String[]{this.getParameter().second});
arp.setServices(services);
arp.setTargetScope(this.scope+"/"+this.getParameter().first);
String reportId=mbportType.addResources(arp);
String report;
int attempt=0;
do{
Thread.currentThread().sleep(30000);
report=mbportType.getReport(reportId);
attempt++;
getResource().setReportFirstStep(report);
System.out.println("---------");
System.out.println(report);
System.out.println("---------");
}while (!isDeploymentStatusFinished(report) && attempt<10);
}catch(Exception e){e.printStackTrace(); throw e;}
return "";
}
};
System.out.println(vreName);
System.out.println(firstGHNId);
vreManagerHandler.setHandled(new GCUBEServiceClientImpl());
Couple<String, String> coupleParams= new Couple<String, String>(vreName, firstGHNId);
vreManagerHandler.setParameter(coupleParams);
vreManagerHandler.scope=this.startingScope;
try {
vreManagerHandler.run();
} catch (Exception e) {
logger.error("Error deploying the VRE "+e);
throw new GCUBEFault(e);
}
this.vreName= vreName;
}
private void createVRE() throws GCUBEFault{
VREManagerServiceHandler<String, String> vreManagerHandler= new VREManagerServiceHandler<String,String>(){
//the parameter is resourceID
@Override
protected String makeCall(VREManagerPortType vreManPortType)
throws Exception {
OptionsParameters ops;
ResultSet resGenericInfo = DBInterface.queryDB("select VRE.name from VRE where VRE.id='"+this.getParameter()+"'; ");
if (!resGenericInfo.next()) {
throw new GCUBEFault("The VRE with ID "+this.getParameter()+" cannot be retrieved on the DB");
}
if (!resGenericInfo.next()) throw new GCUBEFault("The VRE with ID "+this.getParameter()+" cannot be retrieved");
ops=new OptionsParameters();
ScopeOption[] scopeOptionList= new ScopeOption[6];
ScopeOption soDesigner= new ScopeOption();
soDesigner.setName("DESIGNER");
soDesigner.setValue(resGenericInfo.getString("vredesigner"));
scopeOptionList[0]= soDesigner;
ScopeOption soCreator= new ScopeOption();
soCreator.setName("CREATOR");
soCreator.setValue(resGenericInfo.getString("vremanager"));
scopeOptionList[1]= soCreator;
ScopeOption soEndtime= new ScopeOption();
soEndtime.setName("ENDTIME");
soEndtime.setValue(KGCUBEResource.toXMLDateAndTime(resGenericInfo.getDate("IntervalTo")));
scopeOptionList[2]= soEndtime;
ScopeOption soStarttime= new ScopeOption();
soStarttime.setName("STARTTIME");
soStarttime.setValue(KGCUBEResource.toXMLDateAndTime(resGenericInfo.getDate("IntervalFrom")));
scopeOptionList[3]= soStarttime;
ScopeOption soDescription= new ScopeOption();
soDescription.setName("DESCRIPTION");
soDescription.setValue(resGenericInfo.getString("description"));
scopeOptionList[4]= soDescription;
ScopeOption soDisplayname= new ScopeOption();
soDisplayname.setName("DISPLAYNAME");
soDisplayname.setValue(resGenericInfo.getString("name"));
scopeOptionList[5]= soDisplayname;
ops.setScopeOptionList(scopeOptionList);
vreManPortType.setScopeOptions(ops);
//Adding the resources to the new VRE
AddResourcesParameters arp= new AddResourcesParameters();
ResourceList rl= new ResourceList();
List<ResourceItem> resItemList= new ArrayList<ResourceItem>();
//retrieving Collection
try{
ResourceItem resItem;
ResultSet resRelatedCol =DBInterface.queryDB("select VRERELATEDCOLLECTION.collid from VRERELATEDCOLLECTION where VRERELATEDCOLLECTION.vreid='"+this.getParameter()+"';");
while (resRelatedCol.next()){
resItem= new ResourceItem();
resItem.setID(resRelatedCol.getString(1));
resItem.setType(GCUBECollection.TYPE);
resItemList.add(resItem);
}
}catch(SQLException sqle){logger.error("Error contacting HSQLDB");}
//retrieving MDCollection with native MDFormat
try{
ResourceItem resItem;
ResultSet resMdColNative =DBInterface.queryDB("select mdcollid from SELECTEDNATIVEMDFROMAT AS s where s.vreid='"+this.getParameter()+"';");
while (resMdColNative.next()){
resItem= new ResourceItem();
resItem.setID(resMdColNative.getString(1));
System.out.println(resItem.getID());
resItem.setType(GCUBEMCollection.TYPE);
resItemList.add(resItem);
}
}catch(SQLException sqle){logger.error("Error contacting HSQLDB");}
rl.setResource(resItemList.toArray(new ResourceItem[0]));
arp.setResources(rl);
//retrieve services
ServiceList serviceList= new ServiceList();
try{
ServiceItem servItem;
List<ServiceItem> listService= new ArrayList<ServiceItem>();
ResultSet resMdColNative =DBInterface.queryDB("select s.name, s.class from VRERELATEDFUNCTIONALITY AS vrf, SERVICES AS s where vrf.vreid='"+this.getParameter()+"' AND s.id=vrf.funcid;");
while (resMdColNative.next()){
servItem= new ServiceItem();
servItem.setServiceClass(resMdColNative.getString("class"));
servItem.setServiceName(resMdColNative.getString("name"));
listService.add(servItem);
}
serviceList.setService(listService.toArray(new ServiceItem[0]));
}catch(SQLException sqle){logger.error("Error contacting HSQLDB");}
//retrieve the GHN
try{
List<String> listGHN= new ArrayList<String>();
ResultSet resGHN =DBInterface.queryDB("select ghnih, s.class from VRERELATEDGHN where vrf.vreid='"+this.getParameter()+"';");
//eliminating the First GHN used for VREManager Deployment
resGHN.next();
while (resGHN.next()){
listGHN.add(resGHN.getString(1));
}
serviceList.setGHN(listGHN.toArray(new String[0]));
}catch(SQLException sqle){logger.error("Error contacting HSQLDB");}
arp.setServices(serviceList);
String reportId=vreManPortType.addResources(arp);
String report;
int attempt=0;
do{
this.wait(20000);
report=vreManPortType.getReport(reportId);
attempt++;
getResource().setReportSecondStep(report);
}while (!isDeploymentStatusFinished(report) && attempt<20);
return "";
}
};
vreManagerHandler.setHandled(new GCUBEServiceClientImpl());
vreManagerHandler.setParameter(this.resourceId);
vreManagerHandler.scope=this.startingScope;
try {
vreManagerHandler.run();
} catch (Exception e) {
throw new GCUBEFault(e);
}
}
private boolean isDeploymentStatusFinished(String report) {
boolean ret = false;
String xpath = "/ResourceReport/DeploymentActivity/GHN/LastReportReceived/Status";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
db = dbf.newDocumentBuilder();
Document document = db.parse(new ByteArrayInputStream(report.getBytes()));
XPath engine = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList) engine.evaluate(xpath,document, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength(); i++) {
if(i==0){
ret = true;
}
if(nl.item(i).getFirstChild().getNodeValue().compareTo("CLOSED")!=0){
ret = false;
break;
}
}
} catch (ParserConfigurationException e) {
return false;
} catch (SAXException e) {
return false;
} catch (IOException e) {
return false;
} catch (XPathExpressionException e) {
return false;
}
return ret;
}
}