AT&T 1712 and 1802 release code

This is code from AT&T's 1712 and 1802 releases.

Change-Id: Ie1e85851e94bc66c4d9514a0226c221939531a04
Issue-ID: SO-425
Signed-off-by: Rob Daugherty <rd472p@att.com>
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCConfiguration.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCConfiguration.java
index e069989..98c7173 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCConfiguration.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCConfiguration.java
@@ -53,6 +53,9 @@
 
     public static final String MSO_PROP_ASDC = "MSO_PROP_ASDC";
     public static final String PARAMETER_PATTERN = "asdc-connections";
+    public static final String MSG_BUS_ADDRESS_ATTRIBUTE_NAME = "messageBusAddress";
+    public static final String COMPONENT_NAMES_ADDRESS_ATTRIBUTE_NAME = "componentNames";
+    public static final String WATCHDOG_TIMEOUT_NAME = "watchDogTimeout";
 
     public static final String CONSUMER_GROUP_ATTRIBUTE_NAME = "consumerGroup";
     public static final String CONSUMER_ID_ATTRIBUTE_NAME = "consumerId";
@@ -113,14 +116,46 @@
 
     }
     
+    @Override
     public java.lang.Boolean isUseHttpsWithDmaap() {
     	return false;
     }
+    
+    @Override
+    public boolean isConsumeProduceStatusTopic(){
+    	return true;
+    }
+    
+    @Override
+    public List<String> getMsgBusAddress(){
 
+       JsonNode masterConfigNode = getASDCControllerConfigJsonNode ();
+        if (masterConfigNode != null && masterConfigNode.get (MSG_BUS_ADDRESS_ATTRIBUTE_NAME) != null) {
+            List<String> msgAddressList = new ArrayList<>();
+            
+            Iterator<JsonNode> config = masterConfigNode.get(MSG_BUS_ADDRESS_ATTRIBUTE_NAME).elements();
+      
+            while( config.hasNext() ) {
+                String key = (String)config.next().asText();
+                msgAddressList.add(key);
+            }
+
+            if ("NULL".equals (msgAddressList) || msgAddressList.isEmpty ()) {
+                return null;
+            } else {
+                return msgAddressList;
+            }
+        } else {
+            return null;
+        } 
+    	
+    	
+    }
+    
     public String getAsdcControllerName () {
         return asdcControllerName;
     }
-
+    
     private JsonNode getASDCControllerConfigJsonNode () {
         if (this.msoProperties.getJsonRootNode ().get (PARAMETER_PATTERN) != null) {
             return this.msoProperties.getJsonRootNode ().get (PARAMETER_PATTERN).get (this.asdcControllerName);
@@ -184,6 +219,16 @@
             return null;
         }
     }
+    
+    public int getWatchDogTimeout () {
+        JsonNode masterConfigNode = getASDCControllerConfigJsonNode ();
+        if (masterConfigNode != null && masterConfigNode.get (WATCHDOG_TIMEOUT_NAME) != null) {
+        	
+            return masterConfigNode.get (WATCHDOG_TIMEOUT_NAME).asInt ();
+        } else {
+            return 0;
+        }
+    }
 
     @Override
     public String getConsumerID () {
@@ -376,6 +421,11 @@
             throw new ASDCParametersException (POLLING_TIMEOUT_ATTRIBUTE_NAME
                                                + " parameter cannot be found in config mso.properties");
         }
+        
+        if (this.getWatchDogTimeout() == 0) {
+            throw new ASDCParametersException (WATCHDOG_TIMEOUT_NAME
+                                               + " parameter cannot be found in config mso.properties");
+        }
 
         if (this.getRelevantArtifactTypes () == null || this.getRelevantArtifactTypes ().isEmpty ()) {
             throw new ASDCParametersException (RELEVANT_ARTIFACT_TYPES_ATTRIBUTE_NAME
@@ -386,6 +436,12 @@
             throw new ASDCParametersException (USER_ATTRIBUTE_NAME
                                                + " parameter cannot be found in config mso.properties");
         }
+                
+        if (this.getMsgBusAddress() == null || this.getMsgBusAddress().isEmpty ()) {
+            throw new ASDCParametersException (MSG_BUS_ADDRESS_ATTRIBUTE_NAME
+                                               + " parameter cannot be found in config mso.properties");
+        }
+        
     }
 
     /**
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java
index 22c4b04..6a75229 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java
@@ -1,5 +1,5 @@
 /*-

- * ============LICENSE_START=======================================================

+d * ============LICENSE_START=======================================================

  * ONAP - SO

  * ================================================================================

  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.

@@ -26,14 +26,18 @@
 import java.io.FileOutputStream;

 import java.io.IOException;

 import java.io.UnsupportedEncodingException;

+import java.util.ArrayList;

 import java.util.List;

 

 import org.openecomp.sdc.api.IDistributionClient;

 import org.openecomp.sdc.api.consumer.IDistributionStatusMessage;

+import org.openecomp.sdc.api.consumer.IFinalDistrStatusMessage;

 import org.openecomp.sdc.api.consumer.INotificationCallback;

+import org.openecomp.sdc.api.consumer.IStatusCallback;

 import org.openecomp.sdc.api.notification.IArtifactInfo;

 import org.openecomp.sdc.api.notification.INotificationData;

 import org.openecomp.sdc.api.notification.IResourceInstance;

+import org.openecomp.sdc.api.notification.IStatusData;

 import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;

 import org.openecomp.sdc.api.results.IDistributionClientResult;

 import org.openecomp.sdc.impl.DistributionClientFactory;

@@ -48,10 +52,14 @@
 import org.openecomp.mso.asdc.installer.VfResourceStructure;

 import org.openecomp.mso.asdc.installer.heat.ToscaResourceInstaller;

 import org.openecomp.mso.asdc.installer.heat.VfResourceInstaller;

+import org.openecomp.mso.asdc.tenantIsolation.DistributionStatus;

+import org.openecomp.mso.asdc.tenantIsolation.WatchdogDistribution;

 import org.openecomp.mso.asdc.util.ASDCNotificationLogging;

 import org.openecomp.mso.logger.MessageEnum;

 import org.openecomp.mso.logger.MsoAlarmLogger;

 import org.openecomp.mso.logger.MsoLogger;

+import org.openecomp.mso.properties.MsoPropertiesFactory;

+import org.openecomp.mso.requestsdb.WatchdogDistributionStatusDb;

 import org.openecomp.mso.utils.UUIDChecker;

 

 public class ASDCController {

@@ -66,6 +74,96 @@
 

     protected ToscaResourceInstaller toscaInstaller;

     

+    private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();

+    

+   

+   private final class ResourceInstance implements IResourceInstance {

+    	       

+        @Override

+        public String getResourceInstanceName(){

+        	return new String();

+        }

+        

+        @Override

+        public String getResourceName(){

+        	return new String();

+        }

+        

+        @Override

+        public String getResourceVersion(){

+        	return new String();

+        }

+        

+        @Override

+        public String getResourceType(){

+        	return new String();

+        }

+        

+        @Override

+        public String getResourceUUID(){

+        	return new String();

+        }

+        

+        // Method descriptor #10 ()Ljava/util/List;

+        @Override

+        public java.util.List getArtifacts(){

+        	return new ArrayList();

+        }

+        

+        @Override

+        public String getResourceInvariantUUID(){

+        	return new String();

+        }

+        

+        @Override

+        public String getResourceCustomizationUUID(){

+        	return new String();

+        }

+        

+        @Override

+        public String getCategory(){

+        	return new String();

+        }

+        

+        @Override

+        public String getSubcategory(){

+        	return new String();

+        }

+    	

+    }

+    

+   private final class ASDCStatusCallBack implements IStatusCallback {

+	       	

+        @Override

+        public void activateCallback (IStatusData iStatus) {

+         	

+            long startTime = System.currentTimeMillis ();

+            UUIDChecker.generateUUID (LOGGER);

+            MsoLogger.setServiceName ("ASDCStatusCallBack");

+            MsoLogger.setLogContext (iStatus.getDistributionID (), iStatus.getComponentName());

+            String event = "Receive a callback componentStatus in ASDC, for componentName: " + iStatus.getComponentName() + " and status of " + iStatus.getStatus() + " distributionID of " + iStatus.getDistributionID() + 

+            		       " consumerID of " + iStatus.getConsumerID() + " errorReason of " + iStatus.getErrorReason();

+            

+            try{

+            	

+            	if (iStatus.getStatus() == DistributionStatusEnum.COMPONENT_DONE_OK || 

+            		iStatus.getStatus() == DistributionStatusEnum.COMPONENT_DONE_ERROR) {

+            	            		

+            		LOGGER.debug(event);

+            

+            		toscaInstaller.installTheComponentStatus(iStatus);

+            	

+            	}

+            

+            }catch(ArtifactInstallerException e){

+             	System.out.println("Error in ASDCStatusCallback " + e.getMessage());

+             	LOGGER.debug("Error in ASDCStatusCallback " + e.getMessage());

+            }

+            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Completed the Status Call Back"); 

+        }

+    	

+    }

+    

 

     /**

      * Inner class for Notification callback

@@ -96,6 +194,7 @@
             LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Completed the treatment of the notification");

         }

     }

+    

 

     // ***** Controller STATUS code

 

@@ -136,7 +235,6 @@
     }

 

     // ***** END of Controller STATUS code

-

     protected ASDCConfiguration asdcConfig;

     private IDistributionClient distributionClient;

     private IVfResourceInstaller resourceInstaller;

@@ -224,7 +322,7 @@
         }

         long initStartTime = System.currentTimeMillis ();

         IDistributionClientResult result = this.distributionClient.init (asdcConfig,

-                                                                         new ASDCNotificationCallBack (this));

+                                                                         new ASDCNotificationCallBack (this), new ASDCStatusCallBack());

         if (!result.getDistributionActionResult ().equals (DistributionActionResultEnum.SUCCESS)) {

             String endEvent = "ASDC distribution client init failed with reason:"

                               + result.getDistributionMessageResult ();

@@ -284,20 +382,20 @@
 

     private boolean checkResourceAlreadyDeployed (VfResourceStructure resource) throws ArtifactInstallerException {

 

-    	if (toscaInstaller.isResourceAlreadyDeployed (resource)) {

-            LOGGER.info (MessageEnum.ASDC_ARTIFACT_ALREADY_EXIST,

+    	

+   		if (toscaInstaller.isResourceAlreadyDeployed (resource)) {

+    			LOGGER.info (MessageEnum.ASDC_ARTIFACT_ALREADY_EXIST,

                     resource.getResourceInstance().getResourceInstanceName(),

                     resource.getResourceInstance().getResourceUUID(),

                     resource.getResourceInstance().getResourceName(), "", "");

 

-            this.sendDeployNotificationsForResource(resource,DistributionStatusEnum.ALREADY_DOWNLOADED,null);

-            this.sendDeployNotificationsForResource(resource,DistributionStatusEnum.ALREADY_DEPLOYED,null);

+    			this.sendDeployNotificationsForResource(resource,DistributionStatusEnum.ALREADY_DOWNLOADED,null);

+    			this.sendDeployNotificationsForResource(resource,DistributionStatusEnum.ALREADY_DEPLOYED,null);

 

-            return true;

-        } else {

-            return false;

-        }

-

+    		return true;

+    	} else {

+    		return false;

+    	}

     }

 

     private final static String UUID_PARAM = "(UUID:";

@@ -413,7 +511,7 @@
 

     	for (IArtifactInfo artifactInfo : vfResourceStructure.getResourceInstance().getArtifacts()) {

 

-    		if (DistributionStatusEnum.DEPLOY_OK.equals(distribStatus)

+    		if ((DistributionStatusEnum.DEPLOY_OK.equals(distribStatus) && !artifactInfo.getArtifactType().equalsIgnoreCase("OTHER"))

     				// This could be NULL if the artifact is a VF module artifact, this won't be present in the MAP

     				&& vfResourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()) != null

     				&& vfResourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()).getDeployedInDb() == 0) {

@@ -435,7 +533,34 @@
     		}

     	}

     }

-

+    

+    private void sendCsarDeployNotification(INotificationData iNotif, VfResourceStructure resourceStructure, ToscaResourceStructure toscaResourceStructure, boolean deploySuccessful, String errorReason) {

+    	

+    			IArtifactInfo csarArtifact = toscaResourceStructure.getToscaArtifact();

+    			

+    			if(deploySuccessful){

+    				

+     	    		this.sendASDCNotification (NotificationType.DEPLOY,

+     	 	    			  csarArtifact.getArtifactURL (),

+     		                  asdcConfig.getConsumerID (),

+     		                  resourceStructure.getNotification().getDistributionID(),

+     		                  DistributionStatusEnum.DEPLOY_OK,

+     		                  errorReason,

+     		                  System.currentTimeMillis ());

+    				

+    			} else {

+    				

+    				this.sendASDCNotification (NotificationType.DEPLOY,

+   	 	    			  csarArtifact.getArtifactURL (),

+   		                  asdcConfig.getConsumerID (),

+   		                  resourceStructure.getNotification().getDistributionID(),

+   		                  DistributionStatusEnum.DEPLOY_ERROR,

+   		                  errorReason,

+   		                  System.currentTimeMillis ());

+    				

+    			}

+    }

+    

     private void deployResourceStructure (VfResourceStructure resourceStructure, ToscaResourceStructure toscaResourceStructure) throws ArtifactInstallerException {

 

     	LOGGER.info (MessageEnum.ASDC_START_DEPLOY_ARTIFACT, resourceStructure.getResourceInstance().getResourceInstanceName(), resourceStructure.getResourceInstance().getResourceUUID(), "ASDC", "deployResourceStructure");

@@ -445,21 +570,10 @@
         	if("VF".equals(resourceType) && !"Allotted Resource".equalsIgnoreCase(category)){

         		resourceStructure.createVfModuleStructures();

         	}

-        	//resourceInstaller.installTheResource (resourceStructure);

-				

-			//ToscaResourceInstaller tri = new ToscaResourceInstaller();

-        	toscaInstaller.installTheResource(toscaResourceStructure, resourceStructure);

-			

-		/*	if(toscaResourceStructure.isVnfAlreadyInstalled()){

-	            LOGGER.info (MessageEnum.ASDC_ARTIFACT_ALREADY_EXIST,

-	            		toscaResourceStructure.getCatalogVnfResource().getModelName(),

-	            		toscaResourceStructure.getCatalogVnfResource().getModelUuid(),

-	            		toscaResourceStructure.getCatalogVnfResource().getModelUuid(),"","");

+        	

 

-            

-	            this.sendDeployNotificationsForResource(resourceStructure,DistributionStatusEnum.ALREADY_DOWNLOADED,null);

-	            this.sendDeployNotificationsForResource(resourceStructure,DistributionStatusEnum.ALREADY_DEPLOYED,null);

-			} */

+        	toscaInstaller.installTheResource(toscaResourceStructure, resourceStructure);

