Global Read only role, Support VID specific Roles

Issue-ID: VID-46 , VID-47
Change-Id: Ib100d20ac40a65d39e27a6e2741b19a173a2b8ea
Signed-off-by: Ofir Sonsino <os0695@att.com>
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/createnewserviceinstance.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/createnewserviceinstance.jsp
new file mode 100644
index 0000000..fd2030e
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/createnewserviceinstance.jsp
@@ -0,0 +1,146 @@
+<script>
+app.controller('createNewSIController',['$scope','$http',function ($scope,$http) { 
+	
+    $scope.searchCategory = "";
+    $scope.searchString = "";
+ 	$scope.tableData=[];
+ 	$scope.displayData=[];
+ 	$scope.selectedSubscriber = $scope.tableData[0]; 
+    $scope.selectedServiceType = "Select Service Type";
+ 	function escapeRegExp(str) {
+ 		return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|\&]/g, " ");
+ 	}
+ 	$scope.serviceTypes=["Select Service Type", "uCPE-VMS", "SDN-L3-BONDING", "SDN-ETHERNET-INTERNET"];
+ 	
+ 	$scope.getSubscribers = function(refresh){
+ 
+ 		var refreshTxt = 'refresh_subscribers';
+ 		var getTxt = 'get_subscribers';
+ 		var selectedTxt = getTxt;
+ 		if (refresh)
+ 			selectedTxt = refreshTxt;
+		$http.get(selectedTxt).
+			then(function(response){
+				var data = JSON.parse(response.data.result);
+				$scope.tableData = data['customer'];
+				$scope.initSubscriberList();
+			})
+			.catch(function(data,status){
+			console.log("Error: " + status + " : " + data); 					
+			})
+			.finally(function() {
+				
+			});
+ 		
+ 	}
+ 
+
+ 	$scope.initSubscriberList = function () {
+ 		//$scope.selectedSubscriber = $scope.selectedSubscriber['subscriber-name'] || $scope.tableData[0]['subscriber-name'];
+ 		$scope.selectedSubscriber = 'Select Subscriber Name';
+ 	}
+ 	
+ 	$scope.initSrvcTypeList = function () {
+ 		$scope.selectedServiceType = $scope.serviceTypes[0];  
+ 	}
+
+ 	$scope.getSubscriberDetails = function(selectedSubscriber){
+		if (selectedSubscriber == 'Select Subscriber Name')
+			return;
+ 		$http.get('createsubscriber/' + encodeURIComponent(selectedSubscriber)).
+		then(function(response){
+		//	window.location.href = 'createsubscriberdetails.htm';
+		})
+		.catch(function(data,status){
+		console.log("Error: " + status + " : " + data); 					
+		})
+		.finally(function() {
+			
+		});
+	}
+	
+	$scope.disableSubmitBtn = function (subName, svcType) {
+		return (typeof subName === "undefined") && (svcType == 'Select Service Type');
+ 		//return (subName == 'Select Subscriber Name') && (svcType == 'Select Service Type');
+ 	}
+	
+    $scope.cancelCreateSI = function(selectedSubscriber){
+ 		
+		window.location.href = 'welcome.htm';
+		
+	}
+	
+ 	$scope.getSubscribers(false);
+ 	//$scope.initSubscriberList();
+ 	
+}]);
+
+
+</script>
+
+<div ng-controller="createNewSIController">
+     
+     <h1 class="heading1"><center>Create New Service Instance</center></h1>
+	
+
+<BR>
+ <table> <tr>
+   
+   <td width="5%" align="left">
+	<!--  <a ng-click="getSubscriberDetails(selectedSubscriber['global-customer-id']);" ng-disabled="disableSubmitBtn(selectedSubscriber['subscriber-name'], selectedServiceType);" ><img src="static/fusion/images/plus.png"></a>-->
+  <input type="image" ng-click="getSubscriberDetails(selectedSubscriber['global-customer-id']);" ng-disabled="disableSubmitBtn(selectedSubscriber['subscriber-name'], selectedServiceType);" src="static/fusion/images/plus.png"/>
+   </td>
+   
+	<td style="width:10%" align="left"><div class="fn-ebz-container">	
+		<label  class="fn-ebz-text-label">Subscriber:</label>
+		</div> </td>
+	<td style="width:30%"><div class="fn-ebz-container">
+		<select  ng-model="selectedSubscriber"  ng-options="resultdata['subscriber-name'] for resultdata in tableData" required>
+		<option value="">Select Subscriber Name</option>
+		</select>
+	</div></td>
+	 <td width="5%" align="left">
+		  <input type="image" ng-click="getSubscribers(true);" src="static/fusion/images/refresh.jpg"/>
+      </td>
+	
+	<td width="5%"> </td>
+<td style="width:10%" align="left">
+
+    
+	<div class="fn-ebz-container">	
+		<label  class="fn-ebz-text-label">Service Type:</label>
+	</div> </td>
+    <td style="width:32%"><div class="fn-ebz-container">
+		<select  ng-model="selectedServiceType"  ng-options="sType for sType in serviceTypes" ng-init="initSrvcTypeList();" ></select>
+	</div> </td>
+	
+	<td width="5%"> </td>
+	
+    </tr>
+    </table>
+ 
+	<center>
+		<button type="cancel" ng-click="cancelCreateSI();" att-button size="small">Cancel</button>
+	</center>
+	
+
+
+</div>
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/16/2016 -->
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+
+
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/login.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/login.jsp
new file mode 100644
index 0000000..804c0bf
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/login.jsp
@@ -0,0 +1,125 @@
+<%@ page import="java.net.URLEncoder"%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<%
+	// Requests are handled by class ProcessCspController in the EP-SDK-Core library.
+	// On login error, that controller returns a model that is a String->String map.
+	
+	// CSP property is defined in fusion.properties file
+	final String cspLoginUrl = SystemProperties.getProperty(SystemProperties.CSP_LOGIN_URL);
+	// Name is defined by app; do not throw if missing
+	final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME)
+			? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)
+			: SystemProperties.APP_DISPLAY_NAME;
+	// Build login-link URL using parameters and/or system properties 
+	String returnUrl = request.getParameter("returnUrl");
+	if (returnUrl == null) {
+		final String cspPage = "doLogin";
+		if (SystemProperties.containsProperty(SystemProperties.APP_BASE_URL)) {
+			// Use property with the application URL; e.g., WebJunction
+			String appUrl = SystemProperties.getProperty(SystemProperties.APP_BASE_URL);
+			returnUrl = appUrl + (appUrl.endsWith("/") ? "" : "/") + cspPage;
+		} else {
+			// Use server info; incorrect for sites behind WebJunction.
+			returnUrl = (request.isSecure() ? "https://" : "http://") + request.getServerName() + ":"
+					+ request.getServerPort() + request.getContextPath() + "/" + cspPage;
+		}
+	} else {
+		// Request has a parameter with the return URL
+		returnUrl = URLEncoder.encode(returnUrl, "UTF-8");
+	}
+%>
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
+<style>
+html {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+body {
+	padding-top: 15px;
+}
+
+.logo {
+	position: fixed;
+	left: 15px;
+	top: 15px;
+	z-index: -1;
+}
+
+.loginError {
+	font-size: 18px;
+	color: red;
+	text-align: center;
+}
+
+.login {
+	font-size: 16px;
+	display: block;
+	margin-left: auto;
+	margin-right: auto;
+	text-align: center;
+	width: 100%;
+}
+
+.login a {
+	font-size: 16px;
+}
+
+.terms {
+	font-size: 10px;
+	text-align: center;
+	margin-left: auto;
+	margin-right: auto;
+}
+
+.terms a {
+	font-size: 10px;
+	text-align: center;
+	margin-left: auto;
+	margin-right: auto;
+}
+</style>
+</head>
+<body>
+	<!-- AT&T Logo -->
+	<div class="logo">
+		<img src="static/fusion/images/logo_att_header.jpg" alt="AT&T" />
+	</div>
+	<div class="login">
+		<img src="static/fusion/images/ecomp-login-550x360.jpg" />
+		<h2>
+			<%=appDisplayName%>
+		</h2>
+		<a href="<%=cspLoginUrl%><%=returnUrl%>">Click here to login</a>
+	</div>
+	<br />
+	<br />
+	<br />
+	<div class="loginError">${model.error}</div>
+	<br />
+	<br />
+	<br />
+	<br />
+	<br />
+	<br />
+	<div id="footer">
+		<div class="terms">
+			Warning: This system is restricted to AT&amp;T authorized users for
+			business purposes. Unauthorized access is a violation of the law. <br />
+			This service may be monitored for administrative and security
+			reasons. By proceeding, you consent to this monitoring.
+		</div>
+		<p>
+		<div class="terms">
+			<a target="_top" href="http://www.att.com/terms/">Terms and
+				Conditions</a> | <a target="_top" href="http://www.att.com/privacy/">Privacy
+				Policy</a> <br> &copy; 2017 AT&amp;T. All rights reserved.
+		</div>
+	</div>
+</body>
+</html>
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/login_external.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/login_external.jsp
new file mode 100644
index 0000000..dfa3305
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/login_external.jsp
@@ -0,0 +1,126 @@
+<%--
+  ================================================================================
+  ECOMP Portal SDK
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property
+  ================================================================================
+  Licensed 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.
+  ================================================================================
+--%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<!DOCTYPE html>
+<%
+	// Name is defined by app; do not throw if missing
+	final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME)
+			? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)
+			: SystemProperties.APP_DISPLAY_NAME;
+%>
+
+<html>
+	<head>
+		<meta charset="utf-8">
+		<meta http-equiv="X-UA-Compatible" content="IE=edge">
+		<meta name="viewport" content="width=device-width, initial-scale=1">
+		<style>
+		html {
+			font-family: Verdana, Arial, Helvetica, sans-serif;
+		}
+		body {
+			padding-top: 15px;
+		}
+		.logo {
+			position: fixed;
+			left: 15px;
+			top: 15px;
+			z-index: -1;
+		}
+		.loginError {
+			font-size: 18px;
+			color: red;
+			text-align: center;
+		}
+		.login {
+			font-size: 16px;
+			display: block;
+			margin-left: auto;
+			margin-right: auto;
+			text-align: center;
+			width: 100%;
+		}
+		.login input[type=submit] {
+			font-size: 16px;
+		}
+		.terms {
+			font-size: 10px;
+			text-align: center;
+			margin-left: auto;
+			margin-right: auto;
+		}
+		.terms a {
+			font-size: 10px;
+			text-align: center;
+			margin-left: auto;
+			margin-right: auto;
+		}
+		</style>
+	</head>
+	<body>
+		<!-- AT&T Logo -->
+		<div class="logo">
+			<img src="static/fusion/images/logo_att_header.jpg" alt="AT&T" />
+		</div>
+		<div class="login">
+			<img src="static/fusion/images/ecomp_trans.png" />
+			<h2>
+				<%=appDisplayName%>
+			</h2>
+			<br />
+			<form action="login_external" method="POST"> 
+				<label for="loginId">Login ID:</label>
+				<input id="loginId" name="loginId" type="text" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" maxlength="30">
+				<br/>
+				<br/>
+				<label for="password">Password:</label>
+				<input id="password" name="password" type="password" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;"
+							maxlength="30" >
+				<br />
+				<br />
+				<input id="loginBtn" type="submit" alt="Login" value="Login">
+			</form>
+		</div>
+		<br />
+		<br />
+		<div class="loginError">${model.error}</div>
+		<br />
+		<br />
+		<br />
+		<br />
+		<br />
+		<br />
+		<div id="footer">
+			<div class="terms">
+				Warning: This system is restricted to AT&amp;T authorized users for
+				business purposes. Unauthorized access is a violation of the law. 
+				<br />
+				This service may be monitored for administrative and security
+				reasons. By proceeding, you consent to this monitoring.
+			</div>
+			<p>
+			<div class="terms">
+				<a target="_top" href="http://www.att.com/terms/">Terms and
+					Conditions</a> | <a target="_top" href="http://www.att.com/privacy/">Privacy
+					Policy</a> <br> &copy; 2017 AT&amp;T. All rights reserved.
+			</div>
+		</div>
+	</body>
+</html>
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/searchexistingsi.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/searchexistingsi.jsp
new file mode 100644
index 0000000..2c7dd9f
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/searchexistingsi.jsp
@@ -0,0 +1,81 @@
+<link rel="stylesheet" type="text/css" href="app/vid/styles/subscriberSearch.css" />
+
+<script src="app/vid/scripts/controller/VidApp.js"></script>
+<script src="app/vid/scripts/controller/subscriberSearch.js"></script>
+
+<script src="app/vid/scripts/controller/aaiSubscriberController.js"></script>
+<script src="app/vid/scripts/services/utilityService.js"></script>
+<script src="app/vid/scripts/angular-ui-tree.js"></script>
+
+<link rel="stylesheet" type="text/css" href="app/vid/styles/dialogs.css" />
+
+<script src="app/vid/test/testAaiData.js"></script>
+
+<script src="app/vid/scripts/controller/creationDialogController.js"></script>
+<script src="app/vid/scripts/controller/deletionDialogController.js"></script>
+<script src="app/vid/scripts/controller/detailsDialogController.js"></script>
+<script src="app/vid/scripts/controller/statusDialogController.js"></script>
+<script src="app/vid/scripts/controller/msoCommitController.js"></script>
+
+<script src="app/vid/scripts/services/aaiService.js"></script>
+<script src="app/vid/scripts/services/asdcService.js"></script>
+<script src="app/vid/scripts/services/creationService.js"></script>
+<script src="app/vid/scripts/services/dataService.js"></script>
+<script src="app/vid/scripts/services/deletionService.js"></script>
+<script src="app/vid/scripts/services/detailsService.js"></script>
+<script src="app/vid/scripts/services/statusService.js"></script>
+<script src="app/vid/scripts/services/componentService.js"></script>
+<script src="app/vid/scripts/services/msoService.js"></script>
+<script src="app/vid/scripts/services/propertyService.js"></script>
+<script src="app/vid/scripts/services/utilityService.js"></script>
+
+<script src="app/vid/scripts/directives/extensionsDirective.js"></script>
+<script src="app/vid/scripts/directives/parameterBlockDirective.js"></script>
+<script src="app/vid/scripts/directives/popupWindowDirective.js"></script>
+<script src="app/vid/scripts/directives/progressBarDirective.js"></script>
+
+<script src="app/vid/scripts/constants/componentConstants.js"></script>
+<script src="app/vid/scripts/constants/fieldConstants.js"></script>
+<script src="app/vid/scripts/constants/parameterConstants.js"></script>
+
+<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiGetSubs.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiSubDetails.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/angular-ui-tree.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/vidTree.css" />
+
+<%@ page import="org.openecomp.vid.mso.*"%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<%
+	String properties = "{msoMaxPolls:" + SystemProperties.getProperty(MsoProperties.MSO_MAX_POLLS)
+			+ ",msoMaxPollingIntervalMsec:"
+			+ SystemProperties.getProperty(MsoProperties.MSO_POLLING_INTERVAL_MSECS) + "}";
+%>
+
+<div ng-controller="aaiSubscriberSearchController"
+	ng-init="init(<%=properties%>);" ng-cloak>
+
+
+ 
+	<div ng-view></div>
+	
+</div>
+
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/16/2016 -->
+
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+
+		
\ No newline at end of file
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/serviceModels.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/serviceModels.jsp
new file mode 100644
index 0000000..3280bc6
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/serviceModels.jsp
@@ -0,0 +1,82 @@
+<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiGetSubs.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiSubDetails.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiSubViewEdit.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/angular-ui-tree.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/dialogs.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/instantiate.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/vidTree.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/styles/dialogs.css" />
+
+	
+	<script>
+	
+	var appDS2 = app;
+</script>
+	<script src="app/vid/scripts/controller/VidApp.js"></script>
+	
+<!-- Latest compiled and minified JavaScript -->
+
+<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
+
+
+<script src="app/vid/scripts/angular-ui-tree.js"></script>
+
+<script src="app/vid/scripts/constants/componentConstants.js"></script>
+<script src="app/vid/scripts/constants/fieldConstants.js"></script>
+<script src="app/vid/scripts/constants/vidConfiguration.js"></script>
+<script src="app/vid/scripts/constants/parameterConstants.js"></script>
+<script src="app/vid/scripts/controller/aaiSubscriberController.js"></script>
+<script src="app/vid/scripts/controller/creationDialogController.js"></script>
+<script src="app/vid/scripts/controller/deletionDialogController.js"></script>
+<script src="app/vid/scripts/controller/detailsDialogController.js"></script>
+<script src="app/vid/scripts/controller/statusDialogController.js"></script>
+<script src="app/vid/scripts/controller/InstantiationController.js"></script>
+<script src="app/vid/scripts/controller/msoCommitController.js"></script>
+<script src="app/vid/scripts/controller/ServiceModelController.js"></script>
+<script src="app/vid/scripts/controller/previousVersionDialogController.js"></script>
+<script src="app/vid/scripts/controller/previousVersionContoller.js"></script>
+<script src="app/vid/scripts/directives/extensionsDirective.js"></script>
+<script src="app/vid/scripts/directives/parameterBlockDirective.js"></script>
+<script src="app/vid/scripts/directives/popupWindowDirective.js"></script>
+<script src="app/vid/scripts/directives/progressBarDirective.js"></script>
+<script src="app/vid/scripts/services/aaiService.js"></script>
+<script src="app/vid/scripts/services/asdcService.js"></script>
+<script src="app/vid/scripts/services/componentService.js"></script>
+<script src="app/vid/scripts/services/creationService.js"></script>
+<script src="app/vid/scripts/services/dataService.js"></script>
+<script src="app/vid/scripts/services/deletionService.js"></script>
+<script src="app/vid/scripts/services/detailsService.js"></script>
+<script src="app/vid/scripts/services/statusService.js"></script>
+<script src="app/vid/scripts/services/msoService.js"></script>
+<script src="app/vid/scripts/services/propertyService.js"></script>
+<script src="app/vid/scripts/services/utilityService.js"></script>
+<script src="app/vid/scripts/services/vnfService.js"></script>
+
+<%@ page import="org.openecomp.vid.mso.*"%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<%
+	String properties = "{msoMaxPolls:" + SystemProperties.getProperty(MsoProperties.MSO_MAX_POLLS)
+			+ ",msoMaxPollingIntervalMsec:"
+			+ SystemProperties.getProperty(MsoProperties.MSO_POLLING_INTERVAL_MSECS) + "}";
+%>
+
+<div ng-controller="ServiceModelController"
+	ng-init="init(<%=properties%>);" ng-cloak>
+	<div ng-view></div>
+</div>
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/16/2016 -->
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/subscriberdetails.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/subscriberdetails.jsp
new file mode 100644
index 0000000..ca92b15
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/subscriberdetails.jsp
@@ -0,0 +1,184 @@
+<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %>
+<div ng-controller="subscriberDetailsController">
+	<div>
+		<h1 class="heading1" style="margin-top:20px;">Selected Subscriber's Service Instance Details:</h1>
+		<div style="margin-top:30px">
+		 	<table att-table table-data="tableData">
+
+			    <thead  att-table-row type="header">
+					<tr>
+					    <th att-table-header key="viewSubDetails">View/Edit</th>
+						<th att-table-header key="global-customer-id">Global Customer ID</th>
+			            <th att-table-header key="subscriber-name">Subscriber Name</th>        
+			            <th att-table-header key="service-type">Service Type</th>    
+			            <th att-table-header key="service-instance-id">Service Instance ID</th>
+			        </tr>
+			    </thead>
+			    <tbody att-table-row type="body" row-repeat="disData in displayData">
+			        <tr>
+			        <td att-table-body>
+			         <div ng-controller="viewEditSubController">
+    	              <a href="#" ng-click="postsubscriberID(disData.subscriberName)" alt="View/Edit">
+                  	     View/Edit
+	                  </a>
+            	   </div>
+            	   </td>
+		            	<td att-table-body >{{disData.globalCustomerId}}</td>
+		            	<td att-table-body >{{disData.subscriberName}}</td>
+		            	<td att-table-body >{{disData.serviceType}}</td>
+		            	<td att-table-body >{{disData.serviceInstanceId}}</td>
+			        </tr>     
+			    </tbody>	  
+			</table> 
+		</div>
+	</div>	
+	<table><tr>
+	<td>
+	<div ng-controller="searchExistingSIController" align="left" >
+		<button type="submit" ng-click="cancelSubDetails();" att-button
+			btn-type="primary" size="small">Cancel</button>
+	</div>
+	</td></tr>
+	
+	</table>
+	
+</div>
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/25/2016 -->
+
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+		
+<script>
+app.controller("subscriberDetailsController", function ($scope,$http,modalService, $modal) { 
+	$scope.tableData=${model.customerInfo};
+	$scope.displayData= [];
+	$scope.subscriberData=[];
+	$scope.serviceInstanceData= new Array();
+	$scope.globalcustomerid = $scope.tableData['global-customer-id'];
+	$scope.subscriberName = $scope.tableData['subscriber-name'];
+	$scope.subscriberData = $scope.tableData['service-subscriptions'];
+	   
+	 $scope.setDisplaynoSTSI = function(){
+    	 $scope.displayData.push({
+				globalCustomerId : $scope.globalcustomerid,
+			    subscriberName   :  $scope.subscriberName,
+			    serviceType : "No Service Subscription Found",
+			    serviceInstanceId : "No Service Instance Found"
+			});
+     }
+	 
+	 $scope.setDisplaynoSI = function(servcType){
+    	 $scope.displayData.push({
+				globalCustomerId : $scope.globalcustomerid,
+			    subscriberName   :  $scope.subscriberName,
+			    serviceType : servcType,
+			    serviceInstanceId : "No Service Instance Found"
+			});
+     }
+	 
+	if ($scope.subscriberData != null)
+		{
+		    if ($scope.numberofSubscribers = $scope.subscriberData['service-subscription'] != null)
+		    	{
+					$scope.numberofSubscribers = $scope.subscriberData['service-subscription'].length;
+					if ($scope.numberofSubscribers > 0)
+						{
+						    var index = 0;
+							for(i=0; i < $scope.numberofSubscribers; i++) {
+								$scope.serviceInstanceData[i] = new Array();
+								var servicesubscription = $scope.subscriberData['service-subscription'][i]; 
+								$scope.serviceInstanceData[i] = servicesubscription['service-instances'];
+								if ($scope.serviceInstanceData[i] != null)
+									{
+									    if ($scope.serviceInstanceData[i]['service-instance'] != null)
+									    	{
+												var numberofserviceInstance = $scope.serviceInstanceData[i]['service-instance'].length;
+												if (numberofserviceInstance > 0)
+													{
+														for(j=0; j < numberofserviceInstance; j++)
+														{
+															$scope.displayData.push({
+																globalCustomerId : $scope.globalcustomerid,
+															    subscriberName   :  $scope.subscriberName,
+															    serviceType : servicesubscription['service-type'],
+															    serviceInstanceId : $scope.serviceInstanceData[i]['service-instance'][j]['service-instance-id']
+															});
+														}
+													}
+												else
+													{
+													   $scope.setDisplaynoSI(servicesubscription['service-type']);
+													}
+									    	}
+									    else
+										{
+									    	$scope.setDisplaynoSI(servicesubscription['service-type']);
+										}
+									}
+								else
+									{
+									   $scope.setDisplaynoSI(servicesubscription['service-type']);
+									}
+					        }
+						}
+					else
+						{
+						  $scope.setDisplaynoSTSI();
+						}
+		    	}
+		    else
+				{
+		    	   $scope.setDisplaynoSTSI();
+				}
+			}
+		else
+		{
+			 $scope.setDisplaynoSTSI();
+		}
+	
+	
+});
+
+app.controller('viewEditSubController',['$scope','$http',function ($scope,$http) { 
+	
+	$scope.postsubscriberID = function(subID){
+		   $.ajax({
+		            url: "vieweditsub/subedit?"+"subscriberID="+encodeURIComponent(subID),
+	                type : "POST",
+	                success:function (response){
+	                    window.location.href = 'instantiate.htm';
+	                },
+	                error:function( jqXHR, status,error ){
+	                	$("#errorInfo").show();
+	                }
+	                
+	        });
+		}
+	
+}]);
+
+app.controller('searchExistingSIController',['$scope','$http',function ($scope,$http) { 
+	
+	$scope.cancelSubDetails = function(selectedSubscriber){
+ 		
+		window.location.href = 'searchexistingsi.htm';
+		
+	}
+	
+}]);
+</script>
+
+    
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/testMso.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/testMso.jsp
new file mode 100644
index 0000000..abcc8e2
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/testMso.jsp
@@ -0,0 +1,174 @@
+<link rel="stylesheet" type="text/css" href="app/vid/test/testMso.css" />
+<script src="app/vid/test/testMso.js"></script>
+
+<link rel="stylesheet" type="text/css" href="app/vid/styles/dialogs.css" />
+
+<script src="app/vid/scripts/controller/msoCommitController.js"></script>
+<script src="app/vid/scripts/controller/detailsDialogController.js"></script>
+<script src="app/vid/scripts/controller/statusDialogController.js"></script>
+
+<script src="app/vid/scripts/services/dataService.js"></script>
+<script src="app/vid/scripts/services/detailsService.js"></script>
+<script src="app/vid/scripts/services/statusService.js"></script>
+<script src="app/vid/scripts/services/componentService.js"></script>
+<script src="app/vid/scripts/services/propertyService.js"></script>
+<script src="app/vid/scripts/services/msoService.js"></script>
+<script src="app/vid/scripts/services/utilityService.js"></script>
+
+<script src="app/vid/scripts/directives/extensionsDirective.js"></script>
+<script src="app/vid/scripts/directives/parameterBlockDirective.js"></script>
+<script src="app/vid/scripts/directives/popupWindowDirective.js"></script>
+<script src="app/vid/scripts/directives/progressBarDirective.js"></script>
+
+<script src="app/vid/scripts/constants/componentConstants.js"></script>
+<script src="app/vid/scripts/constants/fieldConstants.js"></script>
+<script src="app/vid/scripts/constants/parameterConstants.js"></script>
+
+<!--
+	Read configuration properties from server-side properties settings and
+	pass to the test controller via the ng-include onload event.
+
+	Consider / investigate replacing this approach with an alternative
+	REST / Angular mechanism.
+-->
+<%@ page import="org.openecomp.vid.mso.*"%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<%
+	String properties = "{msoMaxPolls:" + SystemProperties.getProperty(MsoProperties.MSO_MAX_POLLS)
+			+ ",msoMaxPollingIntervalMsec:"
+			+ SystemProperties.getProperty(MsoProperties.MSO_POLLING_INTERVAL_MSECS) + "}";
+%>
+
+<div ng-controller="testController" ng-init="init(<%=properties%>);"
+	ng-cloak>
+	<div popup-window class="popupContents" ngx-show="{{popup.isVisible}}"
+		ng-cloak>
+		<div ng-include="'app/vid/scripts/view-models/msoCommit.htm'"
+			onload="autoStartCommitTest();"></div>
+		<div ng-include="'app/vid/scripts/view-models/detailsDialog.htm'"
+			onload="autoStartQueryTest();"></div>
+	</div>
+
+	<h1 class="heading2">
+		<center>Various MSO Tests</center>
+	</h1>
+	<div>
+		<input type="checkbox" ng-change="testMsoModeChanged();"
+			ng-model="isTestMsoMode"></input> <span>Use test MSO
+			controller</span>
+	</div>
+	<div>
+		<h3>These actions are expected to return successfully.</h3>
+		<button type="button" ng-click="queryServiceInstance();" att-button
+			btn-type="primary" size="small">Query Service Instance</button>
+		<button type="button" ng-click="createServiceInstance();" att-button
+			btn-type="primary" size="small">Create Service Instance</button>
+		<button type="button" ng-click="deleteServiceInstance();" att-button
+			btn-type="primary" size="small">Delete Service Instance</button>
+		<button type="button" ng-click="createNetworkInstance();" att-button
+			btn-type="primary" size="small">Create Network Instance</button>
+		<button type="button" ng-click="deleteNetworkInstance();" att-button
+			btn-type="primary" size="small">Delete Network Instance</button>
+		<button type="button" ng-click="createVNFInstance();" att-button
+			btn-type="primary" size="small">Create VNF Instance</button>
+		<button type="button" ng-click="deleteVNFInstance();" att-button
+			btn-type="primary" size="small">Delete VNF Instance</button>
+		<button type="button" ng-click="createVolumeGroupInstance();"
+			att-button btn-type="primary" size="small">Create Volume
+			Group</button>
+		<button type="button" ng-click="deleteVolumeGroupInstance();"
+			att-button btn-type="primary" size="small">Delete Volume
+			Group</button>
+		<button type="button" ng-click="createVFModuleInstance();" att-button
+			btn-type="primary" size="small">Create VF Module</button>
+		<button type="button" ng-click="deleteVFModuleInstance();" att-button
+			btn-type="primary" size="small">Delete VF Module</button>
+	</div>
+	<hr />
+	<h3>These actions are expected to generate errors. These tests assume the above
+		"Use test MSO controller" checkbox is checked. All tests are base on the Create Service
+		Instance transaction.</h3>
+	<ol>
+		<li>
+			<button type="button"
+				ng-click="generateError('ERROR_POLICY_EXCEPTION');" att-button
+				btn-type="primary" size="small">Policy Exception</button> <span>Initial
+				response contains policy exception</span>
+		</li>
+		<li>
+			<button type="button"
+				ng-click="generateError('ERROR_SERVICE_EXCEPTION');" att-button
+				btn-type="primary" size="small">Service Exception</button> <span>Initial
+				response contains service exception</span>
+		</li>
+		<li>
+			<button type="button" ng-click="generateError('ERROR_POLL_FAILURE');"
+				att-button btn-type="primary" size="small">Poll Failure</button> <span>Subsequent
+				getOrchestrationRequest poll response contains MSO failure condition</span>
+		</li>
+		<li>
+			<button type="button"
+				ng-click="generateError('ERROR_INVALID_FIELD_INITIAL');" att-button
+				btn-type="primary" size="small">Initial Invalid</button> <span>Initial
+				response contains invalid data field</span>
+		</li>
+		<li>
+			<button type="button"
+				ng-click="generateError('ERROR_INVALID_FIELD_POLL');" att-button
+				btn-type="primary" size="small">Poll Invalid</button> <span>Subsequent
+				getOrchestrationRequest poll response contains invalid data field</span>
+		</li>
+		<li>
+			<button type="button"
+				ng-click="generateError('ERROR_GENERAL_SERVER_EXCEPTION');"
+				att-button btn-type="primary" size="small">Server Exception</button>
+			<span>VID controller code generates general exception</span>
+		</li>
+		<li>
+			<button type="button" ng-click="generateError('ERROR_MAX_POLLS');"
+				att-button btn-type="primary" size="small">Maximum Polls</button> <span>Maximum
+				poll attempts exceeded</span>
+		</li>
+		<li>
+			<button type="button"
+				ng-click="generateError('ERROR_SERVER_TIMEOUT_INITIAL');" att-button
+				btn-type="primary" size="small">Initial Timeout</button> <span>Timeout
+				on initial response</span>
+		</li>
+		<li>
+			<button type="button"
+				ng-click="generateError('ERROR_SERVER_TIMEOUT_POLL');" att-button
+				btn-type="primary" size="small">Poll Timeout</button> <span>Timeout
+				on subsequent getOrchestrationRequest poll response</span>
+		</li>
+		<li>
+			<button type="button" ng-click="generateInvalidUrl404();" att-button
+				btn-type="primary" size="small">Invalid URL (404)</button> <span>GUI
+				front-end specifies invalid URL - HTTP 404 response expected</span>
+		</li>
+		<li>
+			<button type="button" ng-click="generateInvalidUrl405();" att-button
+				btn-type="primary" size="small">Invalid URL (405)</button> <span>GUI
+				front-end specifies invalid URL - HTTP 405 response expected</span>
+		</li>
+	</ol>
+
+</div>
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/16/2016 -->
+
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/testViewEdit.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/testViewEdit.jsp
new file mode 100644
index 0000000..031fedf
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/testViewEdit.jsp
@@ -0,0 +1,172 @@
+<link rel="stylesheet" type="text/css"
+	href="app/vid/test/testViewEdit.css" />
+
+<script src="app/vid/test/testAaiData.js"></script>
+<script src="app/vid/test/testViewEdit.js"></script>
+
+<link rel="stylesheet" type="text/css" href="app/vid/styles/dialogs.css" />
+
+<script src="app/vid/scripts/controller/creationDialogController.js"></script>
+<script src="app/vid/scripts/controller/deletionDialogController.js"></script>
+<script src="app/vid/scripts/controller/detailsDialogController.js"></script>
+<script src="app/vid/scripts/controller/statusDialogController.js"></script>
+<script src="app/vid/scripts/controller/msoCommitController.js"></script>
+
+<script src="app/vid/scripts/services/aaiService.js"></script>
+<script src="app/vid/scripts/services/asdcService.js"></script>
+<script src="app/vid/scripts/services/creationService.js"></script>
+<script src="app/vid/scripts/services/dataService.js"></script>
+<script src="app/vid/scripts/services/deletionService.js"></script>
+<script src="app/vid/scripts/services/detailsService.js"></script>
+<script src="app/vid/scripts/services/statusService.js"></script>
+<script src="app/vid/scripts/services/componentService.js"></script>
+<script src="app/vid/scripts/services/msoService.js"></script>
+<script src="app/vid/scripts/services/propertyService.js"></script>
+<script src="app/vid/scripts/services/utilityService.js"></script>
+
+<script src="app/vid/scripts/directives/extensionsDirective.js"></script>
+<script src="app/vid/scripts/directives/parameterBlockDirective.js"></script>
+<script src="app/vid/scripts/directives/popupWindowDirective.js"></script>
+<script src="app/vid/scripts/directives/progressBarDirective.js"></script>
+
+<script src="app/vid/scripts/constants/componentConstants.js"></script>
+<script src="app/vid/scripts/constants/fieldConstants.js"></script>
+<script src="app/vid/scripts/constants/parameterConstants.js"></script>
+
+<!--
+	Read configuration properties from server-side properties settings and
+	pass to the test controller via the ng-include onload event.
+
+	Consider / investigate replacing this approach with an alternative
+	REST / Angular mechanism.
+-->
+<%@ page import="org.openecomp.vid.mso.*"%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<%
+	String properties = "{msoMaxPolls:" + SystemProperties.getProperty(MsoProperties.MSO_MAX_POLLS)
+			+ ",msoMaxPollingIntervalMsec:"
+			+ SystemProperties.getProperty(MsoProperties.MSO_POLLING_INTERVAL_MSECS) + "}";
+%>
+
+<div ng-controller="testViewEditController"
+	ng-init="init(<%=properties%>);" ng-cloak>
+
+	<div popup-window class="popupContents" ngx-show="{{popup.isVisible}}"
+		ng-cloak>
+		<div ng-include="'app/vid/scripts/view-models/creationDialog.htm'"></div>
+		<div ng-include="'app/vid/scripts/view-models/deletionDialog.htm'"></div>
+		<div ng-include="'app/vid/scripts/view-models/detailsDialog.htm'"
+			onload="autoStartTest();"></div>
+	</div>
+
+	<h1 class="heading2">
+		<center>Test View Edit Page</center>
+	</h1>
+	<hr />
+	These buttons simulate the add, delete and "show details" (called
+	"script" in User Stories) icons (or buttons) that are expected on the
+	view / edit page.
+	<hr />
+	<div>
+		<input type="checkbox" ng-change="testMsoModeChanged();"
+			ng-model="isTestMsoMode"></input> <span>Use test MSO
+			controller</span>
+	</div>
+	<h3 ng-style="callbackStyle">CALLBACK: {{callbackResults}}</h3>
+	<table>
+		<tr>
+			<td>Service</td>
+			<td>
+				<button type="button" ng-click="createService();" att-button
+					btn-type="primary" size="small">Add</button>
+			</td>
+			<td>
+				<button type="button" ng-click="deleteService();" att-button
+					btn-type="primary" size="small">Delete</button>
+			</td>
+			<td>
+				<button type="button" ng-click="showServiceDetails();" att-button
+					btn-type="primary" size="small">Show Details</button>
+			</td>
+		</tr>
+		<tr>
+			<td>VNF</td>
+			<td>
+				<button type="button" ng-click="createVnf();" att-button
+					btn-type="primary" size="small">Add</button>
+			</td>
+			<td>
+				<button type="button" ng-click="deleteVnf();" att-button
+					btn-type="primary" size="small">Delete</button>
+			</td>
+			<td>
+				<button type="button" ng-click="showVnfDetails();" att-button
+					btn-type="primary" size="small">Show Details</button>
+			</td>
+		</tr>
+		<tr>
+			<td>VF Module</td>
+			<td>
+				<button type="button" ng-click="createVfModule();" att-button
+					btn-type="primary" size="small">Add</button>
+			</td>
+			<td>
+				<button type="button" ng-click="deleteVfModule();" att-button
+					btn-type="primary" size="small">Delete</button>
+			</td>
+			<td>
+				<button type="button" ng-click="showVfModuleDetails();" att-button
+					btn-type="primary" size="small">Show Details</button>
+			</td>
+		</tr>
+		<tr>
+			<td>Volume Group</td>
+			<td>
+				<button type="button" ng-click="createVolumeGroup();" att-button
+					btn-type="primary" size="small">Add</button>
+			</td>
+			<td>
+				<button type="button" ng-click="deleteVolumeGroup();" att-button
+					btn-type="primary" size="small">Delete</button>
+			</td>
+			<td>
+				<button type="button" ng-click="showVolumeGroupDetails();"
+					att-button btn-type="primary" size="small">Show Details</button>
+			</td>
+		</tr>
+		<tr>
+			<td>Network</td>
+			<td>
+				<button type="button" ng-click="createNetwork();" att-button
+					btn-type="primary" size="small">Add</button>
+			</td>
+			<td>
+				<button type="button" ng-click="deleteNetwork();" att-button
+					btn-type="primary" size="small">Delete</button>
+			</td>
+			<td>
+				<button type="button" ng-click="showNetworkDetails();" att-button
+					btn-type="primary" size="small">Show Details</button>
+			</td>
+		</tr>
+	</table>
+</div>
+
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/16/2016 -->
+
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/viewlog.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/viewlog.jsp
new file mode 100644
index 0000000..920298e
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/viewlog.jsp
@@ -0,0 +1,33 @@
+
+
+<div ng-controller="viewLogController">
+     
+     <h1 class="heading1"><center>View Log - Page under Construction...</center></h1>
+     <br>
+    
+
+</div>
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/16/2016 -->
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+
+
diff --git a/vid-app-common/src/test/resources/WEB-INF/jsp/welcome.jsp b/vid-app-common/src/test/resources/WEB-INF/jsp/welcome.jsp
new file mode 100644
index 0000000..dcd9968
--- /dev/null
+++ b/vid-app-common/src/test/resources/WEB-INF/jsp/welcome.jsp
@@ -0,0 +1,49 @@
+
+<div>
+     <h1 class="heading1">AT&T Domain 2.0 Network</h1>
+     <br>
+     <h1 class="heading1"><u>Welcome to VID</u></h1>
+     <br>
+   The Virtual Infrastructure Deployment (VID) application allows infrastructure service deployment operators 
+   to instantiate service instances and their constituent parts for Distributed service models required by the 
+   internal AT&T service operations organizations that manage them, such as Mobility Network Services, 
+   Netbond Services, or FlexReach Services. The models are defined by ECOMP component ASDC. The service 
+   deployment operator selects the service operations owner and model that they wish to instantiate. After 
+   entry of appropriate data, the operator instructs VID to direct another ECOMP component, MSO, to instantiate 
+   the selected service model. Once the service instance has been instantiated, the service operator can instruct 
+   VID to direct MSO to instantiate the service instance's component VNFs, VF Modules, Networks and Volume Groups. 
+   The VID user can also search for, and display, existing service instances and direct the instantiation of 
+   subsequent instance components.
+     <br><br>
+   <h1 class="heading1"><u>About VID</u></h1>
+    VID was originally developed for the October 2016 release by an integrated IT and Labs team, under the 
+      direction of Steve Smokowski and Vivian Pressley.
+      <br><br>
+    <h1 class="heading1"><a href="mailto:DL-VIDDeliveryTeam@att.com" target="_top">Contact Us</a></h1>
+    <a href="mailto:DL-VIDDeliveryTeam@att.com" target="_top">Please click here to contact us.</a>
+
+	
+
+<BR>
+
+
+
+</div>
+<!--  Temporary solution for footer overlapping the men after talking to EComp SDK developer on 06/16/2016 -->
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+
+