You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sm...@apache.org on 2013/07/17 21:36:03 UTC
svn commit: r1504246 - in /airavata/sandbox/gsoc2013/admin-dashboard: ./
src/ src/main/ src/main/webapp/ src/main/webapp/WEB-INF/
src/main/webapp/css/ src/main/webapp/js/
Author: smarru
Date: Wed Jul 17 19:36:02 2013
New Revision: 1504246
URL: http://svn.apache.org/r1504246
Log:
thanks viknes for the contribution
Added:
airavata/sandbox/gsoc2013/admin-dashboard/
airavata/sandbox/gsoc2013/admin-dashboard/pom.xml
airavata/sandbox/gsoc2013/admin-dashboard/src/
airavata/sandbox/gsoc2013/admin-dashboard/src/main/
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/WEB-INF/
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/WEB-INF/web.xml
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/credentials.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/css/
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/css/dashboard.css
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentDetail.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentErrorDetail.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experiments.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/index.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/js/
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/js/dashboard.js
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/projects.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/search.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/users.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflowErrorDetail.html
airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflows.html
Added: airavata/sandbox/gsoc2013/admin-dashboard/pom.xml
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/pom.xml?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/pom.xml (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/pom.xml Wed Jul 17 19:36:02 2013
@@ -0,0 +1,94 @@
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.apache.airavata</groupId>
+ <artifactId>admin-dashboard</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>war</packaging>
+ <name>Admin Monitoring Dashboard</name>
+ <description>A WebApp for admins to monitor and debug workflows</description>
+
+ <properties>
+ <war.plugin.version>2.1.1</war.plugin.version>
+ <cargo.version>1.3.1</cargo.version>
+ </properties>
+ <build>
+ <finalName>admin-dashboard</finalName>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>${war.plugin.version}</version>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.cargo</groupId>
+ <artifactId>cargo-maven2-plugin</artifactId>
+ <version>${cargo.version}</version>
+ <configuration>
+ <wait>true</wait>
+ <configuration>
+ <properties>
+ <cargo.servlet.port>6060</cargo.servlet.port>
+ <cargo.tomcat.ajp.port>6009</cargo.tomcat.ajp.port>
+ <cargo.protocol>http</cargo.protocol>
+ <cargo.jvmargs>
+ <![CDATA[-Xdebug -Xrunjdwp:transport=dt_socket,address=6000,server=y,suspend=n -noverify]]>
+ </cargo.jvmargs>
+ <cargo.tomcat.context.reloadable>true</cargo.tomcat.context.reloadable>
+ </properties>
+ <home>${project.build.directory}/tomcat7x</home>
+ </configuration>
+ <container>
+ <containerId>tomcat7x</containerId>
+ <timeout>180000</timeout>
+ <zipUrlInstaller>
+ <url>
+ http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.16/bin/apache-tomcat-7.0.16.zip
+ </url>
+ </zipUrlInstaller>
+ </container>
+ <deployables>
+ <deployable>
+ <groupId>com.apache.airavata</groupId>
+ <artifactId>admin-dashboard</artifactId>
+ <type>war</type>
+ <properties>
+ <context>/admin</context>
+ </properties>
+ </deployable>
+ </deployables>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/WEB-INF/web.xml?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/WEB-INF/web.xml (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/WEB-INF/web.xml Wed Jul 17 19:36:02 2013
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ version="3.0">
+
+</web-app>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/credentials.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/credentials.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/credentials.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/credentials.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,50 @@
+<!--
+ 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.
+-->
+<div>
+ <form class="form-horizontal" name="userForm">
+ <fieldset>
+ <legend>Login Details</legend>
+ <div class="control-group" ng-class="{error: userForm.username.$invalid}">
+ <label class="control-label">Username</label>
+ <div class="controls">
+ <input type="text" ng-model="username" placeholder="Username" required>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Password</label>
+ <div class="controls">
+ <input type="password" ng-model="password" placeholder="Password">
+ </div>
+ </div>
+ <div class="control-group" ng-class="{error: userForm.url.$invalid}">
+ <label class="control-label">Server</label>
+ <div class="controls">
+ <input type="url" ng-model="url" class="input-xlarge" placeholder="http://localhost:8080/airavata-registry/" required>
+ </div>
+ </div>
+ <div class="control-group">
+ <div class="controls">
+ <button ng-hide="crdSetFlag" ng-click="save()" ng-disabled="isClean() || userForm.$invalid" class="btn btn-primary">Login</button>
+ <button ng-show="crdSetFlag" ng-disabled="true" class="btn btn-success"><i class="icon-ok"></i> Successful</button>
+ <a ng-click="clear()" class="btn">Clear</a>
+ </div>
+ </div>
+ </fieldset>
+ </form>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/css/dashboard.css
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/css/dashboard.css?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/css/dashboard.css (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/css/dashboard.css Wed Jul 17 19:36:02 2013
@@ -0,0 +1,63 @@
+/**
+ 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.
+*/
+.dashboard-overlay {
+ background-color: #ffffff;
+ margin: auto;
+ padding: 15px;
+ border: currentColor;
+ transition: 0.25s linear;
+ left: 3%;
+ top: 5%;
+ width: 91.7%;
+ height: 86%;
+ overflow: auto;
+ border-collapse: separate;
+ position: fixed !important;
+ z-index: 10000;
+ opacity: 0;
+ -webkit-border-radius: 1px;
+ -moz-border-radius: 1px;
+ border-radius: 1px;
+ -webkit-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4);
+ -moz-box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4);
+ box-shadow: 0px 3px 10px rgba(34, 25, 25, 0.4);
+ outline: none;
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box;
+}
+
+.title {
+ padding: 1% 0% 1% 1%;
+ font-size: 18px;
+ font-weight: 550;
+ text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbtn {
+ padding: 0.5% 0% 0% 0%;
+}
+
+a:hover,
+a:active {
+ cursor : pointer;
+}
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentDetail.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentDetail.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentDetail.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentDetail.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,103 @@
+<!--
+ 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.
+-->
+<div>
+ <h4>Experiment Details</h4>
+ <div class="accordion" id="workflowAccordion">
+ <div class="accordion-group" ng-repeat="workflow in experiment.workflowInstanceDataList">
+ <div class="accordion-heading">
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#workflowAccordion" ng-href="#collapse{{$index+1}}">
+ Workflow {{$index+1}} - {{workflow.workflowInstance.workflowExecutionId}}
+ </a>
+ </div>
+ <div id="collapse{{$index+1}}" class="accordion-body collapse">
+ <div class="accordion-inner">
+ <table class="table table-condensed">
+ <thead>
+ <tr>
+ <th style="width:30%">Item</th>
+ <th style="width:70%">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Workflow Id</td>
+ <td>{{workflow.workflowInstance.workflowExecutionId}}</td>
+ </tr>
+ <tr>
+ <td>Workflow Instance Name</td>
+ <td>{{workflow.workflowInstance.templateName}}</td>
+ </tr>
+ <tr>
+ <td>Workflow Status</td>
+ <td>{{workflow.workflowInstanceStatus.executionStatus}}
+ <a ng-click="gotoUrl('/experiments/errors/'+experiment.experimentId+'/workflow/'+workflow.workflowInstance.workflowExecutionId)" ng-show="workflow.workflowInstanceStatus.executionStatus=='FAILED'">(Get error details)</a></td>
+ </tr>
+ <tr>
+ <td>Status Update Time</td>
+ <td>{{workflow.workflowInstanceStatus.statusUpdateTime | date:'medium'}}</td>
+ </tr>
+ <tr ng-repeat="node in workflow.nodeDataList">
+ <td colspan="2">
+ <div><strong>{{node.type}}</strong></div>
+ <div style="margin-left:2%">
+ <table class="table table-condensed">
+ <thead>
+ <tr><th style="width:28%"></th><th style="width:72%"></th></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Node Id</td>
+ <td>{{node.nodeId}}</td>
+ </tr>
+ <tr>
+ <td>Execution Status</td>
+ <td>{{node.status.executionStatus}}</td>
+ </tr>
+ <tr>
+ <td>Status Update Time</td>
+ <td>{{node.status.statusUpdateTime | date:'medium'}}</td>
+ </tr>
+ <tr>
+ <td>Input</td>
+ <td>{{node.input}}</td>
+ </tr>
+ <tr>
+ <td>Input Data</td>
+ <td>{{node.inputData}}</td>
+ </tr>
+ <tr>
+ <td>Output</td>
+ <td>{{node.output}}</td>
+ </tr>
+ <tr>
+ <td>Output Data</td>
+ <td>{{node.outputData}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentErrorDetail.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentErrorDetail.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentErrorDetail.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experimentErrorDetail.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,102 @@
+<!--
+ 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.
+-->
+<div>
+ <h4>Experiment Error Details</h4>
+ <table class="table table-condensed">
+ <thead>
+ <tr>
+ <th style="width:30%">Item</th>
+ <th style="width:70%">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Workflow Id</td>
+ <td>{{workflow.workflowInstance.workflowExecutionId}}</td>
+ </tr>
+ <tr>
+ <td>Workflow Status</td>
+ <td>{{workflow.workflowInstanceStatus.executionStatus}}</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div><strong>Workflow Level Error Details</strong></div>
+ <div ng-hide="workflowErrors.length>0"><br>No workflow level error details available !</div>
+ </td>
+ </tr>
+ <tr ng-repeat="workflowError in workflowErrors">
+ <td colspan="2">
+ <div>
+ <table class="table table-condensed">
+ <thead>
+ <tr><th style="width:30%"></th><th style="width:70%"></th></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Date</td>
+ <td style="color:red;">{{workflowError.errorTime | date:'medium'}}</td>
+ </tr>
+ <tr>
+ <td>Message</td>
+ <td style="color:red;">{{workflowError.errorMessage}}</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td style="color:red;">{{workflowError.errorDescription}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div><strong>Node Level Error Details</strong></div>
+ <div ng-hide="nodeErrors.length>0"><br>No node level error details available !</div>
+ </td>
+ </tr>
+ <tr ng-repeat="nodeError in nodeErrors">
+ <td colspan="2">
+ <div><strong>{{nodeError.type}}</strong></div>
+ <div style="margin-left:2%">
+ <table class="table table-condensed">
+ <thead>
+ <tr><th style="width:28%"></th><th style="width:72%"></th></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Date</td>
+ <td style="color:red;">{{nodeError.errorTime | date:'medium'}}</td>
+ </tr>
+ <tr>
+ <td>Message</td>
+ <td style="color:red;">{{nodeError.errorMessage}}</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td style="color:red;">{{nodeError.errorDescription}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experiments.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experiments.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experiments.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/experiments.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,37 @@
+<!--
+ 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.
+-->
+<div>
+ <h4>Experiments</h4>
+ <table class="table table-striped table-condensed">
+ <thead>
+ <tr>
+ <th>Experiment Id</th>
+ <th>Template</th>
+ <th>Run By</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="experiment in experiments">
+ <td><a ng-click="gotoUrl('/experiments/id/'+experiment.experimentId)">{{experiment.experimentId}}</a></td>
+ <td>{{experiment.workflowInstanceName}}</td>
+ <td>{{experiment.user}}</td>
+ </tr>
+ </tbody>
+ </table>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/index.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/index.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/index.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/index.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,43 @@
+<!--
+ 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.
+-->
+<!DOCTYPE html>
+<html ng-app="adminMonitorApp">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <title>Airavata Admin Monitoring Dashboard</title>
+
+ <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+ <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
+ <script type="text/javascript" src="js/dashboard.js"></script>
+
+
+ <!-- Bootstrap -->
+ <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>
+ <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
+ <link href="css/dashboard.css" rel="stylesheet">
+
+</head>
+<body>
+
+ <adminboard></adminboard>
+
+</body>
+</html>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/js/dashboard.js
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/js/dashboard.js?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/js/dashboard.js (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/js/dashboard.js Wed Jul 17 19:36:02 2013
@@ -0,0 +1,481 @@
+/**
+ 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.
+*/
+var app = angular.module("adminMonitorApp",["controllers"]);
+
+app.config(['$httpProvider','$routeProvider' ,function($httpProvider, $routeProvider) {
+ $httpProvider.defaults.useXDomain = true;
+ delete $httpProvider.defaults.headers.common['X-Requested-With'];
+ $routeProvider.
+ when('/', {controller:'LoginCtrl', templateUrl:'credentials.html'}).
+ when('/experiments/id/:expId', {controller:'ExperimentCtrl', templateUrl:'experimentDetail.html'}).
+ when('/experiments/errors/:expId', {controller:'ExperimentCtrl', templateUrl:'experimentErrorDetail.html'}).
+ when('/experiments/errors/:expId/workflow/:workflowId', {controller:'WorkflowCtrl', templateUrl:'workflowErrorDetail.html'}).
+ when('/experiments/user/:username', {controller:'ExperimentCtrl', templateUrl:'experiments.html'}).
+ when('/experiments/all', {controller:'ExperimentCtrl', templateUrl:'experiments.html'}).
+ when('/experiments', {controller:'ExperimentCtrl', templateUrl:'users.html'}).
+ when('/projects', {controller:'ProjectCtrl', templateUrl:'projects.html'}).
+ when('/workflows', {controller:'WorkflowCtrl', templateUrl:'workflows.html'}).
+ otherwise({redirectTo:'/'});
+}]);
+
+app.directive("adminboard", function() {
+ return {
+ restrict : "E",
+ transclude : true,
+ scope : {},
+ controller : function($scope,$element,$location) {
+ $scope.backUrls = [];
+ $scope.fwdUrls = [];
+ $scope.goBack = function() {
+ $scope.fwdUrls.push($location.path());
+ $location.path($scope.backUrls.pop());
+ };
+ $scope.goFwd = function() {
+ $scope.backUrls.push($location.path());
+ $location.path($scope.fwdUrls.pop());
+ };
+ $scope.gotoUrl = function(url) {
+ $scope.backUrls.push($location.path());
+ $location.path(url);
+ };
+ $scope.showSearch = function() {
+ $scope.showSearchPane = true;
+ };
+ $scope.hideSearch = function() {
+ $scope.showSearchPane = false;
+ };
+ $scope.search = function (searchFor,searchBy,searchText){
+ var searchUrl = "";
+ if(searchFor==undefined || searchFor=="" || searchBy==undefined || searchBy=="" || searchText==undefined || searchText=="")
+ return;
+ switch(searchFor) {
+ case "Experiment" :
+ searchUrl += "/experiments";
+ break;
+ case "Project" :
+ searchUrl += "/projects";
+ break;
+ case "Workflow" :
+ searchUrl += "/workflows";
+ break;
+ }
+ switch(searchBy) {
+ case "User" :
+ searchUrl += "/user";
+ break;
+ case "Id" :
+ searchUrl += "/id";
+ break;
+ }
+ searchUrl += "/"+searchText;
+ $scope.gotoUrl(searchUrl);
+ };
+ },
+ template :
+ '<div>' +
+ '<button class="btn" href="#dashboard" role="button" data-toggle="modal">Debug</button>' +
+ '<div id="dashboard" class="dashboard-overlay hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">' +
+ '<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>' +
+ '<div class="row">' +
+ '<div class="span2 title">Airavata Dashboard </div>' +
+ '<div class="span2 navbtn">' +
+ '<button class="btn" ng-click="goBack()" ng-disabled="backUrls.length<1"><i class="icon-arrow-left"></i></button> ' +
+ '<button class="btn" ng-click="goFwd()" ng-disabled="fwdUrls.length<1"><i class="icon-arrow-right"></i></button>' +
+ '</div>' +
+ '</div>' +
+ '<ul class="nav nav-tabs">' +
+ '<li><a ng-click="gotoUrl(\'/\')">Credentials</a></li>' +
+ '<li><a ng-click="gotoUrl(\'/experiments\')">Experiments</a></li>' +
+ '<li><a ng-click="gotoUrl(\'/projects\')">Projects</a></li>' +
+ '<li><a ng-click="gotoUrl(\'/workflows\')">Workflows</a></li>' +
+ '<li class="pull-right"><a ng-click="showSearch()">Search</a></li>' +
+ '</ul>' +
+ '<div class="row-fluid">' +
+ '<div ng-class="{span10:showSearchPane, span12:!showSearchPane}"><div ng-view></div></div>' +
+ '<div ng-include src="\'search.html\'" ng-show="showSearchPane" class="span2 well">' +
+ '</div>' +
+ '<div class="tab-content" ng-transclude></div>' +
+ '</div>' +
+ '</div>',
+ replace : true
+ };
+});
+
+
+// Controllers
+angular.module("controllers",["config","services"]).
+ controller("LoginCtrl", ["$scope","User","Server",function($scope,User,Server) {
+ $scope.save = function() {
+ Server.setEndpoint($scope.url);
+ User.login($scope.username,$scope.password).then(function(success) {
+ if(success) {
+ $scope.crdSetFlag = true;
+ }
+ });
+ };
+ $scope.clear = function() {
+ $scope.username = "";
+ $scope.password = "";
+ $scope.url = "";
+ User.clearCredentials();
+ Server.clearEndpoint();
+ $scope.crdSetFlag = false;
+ };
+ }]).
+ controller("ExperimentCtrl", ["$scope","$location","$routeParams","Experiment","Workflow","User",function($scope,$location,$routeParams,Experiment,Workflow,User) {
+ if($location.path()=="/experiments") {
+ User.getAll().then(function(users) {
+ console.log(users);
+ $scope.users = users;
+ });
+ }
+ else if($location.path()=="/experiments/all") {
+ Experiment.getAll().then(function(experiments) {
+ $scope.experiments = experiments;
+ });
+ }
+ else if($location.path().indexOf("/experiments/user/")==0) {
+ var username = $routeParams.username;
+ Experiment.getByUser(username).then(function(experiments) {
+ $scope.experiments = experiments;
+ });
+ }
+ else if($location.path().indexOf("/experiments/id/")==0) {
+ var expId = $routeParams.expId;
+ Experiment.getById(expId).then(function(experiment) {
+ $scope.experiment = experiment;
+ });
+ }
+ else if($location.path().indexOf("/experiments/errors/")==0) {
+ var expId = $routeParams.expId;
+ Experiment.getById(expId).then(function(experiment) {
+ $scope.experiment = experiment;
+ var expId = experiment.experimentId;
+ var workflowId = experiment.workflowInstanceDataList[0].workflowInstance.workflowExecutionId;
+ $scope.workflowErrors = [];
+ Workflow.getWorkflowExecutionErrors(expId, workflowId).then(function(workflowErrors) {
+ for(item in workflowErrors) {
+ var error = workflowErrors[item];
+ if(error!={}) {
+ $scope.workflowErrors.push(error);
+ }
+ }
+ });
+ var nodesList = experiment.workflowInstanceDataList[0].nodeDataList;
+ $scope.nodeErrors = [];
+ for(i in nodesList) {
+ Workflow.getNodeExecutionErrors(expId, workflowId,nodesList[i].nodeId).then(function(nodeErrors) {
+ for(item in nodeErrors) {
+ var error = nodeErrors[item];
+ if(error!={}) {
+ error.type = nodesList[i].type;
+ $scope.nodeErrors.push(error);
+ }
+ }
+ });
+ }
+ });
+ }
+ }]).
+ controller("ProjectCtrl", ["$scope","Project",function($scope,Project) {
+ Project.getAll().then(function(projects) {
+ $scope.projects = projects;
+ });
+ }]).
+ controller("WorkflowCtrl", ["$scope","$location","$routeParams","Experiment","Workflow",function($scope,$location,$routeParams,Experiment,Workflow) {
+ if($location.path()=="/workflows") {
+ Workflow.getAll().then(function(workflows) {
+ $scope.workflows = workflows;
+ });
+ }
+ else if($location.path().indexOf("/experiments/errors/")==0) {
+ var expId = $routeParams.expId;
+ var workflowId = $routeParams.workflowId;
+ Experiment.getById(expId).then(function(experiment) {
+ var expId = experiment.experimentId;
+ var workflowList = experiment.workflowInstanceDataList;
+ $scope.workflowErrors = [];
+ $scope.nodeErrors = [];
+ for(i in workflowList) {
+ // Get only the particular workflow error details.
+ if(workflowId==workflowList[i].workflowInstance.workflowExecutionId) {
+ $scope.workflow = workflowList[i];
+ Workflow.getWorkflowExecutionErrors(expId, workflowId).then(function(workflowErrors) {
+ for(item in workflowErrors) {
+ var error = workflowErrors[item];
+ if(error!={}) {
+ $scope.workflowErrors.push(error);
+ }
+ }
+ });
+ var nodesList = workflowList[i].nodeDataList;
+ for(i in nodesList) {
+ Workflow.getNodeExecutionErrors(expId, workflowId,nodesList[i].nodeId).then(function(nodeErrors) {
+ for(item in nodeErrors) {
+ var error = nodeErrors[item];
+ if(error!={}) {
+ error.type = nodesList[i].type;
+ $scope.nodeErrors.push(error);
+ }
+ }
+ });
+ }
+ }
+ }
+ });
+ }
+ }]);
+
+// Services
+angular.module("services",["config"]).
+ factory("Project",["$http","User","Server", function($http, User, Server) {
+ return {
+ getAll : function() {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/projectregistry/get/projects",
+ cache : true, withCredentials : true}).
+ then(function(response) {
+ return response.data.workspaceProjects;
+ }, function(error) {
+ console.log("Error occured while fetching projects !");
+ });
+ }
+ };
+ }]).
+ factory("Experiment",["$http","User","Server", function($http, User, Server) {
+ return {
+ getAll : function() {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/experimentregistry/get/experiments/all",
+ cache : true, withCredentials : true}).
+ then(function(response) {
+ console.log(response);
+ var results = response.data.experiments;
+ var experiments = [];
+ for (var item in results) {
+ var experiment = {};
+ experiment.experimentId = results[item].experimentId;
+ experiment.gatewayName = results[item].gateway.gatewayName;
+ experiment.projectName = results[item].project.projectName;
+ experiment.submittedDate = new Date(results[item].submittedDate).toLocaleString();
+ experiment.user = results[item].user.userName;
+ experiments.push(experiment);
+ }
+ return experiments;
+ }, function(error) {
+ console.log("Error occured while fetching experiments !");
+ });
+ },
+ getByUser : function(username) {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/provenanceregistry/get/experiment/user?username="+username,
+ cache : true, withCredentials : true}).
+ then(function(response) {
+ console.log(response);
+ return response.data.experimentDataList;
+ }, function(error) {
+ console.log("Error occured while fetching experiments !");
+ });
+ },
+ getById : function(expId) {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/provenanceregistry/get/experiment?experimentId="+expId,
+ cache : false, withCredentials : true}).
+ then(function(response) {
+ return response.data;
+ }, function(error) {
+ console.log("Error occured while fetching experiment with id "+expId);
+ });
+ }
+ };
+ }]).
+ factory("Workflow",["$http","User","Server", function($http, User, Server) {
+ return {
+ getAll : function() {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/userwfregistry/get/workflows",
+ cache : true, withCredentials : true}).
+ then(function(response) {
+ return response.data.workflowList;
+ }, function(error) {
+ console.log("Error occured while fetching workflows !");
+ });
+ },
+ getWorkflowExecutionErrors : function(expId,workflowId) {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/provenanceregistry/workflow/errors?experimentId="+expId+"&workflowInstanceId="+workflowId,
+ cache : false, withCredentials : true}).
+ then(function(response) {
+ return response.data.workflowExecutionErrorList;
+ }, function(error) {
+ console.log("Error occured while fetching execution errors for workflow with id "+workflowId);
+ });
+ },
+ getNodeExecutionErrors : function(expId,workflowId,nodeId) {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/provenanceregistry/node/errors?experimentId="+expId+"&workflowInstanceId="+workflowId+"&nodeId="+nodeId,
+ cache : false, withCredentials : true}).
+ then(function(response) {
+ return response.data.nodeExecutionErrorList;
+ }, function(error) {
+ console.log("Error occured while fetching execution errors for workflow id "+workflowId+" with node id "+nodeId);
+ });
+ }
+ };
+ }]);
+
+// Utils
+angular.module("config",["encoder"]).
+factory("User",["$http","Base64","Server", function($http,Base64,Server) {
+ var _username = "";
+ return {
+ getAuthHeader : function(username,password) {
+ var token = username + ':' + password;
+ return "Basic " + Base64.encode(token);
+ },
+ clearCredentials : function() {
+ _username = "";
+ return;
+ },
+ getUsername : function() {
+ return _username;
+ },
+ login : function(username,password) {
+ _username = username;
+ $http.defaults.headers.common.Authorization = this.getAuthHeader(username,password);
+ return $http({method:"GET", url:Server.getEndpoint()+"api/congfigregistry/get/eventingservice/uri",
+ cache : false}).
+ then(function(response) {
+ return true;
+ }, function(error) {
+ console.error("Error logging in with username "+_username+" and the password you provided");
+ return false;
+ });
+ },
+ getAll : function() {
+ return $http({method:"GET", url:Server.getEndpoint()+"api/userregistry/get/user/all",
+ cache : false, withCredentials : true}).
+ then(function(response) {
+ return response.data.userList;
+ }, function(error) {
+ console.log("Error occured while fetching list of users");
+ });
+ }
+ };
+}]).
+factory("Server",[function() {
+ var _url = "";
+ function endsWith(str, suffix) {
+ return str.indexOf(suffix, str.length - suffix.length) !== -1;
+ }
+ return {
+ setEndpoint : function(url) {
+ if(!endsWith(url,"/"))
+ url += "/";
+ _url = url;
+ return;
+ },
+ clearEndpoint : function() {
+ _url = "";
+ return;
+ },
+ getEndpoint : function() {
+ return _url;
+ }
+ };
+}]);
+
+angular.module("encoder",[]).
+ factory('Base64', function() {
+ var keyStr = 'ABCDEFGHIJKLMNOP' +
+ 'QRSTUVWXYZabcdef' +
+ 'ghijklmnopqrstuv' +
+ 'wxyz0123456789+/' +
+ '=';
+ return {
+ encode: function (input) {
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+
+ do {
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+
+ if (isNaN(chr2)) {
+ enc3 = enc4 = 64;
+ } else if (isNaN(chr3)) {
+ enc4 = 64;
+ }
+
+ output = output +
+ keyStr.charAt(enc1) +
+ keyStr.charAt(enc2) +
+ keyStr.charAt(enc3) +
+ keyStr.charAt(enc4);
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+ } while (i < input.length);
+
+ return output;
+ },
+
+ decode: function (input) {
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+ var base64test = /[^A-Za-z0-9\+\/\=]/g;
+ if (base64test.exec(input)) {
+ alert("There were invalid base64 characters in the input text.\n" +
+ "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
+ "Expect errors in decoding.");
+ }
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+ do {
+ enc1 = keyStr.indexOf(input.charAt(i++));
+ enc2 = keyStr.indexOf(input.charAt(i++));
+ enc3 = keyStr.indexOf(input.charAt(i++));
+ enc4 = keyStr.indexOf(input.charAt(i++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ output = output + String.fromCharCode(chr1);
+
+ if (enc3 != 64) {
+ output = output + String.fromCharCode(chr2);
+ }
+ if (enc4 != 64) {
+ output = output + String.fromCharCode(chr3);
+ }
+
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+
+ } while (i < input.length);
+
+ return output;
+ }
+ };
+ });
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/projects.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/projects.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/projects.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/projects.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,35 @@
+<!--
+ 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.
+-->
+<div>
+ <table class="table table-striped table-condensed">
+ <thead>
+ <tr>
+ <th>Project Name</th>
+ <th>Gateway</th>
+ <th>Run By</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="project in projects">
+ <td>{{project.projectName}}</td>
+ <td>{{project.gateway.gatewayName}}</td>
+ <td>{{project.airavataUser.userName}}</td>
+ </tbody>
+ </table>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/search.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/search.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/search.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/search.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,57 @@
+<!--
+ 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.
+-->
+<div>
+ <button ng-click="hideSearch()" class="close">×</button>
+ <form>
+ <fieldset>
+ <legend>Search</legend>
+ <div class="control-group">
+ <label class="control-label">For</label>
+ <div class="controls">
+ <select class="span12" ng-model="searchFor">
+ <option>Experiment</option>
+ <option>Project</option>
+ <option>Workflow</option>
+ </select>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">By</label>
+ <div class="controls">
+ <select class="span12" ng-model="searchBy">
+ <option>Id</option>
+ <option>User</option>
+ <option>Date</option>
+ </select>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">{{searchBy}}</label>
+ <div class="controls">
+ <input class="span12" type="text" ng-model="searchText" placeholder="Value">
+ </div>
+ </div>
+ <div class="control-group">
+ <div class="controls">
+ <button ng-click="search(searchFor,searchBy,searchText)" class="btn">Search</button>
+ </div>
+ </div>
+ </fieldset>
+ </form>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/users.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/users.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/users.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/users.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,35 @@
+<!--
+ 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.
+-->
+<div>
+ <h4>Select a user to list his experiments</h4>
+ <table class="table table-striped table-condensed">
+ <thead>
+ <tr>
+ <th>Username</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="user in users">
+ <td><a ng-click="gotoUrl('/experiments/user/'+user.userName)">{{user.userName}}</a></td>
+ </tr>
+ </tbody>
+ </table>
+ <br>
+ <a ng-click="gotoUrl('/experiments/all')">Click here</a> to list <strong>all experiments</strong>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflowErrorDetail.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflowErrorDetail.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflowErrorDetail.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflowErrorDetail.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,102 @@
+<!--
+ 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.
+-->
+<div>
+ <h4>Workflow Error Details</h4>
+ <table class="table table-condensed">
+ <thead>
+ <tr>
+ <th style="width:30%">Item</th>
+ <th style="width:70%">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Workflow Id</td>
+ <td>{{workflow.workflowInstance.workflowExecutionId}}</td>
+ </tr>
+ <tr>
+ <td>Workflow Status</td>
+ <td>{{workflow.workflowInstanceStatus.executionStatus}}</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div><strong>Workflow Level Error Details</strong></div>
+ <div ng-hide="workflowErrors.length>0"><br>No workflow level error details available !</div>
+ </td>
+ </tr>
+ <tr ng-repeat="workflowError in workflowErrors">
+ <td colspan="2">
+ <div>
+ <table class="table table-condensed">
+ <thead>
+ <tr><th style="width:30%"></th><th style="width:70%"></th></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Date</td>
+ <td style="color:red;">{{workflowError.errorTime | date:'medium'}}</td>
+ </tr>
+ <tr>
+ <td>Message</td>
+ <td style="color:red;">{{workflowError.errorMessage}}</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td style="color:red;">{{workflowError.errorDescription}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div><strong>Node Level Error Details</strong></div>
+ <div ng-hide="nodeErrors.length>0"><br>No node level error details available !</div>
+ </td>
+ </tr>
+ <tr ng-repeat="nodeError in nodeErrors">
+ <td colspan="2">
+ <div><strong>{{nodeError.type}}</strong></div>
+ <div style="margin-left:2%">
+ <table class="table table-condensed">
+ <thead>
+ <tr><th style="width:28%"></th><th style="width:72%"></th></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Date</td>
+ <td style="color:red;">{{nodeError.errorTime | date:'medium'}}</td>
+ </tr>
+ <tr>
+ <td>Message</td>
+ <td style="color:red;">{{nodeError.errorMessage}}</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td style="color:red;">{{nodeError.errorDescription}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
\ No newline at end of file
Added: airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflows.html
URL: http://svn.apache.org/viewvc/airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflows.html?rev=1504246&view=auto
==============================================================================
--- airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflows.html (added)
+++ airavata/sandbox/gsoc2013/admin-dashboard/src/main/webapp/workflows.html Wed Jul 17 19:36:02 2013
@@ -0,0 +1,33 @@
+<!--
+ 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.
+-->
+<div>
+ <table class="table table-striped table-condensed">
+ <thead>
+ <tr>
+ <th>Workflow Name</th>
+ <th>Graph</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="workflow in workflows">
+ <td>{{workflow.workflowName}}</td>
+ <td>{{workflow.workflowGraph}}</td>
+ </tbody>
+ </table>
+</div>
\ No newline at end of file