+        	        				

 

         } catch (ArtifactInstallerException e) {

         	LOGGER.info (MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL,

@@ -470,7 +584,7 @@
         	throw e;

         }

 

-        if (resourceStructure.isDeployedSuccessfully()) {

+        if (resourceStructure.isDeployedSuccessfully() || toscaResourceStructure.isDeployedSuccessfully()) {

 	        LOGGER.info (MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC,

 	           		resourceStructure.getResourceInstance().getResourceName(),

 	          		resourceStructure.getResourceInstance().getResourceUUID(),

@@ -479,6 +593,7 @@
         }

 

     }

+    

 

     private enum NotificationType {

     	DOWNLOAD, DEPLOY

@@ -541,10 +656,42 @@
         }

         LOGGER.recordMetricEvent (subStarttime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully sent notification to ASDC", "ASDC", action, null);

     }

+    

+    private void sendFinalDistributionStatus (

+    		String distributionID,

+    		DistributionStatusEnum status,

+    		String errorReason) {

+

+

+    	LOGGER.debug ("Enter sendFinalDistributionStatus with DistributionID " + distributionID + " and Status of " + status.name() + " and ErrorReason " + errorReason);

+

+    	long subStarttime = System.currentTimeMillis ();

+    	try {

+    		

+    		

+    		IFinalDistrStatusMessage finalDistribution = new FinalDistributionStatusMessage(distributionID,status,subStarttime, asdcConfig.getConsumerID());

+    		

+    		if(errorReason == null){

+    			this.distributionClient.sendFinalDistrStatus(finalDistribution);

+    		}else{

+    			this.distributionClient.sendFinalDistrStatus(finalDistribution, errorReason);

+    		}

+    		

+ 

+    	} catch (RuntimeException e) {

+    		// TODO: May be a list containing the unsent notification should be

+    		// kept

+    		LOGGER.debug ("Exception caught in sendFinalDistributionStatus " + e.getMessage());

+    		LOGGER.warn (MessageEnum.ASDC_SEND_NOTIF_ASDC_EXEC, "ASDC", "sendASDCNotification", MsoLogger.ErrorCode.SchemaError, "RuntimeException - sendASDCNotification", e);

+    	}

+    	LOGGER.recordMetricEvent (subStarttime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully sent Final notification to ASDC", "ASDC", null, null);

+    }

 

     public void treatNotification (INotificationData iNotif) {

 

     	int noOfArtifacts = 0;

+    	WatchdogDistribution wd = new WatchdogDistribution();

+

     	for (IResourceInstance resource : iNotif.getResources ()) {

     		noOfArtifacts += resource.getArtifacts ().size ();

     	}

@@ -561,21 +708,102 @@
 						

 			// Process only the Resource artifacts in MSO

 			for (IResourceInstance resource : iNotif.getResources()) {

-

-				// We process only VNF(VF) and Network(VL) resources on MSO Side

-				// We process only VNF resource on MSO Side

-				if ("VF".equals(resource.getResourceType()) || "VL".equals(resource.getResourceType())) {

-					this.processResourceNotification(iNotif,resource);

-				}

+				

+				// We process only VNF(VF), Network(VL) and PNF resources on MSO Side

+				//if ("VF".equals(resource.getResourceType()) || "VL".equals(resource.getResourceType()) || "PNF".equals(resource.getResourceType())){

+				this.processResourceNotification(iNotif,resource);

+				//}

 

 			}

+			

+			//Handle services without any resources	

+			if (iNotif.getResources() == null || iNotif.getResources().size() < 1){

+				

+				this.processResourceNotification(iNotif, new ResourceInstance());

+			}

+			

+			//********************************************************************************************************

+			//Start Watchdog loop and wait for all components to complete before reporting final status back. 

+			// **If timer expires first then we will report a Distribution Error back to ASDC

+			//********************************************************************************************************

+        	long initialStartTime = System.currentTimeMillis();

+        	boolean componentsComplete = false;

+        	String distributionStatus = null;

+        	String watchdogError = null;

+        	String overallStatus = null;

+        	int watchDogTimeout = asdcConfig.getWatchDogTimeout() * 1000;

+        	boolean isDeploySuccess = false;

+        	WatchdogDistributionStatusDb wdDistributionStatus = WatchdogDistributionStatusDb.getInstance();

+        	

+						

+        	while(componentsComplete == false && (System.currentTimeMillis() - initialStartTime) < watchDogTimeout)

+        	{

+        		        		

+    			try{

+        		

+    				distributionStatus = wd.getOverallDistributionStatus(iNotif.getDistributionID());

+    				Thread.sleep(watchDogTimeout / 10);

+    		

+    			}catch(Exception e){

+    				LOGGER.debug ("Exception in Watchdog Loop " + e.getMessage());

+    				Thread.sleep(watchDogTimeout / 10);

+    			}

+    			

+    			if(distributionStatus != null && !distributionStatus.equalsIgnoreCase(DistributionStatus.INCOMPLETE.name())){

+    				

+    				if(distributionStatus.equalsIgnoreCase(DistributionStatus.SUCCESS.name())){

+    					isDeploySuccess = true;

+    					overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK.name();

+    				}else{

+    					overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();

+    				}

+    				

+    				componentsComplete = true;

+    			}

+        	}

+        	

+        	if(componentsComplete == false){

+        		LOGGER.debug("Timeout of " + watchDogTimeout + " seconds was reached before all components reported status");

+        		watchdogError = "Timeout occurred while waiting for all components to report status";

+        		overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();

+        	}

+        	

+        	if(distributionStatus == null){

+          		overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();

+        		LOGGER.debug("DistributionStatus is null for DistributionId: " + iNotif.getDistributionID());

+        		 	

+        	}

+        	

+        	try {

+        		wd.executePatchAAI(iNotif.getDistributionID(), iNotif.getServiceInvariantUUID(), overallStatus);

+        		LOGGER.debug ("A&AI Updated succefully with Distribution Status!");

+        	}

+        	catch(Exception e) {

+        		LOGGER.debug ("Exception in Watchdog executePatchAAI(): " + e.getMessage());

+        		watchdogError = "Error calling A&AI " + e.getMessage();

+        		if(e.getCause() != null) {

+        			LOGGER.debug ("Exception caused by: " + e.getCause().getMessage());

+        		}

+        	}

+     	

+        	

+        	if(isDeploySuccess && watchdogError == null){

+        		sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK, null);

+        		wdDistributionStatus.updateWatchdogDistributionIdStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK.name());        

+        	} else {

+        		sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR, watchdogError);

+        		wdDistributionStatus.updateWatchdogDistributionIdStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name());        

+        	}

+        	

+        	

 

-

-

-        } catch (RuntimeException e) {

+        } catch (Exception e) {

             LOGGER.error (MessageEnum.ASDC_GENERAL_EXCEPTION_ARG,

                           "Unexpected exception caught during the notification processing", "ASDC", "treatNotification", MsoLogger.ErrorCode.SchemaError, "RuntimeException in treatNotification",

                           e);

+            

+             sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR, e.getMessage());

+            

         } finally {

             this.changeControllerStatus (ASDCControllerStatus.IDLE);

         }

@@ -586,6 +814,8 @@
 		// For each artifact, create a structure describing the VFModule in a ordered flat level

     	VfResourceStructure resourceStructure = new VfResourceStructure(iNotif,resource);

     	ToscaResourceStructure toscaResourceStructure = new ToscaResourceStructure();

+    	boolean deploySuccessful = true;

+    	String errorMessage = null;

 

 		try {

 

@@ -605,12 +835,22 @@
 						}

 

 				}

-

 				this.processCsarServiceArtifacts(iNotif, toscaResourceStructure);

 				

-				this.deployResourceStructure(resourceStructure, toscaResourceStructure);

+				try{

+				

+					this.deployResourceStructure(resourceStructure, toscaResourceStructure);

+					

+				} catch(ArtifactInstallerException e){

+					deploySuccessful = false;

+					errorMessage = e.getMessage();

+				}

+												

+					this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deploySuccessful, errorMessage);

+					

 

-			}

+

