| /* |
| * |
| * 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. |
| * |
| */ |
| |
| package org.apache.airavata.xbaya.ui.experiment; |
| |
| import org.apache.airavata.api.Airavata; |
| import org.apache.airavata.api.Airavata.Client; |
| import org.apache.airavata.api.client.AiravataClientFactory; |
| import org.apache.airavata.common.utils.JSONUtil; |
| import org.apache.airavata.common.utils.ServerSettings; |
| import org.apache.airavata.common.utils.XMLUtil; |
| import org.apache.airavata.model.appcatalog.appinterface.DataType; |
| import org.apache.airavata.model.appcatalog.appinterface.InputDataObjectType; |
| import org.apache.airavata.model.appcatalog.appinterface.OutputDataObjectType; |
| import org.apache.airavata.model.error.AiravataClientConnectException; |
| import org.apache.airavata.model.error.AiravataClientException; |
| import org.apache.airavata.model.error.AiravataSystemException; |
| import org.apache.airavata.model.error.InvalidRequestException; |
| import org.apache.airavata.model.util.ExperimentModelUtil; |
| import org.apache.airavata.model.workspace.Project; |
| import org.apache.airavata.model.workspace.experiment.ComputationalResourceScheduling; |
| import org.apache.airavata.model.workspace.experiment.Experiment; |
| import org.apache.airavata.model.workspace.experiment.UserConfigurationData; |
| import org.apache.airavata.orchestrator.client.OrchestratorClientFactory; |
| import org.apache.airavata.orchestrator.cpi.OrchestratorService; |
| import org.apache.airavata.workflow.model.graph.system.InputNode; |
| import org.apache.airavata.workflow.model.graph.system.OutputNode; |
| import org.apache.airavata.workflow.model.graph.util.GraphUtil; |
| import org.apache.airavata.workflow.model.wf.Workflow; |
| import org.apache.airavata.xbaya.ThriftClientData; |
| import org.apache.airavata.xbaya.ThriftServiceType; |
| import org.apache.airavata.xbaya.XBayaEngine; |
| import org.apache.airavata.xbaya.messaging.MonitorException; |
| import org.apache.airavata.xbaya.ui.dialogs.XBayaDialog; |
| import org.apache.airavata.xbaya.ui.widgets.GridPanel; |
| import org.apache.airavata.xbaya.ui.widgets.XBayaLabel; |
| import org.apache.airavata.xbaya.ui.widgets.XBayaTextField; |
| import org.apache.airavata.xbaya.util.XBayaUtil; |
| import org.apache.thrift.TException; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| import org.xmlpull.infoset.XmlElement; |
| |
| import javax.swing.AbstractAction; |
| import javax.swing.BorderFactory; |
| import javax.swing.JButton; |
| import javax.swing.JComboBox; |
| import javax.swing.JLabel; |
| import javax.swing.JOptionPane; |
| import javax.swing.JPanel; |
| import javax.swing.border.EtchedBorder; |
| import javax.xml.namespace.QName; |
| import java.awt.event.ActionEvent; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.UUID; |
| |
| //import org.apache.airavata.registry.api.AiravataRegistry2; |
| |
| public class WorkflowInterpreterLaunchWindow { |
| |
| private static final Logger logger = LoggerFactory.getLogger(WorkflowInterpreterLaunchWindow.class); |
| |
| private XBayaEngine engine; |
| |
| private Workflow workflow; |
| |
| private XBayaDialog dialog; |
| |
| private GridPanel parameterPanel; |
| |
| private List<XBayaTextField> parameterTextFields = new ArrayList<XBayaTextField>(); |
| |
| private XBayaTextField instanceNameTextField; |
| |
| private Airavata.Client airavataClient; |
| |
| private JComboBox host; |
| private HashMap<String, String> hostNames; |
| private XBayaTextField token; |
| |
| /** |
| * Constructs a WorkflowInterpreterLaunchWindow. |
| * |
| * @param engine |
| * |
| */ |
| public WorkflowInterpreterLaunchWindow(XBayaEngine engine) throws AiravataClientConnectException { |
| this.engine = engine; |
| airavataClient = AiravataClientFactory.createAiravataClient("127.0.0.1", 8930); |
| initGUI(); |
| } |
| |
| /** |
| * Shows the dialog. |
| */ |
| public void show() { |
| this.workflow = this.engine.getGUI().getWorkflow(); |
| |
| // Create input fields |
| Collection<InputNode> inputNodes = GraphUtil.getInputNodes(this.workflow.getGraph()); |
| for (InputNode node : inputNodes) { |
| String id = node.getID(); |
| DataType parameterType = node.getParameterType(); |
| JLabel nameLabel = new JLabel(id); |
| JLabel typeField = new JLabel(parameterType.toString()); |
| XBayaTextField paramField = new XBayaTextField(); |
| Object value = node.getDefaultValue(); |
| |
| String valueString; |
| if (value == null) { |
| valueString = ""; |
| } else { |
| if (value instanceof XmlElement) { |
| XmlElement valueElement = (XmlElement) value; |
| valueString = XMLUtil.xmlElementToString(valueElement); |
| } else { |
| // Only string comes here for now. |
| valueString = value.toString(); |
| } |
| } |
| paramField.setText(valueString); |
| this.parameterPanel.add(nameLabel); |
| this.parameterPanel.add(typeField); |
| this.parameterPanel.add(paramField); |
| this.parameterTextFields.add(paramField); |
| } |
| |
| Map<String, String> hosts = null; |
| |
| try { |
| hosts = airavataClient.getAllComputeResourceNames(); |
| if (hosts.isEmpty()) { |
| JOptionPane.showMessageDialog(engine.getGUI().getFrame(), |
| "No Compute Resources found", |
| "Compute Resources", |
| JOptionPane.ERROR_MESSAGE); |
| return; |
| } |
| } catch (InvalidRequestException e2) { |
| // TODO Auto-generated catch block |
| e2.printStackTrace(); |
| } catch (AiravataClientException e2) { |
| // TODO Auto-generated catch block |
| e2.printStackTrace(); |
| } catch (AiravataSystemException e2) { |
| // TODO Auto-generated catch block |
| e2.printStackTrace(); |
| } catch (TException e2) { |
| // TODO Auto-generated catch block |
| e2.printStackTrace(); |
| } |
| |
| hostNames = new HashMap<String, String>(); |
| Iterator it=hosts.entrySet().iterator(); |
| while(it.hasNext()){ |
| Map.Entry pairs=(Map.Entry)it.next(); |
| String key = (String) pairs.getKey(); |
| String value = (String) pairs.getValue(); |
| if(!hostNames.containsKey(value)){ |
| hostNames.put(value, key); |
| } |
| } |
| host = new JComboBox(); |
| it= hostNames.entrySet().iterator(); |
| while(it.hasNext()){ |
| Map.Entry pairs=(Map.Entry)it.next(); |
| String key = (String) pairs.getKey(); |
| host.addItem(key); |
| } |
| host.setSelectedIndex(0); |
| XBayaLabel hostLabel = new XBayaLabel("Host", host); |
| this.parameterPanel.add(hostLabel); |
| this.parameterPanel.add(host); |
| this.parameterPanel.layout(inputNodes.size(), 3, GridPanel.WEIGHT_NONE, 2); |
| this.dialog.show(); |
| } |
| |
| /** |
| * Hides the dialog. |
| */ |
| public void hide() { |
| this.dialog.hide(); |
| |
| this.parameterPanel.getContentPanel().removeAll(); |
| this.parameterTextFields.clear(); |
| } |
| |
| private void initGUI() { |
| this.parameterPanel = new GridPanel(true); |
| GridPanel infoPanel = new GridPanel(); |
| |
| this.instanceNameTextField = new XBayaTextField(); |
| XBayaLabel instanceNameLabel = new XBayaLabel("Experiment name", this.instanceNameTextField); |
| infoPanel.add(instanceNameLabel); |
| infoPanel.add(this.instanceNameTextField); |
| |
| token = new XBayaTextField(""); |
| JLabel tokenLabel = new JLabel("Token Id: "); |
| infoPanel.add(tokenLabel); |
| infoPanel.add(token); |
| infoPanel.layout(2, 2, GridPanel.WEIGHT_NONE, 1); |
| |
| GridPanel mainPanel = new GridPanel(); |
| mainPanel.getContentPanel().setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); |
| mainPanel.add(infoPanel); |
| mainPanel.add(this.parameterPanel); |
| mainPanel.layout(2, 1, 0, 0); |
| |
| JButton okButton = new JButton("Run"); |
| okButton.addActionListener(new AbstractAction() { |
| public void actionPerformed(ActionEvent e) { |
| try { |
| execute(); |
| } catch (AiravataClientConnectException e1) { |
| e1.printStackTrace(); |
| } catch (InvalidRequestException e1) { |
| // TODO Auto-generated catch block |
| e1.printStackTrace(); |
| } catch (AiravataClientException e1) { |
| // TODO Auto-generated catch block |
| e1.printStackTrace(); |
| } catch (AiravataSystemException e1) { |
| // TODO Auto-generated catch block |
| e1.printStackTrace(); |
| } catch (TException e1) { |
| // TODO Auto-generated catch block |
| e1.printStackTrace(); |
| } |
| } |
| }); |
| |
| JButton cancelButton = new JButton("Cancel"); |
| cancelButton.addActionListener(new AbstractAction() { |
| public void actionPerformed(ActionEvent e) { |
| hide(); |
| } |
| }); |
| |
| JPanel buttonPanel = new JPanel(); |
| buttonPanel.add(okButton); |
| buttonPanel.add(cancelButton); |
| buttonPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); |
| this.dialog = new XBayaDialog(this.engine.getGUI(), "Launch workflow", mainPanel, buttonPanel); |
| this.dialog.setDefaultButton(okButton); |
| } |
| |
| private void execute() throws AiravataClientConnectException, TException { |
| ThriftClientData thriftClientData = engine.getConfiguration().getThriftClientData(ThriftServiceType.API_SERVICE); |
| Client airavataClient = XBayaUtil.getAiravataClient(thriftClientData); |
| String gatewayId = engine.getConfiguration().getThriftClientData(ThriftServiceType.API_SERVICE).getGatewayId(); |
| |
| Workflow workflowClone = workflow.clone(); |
| workflowClone.setName(workflowClone.getName()+UUID.randomUUID().toString()); |
| org.apache.airavata.model.Workflow w = new org.apache.airavata.model.Workflow(); |
| w.setName(workflowClone.getName()); |
| w.setGraph(JSONUtil.jsonElementToString(workflowClone.toJSON())); |
| w.setTemplateId(airavataClient.registerWorkflow(gatewayId, w)); |
| String instanceName = this.instanceNameTextField.getText(); |
| if (instanceName.trim().equals("")){ |
| JOptionPane.showMessageDialog(engine.getGUI().getFrame(), |
| "Experiment name cannot be empty", |
| "Experiment Name", |
| JOptionPane.ERROR_MESSAGE); |
| return; |
| } |
| //previous instance name |
| if (!instanceNameTextField.getText().equals("")){ |
| this.instanceNameTextField.setText(""); |
| } |
| // Use topic as a base of workflow instance ID so that the monitor can |
| // find it. |
| Project project = new Project(); |
| project.setName("project1"); |
| project.setOwner(thriftClientData.getUsername()); |
| project.setProjectID(airavataClient.createProject(gatewayId, project)); |
| final List<InputNode> inputNodes = GraphUtil.getInputNodes(this.workflow.getGraph()); |
| final Experiment experiment = new Experiment(); |
| experiment.setApplicationId(w.getTemplateId()); |
| experiment.setName(instanceName); |
| experiment.setProjectID(project.getProjectID()); |
| experiment.setUserName(thriftClientData.getUsername()); |
| for (int i = 0; i < inputNodes.size(); i++) { |
| InputNode inputNode = inputNodes.get(i); |
| XBayaTextField parameterTextField = this.parameterTextFields.get(i); |
| inputNode.getID(); |
| String value = parameterTextField.getText(); |
| // inputNode.setDefaultValue(value); |
| InputDataObjectType elem = new InputDataObjectType(); |
| elem.setName(inputNode.getID()); |
| elem.setType(inputNode.getDataType()); |
| elem.setValue(value); |
| elem.setApplicationArgument(inputNode.getApplicationArgument()); |
| elem.setInputOrder(inputNode.getInputOrder()); |
| |
| experiment.addToExperimentInputs(elem ); |
| } |
| final List<OutputNode> outputNodes = GraphUtil.getOutputNodes(this.workflow.getGraph()); |
| OutputDataObjectType outputDataObjectType = null; |
| for (OutputNode outputNode : outputNodes) { |
| outputDataObjectType = new OutputDataObjectType(); |
| outputDataObjectType.setName(outputNode.getName()); |
| outputDataObjectType.setType(DataType.STRING); |
| experiment.addToExperimentOutputs(outputDataObjectType); |
| } |
| // Add scheduling configurations |
| if (host != null && host.getSelectedIndex() >= 0) { |
| String selectedHostName = host.getSelectedItem().toString(); |
| String computeResouceId = hostNames.get(selectedHostName); |
| ComputationalResourceScheduling computationalResourceScheduling; |
| if (selectedHostName.equals("localhost")) { |
| computationalResourceScheduling = ExperimentModelUtil.createComputationResourceScheduling( |
| computeResouceId, 1, 1, 1, "normal", 1, 0, 1, "test"); |
| }else if (selectedHostName.equals("trestles.sdsc.xsede.org")) { |
| computationalResourceScheduling = ExperimentModelUtil.createComputationResourceScheduling( |
| computeResouceId,1,1,1,"normal", 1,0,1, "sds128"); |
| }else if (selectedHostName.equals("stampede.tacc.xsede.org")) { |
| computationalResourceScheduling = ExperimentModelUtil.createComputationResourceScheduling( |
| computeResouceId, 2, 32, 1, "development", 90, 0, 1, "TG-STA110014S"); |
| } else if (selectedHostName.equals("bigred2.uits.iu.edu")) { |
| computationalResourceScheduling = ExperimentModelUtil.createComputationResourceScheduling( |
| computeResouceId, 1, 1, 1, "normal", 1, 0, 1, null); |
| } else { |
| // TODO handle for other computer resources too. |
| throw new IllegalArgumentException("Computational resource scheduling is not configured for host :" + |
| computeResouceId); |
| } |
| UserConfigurationData userConfigurationData = new UserConfigurationData(); |
| userConfigurationData.setAiravataAutoSchedule(false); |
| userConfigurationData.setOverrideManualScheduledParams(false); |
| userConfigurationData.setComputationalResourceScheduling(computationalResourceScheduling); |
| experiment.setUserConfigurationData(userConfigurationData); |
| }else { |
| throw new RuntimeException("Resource scheduling failed, target computer resource host name is not defined"); |
| } |
| /* |
| // code snippet for load test. |
| for (int i = 0; i < 20; i++) { |
| experiment.setName(instanceName + "_" + i); |
| |
| experiment.setExperimentID(airavataClient.createExperiment(experiment)); |
| |
| try { |
| this.engine.getMonitor().subscribe(experiment.getExperimentID()); |
| this.engine.getMonitor().fireStartMonitoring(workflow.getName()); |
| } catch (MonitorException e) { |
| logger.error("Error while subscribing with experiment Id : " + experiment.getExperimentID(), e); |
| } |
| airavataClient.launchExperiment(experiment.getExperimentID(), "testToken"); |
| |
| }*/ |
| experiment.setExperimentID(airavataClient.createExperiment(gatewayId, experiment)); |
| try { |
| this.engine.getMonitor().subscribe(experiment.getExperimentID()); |
| this.engine.getMonitor().fireStartMonitoring(workflow.getName()); |
| } catch (MonitorException e) { |
| logger.error("Error while subscribing with experiment Id : " + experiment.getExperimentID(), e); |
| } |
| airavataClient.launchExperiment(experiment.getExperimentID(), token.getText()); |
| hide(); |
| } |
| |
| private OrchestratorService.Client getOrchestratorClient() { |
| final int serverPort = Integer.parseInt(ServerSettings.getSetting(org.apache.airavata.common.utils.Constants.ORCHESTRATOR_SERVER_PORT,"8940")); |
| final String serverHost = ServerSettings.getSetting(org.apache.airavata.common.utils.Constants.ORCHESTRATOR_SERVER_HOST, null); |
| try { |
| return OrchestratorClientFactory.createOrchestratorClient(serverHost, serverPort); |
| } catch (AiravataClientConnectException e) { |
| logger.error(e.getMessage(), e); |
| } |
| return null; |
| } |
| } |