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">&times;</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">&times;</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