+		}

 		} catch (ArtifactInstallerException | ASDCDownloadException | UnsupportedEncodingException e) {

 			LOGGER.error(MessageEnum.ASDC_GENERAL_EXCEPTION_ARG,

 					"Exception caught during Installation of artifact", "ASDC", "processResourceNotification", MsoLogger.ErrorCode.BusinessProcesssError, "Exception in processResourceNotification", e);

diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/FinalDistributionStatusMessage.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/FinalDistributionStatusMessage.java
new file mode 100644
index 0000000..6205bd5
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/FinalDistributionStatusMessage.java
@@ -0,0 +1,86 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client;
+
+import org.openecomp.sdc.api.consumer.IFinalDistrStatusMessage;
+import org.openecomp.sdc.utils.DistributionStatusEnum;
+
+public class FinalDistributionStatusMessage implements IFinalDistrStatusMessage{
+
+	private String componentName;
+
+	private String consumerID;
+	
+	private String distributionID;
+	
+	private DistributionStatusEnum status;
+	
+	private long timestamp;
+	
+	public FinalDistributionStatusMessage (String distributionId, final DistributionStatusEnum distributionStatusEnum, final long timestampL, String consumerId) {
+		//componentName = componentname;
+		consumerID = consumerId;
+		distributionID = distributionId;
+		status = distributionStatusEnum;
+		timestamp = timestampL;
+	}
+
+	public DistributionStatusEnum getStatus() {
+		return status;
+	}
+
+	public void setStatus(DistributionStatusEnum status) {
+		this.status = status;
+	}
+
+	public String getDistributionID() {
+		return distributionID;
+	}
+
+	public void setDistributionID(String distributionID) {
+		this.distributionID = distributionID;
+	}
+
+	public long getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(long timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getComponentName() {
+		return componentName;
+	}
+
+	public void setComponentName(String componentName) {
+		this.componentName = componentName;
+	}
+
+	public String getConsumerID() {
+		return consumerID;
+	}
+
+	public void setConsumerID(String consumerID) {
+		this.consumerID = consumerID;
+	}
+
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/DistributionClientEmulator.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/DistributionClientEmulator.java
new file mode 100644
index 0000000..d6d6f79
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/DistributionClientEmulator.java
@@ -0,0 +1,204 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.openecomp.mso.asdc.installer.IVfModuleData;
+import org.openecomp.sdc.api.IDistributionClient;
+import org.openecomp.sdc.api.consumer.IComponentDoneStatusMessage;
+import org.openecomp.sdc.api.consumer.IConfiguration;
+import org.openecomp.sdc.api.consumer.IDistributionStatusMessage;
+import org.openecomp.sdc.api.consumer.IFinalDistrStatusMessage;
+import org.openecomp.sdc.api.consumer.INotificationCallback;
+import org.openecomp.sdc.api.consumer.IStatusCallback;
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.IVfModuleMetadata;
+import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
+import org.openecomp.sdc.api.results.IDistributionClientResult;
+import org.openecomp.sdc.impl.DistributionClientDownloadResultImpl;
+import org.openecomp.sdc.impl.DistributionClientResultImpl;
+import org.openecomp.sdc.utils.DistributionActionResultEnum;
+
+public class DistributionClientEmulator implements IDistributionClient {
+
+	private String resourcePath;
+	
+	private List<IVfModuleData> listVFModuleMetaData;
+	
+	private List<IDistributionStatusMessage> distributionMessageReceived = new LinkedList<>();
+	
+	public DistributionClientEmulator(String notifFolderInResource) {
+		
+		resourcePath = notifFolderInResource;
+	}
+
+	public List<IDistributionStatusMessage> getDistributionMessageReceived() {
+		return distributionMessageReceived;
+	}
+	
+	@Override
+	public List<IVfModuleMetadata> decodeVfModuleArtifact(byte[] arg0) {
+		return null;
+	}
+
+	/* @Override
+	public List<IVfModuleData> decodeVfModuleArtifact(byte[] arg0) {
+		try {
+			listVFModuleMetaData = new ObjectMapper().readValue(arg0, new TypeReference<List<JsonVfModuleMetaData>>(){});
+			return listVFModuleMetaData;
+			 
+		} catch (JsonParseException e) {
+			e.printStackTrace();
+		} catch (JsonMappingException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	} */
+	
+	public List<IVfModuleData> getListVFModuleMetaData() {
+		return listVFModuleMetaData;
+	}
+
+	@Override
+	public IDistributionClientDownloadResult download (IArtifactInfo arg0) {
+		
+		
+		//String filename = resourcePath+"/artifacts/"+arg0.getArtifactURL();
+		String filename = arg0.getArtifactURL();
+		System.out.println("Emulating the download from resources files:"+filename);
+		
+		InputStream inputStream = null;
+		
+		if(arg0.getArtifactName().equals("service_PortMirroringContainer_csar.csar")){
+			try{
+				inputStream = new FileInputStream("C://Users//JM5423//git//mso//asdc-tosca-1712-test3//openecomp-mso//asdc-controller//src//main//resources//resource-examples//service_PortMirroringContainer_csar.csar");
+			}catch(Exception e){
+				System.out.println("Error " + e.getMessage());
+			}
+		}else{
+		
+			inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath + filename);
+		}
+		
+		if (inputStream == null) {
+			System.out.println("InputStream is NULL for:"+filename);
+		}
+		try {	
+			return new DistributionClientDownloadResultImpl(DistributionActionResultEnum.SUCCESS, DistributionActionResultEnum.SUCCESS.name(),arg0.getArtifactName(),IOUtils.toByteArray(inputStream));
+		} catch (IOException e) {
+			
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	@Override
+	public IConfiguration getConfiguration() {
+		return null;
+	}
+
+	@Override
+	public IDistributionClientResult init(IConfiguration arg0, INotificationCallback arg1) {
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+	
+	@Override
+	public IDistributionClientResult init(IConfiguration arg0, INotificationCallback arg1, IStatusCallback arg2) {
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+
+	@Override
+	public IDistributionClientResult sendDeploymentStatus(IDistributionStatusMessage arg0) {
+		this.distributionMessageReceived.add(arg0);
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+
+	@Override
+	public IDistributionClientResult sendDeploymentStatus(IDistributionStatusMessage arg0, String arg1) {
+		this.distributionMessageReceived.add(arg0);
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+
+	@Override
+	public IDistributionClientResult sendDownloadStatus(IDistributionStatusMessage arg0) {
+		this.distributionMessageReceived.add(arg0);
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+
+	@Override
+	public IDistributionClientResult sendDownloadStatus(IDistributionStatusMessage arg0, String arg1) {
+		this.distributionMessageReceived.add(arg0);
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+
+	@Override
+	public IDistributionClientResult start() {
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+
+	@Override
+	public IDistributionClientResult stop() {
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+		
+	}
+
+	@Override
+	public IDistributionClientResult updateConfiguration(IConfiguration arg0) {
+		return new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS,DistributionActionResultEnum.SUCCESS.name());
+	}
+
+	@Override
+	public IDistributionClientResult sendComponentDoneStatus(
+			IComponentDoneStatusMessage arg0) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public IDistributionClientResult sendFinalDistrStatus(
+			IFinalDistrStatusMessage arg0) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public IDistributionClientResult sendComponentDoneStatus(
+			IComponentDoneStatusMessage arg0, String arg1) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public IDistributionClientResult sendFinalDistrStatus(
+			IFinalDistrStatusMessage arg0, String arg1) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonArtifactInfo.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonArtifactInfo.java
new file mode 100644
index 0000000..2da5996
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonArtifactInfo.java
@@ -0,0 +1,122 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+public class JsonArtifactInfo implements IArtifactInfo {
+
+	@JsonIgnore
+	private Map<String,IArtifactInfo> artifactsMapByUUID = new HashMap<>();
+	
+	@JsonIgnore
+	private Map<String,Object> attributesMap = new HashMap<>();
+	
+	public JsonArtifactInfo() {
+		
+	}
+	
+	public synchronized void addArtifactToUUIDMap (List<JsonArtifactInfo> artifactList) {
+		for (JsonArtifactInfo artifact:artifactList) {
+			artifactsMapByUUID.put(artifact.getArtifactUUID(), artifact);	
+		}
+		
+	}
+	
+	@SuppressWarnings("unused")
+	@JsonAnySetter
+	public final void setAttribute(String attrName, Object attrValue) {
+		if ((null != attrName) && (!attrName.isEmpty()) && (null != attrValue) && (null != attrValue.toString())) {
+			this.attributesMap.put(attrName,attrValue);
+		}
+	}
+	
+	
+	
+	public Map<String, IArtifactInfo> getArtifactsMapByUUID() {
+		return artifactsMapByUUID;
+	}
+
+	@Override
+	public String getArtifactChecksum() {
+		return (String)attributesMap.get("artifactCheckSum");
+	}
+
+	@Override
+	public String getArtifactDescription() {
+		return (String)attributesMap.get("artifactDescription");
+	}
+
+	@Override
+	public String getArtifactName() {
+		return (String)attributesMap.get("artifactName");
+	}
+
+	@Override
+	public Integer getArtifactTimeout() {
+		return (Integer)attributesMap.get("artifactTimeout");
+	}
+
+	@Override
+	public String getArtifactType() {
+		return (String)attributesMap.get("artifactType");
+	}
+
+	@Override
+	public String getArtifactURL() {
+		return (String)attributesMap.get("artifactURL");
+	}
+
+	@Override
+	public String getArtifactUUID() {
+		return (String)attributesMap.get("artifactUUID");
+	}
+
+	@Override
+	public String getArtifactVersion() {
+		return (String)attributesMap.get("artifactVersion");
+	}
+
+	@Override
+	public IArtifactInfo getGeneratedArtifact () {
+		return artifactsMapByUUID.get(attributesMap.get("generatedArtifact"));
+	}
+
+	@Override
+	public List<IArtifactInfo> getRelatedArtifacts() {
+		List<IArtifactInfo> listArtifacts = new LinkedList<>();
+		List<String> uuidList = (List<String>)attributesMap.get("relatedArtifact");
+		if (uuidList != null) {
+			for(String uuid:uuidList) {
+				listArtifacts.add(artifactsMapByUUID.get(uuid));
+			}
+		}
+		return listArtifacts;
+	}
+
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonArtifactInfoDeserializer.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonArtifactInfoDeserializer.java
new file mode 100644
index 0000000..66863b5
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonArtifactInfoDeserializer.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+
+import java.io.IOException;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class JsonArtifactInfoDeserializer extends JsonDeserializer<List<JsonArtifactInfo>>{
+
+	@Override
+	public List<JsonArtifactInfo> deserialize(JsonParser jp, DeserializationContext ctxt)
+			throws IOException, JsonProcessingException {
+		List<JsonArtifactInfo> jsonArtifactInfoList =  new ObjectMapper().readValue(jp, new TypeReference<List<JsonArtifactInfo>>(){}); 
+
+		// For each artifact add the list of artifact retrieved 
+		// This could be used later to index by UUID
+		for (JsonArtifactInfo artifactInfo:jsonArtifactInfoList) {
+			artifactInfo.addArtifactToUUIDMap(jsonArtifactInfoList);
+		}
+		return jsonArtifactInfoList;
+	}
+
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonNotificationData.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonNotificationData.java
new file mode 100644
index 0000000..257dae9
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonNotificationData.java
@@ -0,0 +1,149 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.INotificationData;
+import org.openecomp.sdc.api.notification.IResourceInstance;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+
+public class JsonNotificationData implements INotificationData {
+	
+	@JsonIgnore
+	private static ObjectMapper mapper = new ObjectMapper();
+	
+	@JsonIgnore
+	private Map<String,Object> attributesMap = new HashMap<>();
+	
+	@JsonProperty("serviceArtifacts")
+	@JsonDeserialize(using=JsonArtifactInfoDeserializer.class)
+	private List<IArtifactInfo> serviceArtifacts;
+	
+	@JsonProperty("resources")
+	@JsonDeserialize(using=JsonResourceInfoDeserializer.class)
+	private List<IResourceInstance> resourcesList;
+	
+	public JsonNotificationData() {
+		
+	}
+		
+	/**
+	 * Method instantiate a INotificationData implementation from a JSON file.
+	 * 
+	 * @param notifFilePath The file path in String
+	 * @return A JsonNotificationData instance
+	 * @throws IOException in case of the file is not readable or not accessible 
+	 */
+	public static JsonNotificationData instantiateNotifFromJsonFile(String notifFilePath) throws IOException {
+		
+		InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(notifFilePath + "notif-structure.json");
+		
+		//String fileLocation = System.getProperty("mso.config.path") + "notif-structure.json";
+		
+		//String source = fileLocation;
+		//InputStream is = IOUtils.toInputStream(source, "UTF-8");
+		
+		//String myString = IOUtils.toString(is, "UTF-8");
+		
+		
+		//System.out.println(myString);
+		
+		if (is == null) {
+			//throw new FileExistsException("Resource Path does not exist: "+notifFilePath);
+		}
+			return mapper.readValue(is, JsonNotificationData.class);
+	}
+	
+	@SuppressWarnings("unused")
+	@JsonAnySetter
+	public final void setAttribute(String attrName, Object attrValue) {
+		if ((null != attrName) && (!attrName.isEmpty()) && (null != attrValue) && (null != attrValue.toString())) {
+			this.attributesMap.put(attrName,attrValue);
+		}
+	}
+	
+	@Override
+	public String getWorkloadContext(){
+		return (String)this.attributesMap.get("workloadContext");
+	}
+	  
+	@Override
+	public void setWorkloadContext(java.lang.String arg0){
+		
+	}
+
+	@Override
+	public IArtifactInfo getArtifactMetadataByUUID(String arg0) {
+		return null;
+	}
+
+	@Override
+	public String getDistributionID() {
+		return (String)this.attributesMap.get("distributionID");
+	}
+
+	@Override
+	public List<IResourceInstance> getResources() {
+		return resourcesList;
+	}
+
+	@Override
+	public List<IArtifactInfo> getServiceArtifacts() {
+		return this.serviceArtifacts;
+	}
+
+	@Override
+	public String getServiceDescription() {
+		return (String)this.attributesMap.get("serviceDescription");
+	}
+
+	@Override
+	public String getServiceInvariantUUID() {
+		return (String)this.attributesMap.get("serviceInvariantUUID");
+	}
+
+	@Override
+	public String getServiceName() {
+		return (String)this.attributesMap.get("serviceName");
+	}
+
+	@Override
+	public String getServiceUUID() {
+		return (String)this.attributesMap.get("serviceUUID");
+	}
+
+	@Override
+	public String getServiceVersion() {
+		return (String)this.attributesMap.get("serviceVersion");
+	}
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonResourceInfo.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonResourceInfo.java
new file mode 100644
index 0000000..c2e1cbb
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonResourceInfo.java
@@ -0,0 +1,105 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.IResourceInstance;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+public class JsonResourceInfo implements IResourceInstance {
+
+	@JsonIgnore
+	private Map<String,Object> attributesMap = new HashMap<>();
+	
+	@JsonProperty("artifacts")
+	@JsonDeserialize(using=JsonArtifactInfoDeserializer.class)
+	private List<IArtifactInfo> artifacts;
+	
+	public JsonResourceInfo() {
+	
+	}
+	
+	@Override
+	public List<IArtifactInfo> getArtifacts() {
+		return artifacts;
+	}
+
+	@Override
+	public String getResourceInstanceName() {
+		return (String)attributesMap.get("resourceInstanceName");
+	}
+
+	@Override
+	public String getResourceInvariantUUID() {
+		return (String)attributesMap.get("resourceInvariantUUID");
+	}
+	
+	@Override
+	public String getResourceCustomizationUUID() {
+		return (String)attributesMap.get("resourceCustomizationUUID");
+	}
+
+	@Override
+	public String getResourceName() {
+		return (String)attributesMap.get("resourceName");
+	}
+
+	@Override
+	public String getResourceType() {
+		return (String)attributesMap.get("resourceType");
+	}
+
+	@Override
+	public String getResourceUUID() {
+		return (String)attributesMap.get("resourceUUID");
+	}
+
+	@Override
+	public String getResourceVersion() {
+		return (String)attributesMap.get("resourceVersion");
+	}
+	
+	@Override
+	public String getSubcategory() {
+		return (String)attributesMap.get("subCategory");
+	}
+	
+	@Override
+	public String getCategory() {
+		return (String)attributesMap.get("category");
+	}
+	
+	@SuppressWarnings("unused")
+	@JsonAnySetter
+	public final void setAttribute(String attrName, Object attrValue) {
+		if ((null != attrName) && (!attrName.isEmpty()) && (null != attrValue) && (null != attrValue.toString())) {
+			this.attributesMap.put(attrName,attrValue);
+		}
+	}
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonResourceInfoDeserializer.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonResourceInfoDeserializer.java
new file mode 100644
index 0000000..49908e7
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonResourceInfoDeserializer.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+
+import java.io.IOException;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class JsonResourceInfoDeserializer extends JsonDeserializer<List<JsonResourceInfo>>{
+
+	@Override
+	public List<JsonResourceInfo> deserialize(JsonParser jp, DeserializationContext ctxt)
+			throws IOException, JsonProcessingException {
+		List<JsonResourceInfo> jsonResourceInfoList =  new ObjectMapper().readValue(jp, new TypeReference<List<JsonResourceInfo>>(){}); 
+		
+		return jsonResourceInfoList;
+	}
+
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonStatusData.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonStatusData.java
new file mode 100644
index 0000000..627f8f4
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonStatusData.java
@@ -0,0 +1,124 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.openecomp.sdc.api.notification.IStatusData;
+import org.openecomp.sdc.utils.DistributionStatusEnum;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+public class JsonStatusData implements IStatusData {
+	
+	@JsonIgnore
+	private static ObjectMapper mapper = new ObjectMapper();
+	
+	@JsonIgnore
+	private Map<String,Object> attributesMap = new HashMap<>();
+	
+	public JsonStatusData() {
+		
+	}
+	
+	@Override
+	public String getErrorReason(){
+		return "MSO FAILURE";
+	}
+	
+	@Override
+	public String getDistributionID(){
+		//return (String)this.attributesMap.get("distributionID");
+		return "35120a87-1f82-4276-9735-f6de5a244d65";
+	}
+	  
+	@Override
+	public String getConsumerID(){
+		//return (String)this.attributesMap.get("consumerID");
+		return "mso.123456";
+	}
+	  
+	@Override
+	public String getComponentName(){
+		//return (String)this.attributesMap.get("componentName");
+		return "SDN-C";
+	}
+	  
+	@Override
+	public Long getTimestamp(){
+		//return (String)this.attributesMap.get("timestamp");
+		return null;
+	}
+	  
+	@Override
+	public String getArtifactURL(){
+		//return (String)this.attributesMap.get("artifactURL");
+		return "/sdc/v1/catalog/services/srv1/2.0/resources/aaa/1.0/artifacts/aaa.yml";
+	}
+	  
+	@Override
+	public DistributionStatusEnum getStatus(){
+		//return (DistributionStatusEnum)this.attributesMap.get(DistributionStatusEnum.DEPLOY_OK);
+		return DistributionStatusEnum.COMPONENT_DONE_OK;
+	}
+		
+	/**
+	 * Method instantiate a INotificationData implementation from a JSON file.
+	 * 
+	 * @param notifFilePath The file path in String
+	 * @return A JsonNotificationData instance
+	 * @throws IOException in case of the file is not readable or not accessible 
+	 */
+	public static JsonStatusData instantiateNotifFromJsonFile(String notifFilePath) throws IOException {
+		
+		InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(notifFilePath + "status-structure.json");
+		
+		//String fileLocation = System.getProperty("mso.config.path") + "notif-structure.json";
+		
+		//String source = fileLocation;
+		//InputStream is = IOUtils.toInputStream(source, "UTF-8");
+		
+		//String myString = IOUtils.toString(is, "UTF-8");
+		
+		
+		//System.out.println(myString);
+		
+		if (is == null) {
+			//throw new FileExistsException("Resource Path does not exist: "+notifFilePath);
+		}
+			return mapper.readValue(is, JsonStatusData.class);
+	}
+	
+	@SuppressWarnings("unused")
+	@JsonAnySetter
+	public final void setAttribute(String attrName, Object attrValue) {
+		if ((null != attrName) && (!attrName.isEmpty()) && (null != attrValue) && (null != attrValue.toString())) {
+			this.attributesMap.put(attrName,attrValue);
+		}
+	}
+	
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonVfModuleMetaData.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonVfModuleMetaData.java
new file mode 100644
index 0000000..765f14f
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/emulators/JsonVfModuleMetaData.java
@@ -0,0 +1,96 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.emulators;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.openecomp.mso.asdc.installer.IVfModuleData;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class JsonVfModuleMetaData implements IVfModuleData {
+
+	@JsonProperty("artifacts")
+	private List<String> artifacts;
+	@JsonProperty("properties")
+	//private List<Map<String, Object>> properties = new ArrayList<>();
+	private Map<String,String> properties = new HashMap<>();
+	
+	public Map<String, String> getProperties() {
+		return properties;
+	}
+	
+	@JsonIgnore
+	private Map<String,Object> attributesMap = new HashMap<>();
+	
+	@Override
+	public List<String> getArtifacts() {
+		return artifacts;
+	}
+
+	@Override
+	public String getVfModuleModelDescription() {
+		return (String)attributesMap.get("vfModuleModelDescription");
+	}
+
+	@Override
+	public String getVfModuleModelInvariantUUID() {
+		return (String)attributesMap.get("vfModuleModelInvariantUUID");
+	}
+	
+	@Override
+	public String getVfModuleModelCustomizationUUID() {
+		return (String)attributesMap.get("vfModuleModelCustomizationUUID");
+	}
+
+	@Override
+	public String getVfModuleModelName() {
+		return (String)attributesMap.get("vfModuleModelName");
+	}
+
+	@Override
+	public String getVfModuleModelUUID() {
+		return (String)attributesMap.get("vfModuleModelUUID");
+	}
+
+	@Override
+	public String getVfModuleModelVersion() {
+		return (String)attributesMap.get("vfModuleModelVersion");
+	}
+
+	@Override
+	public boolean isBase() {
+		return (boolean)attributesMap.get("isBase");
+	}
+	
+	@SuppressWarnings("unused")
+	@JsonAnySetter
+	public final void setAttribute(String attrName, Object attrValue) {
+		if ((null != attrName) && (!attrName.isEmpty()) && (null != attrValue) && (null != attrValue.toString())) {
+			this.attributesMap.put(attrName,attrValue);
+		}
+	}
+
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/rest/ASDCRestInterface.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/rest/ASDCRestInterface.java
new file mode 100644
index 0000000..ae434b1
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/test/rest/ASDCRestInterface.java
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.client.test.rest;

+

+

+import javax.ws.rs.GET;

+import javax.ws.rs.Path;

+import javax.ws.rs.Produces;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.Response;

+

+import org.openecomp.mso.asdc.client.ASDCController;

+import org.openecomp.mso.asdc.client.test.emulators.DistributionClientEmulator;

+import org.openecomp.mso.asdc.client.test.emulators.JsonNotificationData;

+import org.openecomp.mso.asdc.client.test.emulators.JsonStatusData;

+import org.openecomp.mso.asdc.installer.heat.ToscaResourceInstaller;

+import org.openecomp.mso.logger.MessageEnum;

+import org.openecomp.mso.logger.MsoLogger;

+

+/**

+ * This is a TEST only rest interface.  It is not used in production, it is used to aid in testing the ASDC service on jboss without the need to be connected 

+ * to the ASDC service broker.  It starts the test at the treatNotification step and simulates both the notification step as well as the artifact download step.

+ * 

+ * i.e. http://localhost:8080/asdc/treatNotification/v1

+ * 

+ * i.e. http://localhost:8080/asdc/statusData/v1

+ * 

+ * @author jm5423

+ *

+ */

+

+@Path("/")

+public class ASDCRestInterface {

+

+	private static DistributionClientEmulator distributionClientEmulator;

+	

+	private static JsonNotificationData notifDataWithoutModuleInfo;

+	

+	private static JsonStatusData statusData;

+	

+	private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.ASDC);

+    

+	@GET

+	@Path("/treatNotification/v1")

+	@Produces(MediaType.APPLICATION_JSON)

+	public Response invokeASDCService(String request) {

+		

+		try{

+			distributionClientEmulator = new DistributionClientEmulator("resource-examples/");

+			notifDataWithoutModuleInfo = JsonNotificationData.instantiateNotifFromJsonFile("resource-examples/");

+		

+			ASDCController asdcController = new ASDCController("asdc-controller1", distributionClientEmulator);

+			LOGGER.info(MessageEnum.ASDC_INIT_ASDC_CLIENT_EXC, notifDataWithoutModuleInfo.getServiceUUID(), "ASDC", "initASDC()");

+			asdcController.initASDC();

+			LOGGER.info(MessageEnum.ASDC_INIT_ASDC_CLIENT_EXC, notifDataWithoutModuleInfo.getServiceUUID(), "ASDC", "treatNotification()");

+			asdcController.treatNotification(notifDataWithoutModuleInfo);

+			LOGGER.info(MessageEnum.ASDC_INIT_ASDC_CLIENT_EXC, notifDataWithoutModuleInfo.getServiceUUID(), "ASDC", "closeASDC()");

+			asdcController.closeASDC();

+		}catch(Exception e){

+			System.out.println("Error caught " + e.getMessage());

+			LOGGER.error(MessageEnum.ASDC_GENERAL_EXCEPTION,

+					"Exception caught during ASDCRestInterface", "ASDC", "invokeASDCService", MsoLogger.ErrorCode.BusinessProcesssError, "Exception in invokeASDCService", e);

+		}

+		System.out.println("ASDC Updates are complete");

+		LOGGER.info(MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC, notifDataWithoutModuleInfo.getServiceUUID(), "ASDC", "ASDC Updates Are Complete");

+		

+		return null;

+	}

+	

+	@GET

+	@Path("/statusData/v1")

+	@Produces(MediaType.APPLICATION_JSON)

+	public Response invokeASDCStatusData(String request) {

+		

+		ToscaResourceInstaller toscaInstaller = new ToscaResourceInstaller();

+		

+		try{

+			distributionClientEmulator = new DistributionClientEmulator("resource-examples/");

+			statusData = JsonStatusData.instantiateNotifFromJsonFile("resource-examples/");

+		

+			ASDCController asdcController = new ASDCController("asdc-controller1", distributionClientEmulator);

+			//LOGGER.info(MessageEnum.ASDC_INIT_ASDC_CLIENT_EXC, notifDataWithoutModuleInfo.getServiceUUID(), "ASDC", "initASDC()");

+			asdcController.initASDC();

+			//LOGGER.info(MessageEnum.ASDC_INIT_ASDC_CLIENT_EXC, notifDataWithoutModuleInfo.getServiceUUID(), "ASDC", "treatNotification()");

+			toscaInstaller.installTheComponentStatus(statusData);

+			//asdcController.treatNotification(notifDataWithoutModuleInfo);

+			//LOGGER.info(MessageEnum.ASDC_INIT_ASDC_CLIENT_EXC, notifDataWithoutModuleInfo.getServiceUUID(), "ASDC", "closeASDC()");

+			asdcController.closeASDC();

+		}catch(Exception e){

+			System.out.println("Error caught " + e.getMessage());

+			LOGGER.error(MessageEnum.ASDC_GENERAL_EXCEPTION,

+					"Exception caught during ASDCRestInterface", "ASDC", "invokeASDCService", MsoLogger.ErrorCode.BusinessProcesssError, "Exception in invokeASDCService", e);

+		}

+		System.out.println("ASDC Updates are complete");

+		LOGGER.info(MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC, statusData.getDistributionID(), "ASDC", "ASDC Updates Are Complete");

+		

+		return null;

+	}

+}

diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/ToscaResourceStructure.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/ToscaResourceStructure.java
index 2c5d6d4..98b6b6d 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/ToscaResourceStructure.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/ToscaResourceStructure.java
@@ -45,7 +45,7 @@
 

 import org.openecomp.sdc.toscaparser.api.NodeTemplate;

 import org.openecomp.sdc.toscaparser.api.elements.Metadata;

-

+import org.openecomp.mso.asdc.client.exceptions.ASDCDownloadException;

 import org.openecomp.mso.db.catalog.beans.AllottedResource;

 import org.openecomp.mso.db.catalog.beans.AllottedResourceCustomization;

 import org.openecomp.mso.db.catalog.beans.NetworkResource;

@@ -76,13 +76,16 @@
 	String volHeatEnvTemplateUUID;

 	String envHeatTemplateUUID;

 	String heatFilesUUID;

+	String workloadPerformance;

 	boolean isVnfAlreadyInstalled = false;

 	String serviceVersion;

+	private boolean isDeployedSuccessfully=false;

+	

 	

 	private NetworkResourceCustomization catalogNetworkResourceCustomization;

 	

 	private NetworkResource catalogNetworkResource;

-	

+		

 	private AllottedResourceCustomization catalogResourceCustomization;

 	

 	private VfModule vfModule;

@@ -121,19 +124,18 @@
 	public ToscaResourceStructure(){

 	}

 	

-	public void updateResourceStructure(IArtifactInfo artifact){

+	public void updateResourceStructure(IArtifactInfo artifact) throws ASDCDownloadException {

 		

 				

 		try {

 				

 			SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();//Autoclosable

 			

+			LOGGER.debug("MSO config path is: " + System.getProperty("mso.config.path"));

 			

 			File spoolFile = new File(System.getProperty("mso.config.path") + "ASDC/" + artifact.getArtifactName());

-			

-

-			 

-			System.out.println("PATH IS " + spoolFile.getAbsolutePath());

+ 

+			LOGGER.debug("ASDC File path is: " + spoolFile.getAbsolutePath());

 			LOGGER.info(MessageEnum.ASDC_RECEIVE_SERVICE_NOTIF, "***PATH", "ASDC", spoolFile.getAbsolutePath());

 			

 

@@ -143,12 +145,12 @@
 			System.out.println("System out " + e.getMessage());

 			LOGGER.error(MessageEnum.ASDC_GENERAL_EXCEPTION_ARG,

 					"Exception caught during parser *****LOOK********* " + artifact.getArtifactName(), "ASDC", "processResourceNotification", MsoLogger.ErrorCode.BusinessProcesssError, "Exception in processResourceNotification", e);

-		}	

 			

+			throw new ASDCDownloadException ("Exception caught when passing the csar file to the parser ", e);

+		}	

 

 			serviceMetadata = sdcCsarHelper.getServiceMetadata();

-

-		

+	

 	}

 	

 	public String getHeatTemplateUUID() {

@@ -409,4 +411,127 @@
 		this.serviceVersion = serviceVersion;

 	}

 

+	public String getWorkloadPerformance() {

+		return workloadPerformance;

+	}

+

+	public void setWorkloadPerformance(String workloadPerformance) {

+		this.workloadPerformance = workloadPerformance;

+	}

+

+	public VfModule getVfModule() {

+		return vfModule;

+	}

+

+	public void setVfModule(VfModule vfModule) {

+		this.vfModule = vfModule;

+	}

+

+	public VfModuleCustomization getVfModuleCustomization() {

+		return vfModuleCustomization;

+	}

+

+	public void setVfModuleCustomization(VfModuleCustomization vfModuleCustomization) {

+		this.vfModuleCustomization = vfModuleCustomization;

+	}

+

+	public VnfResource getVnfResource() {

+		return vnfResource;

+	}

+

+	public void setVnfResource(VnfResource vnfResource) {

+		this.vnfResource = vnfResource;

+	}

+

+	public VnfResourceCustomization getVnfResourceCustomization() {

+		return vnfResourceCustomization;

+	}

+

+	public void setVnfResourceCustomization(

+			VnfResourceCustomization vnfResourceCustomization) {

+		this.vnfResourceCustomization = vnfResourceCustomization;

+	}

+

+	public AllottedResourceCustomization getAllottedResourceCustomization() {

+		return allottedResourceCustomization;

+	}

+

+	public void setAllottedResourceCustomization(

+			AllottedResourceCustomization allottedResourceCustomization) {

+		this.allottedResourceCustomization = allottedResourceCustomization;

+	}

+

+	public VnfResCustomToVfModuleCustom getVnfResCustomToVfModuleCustom() {

+		return vnfResCustomToVfModuleCustom;

+	}

+

+	public void setVnfResCustomToVfModuleCustom(

+			VnfResCustomToVfModuleCustom vnfResCustomToVfModuleCustom) {

+		this.vnfResCustomToVfModuleCustom = vnfResCustomToVfModuleCustom;

+	}

+

+	public TempNetworkHeatTemplateLookup getTempNetworkHeatTemplateLookup() {

+		return tempNetworkHeatTemplateLookup;

+	}

+

+	public void setTempNetworkHeatTemplateLookup(

+			TempNetworkHeatTemplateLookup tempNetworkHeatTemplateLookup) {

+		this.tempNetworkHeatTemplateLookup = tempNetworkHeatTemplateLookup;

+	}

+

+	public VfModuleToHeatFiles getVfModuleToHeatFiles() {

+		return vfModuleToHeatFiles;

+	}

+

+	public void setVfModuleToHeatFiles(VfModuleToHeatFiles vfModuleToHeatFiles) {

+		this.vfModuleToHeatFiles = vfModuleToHeatFiles;

+	}

+

+	public ToscaCsar getToscaCsar() {

+		return toscaCsar;

+	}

+

+	public void setToscaCsar(ToscaCsar toscaCsar) {

+		this.toscaCsar = toscaCsar;

+	}

+

+	public ServiceToResourceCustomization getVfServiceToResourceCustomization() {

+		return vfServiceToResourceCustomization;

+	}

+

+	public void setVfServiceToResourceCustomization(

+			ServiceToResourceCustomization vfServiceToResourceCustomization) {

+		this.vfServiceToResourceCustomization = vfServiceToResourceCustomization;

+	}

+

+	public ServiceToResourceCustomization getAllottedServiceToResourceCustomization() {

+		return allottedServiceToResourceCustomization;

+	}

+

+	public void setAllottedServiceToResourceCustomization(

+			ServiceToResourceCustomization allottedServiceToResourceCustomization) {

+		this.allottedServiceToResourceCustomization = allottedServiceToResourceCustomization;

+	}

+

+	public ServiceToResourceCustomization getVlServiceToResourceCustomization() {

+		return vlServiceToResourceCustomization;

+	}

+

+	public void setVlServiceToResourceCustomization(

+			ServiceToResourceCustomization vlServiceToResourceCustomization) {

+		this.vlServiceToResourceCustomization = vlServiceToResourceCustomization;

+	}

+

+	public static MsoLogger getLogger() {

+		return LOGGER;

+	}

+	

+	public boolean isDeployedSuccessfully() {

+		return isDeployedSuccessfully;

+	}

+

+	public void setSuccessfulDeployment() {

+		isDeployedSuccessfully = true;

+	}

+

 }

diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfModuleMetaData.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfModuleMetaData.java
index 3a7dd9a..8ee5302 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfModuleMetaData.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfModuleMetaData.java
@@ -20,16 +20,13 @@
 
 package org.openecomp.mso.asdc.installer;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.codehaus.jackson.annotate.JsonAnySetter;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import org.openecomp.sdc.api.notification.IVfModuleMetadata;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class VfModuleMetaData implements IVfModuleData {
 
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfResourceStructure.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfResourceStructure.java
index e9e39d7..fb4dcaf 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfResourceStructure.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/VfResourceStructure.java
@@ -28,10 +28,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
 import org.openecomp.mso.asdc.client.ASDCConfiguration;
 import org.openecomp.mso.asdc.client.exceptions.ArtifactInstallerException;
 import org.openecomp.mso.db.catalog.beans.AllottedResourceCustomization;
@@ -40,13 +36,17 @@
 import org.openecomp.mso.db.catalog.beans.ServiceToAllottedResources;
 import org.openecomp.mso.db.catalog.beans.ServiceToNetworks;
 import org.openecomp.mso.db.catalog.beans.VnfResource;
-import org.openecomp.mso.logger.MessageEnum;
 import org.openecomp.mso.logger.MsoLogger;
 import org.openecomp.sdc.api.IDistributionClient;
 import org.openecomp.sdc.api.notification.IArtifactInfo;
 import org.openecomp.sdc.api.notification.INotificationData;
 import org.openecomp.sdc.api.notification.IResourceInstance;
 import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
+import org.openecomp.mso.logger.MessageEnum;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 /**
  * This structure exists to avoid having issues if the order of the vfResource/vfmodule artifact is not good (tree structure).
  *
@@ -139,7 +139,7 @@
 
 	public void createVfModuleStructures() throws ArtifactInstallerException {
 
-	    //for vender tosca VNF there is no VFModule in VF
+		//for vender tosca VNF there is no VFModule in VF
 		if (vfModulesMetadataList == null) {
 		    LOGGER.info(MessageEnum.ASDC_GENERAL_INFO,"There is no VF mudules in the VF.", "ASDC", "createVfModuleStructures");
 		    return;
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/heat/ToscaResourceInstaller.java
index 8c08d3e..2817aad 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/heat/ToscaResourceInstaller.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/installer/heat/ToscaResourceInstaller.java
@@ -21,6 +21,7 @@
 

 package org.openecomp.mso.asdc.installer.heat;

 

+import java.sql.SQLIntegrityConstraintViolationException;

 import java.sql.Timestamp;

 import java.text.SimpleDateFormat;

 import java.util.ArrayList;

@@ -32,22 +33,25 @@
 import java.util.Map;

 import java.util.Set;

 import java.util.regex.Pattern;

-import java.util.Collections;

 import java.util.regex.Matcher;

 import java.util.Comparator;

 

 import org.hibernate.exception.ConstraintViolationException;

 import org.hibernate.exception.LockAcquisitionException;

+import org.openecomp.sdc.api.consumer.IComponentDoneStatusMessage;

 //import org.openecomp.generic.tosca.parser.model.Metadata;

 //import org.openecomp.generic.tosca.parser.model.NodeTemplate;

 import org.openecomp.sdc.api.notification.IArtifactInfo;

+import org.openecomp.sdc.api.notification.IStatusData;

 import org.openecomp.sdc.api.notification.IVfModuleMetadata;

+import org.openecomp.sdc.api.results.IDistributionClientResult;

 import org.openecomp.sdc.tosca.parser.impl.SdcPropertyNames;

 import org.openecomp.sdc.toscaparser.api.Group;

 import org.openecomp.sdc.toscaparser.api.NodeTemplate;

 import org.openecomp.sdc.toscaparser.api.Property;

 import org.openecomp.sdc.toscaparser.api.elements.Metadata;

 import org.openecomp.sdc.toscaparser.api.parameters.Input;

+import org.openecomp.sdc.utils.DistributionStatusEnum;

 import org.openecomp.mso.asdc.client.ASDCConfiguration;

 import org.openecomp.mso.asdc.client.exceptions.ArtifactInstallerException;

 import org.openecomp.mso.asdc.installer.ASDCElementInfo;

@@ -58,6 +62,9 @@
 import org.openecomp.mso.asdc.installer.VfModuleArtifact;

 import org.openecomp.mso.asdc.installer.VfModuleStructure;

 import org.openecomp.mso.asdc.installer.VfResourceStructure;

+import org.openecomp.mso.asdc.tenantIsolation.DistributionStatus;

+import org.openecomp.mso.asdc.tenantIsolation.WatchdogDistribution;

+import org.openecomp.mso.asdc.util.ASDCNotificationLogging;

 import org.openecomp.mso.asdc.util.YamlEditor;

 import org.openecomp.mso.db.catalog.CatalogDatabase;

 import org.openecomp.mso.db.catalog.beans.AllottedResource;

@@ -82,6 +89,9 @@
 import org.openecomp.mso.db.catalog.beans.VnfResourceCustomization;

 import org.openecomp.mso.logger.MessageEnum;

 import org.openecomp.mso.logger.MsoLogger;

+import org.openecomp.mso.requestsdb.WatchdogComponentDistributionStatusDb;

+import org.openecomp.mso.requestsdb.WatchdogDistributionStatusDb;

+import org.openecomp.mso.requestsdb.WatchdogServiceModVerIdLookupDb;

 

 public class ToscaResourceInstaller {// implements IVfResourceInstaller {

 

@@ -135,8 +145,42 @@
 			throw new ArtifactInstallerException("Exception caught during checking existence of the VNF Resource.", e);

 		}

 	}

+	

+	public void installTheComponentStatus(IStatusData iStatus) throws ArtifactInstallerException {

+		

+		logger.debug("Entering installTheComponentStatus for distributionId " + iStatus.getDistributionID() + " and ComponentName " + iStatus.getComponentName());

+		

+		WatchdogComponentDistributionStatusDb wdComponentDistributionStatus = WatchdogComponentDistributionStatusDb.getInstance();

+		

+		WatchdogDistributionStatusDb wdDistributionStatus = WatchdogDistributionStatusDb.getInstance();

+		

+		

+		try{

+			//Check to make sure the distributionId exists in the Distribution Status table first.  If not then we'll need to add it

+			String distributionId = wdDistributionStatus.getWatchdogDistributionId(iStatus.getDistributionID());

+			

+			if(distributionId == null){

+				// Insert the record into the parent table first - WatchDogDistributionStatus

+				wdDistributionStatus.insertWatchdogDistributionId(iStatus.getDistributionID());  

+			}

+		

+			wdComponentDistributionStatus.insertWatchdogComponentDistributionStatus(iStatus.getDistributionID(), iStatus.getComponentName(), iStatus.getStatus().toString());

+		

+		

+			WatchdogDistribution wd = new WatchdogDistribution();

 

-	//@Override

+			String distributionStatus = wd.getOverallDistributionStatus(iStatus.getDistributionID());

+	

+			logger.debug("Distribution status in installTheComponentStatus is : " + distributionStatus);					

+						

+		}catch (Exception e){

+			logger.debug("Exception caught in installTheComponentStatus " + e.getMessage());

+			throw new ArtifactInstallerException("Exception caught in installTheComponentStatus " + e.getMessage());

+		}

+

+	} 

+	

+

 	public void installTheResource(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStruct) throws ArtifactInstallerException {

 		

 		logger.debug("installTheResource is called");

@@ -174,6 +218,12 @@
 		List<ASDCElementInfo> artifactListForLogging = new ArrayList<>();

 		

 		CatalogDatabase catalogDB = CatalogDatabase.getInstance();

+		

+		WatchdogServiceModVerIdLookupDb wdLookupDB = WatchdogServiceModVerIdLookupDb.getInstance();

+		

+		WatchdogDistributionStatusDb wdDistributionStatus = WatchdogDistributionStatusDb.getInstance();

+		

+		WatchdogComponentDistributionStatusDb wdComponentDistributionStatus = WatchdogComponentDistributionStatusDb.getInstance();

 		// 2. Create the VFModules/VNFResource objects by linking them to the

 		// objects created before and store them in Resource/module structure

 		// Opening a DB transaction, starting from here

@@ -184,9 +234,13 @@
 			

 			catalogDB.saveToscaCsar(toscaResourceStruct.getCatalogToscaCsar());

 			

-			ToscaResourceInstaller.createService(toscaResourceStruct);

+			ToscaResourceInstaller.createService(toscaResourceStruct, vfResourceStruct);

 			

 			catalogDB.saveService(toscaResourceStruct.getCatalogService());

+			

+			wdLookupDB.insertWatchdogServiceModVerIdLookup(vfResourceStructure.getNotification().getDistributionID(), vfResourceStructure.getNotification().getServiceUUID());

+			

+			wdDistributionStatus.insertWatchdogDistributionId(vfResourceStructure.getNotification().getDistributionID());

 

 			

 			/* VNF POPULATION

@@ -197,325 +251,340 @@
             List<NodeTemplate> vfNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceVfList();

             int outerLoop = 0;

             logger.debug("**vfMondeTEmplatesList.size()=" + vfNodeTemplatesList.size());

-            for(NodeTemplate nodeTemplate : vfNodeTemplatesList) {

-                logger.debug("nodeTemplate outerLoop=" + outerLoop++);

-                // extract VF metadata

+            for (NodeTemplate nodeTemplate :  vfNodeTemplatesList) {

+            	logger.debug("nodeTemplate outerLoop=" + outerLoop++);

+            	// extract VF metadata

+             	

+				Metadata metadata = nodeTemplate.getMetaData();

+				

+				

+				

+				//************************Flexware code*******************************************

+								

+				String serviceType = toscaResourceStruct.getCatalogService().getServiceType();

+		

+				

+				if(serviceType != null && serviceType.equalsIgnoreCase("Flexware")){

+					

+					createVnfResource(nodeTemplate, toscaResourceStruct);

+					

+		         	// check for duplicate record already in the database

+					VnfResource vnfResource = catalogDB.getVnfResource(toscaResourceStruct.getCatalogVnfResource().getModelName(),

+							BigDecimalVersion.castAndCheckNotificationVersionToString(

+									toscaResourceStruct.getCatalogVnfResource().getVersion()));

 

-                Metadata metadata = nodeTemplate.getMetaData();

+					if (vnfResource != null) {

+						toscaResourceStruct.setVnfAlreadyInstalled(true);

+					}

+		      	

+		  	

+					if(!toscaResourceStruct.isVnfAlreadyInstalled()) {

+		    

+						 catalogDB.saveOrUpdateVnfResource(toscaResourceStruct.getCatalogVnfResource());

+						

+					}

+					

+					

+					boolean saveVnfCustomization = catalogDB.saveVnfResourceCustomization(toscaResourceStruct.getCatalogVnfResourceCustomization());

+					

+					if(saveVnfCustomization){

+					   catalogDB.saveServiceToResourceCustomization(toscaResourceStruct.getCatalogVfServiceToResourceCustomization());

+					}

+					

 

-                String vfCustomizationUUID = toscaResourceStruct.getSdcCsarHelper().getMetadataPropertyValue(metadata,

-                        SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);

-                logger.debug("vfCustomizationUUID=" + vfCustomizationUUID);

+				}

+				

+				

+			// *************************** END of FLEXWARE CODE ****************************************************

+					

+			String vfCustomizationCategory = toscaResourceStruct.getSdcCsarHelper().getMetadataPropertyValue(metadata, SdcPropertyNames.PROPERTY_NAME_CATEGORY);

+					

+			if(!vfCustomizationCategory.equalsIgnoreCase("Allotted Resource")) // Do not treat Allotted Resources as VNF resources

+			{

 

-                // extract VF metadata

-                createVnfResource(nodeTemplate, toscaResourceStruct);

+				String vfCustomizationUUID = toscaResourceStruct.getSdcCsarHelper().getMetadataPropertyValue(metadata, SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);

+				logger.debug("vfCustomizationUUID=" + vfCustomizationUUID);

 

-                // check for duplicate record already in the database

-                VnfResource vnfResource =

-                        catalogDB.getVnfResource(toscaResourceStruct.getCatalogVnfResource().getModelName(),

-                                BigDecimalVersion.castAndCheckNotificationVersionToString(

-                                        toscaResourceStruct.getCatalogVnfResource().getVersion()));

+			

+			/* HEAT TABLE POPULATION

+			 * *******************************************************************************************************

+			 */

+			

+				int nextLoop = 0;

+			for (VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) {

+				logger.debug("vfResourceStructure.getVfModuleStructure() loop, nextLoop = " + nextLoop++);

+				logger.debug("vfModuleStructure:" + vfModuleStructure.toString());

+				

+				// Here we set the right db structure according to the Catalog

+				// DB

 

-                if(vnfResource != null) {

-                    toscaResourceStruct.setVnfAlreadyInstalled(true);

-                }

+				// We expect only one MAIN HEAT per VFMODULE

+				// we can also obtain from it the Env ArtifactInfo, that's why

+				// we

+				// get the Main IArtifactInfo

 

-                if(!toscaResourceStruct.isVnfAlreadyInstalled()) {

+				HeatTemplate heatMainTemplate = null;

+				HeatEnvironment heatEnv;

+				

+				HeatTemplate heatVolumeTemplate = null;

+				HeatEnvironment heatVolumeEnv;

+				

+				

+				IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata();

+							

+				

+				if (vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT)) {

+					

+					List<VfModuleArtifact> artifacts = vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT);

+					logger.debug("there are " + artifacts.size() + " artifacts");

+					IArtifactInfo mainEnvArtifactInfo = null;

+					for (VfModuleArtifact vfma : artifacts) {

+						logger.debug("vmfa=" + vfma.toString());

+						mainEnvArtifactInfo = 

+								vfma.getArtifactInfo().getGeneratedArtifact();

+						

+						// MAIN HEAT

+						heatMainTemplate = (HeatTemplate) vfma.getCatalogObject(); 

+						

+						// Set HeatTemplateArtifactUUID to use later when setting the VfModule and NetworkResource

+						toscaResourceStruct.setHeatTemplateUUID(heatMainTemplate.getArtifactUuid());

 

-                    catalogDB.saveOrUpdateVnfResource(toscaResourceStruct.getCatalogVnfResource());

+						// Add this one for logging

+						artifactListForLogging.add(ASDCElementInfo

+								.createElementFromVfArtifactInfo(vfma.getArtifactInfo()));

+						

+						catalogDB.saveHeatTemplate(heatMainTemplate, heatMainTemplate.getParameters());

+						// Indicate we have deployed it in the DB

+						vfma.incrementDeployedInDB();

+					}

+					

+					

+					// VOLUME HEAT

+					// We expect only one VOL HEAT per VFMODULE

+					// we can also obtain from it the Env ArtifactInfo, that's why

+					// we get the Volume IArtifactInfo

+				

+					if (vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT_VOL)) {

+						IArtifactInfo volEnvArtifactInfo = vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL).get(0)

+								.getArtifactInfo().getGeneratedArtifact();

+		

+						heatVolumeTemplate = (HeatTemplate) vfModuleStructure.getArtifactsMap()

+								.get(ASDCConfiguration.HEAT_VOL).get(0).getCatalogObject();

+						

+						// Set VolHeatTemplate ArtifactUUID to use later when setting the VfModule 

+						toscaResourceStruct.setVolHeatTemplateUUID(heatVolumeTemplate.getArtifactUuid());

+						

+						

+						// Add this one for logging

+						artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL).get(0).getArtifactInfo()));

 

-                }

+						catalogDB.saveHeatTemplate(heatVolumeTemplate, heatVolumeTemplate.getParameters());

+						// Indicate we have deployed it in the DB

+						vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL).get(0).incrementDeployedInDB();

+						

+						if (volEnvArtifactInfo != null) {

+							heatVolumeEnv = (HeatEnvironment) vfResourceStructure.getArtifactsMapByUUID()

+									.get(volEnvArtifactInfo.getArtifactUUID()).getCatalogObject();

+							

+							// Set VolHeatTemplate ArtifactUUID to use later when setting the VfModule 

+							toscaResourceStruct.setVolHeatEnvTemplateUUID(heatVolumeEnv.getArtifactUuid());

 

-                boolean saveVnfCustomization = catalogDB

-                        .saveVnfResourceCustomization(toscaResourceStruct.getCatalogVnfResourceCustomization());

+							// Add this one for logging

+							artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(volEnvArtifactInfo));

+														

+							catalogDB.saveHeatEnvironment(heatVolumeEnv);

+							// Indicate we have deployed it in the DB

+							vfResourceStructure.getArtifactsMapByUUID().get(volEnvArtifactInfo.getArtifactUUID()).incrementDeployedInDB();

+						}

+						

+					}

+					

+					// NESTED HEAT

+					// Here we expect many HEAT_NESTED template to be there

+					// XXX FIX BY PCLO: Defect# -36643 -US666034 - check first if we really have nested heat templates

+					if (vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT_NESTED)) {

+						for (VfModuleArtifact heatNestedArtifact : vfModuleStructure.getArtifactsMap()

+								.get(ASDCConfiguration.HEAT_NESTED)) {

+	

+							// Check if this nested is well referenced by the MAIN HEAT

+							String parentArtifactType = ToscaResourceInstaller.identifyParentOfNestedTemplate(vfModuleStructure,heatNestedArtifact);

+							HeatTemplate heatNestedTemplate = (HeatTemplate) heatNestedArtifact.getCatalogObject();

+							

+							if (parentArtifactType != null) {

+														

+								switch (parentArtifactType) {

+									case ASDCConfiguration.HEAT:

+										

+										// Add this one for logging

+										artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(heatNestedArtifact.getArtifactInfo()));

+								

+										catalogDB.saveNestedHeatTemplate (heatMainTemplate.getArtifactUuid(), heatNestedTemplate, heatNestedTemplate.getTemplateName());

+										// Indicate we have deployed it in the DB

+										heatNestedArtifact.incrementDeployedInDB();

+										break;

+									case ASDCConfiguration.HEAT_VOL:

+										

+										// Add this one for logging

+										artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(heatNestedArtifact.getArtifactInfo()));

+										catalogDB.saveNestedHeatTemplate (heatVolumeTemplate.getArtifactUuid(), heatNestedTemplate, heatNestedTemplate.getTemplateName());

+										// Indicate we have deployed it in the DB

+										heatNestedArtifact.incrementDeployedInDB();

+										break;

+										

+									default:

+										break;

 

-                if(saveVnfCustomization) {

-                    catalogDB.saveServiceToResourceCustomization(

-                            toscaResourceStruct.getCatalogVfServiceToResourceCustomization());

-                }

+								}

+							} else { // Assume it belongs to HEAT MAIN

+								// Add this one for logging

+								artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(heatNestedArtifact.getArtifactInfo()));

+						

+								catalogDB.saveNestedHeatTemplate (heatMainTemplate.getArtifactUuid(), heatNestedTemplate, heatNestedTemplate.getTemplateName());

+								// Indicate we have deployed it in the DB

+								heatNestedArtifact.incrementDeployedInDB();

+							}

+						}

+					}

+					

+					if (mainEnvArtifactInfo != null) {

+						heatEnv = (HeatEnvironment) vfResourceStructure.getArtifactsMapByUUID()

+								.get(mainEnvArtifactInfo.getArtifactUUID()).getCatalogObject();

+						

+						// Set HeatEnvironmentArtifactUUID to use later when setting the VfModule 

+						toscaResourceStruct.setEnvHeatTemplateUUID(heatEnv.getArtifactUuid());

 

-                /*

-                 * HEAT TABLE POPULATION

-                 * *********************************************************************************

-                 * **********************

-                 */

+						// Add this one for logging

+						artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(mainEnvArtifactInfo));

+												

+						catalogDB.saveHeatEnvironment(heatEnv);

+						// Indicate we have deployed it in the DB

+						vfResourceStructure.getArtifactsMapByUUID().get(mainEnvArtifactInfo.getArtifactUUID()).incrementDeployedInDB();

+					}

+					

+					// here we expect one VFModule to be there

+					//VfResourceInstaller.createVfModule(vfModuleStructure,heatMainTemplate, heatVolumeTemplate, heatEnv, heatVolumeEnv);

+					//VfModule vfModule = vfModuleStructure.getCatalogVfModule();

 

-                int nextLoop = 0;

-                for(VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) {

-                    logger.debug("vfResourceStructure.getVfMOduleStructure() loop, nextLoop = " + nextLoop++);

-                    logger.debug("vfModuleStructure:" + vfModuleStructure.toString());

+					// Add this one for logging

+					//artifactListForLogging.add(ASDCElementInfo.createElementFromVfModuleStructure(vfModuleStructure));

+					

+					//catalogDB.saveOrUpdateVfModule(vfModule);

+					

+					

+	                // extract VF metadata          	

+					createVnfResource(nodeTemplate, toscaResourceStruct);

+					

+		         	// check for duplicate record already in the database

+					VnfResource vnfResource = catalogDB.getVnfResource(toscaResourceStruct.getCatalogVnfResource().getModelName(),

+							BigDecimalVersion.castAndCheckNotificationVersionToString(

+									toscaResourceStruct.getCatalogVnfResource().getVersion()));

 

-                    // Here we set the right db structure according to the Catalog

-                    // DB

+					if (vnfResource != null) {

+						toscaResourceStruct.setVnfAlreadyInstalled(true);

+					}

+		      	

+		  	

+					if(!toscaResourceStruct.isVnfAlreadyInstalled()) {

+		    

+						 catalogDB.saveOrUpdateVnfResource(toscaResourceStruct.getCatalogVnfResource());

+						

+					}

+					

+								

+					catalogDB.saveVnfResourceCustomization(toscaResourceStruct.getCatalogVnfResourceCustomization()); 			

 

-                    // We expect only one MAIN HEAT per VFMODULE

-                    // we can also obtain from it the Env ArtifactInfo, that's why

-                    // we

-                    // get the Main IArtifactInfo

+					catalogDB.saveServiceToResourceCustomization(toscaResourceStruct.getCatalogVfServiceToResourceCustomization());

 

-                    HeatTemplate heatMainTemplate = null;

-                    HeatEnvironment heatEnv;

 

-                    HeatTemplate heatVolumeTemplate = null;

-                    HeatEnvironment heatVolumeEnv;

-

-                    IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata();

-

-                    if(vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT)) {

-

-                        List<VfModuleArtifact> artifacts =

-                                vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT);

-                        logger.debug("there are " + artifacts.size() + " artifacts");

-                        IArtifactInfo mainEnvArtifactInfo = null;

-                        for(VfModuleArtifact vfma : artifacts) {

-                            logger.debug("vmfa=" + vfma.toString());

-                            mainEnvArtifactInfo = vfma.getArtifactInfo().getGeneratedArtifact();

-

-                            // MAIN HEAT

-                            heatMainTemplate = (HeatTemplate)vfma.getCatalogObject();

-

-                            // Set HeatTemplateArtifactUUID to use later when setting the VfModule

-                            // and NetworkResource

-                            toscaResourceStruct.setHeatTemplateUUID(heatMainTemplate.getArtifactUuid());

-

-                            // Add this one for logging

-                            artifactListForLogging

-                                    .add(ASDCElementInfo.createElementFromVfArtifactInfo(vfma.getArtifactInfo()));

-

-                            catalogDB.saveHeatTemplate(heatMainTemplate, heatMainTemplate.getParameters());

-                            // Indicate we have deployed it in the DB

-                            vfma.incrementDeployedInDB();

-                        }

-

-                        // VOLUME HEAT

-                        // We expect only one VOL HEAT per VFMODULE

-                        // we can also obtain from it the Env ArtifactInfo, that's why

-                        // we get the Volume IArtifactInfo

-

-                        if(vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT_VOL)) {

-                            IArtifactInfo volEnvArtifactInfo = vfModuleStructure.getArtifactsMap()

-                                    .get(ASDCConfiguration.HEAT_VOL).get(0).getArtifactInfo().getGeneratedArtifact();

-

-                            heatVolumeTemplate = (HeatTemplate)vfModuleStructure.getArtifactsMap()

-                                    .get(ASDCConfiguration.HEAT_VOL).get(0).getCatalogObject();

-

-                            // Set VolHeatTemplate ArtifactUUID to use later when setting the

-                            // VfModule

-                            toscaResourceStruct.setVolHeatTemplateUUID(heatVolumeTemplate.getArtifactUuid());

-

-                            // Add this one for logging

-                            artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(vfModuleStructure

-                                    .getArtifactsMap().get(ASDCConfiguration.HEAT_VOL).get(0).getArtifactInfo()));

-

-                            catalogDB.saveHeatTemplate(heatVolumeTemplate, heatVolumeTemplate.getParameters());

-                            // Indicate we have deployed it in the DB

-                            vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL).get(0)

-                                    .incrementDeployedInDB();

-

-                            if(volEnvArtifactInfo != null) {

-                                heatVolumeEnv = (HeatEnvironment)vfResourceStructure.getArtifactsMapByUUID()

-                                        .get(volEnvArtifactInfo.getArtifactUUID()).getCatalogObject();

-

-                                // Set VolHeatTemplate ArtifactUUID to use later when setting the

-                                // VfModule

-                                toscaResourceStruct.setVolHeatEnvTemplateUUID(heatVolumeEnv.getArtifactUuid());

-

-                                // Add this one for logging

-                                artifactListForLogging

-                                        .add(ASDCElementInfo.createElementFromVfArtifactInfo(volEnvArtifactInfo));

-

-                                catalogDB.saveHeatEnvironment(heatVolumeEnv);

-                                // Indicate we have deployed it in the DB

-                                vfResourceStructure.getArtifactsMapByUUID().get(volEnvArtifactInfo.getArtifactUUID())

-                                        .incrementDeployedInDB();

-                            }

-

-                        }

-

-                        // NESTED HEAT

-                        // Here we expect many HEAT_NESTED template to be there

-                        // XXX FIX BY PCLO: Defect# -36643 -US666034 - check first if we really have

-                        // nested heat templates

-                        if(vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT_NESTED)) {

-                            for(VfModuleArtifact heatNestedArtifact : vfModuleStructure.getArtifactsMap()

-                                    .get(ASDCConfiguration.HEAT_NESTED)) {

-

-                                // Check if this nested is well referenced by the MAIN HEAT

-                                String parentArtifactType = ToscaResourceInstaller

-                                        .identifyParentOfNestedTemplate(vfModuleStructure, heatNestedArtifact);

-                                HeatTemplate heatNestedTemplate = (HeatTemplate)heatNestedArtifact.getCatalogObject();

-

-                                if(parentArtifactType != null) {

-

-                                    switch(parentArtifactType) {

-                                        case ASDCConfiguration.HEAT:

-

-                                            // Add this one for logging

-                                            artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(

-                                                    heatNestedArtifact.getArtifactInfo()));

-

-                                            catalogDB.saveNestedHeatTemplate(heatMainTemplate.getArtifactUuid(),

-                                                    heatNestedTemplate, heatNestedTemplate.getTemplateName());

-                                            // Indicate we have deployed it in the DB

-                                            heatNestedArtifact.incrementDeployedInDB();

-                                            break;

-                                        case ASDCConfiguration.HEAT_VOL:

-

-                                            // Add this one for logging

-                                            artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(

-                                                    heatNestedArtifact.getArtifactInfo()));

-                                            catalogDB.saveNestedHeatTemplate(heatVolumeTemplate.getArtifactUuid(),

-                                                    heatNestedTemplate, heatNestedTemplate.getTemplateName());

-                                            // Indicate we have deployed it in the DB

-                                            heatNestedArtifact.incrementDeployedInDB();

-                                            break;

-

-                                        default:

-                                            break;

-

-                                    }

-                                } else { // Assume it belongs to HEAT MAIN

-                                    // Add this one for logging

-                                    artifactListForLogging.add(ASDCElementInfo

-                                            .createElementFromVfArtifactInfo(heatNestedArtifact.getArtifactInfo()));

-

-                                    catalogDB.saveNestedHeatTemplate(heatMainTemplate.getArtifactUuid(),

-                                            heatNestedTemplate, heatNestedTemplate.getTemplateName());

-                                    // Indicate we have deployed it in the DB

-                                    heatNestedArtifact.incrementDeployedInDB();

-                                }

-                            }

-                        }

-

-                        if(mainEnvArtifactInfo != null) {

-                            heatEnv = (HeatEnvironment)vfResourceStructure.getArtifactsMapByUUID()

-                                    .get(mainEnvArtifactInfo.getArtifactUUID()).getCatalogObject();

-

-                            // Set HeatEnvironmentArtifactUUID to use later when setting the

-                            // VfModule

-                            toscaResourceStruct.setEnvHeatTemplateUUID(heatEnv.getArtifactUuid());

-

-                            // Add this one for logging

-                            artifactListForLogging

-                                    .add(ASDCElementInfo.createElementFromVfArtifactInfo(mainEnvArtifactInfo));

-

-                            catalogDB.saveHeatEnvironment(heatEnv);

-                            // Indicate we have deployed it in the DB

-                            vfResourceStructure.getArtifactsMapByUUID().get(mainEnvArtifactInfo.getArtifactUUID())

-                                    .incrementDeployedInDB();

-                        }

-

-                        // here we expect one VFModule to be there

-                        // VfResourceInstaller.createVfModule(vfModuleStructure,heatMainTemplate,

-                        // heatVolumeTemplate, heatEnv, heatVolumeEnv);

-                        // VfModule vfModule = vfModuleStructure.getCatalogVfModule();

-

-                        // Add this one for logging

-                        // artifactListForLogging.add(ASDCElementInfo.createElementFromVfModuleStructure(vfModuleStructure));

-

-                        // catalogDB.saveOrUpdateVfModule(vfModule);

-

-                        List<org.openecomp.sdc.toscaparser.api.Group> vfGroups =

-                                toscaResourceStruct.getSdcCsarHelper().getVfModulesByVf(vfCustomizationUUID);

-                        logger.debug("vfGroups:" + vfGroups.toString());

-

+						List<org.openecomp.sdc.toscaparser.api.Group> vfGroups = toscaResourceStruct.getSdcCsarHelper().getVfModulesByVf(vfCustomizationUUID);

+						logger.debug("vfGroups:" + vfGroups.toString());

+						

 						vfGroups.sort((group1, group2) -> {

+								//Field name1Field = group1.class.getDeclaredField("name");

+								//name1Field.setAccessible(true);

+								String thisName = group1.getName(); //(String) name1Field.get(group1);

+								String thatName = group2.getName(); // (String) name1Field.get(group2);

+								

+								Matcher m = lastDigit.matcher(thisName);

+								Matcher m2 = lastDigit.matcher(thatName);

+								

+								String thisDigit = "0";

+								String thatDigit = "0";

+								if (m.find()) {

+									thisDigit = m.group();

+								} else {

+									return -1;

+								}

+								if (m2.find()) {

+									thatDigit = m2.group();

+								} else {

+									return 1;

+								}

+								

+								return new Integer(thisDigit).compareTo(new Integer(thatDigit));

+							});

+						

+						logger.debug("vfGroupsAfter:" + vfGroups.toString());

 

-							// Field name1Field = group1.class.getDeclaredField("name");

-							// name1Field.setAccessible(true);

-							String thisName = group1.getName(); // (String)

-							// name1Field.get(group1);

-							String thatName = group2.getName(); // (String)

-							// name1Field.get(group2);

-

-							Matcher m = lastDigit.matcher(thisName);

-							Matcher m2 = lastDigit.matcher(thatName);

-

-							String thisDigit = "0";

-							String thatDigit = "0";

-							if (m.find()) {

-								thisDigit = m.group();

+						

+						for(Group group : vfGroups){

+							

+				

+							//boolean saveVFModule = createVFModule(group, nodeTemplate, toscaResourceStruct, vfMetadata);

+							if (vfMetadata.getVfModuleModelCustomizationUUID() == null) {

+								logger.debug("NULL 1");

 							} else {

-								return -1;

+								logger.debug("vfMetadata.getMCU=" + vfMetadata.getVfModuleModelCustomizationUUID());

 							}

-							if (m2.find()) {

-								thatDigit = m2.group();

+							if (group.getMetadata() == null) {

+								logger.debug("NULL 3");

 							} else {

-								return 1;

+								logger.debug("group.getMetadata().getValue() = " + group.getMetadata().getValue("vfModuleModelCustomizationUUID"));

 							}

+							if (vfMetadata.getVfModuleModelCustomizationUUID().equals(group.getMetadata().getValue("vfModuleModelCustomizationUUID"))) {

+								logger.debug("Found a match at " + vfMetadata.getVfModuleModelCustomizationUUID());

+							   createVFModule(group, nodeTemplate, toscaResourceStruct, vfResourceStructure, vfMetadata);

+				

+								catalogDB.saveOrUpdateVfModule(toscaResourceStruct.getCatalogVfModule());

+				

+								catalogDB.saveOrUpdateVfModuleCustomization(toscaResourceStruct.getCatalogVfModuleCustomization());

+								

+								catalogDB.saveVnfResourceToVfModuleCustomization(toscaResourceStruct.getCatalogVnfResourceCustomization(), toscaResourceStruct.getCatalogVfModuleCustomization());

+				

 

-							return new Integer(thisDigit).compareTo(new Integer(thatDigit));

-

-						});

-

-                        logger.debug("vfGroupsAfter:" + vfGroups.toString());

-

-                        for(Group group : vfGroups) {

-

-                            // boolean saveVFModule = createVFModule(group, nodeTemplate,

-                            // toscaResourceStruct, vfMetadata);

-                            if(vfMetadata.getVfModuleModelCustomizationUUID() == null) {

-                                logger.debug("NULL 1");

-                            } else {

-                                logger.debug("vfMetadata.getMCU=" + vfMetadata.getVfModuleModelCustomizationUUID());

-                            }

-                            if(group.getMetadata() == null) {

-                                logger.debug("NULL 3");

-                            } else {

-                                logger.debug("group.getMetadata().getValue() = "

-                                        + group.getMetadata().getValue("vfModuleModelCustomizationUUID"));

-                            }

-                            if(vfMetadata.getVfModuleModelCustomizationUUID()

-                                    .equals(group.getMetadata().getValue("vfModuleModelCustomizationUUID"))) {

-                                logger.debug("Found a match at " + vfMetadata.getVfModuleModelCustomizationUUID());

-                                createVFModule(group, nodeTemplate, toscaResourceStruct, vfResourceStructure,

-                                        vfMetadata);

-

-                                catalogDB.saveOrUpdateVfModule(toscaResourceStruct.getCatalogVfModule());

-

-                                catalogDB.saveOrUpdateVfModuleCustomization(

-                                        toscaResourceStruct.getCatalogVfModuleCustomization());

-

-                                catalogDB.saveVnfResourceToVfModuleCustomization(

-                                        toscaResourceStruct.getCatalogVnfResourceCustomization(),

-                                        toscaResourceStruct.getCatalogVfModuleCustomization());

-

-                            } else {

-                                if(toscaResourceStruct.getCatalogVfModuleCustomization() != null) {

-                                    logger.debug("No match for " + toscaResourceStruct.getCatalogVfModuleCustomization()

-                                            .getModelCustomizationUuid());

-                                } else {

-                                    logger.debug("No match for vfModuleModelCustomizationUUID");

-                                }

-                            }

-

-                        }

-

-                    } // Commented out to process VFModules each time

-

-                    // Here we expect many HEAT_TEMPLATE files to be there

-                    if(vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT_ARTIFACT)) {

-                        for(VfModuleArtifact heatArtifact : vfModuleStructure.getArtifactsMap()

-                                .get(ASDCConfiguration.HEAT_ARTIFACT)) {

-

-                            HeatFiles heatFile = (HeatFiles)heatArtifact.getCatalogObject();

-

-                            // Add this one for logging

-                            artifactListForLogging.add(

-                                    ASDCElementInfo.createElementFromVfArtifactInfo(heatArtifact.getArtifactInfo()));

-

-                            if(toscaResourceStruct.getCatalogVfModule() != null && heatFile != null) {

-                                catalogDB.saveVfModuleToHeatFiles(

-                                        toscaResourceStruct.getCatalogVfModule().getModelUUID(), heatFile);

-                            }

-                            // Indicate we will deploy it in the DB

-                            heatArtifact.incrementDeployedInDB();

-                        }

-                    }

-

-                }

-

-            }

+							} else {

+								if(toscaResourceStruct.getCatalogVfModuleCustomization() != null){

+									logger.debug("No match for " + toscaResourceStruct.getCatalogVfModuleCustomization().getModelCustomizationUuid());

+								} else {

+									logger.debug("No match for vfModuleModelCustomizationUUID");

+								}

+							}

+				

+						}

+						       	   

+					} //Commented out to process VFModules each time 

+					

+					// Here we expect many HEAT_TEMPLATE files to be there

+					if (vfModuleStructure.getArtifactsMap().containsKey(ASDCConfiguration.HEAT_ARTIFACT)) {

+						for (VfModuleArtifact heatArtifact : vfModuleStructure.getArtifactsMap()

+								.get(ASDCConfiguration.HEAT_ARTIFACT)) {

+		

+							HeatFiles heatFile = (HeatFiles) heatArtifact.getCatalogObject();

+												

+							// Add this one for logging

+							artifactListForLogging.add(ASDCElementInfo.createElementFromVfArtifactInfo(heatArtifact.getArtifactInfo()));

+						

+							if(toscaResourceStruct.getCatalogVfModule() != null && heatFile != null){

+								catalogDB.saveVfModuleToHeatFiles (toscaResourceStruct.getCatalogVfModule().getModelUUID(), heatFile);

+							}

+							// Indicate we will deploy it in the DB

+							heatArtifact.incrementDeployedInDB();

+						}

+					}

+					

+				  }

+				}

+		}

 				

 				/* END OF HEAT TABLE POPULATION

 				 * ***************************************************************************************************

@@ -549,7 +618,7 @@
 				

         			for(NodeTemplate vlNode : nodeTemplatesVLList){

         				

-        				String networkResourceModelName = vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim();

+        				String networkResourceModelName = vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME);

 

         				List<TempNetworkHeatTemplateLookup> networkHeatTemplateLookup = catalogDB.getTempNetworkHeatTemplateLookup(networkResourceModelName);

         				

@@ -578,14 +647,20 @@
         	   //createServiceToResourceCustomization(toscaResourceStruct.getCatalogService(), toscaResourceStruct.getCatalogVnfResourceCustomization(), toscaResourceStruct);

         	   

            // catalogDB.saveToscaCsar(toscaResourceStruct.getCatalogToscaCsar());

-         	

+        	wdComponentDistributionStatus.insertWatchdogComponentDistributionStatus(vfResourceStruct.getNotification().getDistributionID(), "SO", DistributionStatusEnum.COMPONENT_DONE_OK.name());        	

  

 			catalogDB.commit();	

-			vfResourceStructure.setSuccessfulDeployment();

+			toscaResourceStruct.setSuccessfulDeployment();

 			

 		}catch(Exception e){

 			logger.debug("Exception :",e);

 			

+			wdDistributionStatus.insertWatchdogDistributionId(vfResourceStructure.getNotification().getDistributionID());

+			

+			wdComponentDistributionStatus.insertWatchdogComponentDistributionStatus(vfResourceStruct.getNotification().getDistributionID(), "SO", DistributionStatusEnum.COMPONENT_DONE_ERROR.name());

+			

+			wdDistributionStatus.updateWatchdogDistributionIdStatus(vfResourceStruct.getNotification().getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name());         	

+			

 			Throwable dbExceptionToCapture = e;

 			while (!(dbExceptionToCapture instanceof ConstraintViolationException || dbExceptionToCapture instanceof LockAcquisitionException)

 					&& (dbExceptionToCapture.getCause() != null)) {

@@ -596,7 +671,7 @@
 				logger.warn(MessageEnum.ASDC_ARTIFACT_ALREADY_DEPLOYED, vfResourceStructure.getResourceInstance().getResourceName(),

 						vfResourceStructure.getNotification().getServiceVersion(), "", "", MsoLogger.ErrorCode.DataError, "Exception - ASCDC Artifact already deployed", e);

 			} else {

-			    String elementToLog = (artifactListForLogging.size() > 0 ? artifactListForLogging.get(artifactListForLogging.size()-1).toString() : "No element listed");

+				String elementToLog = (artifactListForLogging.size() > 0 ? artifactListForLogging.get(artifactListForLogging.size()-1).toString() : "No element listed");

 				logger.error(MessageEnum.ASDC_ARTIFACT_INSTALL_EXC, elementToLog, "", "", MsoLogger.ErrorCode.DataError, "Exception caught during installation of " + vfResourceStructure.getResourceInstance().getResourceName() + ". Transaction rollback", e);

 				catalogDB.rollback();

 				throw new ArtifactInstallerException(

@@ -762,7 +837,7 @@
 		

 	}

 

-	private static void createService(ToscaResourceStructure toscaResourceStructure) {

+	private static void createService(ToscaResourceStructure toscaResourceStructure, VfResourceStructure vfResourceStructure) {

 		

 		toscaResourceStructure.getServiceMetadata();

 		

@@ -771,18 +846,24 @@
 		Service service = new Service();

 		

 		//  Service	

-		if(serviceMetadata != null){	

+		if(serviceMetadata != null) {	

 			

 			if(toscaResourceStructure.getServiceVersion() != null){

 				service.setVersion(toscaResourceStructure.getServiceVersion());

 			}

-			

-			service.setServiceType(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(serviceMetadata, "serviceType"));

-			service.setServiceRole(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(serviceMetadata, "serviceRole"));

+						

+			service.setServiceType(serviceMetadata.getValue("serviceType"));

+			service.setServiceRole(serviceMetadata.getValue("serviceRole"));

 			

 			service.setDescription(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));

 			service.setModelName(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));

 			service.setModelUUID(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));

+			service.setEnvironmentContext(serviceMetadata.getValue("environmentContext"));

+			

+			

+			if(vfResourceStructure != null){

+				service.setWorkloadContext(vfResourceStructure.getNotification().getWorkloadContext());

+			}

 			//service.setVersion(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));

 			service.setModelInvariantUUID(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));

 			service.setCategory(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY));

@@ -823,7 +904,7 @@
 			networkResource.setNeutronNetworkType("BASIC");

 		}

 		

-		networkResource.setModelName(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));

+		networkResource.setModelName(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));

 		

 		networkResource.setModelInvariantUUID(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));

 		networkResource.setModelUUID(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));

@@ -843,21 +924,21 @@
 			

 		toscaResourceStructure.setCatalogNetworkResource(networkResource); 

 		

-		networkResourceCustomization.setModelInstanceName(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));

-		networkResourceCustomization.setModelCustomizationUuid(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));

-		networkResourceCustomization.setNetworkResourceModelUuid(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID).trim()));

+		networkResourceCustomization.setModelInstanceName(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));

+		networkResourceCustomization.setModelCustomizationUuid(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));

+		networkResourceCustomization.setNetworkResourceModelUuid(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));

 		

 				

-		networkResourceCustomization.setNetworkTechnology(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTECHNOLOGY)).trim());

-		networkResourceCustomization.setNetworkType(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTYPE)).trim());

-		networkResourceCustomization.setNetworkRole(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE)).trim());

-		networkResourceCustomization.setNetworkScope(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE)).trim());

+		networkResourceCustomization.setNetworkTechnology(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTECHNOLOGY)));

+		networkResourceCustomization.setNetworkType(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTYPE)));

+		networkResourceCustomization.setNetworkRole(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE)));

+		networkResourceCustomization.setNetworkScope(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE)));

 			

 		toscaResourceStructure.setCatalogNetworkResourceCustomization(networkResourceCustomization);

 		

 		ServiceToResourceCustomization serviceToResourceCustomization = new ServiceToResourceCustomization();

 		serviceToResourceCustomization.setServiceModelUUID(toscaResourceStructure.getCatalogService().getModelUUID());

-		serviceToResourceCustomization.setResourceModelCustomizationUUID(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));

+		serviceToResourceCustomization.setResourceModelCustomizationUUID(testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));

 		serviceToResourceCustomization.setModelType("network");

 

 		toscaResourceStructure.setCatalogVlServiceToResourceCustomization(serviceToResourceCustomization);

@@ -1013,37 +1094,43 @@
 		

 		//toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT)

 		

-		vnfResource.setModelInvariantUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID).trim()));

-		vnfResource.setModelName(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));

-		vnfResource.setModelUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID).trim()));

+		vnfResource.setModelInvariantUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));

+		vnfResource.setModelName(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));

+		vnfResource.setModelUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));

 

-		vnfResource.setVersion(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION).trim()));

-		vnfResource.setDescription(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION).trim()));

+		vnfResource.setVersion(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));

+		vnfResource.setDescription(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));

 		vnfResource.setOrchestrationMode("HEAT");

 		vnfResource.setToscaNodeType(testNull(vfNodeTemplate.getType()));

-		vnfResource.setAicVersionMax(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES).trim()));

-		vnfResource.setAicVersionMin(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES).trim()));

-        // vnfResource.setHeatTemplateArtifactUUId(toscaResourceStructure.getHeatTemplateUUID());

-        vnfResource.setCategory(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY));

-        vnfResource.setSubCategory(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY));

-        // vfNodeTemplate.getProperties()

-        toscaResourceStructure.setCatalogVnfResource(vnfResource);

-

+		vnfResource.setAicVersionMax(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));

+		vnfResource.setAicVersionMin(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));

+		//vnfResource.setHeatTemplateArtifactUUId(toscaResourceStructure.getHeatTemplateUUID());

+		

+	//	vfNodeTemplate.getProperties()

+		toscaResourceStructure.setCatalogVnfResource(vnfResource); 

+		

 		VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization();

-		vnfResourceCustomization.setModelCustomizationUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));

+		vnfResourceCustomization.setModelCustomizationUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));

 		vnfResourceCustomization.setModelInstanceName(vfNodeTemplate.getName());

 		

-		vnfResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)).trim());

-		vnfResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFCODE)).trim());

-		vnfResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)).trim());

-		vnfResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)).trim());

+		vnfResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)));

+		vnfResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFCODE)));

+		vnfResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)));

+		vnfResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)));

 		

 		

-		vnfResourceCustomization.setVnfResourceModelUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID).trim()));

-		vnfResourceCustomization.setAvailabilityZoneMaxCount(Integer.getInteger(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT).trim()));

+		vnfResourceCustomization.setMultiStageDesign(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, "multi_stage_design"));

+		

+		

+		vnfResourceCustomization.setVnfResourceModelUuid(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));

+		vnfResourceCustomization.setAvailabilityZoneMaxCount(Integer.getInteger(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT)));

+		

+		//vnfResourceCustomization.setMultiStageDesign(vfNodeTemplate.getMetaData().getValue("multi_stage_design"));

+		//vnfResourceCustomization.setMultiStageDesign(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT).trim());

+				

 

-		vnfResourceCustomization.setMaxInstances(Integer.getInteger(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES).trim()));

-		vnfResourceCustomization.setMinInstances(Integer.getInteger(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES).trim()));

+		vnfResourceCustomization.setMaxInstances(Integer.getInteger(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));

+		vnfResourceCustomization.setMinInstances(Integer.getInteger(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));

 

 

 		

@@ -1052,7 +1139,7 @@
 		

 		ServiceToResourceCustomization serviceToResourceCustomization = new ServiceToResourceCustomization();

 		serviceToResourceCustomization.setServiceModelUUID(toscaResourceStructure.getCatalogService().getModelUUID());

-		serviceToResourceCustomization.setResourceModelCustomizationUUID(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim());

+		serviceToResourceCustomization.setResourceModelCustomizationUUID(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));

 		serviceToResourceCustomization.setModelType("vnf");

 

 		toscaResourceStructure.setCatalogVfServiceToResourceCustomization(serviceToResourceCustomization);

@@ -1063,29 +1150,38 @@
 	private static void createAllottedResource(NodeTemplate nodeTemplate, ToscaResourceStructure toscaResourceStructure) {

 		AllottedResource allottedResource = new AllottedResource();

 		

-		allottedResource.setModelUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID).trim()));

-		allottedResource.setModelInvariantUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID).trim()));

-		allottedResource.setModelName(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));

-		allottedResource.setModelVersion(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION).trim()));

+		allottedResource.setModelUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));

+		allottedResource.setModelInvariantUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));

+		allottedResource.setModelName(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));

+		allottedResource.setModelVersion(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));

 		allottedResource.setToscaNodeType(testNull(nodeTemplate.getType()));

+		allottedResource.setSubcategory(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY)));

+		allottedResource.setDescription(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));

 		

 		toscaResourceStructure.setAllottedResource(allottedResource);

 		

 		AllottedResourceCustomization allottedResourceCustomization = new AllottedResourceCustomization();

-		allottedResourceCustomization.setModelCustomizationUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));

+		allottedResourceCustomization.setModelCustomizationUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));

 		allottedResourceCustomization.setModelInstanceName(nodeTemplate.getName());

-		allottedResourceCustomization.setArModelUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID).trim()));

+		allottedResourceCustomization.setArModelUuid(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));

 		

-		allottedResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)).trim());

-		allottedResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFCODE)).trim());

-		allottedResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)).trim());

-		allottedResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)).trim());

+		

+		allottedResourceCustomization.setProvidingServiceModelInvariantUuid(toscaResourceStructure.getCatalogService().getModelInvariantUUID());

+		allottedResourceCustomization.setProvidingServiceModelUuid(toscaResourceStructure.getCatalogService().getModelUUID());

+		allottedResourceCustomization.setProvidingServiceModelName(toscaResourceStructure.getCatalogService().getModelName());

+		allottedResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)));

+		allottedResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFCODE)));

+		allottedResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)));

+		allottedResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)));

+		allottedResourceCustomization.setMinInstances(Integer.getInteger(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));

+		allottedResourceCustomization.setMaxInstances(Integer.getInteger(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));

+		allottedResourceCustomization.setTargetNetworkRole(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NETWORKROLE));

 		

 		toscaResourceStructure.setCatalogAllottedResourceCustomization(allottedResourceCustomization);

 		

 		ServiceToResourceCustomization serviceToResourceCustomization = new ServiceToResourceCustomization();

 		serviceToResourceCustomization.setServiceModelUUID(toscaResourceStructure.getCatalogService().getModelUUID());

-		serviceToResourceCustomization.setResourceModelCustomizationUUID(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));

+		serviceToResourceCustomization.setResourceModelCustomizationUUID(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));

 		serviceToResourceCustomization.setModelType("allottedResource");

 

 		toscaResourceStructure.setCatalogAllottedServiceToResourceCustomization(serviceToResourceCustomization);

@@ -1130,13 +1226,15 @@
 	}

 	

 	private static String testNull(Object object) {

-		if (object == null) {

-			return "";

-		} else if ("null".equals(object)) {

+		

+		

+		if(object == null){

 			return null;

-		}else if (object instanceof Integer) {

+		}else if (object != null && object.equals("NULL")) {

+			return null;

+		}else if (object != null && object instanceof Integer) {

 			return object.toString();

-		} else if (object instanceof String) {

+		} else if (object != null && object instanceof String) {

 			return (String)object;

 		} else {

 			return "Type not recognized";

@@ -1158,5 +1256,4 @@
 		

 		return new Timestamp(new Date().getTime());

 	}

-

-}
\ No newline at end of file
+}

diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/AaiClientPropertiesImpl.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/AaiClientPropertiesImpl.java
new file mode 100644
index 0000000..537de3e
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/AaiClientPropertiesImpl.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.tenantIsolation;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.openecomp.mso.asdc.tenantIsolation.AsdcPropertiesUtils;
+import org.openecomp.mso.client.aai.AAIProperties;
+import org.openecomp.mso.client.aai.AAIVersion;
+import org.openecomp.mso.properties.MsoJavaProperties;
+
+public class AaiClientPropertiesImpl implements AAIProperties {
+
+	final MsoJavaProperties props;
+	public AaiClientPropertiesImpl() {
+		this.props = AsdcPropertiesUtils.loadMsoProperties ();
+	}
+
+	@Override
+	public URL getEndpoint() throws MalformedURLException {
+		return new URL(props.getProperty("aai.endpoint", null));
+	}
+
+	@Override
+	public String getSystemName() {
+		return "MSO";
+	}
+	
+	@Override
+	public AAIVersion getDefaultVersion() {
+		return AAIVersion.LATEST;
+	}
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/AsdcPropertiesUtils.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/AsdcPropertiesUtils.java
new file mode 100644
index 0000000..462ef0d
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/AsdcPropertiesUtils.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.openecomp.mso.asdc.tenantIsolation;
+
+import org.openecomp.mso.logger.MessageEnum;
+import org.openecomp.mso.logger.MsoLogger;
+import org.openecomp.mso.properties.MsoJavaProperties;
+import org.openecomp.mso.properties.MsoPropertiesFactory;
+
+public class AsdcPropertiesUtils {
+
+	public final static String MSO_ASDC_CLIENTS = "MSO_ASDC_CLIENTS";
+	
+    private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory ();
+
+    private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.ASDC);
+
+    private static boolean noProperties = true;
+
+    public synchronized static MsoJavaProperties loadMsoProperties () {
+        MsoJavaProperties msoProperties;
+        try {
+            msoProperties = msoPropertiesFactory.getMsoJavaProperties (MSO_ASDC_CLIENTS);
+        } catch (Exception e) {
+            msoLogger.error (MessageEnum.ASDC_PROPERTIES_NOT_FOUND, MSO_ASDC_CLIENTS, "", "", MsoLogger.ErrorCode.DataError, "Exception when loading MSO ASDC Clients Properties", e);
+            return null;
+        }
+
+        if (msoProperties != null && msoProperties.size () > 0) {
+        	noProperties = false;
+            msoLogger.info (MessageEnum.ASDC_PROPERTIES_LOAD_SUCCESS, "", "");
+            return msoProperties;
+        } else {
+            msoLogger.error (MessageEnum.ASDC_PROPERTIES_NOT_FOUND, MSO_ASDC_CLIENTS, "", "", MsoLogger.ErrorCode.DataError, "No MSO ASDC Clients Properties found");
+            return null;
+        }
+    }
+    
+    public synchronized static final boolean getNoPropertiesState() {
+    	return noProperties;
+    }
+}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/DistributionStatus.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/DistributionStatus.java
new file mode 100644
index 0000000..4d04bfa
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/DistributionStatus.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.tenantIsolation;

+

+public enum DistributionStatus {

+

+	SUCCESS,

+	FAILURE,

+	TIMEOUT,

+	INCOMPLETE

+}

diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/WatchdogDistribution.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/WatchdogDistribution.java
new file mode 100644
index 0000000..6efcd64
--- /dev/null
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/tenantIsolation/WatchdogDistribution.java
@@ -0,0 +1,239 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.asdc.tenantIsolation;

+

+import java.util.ArrayList;

+import java.util.HashMap;

+import java.util.Iterator;

+import java.util.List;

+import java.util.Map;

+

+import org.openecomp.mso.asdc.client.ASDCConfiguration;

+import org.openecomp.mso.client.aai.AAIObjectType;

+import org.openecomp.mso.client.aai.AAIResourcesClient;

+import org.openecomp.mso.client.aai.entities.uri.AAIResourceUri;

+import org.openecomp.mso.client.aai.entities.uri.AAIUriFactory;

+import org.openecomp.mso.client.aai.entities.uri.Depth;

+import org.openecomp.mso.db.catalog.CatalogDatabase;

+import org.openecomp.mso.db.catalog.beans.Service;

+import org.openecomp.mso.logger.MsoLogger;

+import org.openecomp.mso.properties.MsoJsonProperties;

+import org.openecomp.mso.properties.MsoPropertiesException;

+import org.openecomp.mso.properties.MsoPropertiesFactory;

+import org.openecomp.mso.requestsdb.WatchdogComponentDistributionStatus;

+import org.openecomp.mso.requestsdb.WatchdogComponentDistributionStatusDb;

+import org.openecomp.mso.requestsdb.WatchdogDistributionStatusDb;

+import org.openecomp.mso.requestsdb.WatchdogServiceModVerIdLookupDb;

+

+import com.fasterxml.jackson.databind.JsonNode;

+

+public class WatchdogDistribution {

+

+	private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.ASDC);

+	private static final String MSO_PROP_ASDC = "MSO_PROP_ASDC";

+	private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();

+	private WatchdogDistributionStatusDb watchdogDistDb;

+	private WatchdogComponentDistributionStatusDb watchdogCompDistDb;

+	private WatchdogServiceModVerIdLookupDb watchdogSerlookupDb;

+	private CatalogDatabase catalogDb;

+	private AAIResourcesClient aaiClient;

+	//protected ASDCConfiguration asdcConfig;

+	   

+	public String getOverallDistributionStatus(String distributionId) throws MsoPropertiesException, Exception {

+		LOGGER.debug("Entered getOverallDistributionStatus method for distrubutionId: " + distributionId);

+		

+		String status = null;

+		try { 

+			String distributionStatus = getWatchdogDistDb().getWatchdogDistributionIdStatus(distributionId);

+			

+			if(DistributionStatus.TIMEOUT.name().equalsIgnoreCase(distributionStatus)) {

+				LOGGER.debug("Ignoring to update WatchdogDistributionStatus as distributionId: " + distributionId + " status is set to: " + distributionStatus);

+				return DistributionStatus.TIMEOUT.name();

+			} else {

+				List<WatchdogComponentDistributionStatus> results = getWatchdogCompDistDb().getWatchdogComponentDistributionStatus(distributionId);

+				LOGGER.debug("Executed RequestDB getWatchdogComponentDistributionStatus for distrubutionId: " + distributionId);

+		

+				MsoJsonProperties properties = msoPropertiesFactory.getMsoJsonProperties(MSO_PROP_ASDC);

+				

+				//*************************************************************************************************************************************************

+				//**** Compare config values verse DB watchdog component names to see if every component has reported status before returning final result back to ASDC

+				//**************************************************************************************************************************************************

+				

+				//List<String> configNames = asdcConfig.getComponentNames();

+				

+				List<String> dbNames = watchdogCompDistDb.getWatchdogComponentNames(distributionId);

+				

+				boolean allComponentsComplete = true;

+							

+				JsonNode masterConfigNode = properties.getJsonRootNode().get("componentNames");

+				

+		        if (masterConfigNode != null) { 

+		            

+		            Iterator<JsonNode> config = masterConfigNode.elements();

+		      

+		            while( config.hasNext() ) {

+		                String name = (String)config.next().asText();	                

+		                

+		                boolean match = false;

+		                

+						for(String dbName: dbNames){

+							

+							if(name.equals(dbName)){

+								LOGGER.debug("Found componentName " + name + " in the WatchDog Component DB");

+								match = true;

+								break;

+							}

+						}

+						

+						if(match==false){

+							LOGGER.debug(name + " has not be updated in the the WatchDog Component DB yet, so ending the loop");

+							allComponentsComplete = false;

+							break;

+						}

+

+		            }

+

+		        } 

+				

+				if(allComponentsComplete) {

+				//if(node.asInt() == results.size()) {

+					LOGGER.debug("Components Size matched with the WatchdogComponentDistributionStatus results.");

+					

+					 for(WatchdogComponentDistributionStatus componentDist : results) {

+						 String componentDistributionStatus = componentDist.getComponentDistributionStatus();

+						 LOGGER.debug("Component status: " + componentDistributionStatus + " on componentName: " + componentDist.getComponentName());

+						 if(componentDistributionStatus.equalsIgnoreCase("COMPONENT_DONE_ERROR")) {

+							 status = DistributionStatus.FAILURE.name();

+							 break;

+						 } else if(componentDistributionStatus.equalsIgnoreCase("COMPONENT_DONE_OK")) {

+							 status = DistributionStatus.SUCCESS.name();

+						 } else {

+							 throw new Exception("Invalid Component distribution status: " + componentDistributionStatus);

+						 }

+					 }

+					 

+					 LOGGER.debug("Updating overall DistributionStatus to: " + status + " for distributionId: " + distributionId);

+					 getWatchdogDistDb().updateWatchdogDistributionIdStatus(distributionId, status);

+				} else {

+					LOGGER.debug("Components Size Didn't match with the WatchdogComponentDistributionStatus results.");

+					status = DistributionStatus.INCOMPLETE.name();

+					return status;

+				}

+			}

+		} catch (MsoPropertiesException e) {

+			String error = "Error occurred when trying to load MSOJson Properties.";

+			LOGGER.debug(error);

+			throw new MsoPropertiesException(e.getMessage());

+		} catch (Exception e) {

+			LOGGER.debug("Exception occurred on getOverallDistributionStatus : " + e.getMessage());

+			throw new Exception(e);

+		}

+		

+		LOGGER.debug("Exciting getOverallDistributionStatus method in WatchdogDistribution");

+		return status;

+	}

+	

+	public void executePatchAAI(String distributionId, String serviceModelInvariantUUID, String distributionStatus) throws Exception {

+		LOGGER.debug("Entered executePatchAAI method with distrubutionId: " + distributionId + " and distributionStatus: " + distributionStatus);

+		

+		try { 

+			String serviceModelVersionId = getWatchdogSerlookupDb().getWatchdogServiceModVerId(distributionId);

+			LOGGER.debug("Executed RequestDB getWatchdogServiceModVerIdLookup with distributionId: " + distributionId + " and serviceModelVersionId: " + serviceModelVersionId);

+			

+			LOGGER.debug("ASDC Notification ServiceModelInvariantUUID : " + serviceModelInvariantUUID);

+			

+			if(serviceModelInvariantUUID == null) {

+				String error = "No Service found with serviceModelInvariantUUID: " + serviceModelInvariantUUID;

+				LOGGER.debug(error);

+				throw new Exception(error);

+			}

+			

+			AAIResourceUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.MODEL_VER, serviceModelInvariantUUID, serviceModelVersionId);

+			aaiUri.depth(Depth.ZERO); //Do not return relationships if any

+			LOGGER.debug("Target A&AI Resource URI: " + aaiUri.build().toString());

+			

+			Map<String, String> payload = new HashMap<>();

+			payload.put("distribution-status", distributionStatus);

+			getAaiClient().update(aaiUri, payload);

+			

+			LOGGER.debug("A&AI UPDATE MODEL Version is success!");

+		} catch (Exception e) {

+			LOGGER.debug("Exception occurred on executePatchAAI : " + e.getMessage());

+			throw new Exception(e);

+		}

+	}

+	

+	public WatchdogDistributionStatusDb getWatchdogDistDb() {

+		if(watchdogDistDb == null) {

+			watchdogDistDb =  WatchdogDistributionStatusDb.getInstance();

+		}

+		return watchdogDistDb;

+	}

+

+	public void setWatchdogDistDb(WatchdogDistributionStatusDb watchdogDistDb) {

+		this.watchdogDistDb = watchdogDistDb;

+	}

+

+	public WatchdogComponentDistributionStatusDb getWatchdogCompDistDb() {

+		if(watchdogCompDistDb == null) {

+			watchdogCompDistDb =  WatchdogComponentDistributionStatusDb.getInstance();

+		}

+		return watchdogCompDistDb;

+	}

+

+	public void setWatchdogCompDistDb(WatchdogComponentDistributionStatusDb watchdogCompDistDb) {

+		this.watchdogCompDistDb = watchdogCompDistDb;

+	}

+

+	public WatchdogServiceModVerIdLookupDb getWatchdogSerlookupDb() {

+		if(watchdogSerlookupDb == null) {

+			watchdogSerlookupDb =  WatchdogServiceModVerIdLookupDb.getInstance();

+		}

+		return watchdogSerlookupDb;

+	}

+

+	public void setWatchdogSerlookupDb(WatchdogServiceModVerIdLookupDb watchdogSerlookupDb) {

+		this.watchdogSerlookupDb = watchdogSerlookupDb;

+	}

+

+	public CatalogDatabase getCatalogDb() {

+		if(catalogDb == null) {

+			catalogDb = CatalogDatabase.getInstance();

+		}

+		return catalogDb;

+	}

+

+	public void setCatalogDb(CatalogDatabase catalogDb) {

+		this.catalogDb = catalogDb;

+	}

+

+	public AAIResourcesClient getAaiClient() {

+		if(aaiClient == null) {

+			aaiClient = new AAIResourcesClient();

+		}

+		return aaiClient;

+	}

+

+	public void setAaiClient(AAIResourcesClient aaiClient) {

+		this.aaiClient = aaiClient;

+	}

+	

+}

diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/util/ASDCNotificationLogging.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/util/ASDCNotificationLogging.java
index 396784a..dcac3db 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/util/ASDCNotificationLogging.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/util/ASDCNotificationLogging.java
@@ -84,6 +84,18 @@
 		buffer.append(System.lineSeparator());
 		buffer.append("Model InvariantUuid:");
 		buffer.append(testNull(csarHelper.getServiceMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
+		buffer.append(System.lineSeparator());
+		buffer.append("Service Type:");
+		buffer.append(csarHelper.getServiceMetadata().getValue("serviceType"));
+		buffer.append(System.lineSeparator());
+		buffer.append("Service Role:");
+		buffer.append(csarHelper.getServiceMetadata().getValue("serviceRole"));
+		buffer.append(System.lineSeparator());
+		buffer.append("WorkLoad Context:");
+		buffer.append(asdcNotification.getWorkloadContext());
+		buffer.append(System.lineSeparator());
+		buffer.append("Environment Context:");
+		buffer.append(csarHelper.getServiceMetadata().getValue("environmentContext"));
 		
 		buffer.append(System.lineSeparator());
 		buffer.append(System.lineSeparator());
@@ -94,25 +106,25 @@
         for (NodeTemplate vfNodeTemplate :  vfNodeTemplatesList) {
         	
     		buffer.append("Model Name:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));
+    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
     		buffer.append(System.lineSeparator());
        		buffer.append("Description:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION).trim()));
+    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
     		buffer.append(System.lineSeparator());
        		buffer.append("Version:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION).trim()));
+    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
     		buffer.append(System.lineSeparator());
       		buffer.append("Type:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE).trim()));
+    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)));
     		buffer.append(System.lineSeparator());
       		buffer.append("InvariantUuid:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID).trim()));
+    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
     		buffer.append(System.lineSeparator());
       		buffer.append("Max Instances:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES).trim()));
+    		buffer.append(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES));
     		buffer.append(System.lineSeparator());
       		buffer.append("Min Instances:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES).trim()));
+    		buffer.append(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES));
     		buffer.append(System.lineSeparator());
     		
     		buffer.append(System.lineSeparator());
@@ -120,44 +132,46 @@
     		buffer.append(System.lineSeparator());
     		
       		buffer.append("Customization UUID:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));
+    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
     		buffer.append(System.lineSeparator());
       		buffer.append("NFFunction:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NFFUNCTION).trim()));
+      		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION));
     		buffer.append(System.lineSeparator());
       		buffer.append("NFCode:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NFCODE).trim()));
+      		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, "nf_naming_code"));
     		buffer.append(System.lineSeparator());
       		buffer.append("NFRole:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NFROLE).trim()));
+      		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE));
     		buffer.append(System.lineSeparator());
       		buffer.append("NFType:");
-    		buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NFTYPE).trim()));
-    		buffer.append(System.lineSeparator());      
+      		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE));
+    		buffer.append(System.lineSeparator());
+    		buffer.append("MultiStageDesign:");
+     		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfNodeTemplate, "multi_stage_design"));
     		
     		buffer.append(System.lineSeparator());
     		buffer.append("VF Module Properties:");
     		buffer.append(System.lineSeparator());
-    		List<Group> vfGroups = toscaResourceStructure.getSdcCsarHelper().getVfModulesByVf(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));
+    		List<Group> vfGroups = toscaResourceStructure.getSdcCsarHelper().getVfModulesByVf(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
     		
     		for(Group group : vfGroups){
         		
     			Metadata vfMetadata = group.getMetadata();
     			
           		buffer.append("ModelInvariantUuid:");
-        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID).trim()));
+        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID)));
         		buffer.append(System.lineSeparator());
          		buffer.append("ModelName:");
-        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELNAME).trim()));
+        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELNAME)));
         		buffer.append(System.lineSeparator()); 
          		buffer.append("ModelUuid:");
-        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID).trim()));
+        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID)));
         		buffer.append(System.lineSeparator());
          		buffer.append("ModelVersion:");
-        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELVERSION).trim()));
+        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELVERSION)));
         		buffer.append(System.lineSeparator()); 
          		buffer.append("Description:");
-        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_DESCRIPTION).trim()));
+        		buffer.append(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
         		buffer.append(System.lineSeparator());     
     		}
   
@@ -175,28 +189,28 @@
     		for(NodeTemplate vlNode : nodeTemplatesVLList){
 			
     			buffer.append("Model Name:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
     			buffer.append(System.lineSeparator()); 
     			buffer.append("Model InvariantUuid:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
     			buffer.append(System.lineSeparator());   
     			buffer.append("Model UUID:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
     			buffer.append(System.lineSeparator()); 
     			buffer.append("Model Version:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
     			buffer.append(System.lineSeparator());   
     			buffer.append("AIC Max Version:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));
     			buffer.append(System.lineSeparator()); 
        			buffer.append("AIC Min Version:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));
     			buffer.append(System.lineSeparator());  
        			buffer.append("Tosca Node Type:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)));
     			buffer.append(System.lineSeparator());  
        			buffer.append("Description:");
-    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION).trim()));
+    			buffer.append(testNull(vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
     			buffer.append(System.lineSeparator());  
     		
     		}
@@ -214,28 +228,46 @@
     			for(NodeTemplate allottedNode : allottedResourceList){
     				
            			buffer.append("Model Name:");
-        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));
+        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
         			buffer.append(System.lineSeparator());
            			buffer.append("Model Name:");
-        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME).trim()));
+        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
         			buffer.append(System.lineSeparator()); 
            			buffer.append("Model InvariantUuid:");
-        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID).trim()));
+        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
         			buffer.append(System.lineSeparator());  
            			buffer.append("Model Version:");
-        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION).trim()));
+        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
         			buffer.append(System.lineSeparator()); 
            			buffer.append("Model UUID:");
-        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID).trim()));
+        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
         			buffer.append(System.lineSeparator());
+        			buffer.append("Model Subcategory:");
+        			buffer.append(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY));
+					buffer.append(System.lineSeparator());
+					buffer.append("Model Description:");
+					buffer.append(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+					buffer.append(System.lineSeparator());
         			
     				
         			buffer.append("Allotted Resource Customization Properties:");
         			buffer.append(System.lineSeparator());
         		
            			buffer.append("Model Cutomization UUID:");
-        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).trim()));
-        			buffer.append(System.lineSeparator());
+        			buffer.append(testNull(allottedNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
+            		buffer.append(System.lineSeparator());
+              		buffer.append("NFFunction:");
+              		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(allottedNode, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION));
+            		buffer.append(System.lineSeparator());
+              		buffer.append("NFCode:");
+              		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(allottedNode, "nf_naming_code"));
+            		buffer.append(System.lineSeparator());
+              		buffer.append("NFRole:");
+              		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(allottedNode, SdcPropertyNames.PROPERTY_NAME_NFROLE));
+            		buffer.append(System.lineSeparator());
+              		buffer.append("NFType:");
+              		buffer.append(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(allottedNode, SdcPropertyNames.PROPERTY_NAME_NFTYPE));
+            		buffer.append(System.lineSeparator());      
     				
 				
     			}
diff --git a/asdc-controller/src/main/resources/META-INF/services/org.openecomp.mso.client.RestProperties b/asdc-controller/src/main/resources/META-INF/services/org.openecomp.mso.client.RestProperties
new file mode 100644
index 0000000..3745ddd
--- /dev/null
+++ b/asdc-controller/src/main/resources/META-INF/services/org.openecomp.mso.client.RestProperties
@@ -0,0 +1 @@
+org.openecomp.mso.asdc.tenantIsolation.AaiClientPropertiesImpl
\ No newline at end of file
diff --git a/asdc-controller/src/main/resources/resource-examples/notif-structure.json b/asdc-controller/src/main/resources/resource-examples/notif-structure.json
index 103a799..16c46a5 100644
--- a/asdc-controller/src/main/resources/resource-examples/notif-structure.json
+++ b/asdc-controller/src/main/resources/resource-examples/notif-structure.json
@@ -5,9 +5,9 @@
     "serviceVersion": "2.0",
     "serviceArtifacts": 
     [{
-		"artifactName": "service_Rg516VmmscSrvc_csar.csar",
+		"artifactName": "service_PortMirroringContainer_csar.csar",
 		"artifactType": "TOSCA_CSAR",
-		"artifactURL": "service_Rg516VmmscSrvc_csar.csar",
+		"artifactURL": "service_PortMirroringContainer_csar.csar",
 		"artifactChecksum": "ZDc1MTcxMzk4ODk4N2U5MzMxOTgwMzYzZTI0MTg5Y2U\u003d",
 		"artifactDescription": "TOSCA representation of the asset",
 		"artifactTimeout": 0,
diff --git a/asdc-controller/src/main/resources/resource-examples/service-ArielInputmapService01-csar.csar b/asdc-controller/src/main/resources/resource-examples/service-ArielInputmapService01-csar.csar
new file mode 100644
index 0000000..7bca1c3
--- /dev/null
+++ b/asdc-controller/src/main/resources/resource-examples/service-ArielInputmapService01-csar.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/service-MdnsPreload17100914-csar.csar b/asdc-controller/src/main/resources/resource-examples/service-MdnsPreload17100914-csar.csar
new file mode 100644
index 0000000..31fff49
--- /dev/null
+++ b/asdc-controller/src/main/resources/resource-examples/service-MdnsPreload17100914-csar.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/service-MultiStage-csar.csar b/asdc-controller/src/main/resources/resource-examples/service-MultiStage-csar.csar
new file mode 100644
index 0000000..7e5fcb3
--- /dev/null
+++ b/asdc-controller/src/main/resources/resource-examples/service-MultiStage-csar.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/service-Tenantisolationservice-csar.csar b/asdc-controller/src/main/resources/resource-examples/service-Tenantisolationservice-csar.csar
new file mode 100644
index 0000000..19f872c
--- /dev/null
+++ b/asdc-controller/src/main/resources/resource-examples/service-Tenantisolationservice-csar.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/service_PortMirroringContainer_csar.csar b/asdc-controller/src/main/resources/resource-examples/service_PortMirroringContainer_csar.csar
new file mode 100644
index 0000000..5d77197
--- /dev/null
+++ b/asdc-controller/src/main/resources/resource-examples/service_PortMirroringContainer_csar.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/service_Rg511NfmService.csar b/asdc-controller/src/main/resources/resource-examples/service_Rg511NfmService.csar
index a383359..2686e4b 100644
--- a/asdc-controller/src/main/resources/resource-examples/service_Rg511NfmService.csar
+++ b/asdc-controller/src/main/resources/resource-examples/service_Rg511NfmService.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/service_Rg516VmmscSrvc_csar.csar b/asdc-controller/src/main/resources/resource-examples/service_Rg516VmmscSrvc_csar.csar
index edbd8d8..d2983ce 100644
--- a/asdc-controller/src/main/resources/resource-examples/service_Rg516VmmscSrvc_csar.csar
+++ b/asdc-controller/src/main/resources/resource-examples/service_Rg516VmmscSrvc_csar.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/status-structure.json b/asdc-controller/src/main/resources/resource-examples/status-structure.json
new file mode 100644
index 0000000..46c127d
--- /dev/null
+++ b/asdc-controller/src/main/resources/resource-examples/status-structure.json
@@ -0,0 +1,10 @@
+{ 
+
+    "distributionID":"35120a87-1f82-4276-9735-f6de5a244d65", 
+	"timestamp":"1436886906",
+	"consumerID":"mso.123456", 
+	"componentName":"ASDC",
+	"artifactURL":"/sdc/v1/catalog/services/srv1/2.0/resources/aaa/1.0/artifacts/aaa.yml",
+	"status":"DOWNLOAD_OK" 
+
+} 
\ No newline at end of file