[SDC-29] rebase continue work to align source
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / jsontitan / operations / ToscaElementLifecycleOperation.java
index be99508..1397e81 100644 (file)
@@ -1,10 +1,13 @@
 package org.openecomp.sdc.be.model.jsontitan.operations;
 
+import java.util.ArrayList;
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
 import org.apache.commons.collections.CollectionUtils;
@@ -14,7 +17,9 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+
 import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
 import org.openecomp.sdc.be.dao.jsongraph.types.EdgePropertyEnum;
@@ -24,20 +29,39 @@ import org.openecomp.sdc.be.dao.jsongraph.utils.IdBuilderUtils;
 import org.openecomp.sdc.be.dao.jsongraph.utils.JsonParserUtils;
 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
+import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GroupInstanceDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapGroupsDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
+import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.ComponentParametersView;
 import org.openecomp.sdc.be.model.DistributionStatusEnum;
+import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.LifecycleStateEnum;
 import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.jsontitan.datamodel.TopologyTemplate;
 import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement;
+import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElementTypeEnum;
+import org.openecomp.sdc.be.model.jsontitan.enums.JsonConstantKeysEnum;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
+import org.openecomp.sdc.common.api.ArtifactTypeEnum;
 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
+import org.openecomp.sdc.exception.ResponseFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,20 +70,19 @@ import fj.data.Either;
 @org.springframework.stereotype.Component("tosca-element-lifecycle-operation")
 
 /**
- * Allows to perform lifecycle operations:
- * checkin, checkout, submit for testing, start certification and certification process
- * for tosca element
+ * Allows to perform lifecycle operations: checkin, checkout, submit for testing, start certification and certification process for tosca element
  */
 public class ToscaElementLifecycleOperation extends BaseOperation {
-       
+
        private static final String FAILED_TO_GET_VERTICES = "Failed to get vertices by id {}. Status is {}. ";
        public static final String VERSION_DELIMETER = ".";
        public static final String VERSION_DELIMETER_REGEXP = "\\.";
-       
+
        private static Logger logger = LoggerFactory.getLogger(ToscaElementLifecycleOperation.class.getName());
 
        /**
-        * Performs changing a lifecycle state of tosca element from  "checked out"  or "ready for certification" to "checked in" 
+        * Performs changing a lifecycle state of tosca element from "checked out" or "ready for certification" to "checked in"
+        * 
         * @param currState
         * @param toscaElementId
         * @param modifierId
@@ -72,109 +95,115 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                Map<String, GraphVertex> vertices = null;
                ToscaElementOperation operation;
                try {
-                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes =
-                                       titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForCheckin(toscaElementId, modifierId, ownerId));
-                       if(getVerticesRes.isRight()){
+                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForCheckin(toscaElementId, modifierId, ownerId));
+                       if (getVerticesRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, FAILED_TO_GET_VERTICES, toscaElementId);
                                updateResult = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getVerticesRes.right().value()));
                        } else {
                                vertices = getVerticesRes.left().value();
                                updateResult = checkinToscaELement(currState, vertices.get(toscaElementId), vertices.get(ownerId), vertices.get(modifierId), LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
                        }
-                       if(updateResult.isLeft()) {
+                       if (updateResult.isLeft()) {
                                ComponentParametersView componentParametersView = buildComponentParametersViewAfterCheckin();
                                operation = getToscaElementOperation(vertices.get(toscaElementId).getLabel());
                                result = operation.getToscaElement(updateResult.left().value().getUniqueId(), componentParametersView);
-                               if(result.isRight()){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to get updated tosca element {}. Status is {}", toscaElementId, result.right().value());
+                               if (result.isRight()) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to get updated tosca element {}. Status is {}", toscaElementId, result.right().value());
                                }
                        } else {
                                result = Either.right(updateResult.right().value());
                        }
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during checkin of tosca element {}. {} ", toscaElementId, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during checkin of tosca element {}. {} ", toscaElementId, e.getMessage());
                }
                return result;
        }
+
        /**
         * Returns vertex presenting owner of tosca element specified by uniqueId
+        * 
         * @param toscaElement
         * @return
         */
        public Either<User, StorageOperationStatus> getToscaElementOwner(String toscaElementId) {
-               Either<User, StorageOperationStatus>  result = null;
+               Either<User, StorageOperationStatus> result = null;
                GraphVertex toscaElement = null;
                Either<GraphVertex, TitanOperationStatus> getToscaElementRes = titanDao.getVertexById(toscaElementId, JsonParseFlagEnum.NoParse);
-               if(getToscaElementRes.isRight()){
+               if (getToscaElementRes.isRight()) {
                        result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getToscaElementRes.right().value()));
                }
-               if(result == null){
+               if (result == null) {
                        toscaElement = getToscaElementRes.left().value();
                        Iterator<Vertex> vertices = toscaElement.getVertex().vertices(Direction.IN, EdgeLabelEnum.STATE.name());
-                       if(vertices == null || !vertices.hasNext()){
+                       if (vertices == null || !vertices.hasNext()) {
                                result = Either.right(StorageOperationStatus.NOT_FOUND);
                        } else {
                                result = Either.left(convertToUser(vertices.next()));
                        }
                }
-                       return result;
-               }
+               return result;
+       }
+
        /**
         * Returns vertex presenting owner of tosca element specified by uniqueId
+        * 
         * @param toscaElement
         * @return
         */
        public Either<User, StorageOperationStatus> getToscaElementOwner(GraphVertex toscaElement) {
-               Either<User, StorageOperationStatus>  result = null;
+               Either<User, StorageOperationStatus> result = null;
                Iterator<Vertex> vertices = toscaElement.getVertex().vertices(Direction.IN, EdgeLabelEnum.STATE.name());
-               if(vertices == null || !vertices.hasNext()){
+               if (vertices == null || !vertices.hasNext()) {
                        result = Either.right(StorageOperationStatus.NOT_FOUND);
                } else {
                        result = Either.left(convertToUser(vertices.next()));
                }
-                       return result;
-               }
+               return result;
+       }
 
-/**
- * Performs checkout of a tosca element
- * @param toscaElementId
- * @param modifierId
- * @param ownerId
- * @param currState
- * @return
- */
+       /**
+        * Performs checkout of a tosca element
+        * 
+        * @param toscaElementId
+        * @param modifierId
+        * @param ownerId
+        * @param currState
+        * @return
+        */
        public Either<ToscaElement, StorageOperationStatus> checkoutToscaElement(String toscaElementId, String modifierId, String ownerId) {
                Either<ToscaElement, StorageOperationStatus> result = null;
                Map<String, GraphVertex> vertices = null;
-               try{
-                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = 
-                                       titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForCheckout(toscaElementId, modifierId, ownerId));
-                       if(getVerticesRes.isRight()){
+               try {
+                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForCheckout(toscaElementId, modifierId, ownerId));
+                       if (getVerticesRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, FAILED_TO_GET_VERTICES, toscaElementId);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getVerticesRes.right().value()));
                        }
-                       if(result == null){
+                       if (result == null) {
                                vertices = getVerticesRes.left().value();
                                // update previous component if not certified
                                StorageOperationStatus status = updatePreviousVersion(vertices.get(toscaElementId), vertices.get(ownerId));
-                               if(status != StorageOperationStatus.OK){
+                               if (status != StorageOperationStatus.OK) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to update vertex with id {} . Status is {}. ", status);
                                        result = Either.right(status);
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                result = cloneToscaElementForCheckout(vertices.get(toscaElementId), vertices.get(modifierId));
                                if (result.isRight()) {
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to checkout tosca element {}. Status is {} ", toscaElementId, result.right().value());
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to checkout tosca element {}. Status is {} ", toscaElementId, result.right().value());
                                }
+
                        }
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during checkout tosca element {}. {}", toscaElementId, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during checkout tosca element {}. {}", toscaElementId, e.getMessage());
                }
                return result;
        }
+
        /**
         * Performs undo checkout for tosca element
+        * 
         * @param toscaElementId
         * @return
         */
@@ -185,44 +214,45 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                ToscaElementOperation operation;
                try {
                        getToscaElementRes = titanDao.getVertexById(toscaElementId, JsonParseFlagEnum.ParseMetadata);
-                       if(getToscaElementRes.isRight()){
+                       if (getToscaElementRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, FAILED_TO_GET_VERTICES, toscaElementId);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getToscaElementRes.right().value()));
                        }
-                       if(result == null && hasPreviousVersion(getToscaElementRes.left().value())){
+                       if (result == null && hasPreviousVersion(getToscaElementRes.left().value())) {
                                // find previous version
                                nextVersionComponentIter = getToscaElementRes.left().value().getVertex().edges(Direction.IN, EdgeLabelEnum.VERSION.name());
-                               if(nextVersionComponentIter == null || !nextVersionComponentIter.hasNext()){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to fetch previous version of tosca element with name {}. ",
-                                                       getToscaElementRes.left().value().getMetadataProperty(GraphPropertyEnum.NORMALIZED_NAME).toString());
-                                       result =  Either.right(StorageOperationStatus.NOT_FOUND);
+                               if (nextVersionComponentIter == null || !nextVersionComponentIter.hasNext()) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to fetch previous version of tosca element with name {}. ", getToscaElementRes.left().value().getMetadataProperty(GraphPropertyEnum.NORMALIZED_NAME).toString());
+                                       result = Either.right(StorageOperationStatus.NOT_FOUND);
                                }
-                               if(result == null){
+                               if (result == null) {
                                        StorageOperationStatus updateOldResourceResult = updateOldToscaElementBeforeUndoCheckout(nextVersionComponentIter.next().outVertex());
                                        if (updateOldResourceResult != StorageOperationStatus.OK) {
                                                result = Either.right(updateOldResourceResult);
                                        }
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                operation = getToscaElementOperation(getToscaElementRes.left().value().getLabel());
                                result = operation.deleteToscaElement(getToscaElementRes.left().value());
                        }
-               } catch(Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during undo checkout tosca element {}. {}", toscaElementId, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during undo checkout tosca element {}. {}", toscaElementId, e.getMessage());
                }
-                       return result;
+               return result;
        }
-       
+
        private boolean hasPreviousVersion(GraphVertex toscaElementVertex) {
                boolean hasPreviousVersion = true;
                String version = (String) toscaElementVertex.getMetadataProperty(GraphPropertyEnum.VERSION);
-               if(StringUtils.isEmpty(version) || version.equals("0.1"))
+               if (StringUtils.isEmpty(version) || version.equals("0.1"))
                        hasPreviousVersion = false;
                return hasPreviousVersion;
        }
+
        /**
         * Performs request certification for tosca element
+        * 
         * @param toscaElementId
         * @param modifierId
         * @param ownerId
@@ -235,49 +265,48 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                GraphVertex modifier = null;
                GraphVertex owner;
                try {
-                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = 
-                                       titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
-                       if(getVerticesRes.isRight()){
+                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
+                       if (getVerticesRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, FAILED_TO_GET_VERTICES, toscaElementId);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getVerticesRes.right().value()));
                        }
-                       if(result == null){
+                       if (result == null) {
                                toscaElement = getVerticesRes.left().value().get(toscaElementId);
                                modifier = getVerticesRes.left().value().get(modifierId);
                                owner = getVerticesRes.left().value().get(ownerId);
-                               
+
                                StorageOperationStatus status = handleRelationsUponRequestForCertification(toscaElement, modifier, owner);
-                               if(status != StorageOperationStatus.OK){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to handle relations on certification request for tosca element {}. Status is {}. ",
-                                                       toscaElement.getUniqueId(), status);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to handle relations on certification request for tosca element {}. Status is {}. ", toscaElement.getUniqueId(), status);
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                LifecycleStateEnum nextState = LifecycleStateEnum.READY_FOR_CERTIFICATION;
-                               
+
                                toscaElement.addMetadataProperty(GraphPropertyEnum.STATE, nextState.name());
                                toscaElement.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
-                               
+
                                resultUpdate = updateToscaElementVertexMetadataPropertiesAndJson(toscaElement);
                                if (resultUpdate.isRight()) {
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to set lifecycle for tosca elememt {} to state {}, error: {}", toscaElement.getUniqueId(), nextState, resultUpdate.right().value());
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to set lifecycle for tosca elememt {} to state {}, error: {}", toscaElement.getUniqueId(), nextState, resultUpdate.right().value());
                                        result = Either.right(resultUpdate.right().value());
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                ToscaElementOperation operation = getToscaElementOperation(toscaElement.getLabel());
                                result = operation.getToscaElement(toscaElement.getUniqueId());
                        }
                        return result;
 
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during request certification tosca element {}. {}", toscaElementId, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during request certification tosca element {}. {}", toscaElementId, e.getMessage());
                }
                return result;
        }
-       
+
        /**
         * Starts certification of tosca element
+        * 
         * @param toscaElementId
         * @param modifierId
         * @param ownerId
@@ -290,45 +319,43 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                GraphVertex modifier = null;
                GraphVertex owner;
                try {
-                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = 
-                                       titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
-                       if(getVerticesRes.isRight()){
+                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
+                       if (getVerticesRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, FAILED_TO_GET_VERTICES, toscaElementId);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getVerticesRes.right().value()));
                        }
-                       if(result == null){
+                       if (result == null) {
                                toscaElement = getVerticesRes.left().value().get(toscaElementId);
                                modifier = getVerticesRes.left().value().get(modifierId);
                                owner = getVerticesRes.left().value().get(ownerId);
-                               
+
                                StorageOperationStatus status = handleRelationsUponCertification(toscaElement, modifier, owner);
-                               if(status != StorageOperationStatus.OK){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to handle relations during certification of tosca element {}. Status is {}. ",
-                                                       toscaElement.getUniqueId(), status);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to handle relations during certification of tosca element {}. Status is {}. ", toscaElement.getUniqueId(), status);
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                LifecycleStateEnum nextState = LifecycleStateEnum.CERTIFICATION_IN_PROGRESS;
-                               
+
                                toscaElement.addMetadataProperty(GraphPropertyEnum.STATE, nextState.name());
                                toscaElement.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
-                               
+
                                resultUpdate = updateToscaElementVertexMetadataPropertiesAndJson(toscaElement);
                                if (resultUpdate.isRight()) {
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Couldn't set lifecycle for component {} to state {}, error: {}", toscaElement.getUniqueId(), nextState, resultUpdate.right().value());
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Couldn't set lifecycle for component {} to state {}, error: {}", toscaElement.getUniqueId(), nextState, resultUpdate.right().value());
                                        result = Either.right(resultUpdate.right().value());
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                ToscaElementOperation operation = getToscaElementOperation(toscaElement.getLabel());
                                result = operation.getToscaElement(toscaElement.getUniqueId());
                        }
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during start certification tosca element {}. {}", toscaElementId, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during start certification tosca element {}. {}", toscaElementId, e.getMessage());
                }
                return result;
        }
-       
+
        public Either<ToscaElement, StorageOperationStatus> certifyToscaElement(String toscaElementId, String modifierId, String ownerId) {
                Either<ToscaElement, StorageOperationStatus> result = null;
                Either<GraphVertex, StorageOperationStatus> cloneRes = null;
@@ -339,53 +366,52 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
 
                StorageOperationStatus status;
                try {
-                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = 
-                                       titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
-                       if(getVerticesRes.isRight()){
+                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
+                       if (getVerticesRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, FAILED_TO_GET_VERTICES, toscaElementId);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getVerticesRes.right().value()));
                        }
-                       if(result == null){
+                       if (result == null) {
                                toscaElement = getVerticesRes.left().value().get(toscaElementId);
                                modifier = getVerticesRes.left().value().get(modifierId);
                                majorVersion = getMajorVersion((String) toscaElement.getMetadataProperty(GraphPropertyEnum.VERSION));
                                status = handleRelationsOfPreviousToscaElementBeforeCertifying(toscaElement, modifier, majorVersion);
-                               if(status != StorageOperationStatus.OK){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to handle relations of previous tosca element before certifying {}. Status is {}. ",
-                                                       toscaElement.getUniqueId(), status);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to handle relations of previous tosca element before certifying {}. Status is {}. ", toscaElement.getUniqueId(), status);
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                cloneRes = cloneToscaElementForCertify(toscaElement, modifier, majorVersion);
                                if (cloneRes.isRight()) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to clone tosca element during certification. ");
                                        result = Either.right(cloneRes.right().value());
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                certifiedToscaElement = cloneRes.left().value();
                                status = handleRelationsOfNewestCertifiedToscaElement(toscaElement, certifiedToscaElement);
-                               if(status != StorageOperationStatus.OK){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to handle relations of newest certified tosca element {}. Status is {}. ",
-                                                       certifiedToscaElement.getUniqueId(), status);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to handle relations of newest certified tosca element {}. Status is {}. ", certifiedToscaElement.getUniqueId(), status);
                                }
                        }
-                       if(result == null){
-                               return  getToscaElementOperation(toscaElement.getLabel()).getToscaElement(certifiedToscaElement.getUniqueId());
+                       if (result == null) {
+                               return getToscaElementOperation(toscaElement.getLabel()).getToscaElement(certifiedToscaElement.getUniqueId());
                        }
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during certification tosca element {}. {}", toscaElementId, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during certification tosca element {}. {}", toscaElementId, e.getMessage());
                }
                return result;
        }
-/**
- * Deletes (marks as deleted) all tosca elements according received name and uuid
- * @param vertexType
- * @param componentType
- * @param componentName
- * @param uuid
- * @return
- */
+
+       /**
+        * Deletes (marks as deleted) all tosca elements according received name and uuid
+        * 
+        * @param vertexType
+        * @param componentType
+        * @param componentName
+        * @param uuid
+        * @return
+        */
        public Either<Boolean, StorageOperationStatus> deleteOldToscaElementVersions(VertexTypeEnum vertexType, ComponentTypeEnum componentType, String componentName, String uuid) {
 
                Either<Boolean, StorageOperationStatus> result = null;
@@ -395,29 +421,31 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                        Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
                        properties.put(GraphPropertyEnum.UUID, uuid);
                        properties.put(GraphPropertyEnum.NAME, componentName);
-                       Either<List<GraphVertex>, TitanOperationStatus> getToscaElementsRes= titanDao.getByCriteria(vertexType, properties, JsonParseFlagEnum.ParseMetadata);
+                       Either<List<GraphVertex>, TitanOperationStatus> getToscaElementsRes = titanDao.getByCriteria(vertexType, properties, JsonParseFlagEnum.ParseMetadata);
                        if (getToscaElementsRes.isRight()) {
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getToscaElementsRes.right().value()));
                        }
-                       if(result == null){
+                       if (result == null) {
                                result = markToscaElementsAsDeleted(operation, getToscaElementsRes.left().value());
                        }
-                       if(result == null){
+                       if (result == null) {
                                result = Either.left(true);
                        }
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during deleteng all tosca elements by UUID {} and name {}. {} ", uuid, componentName, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during deleteng all tosca elements by UUID {} and name {}. {} ", uuid, componentName, e.getMessage());
                }
                return result;
        }
-/**
- * Performs cancelation or failure of certification for received tosca element
- * @param toscaElementId
- * @param modifierId
- * @param ownerId
- * @param nextState
- * @return
- */
+
+       /**
+        * Performs cancelation or failure of certification for received tosca element
+        * 
+        * @param toscaElementId
+        * @param modifierId
+        * @param ownerId
+        * @param nextState
+        * @return
+        */
        public Either<ToscaElement, StorageOperationStatus> cancelOrFailCertification(String toscaElementId, String modifierId, String ownerId, LifecycleStateEnum nextState) {
                Either<ToscaElement, StorageOperationStatus> result = null;
                StorageOperationStatus status;
@@ -425,60 +453,56 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                GraphVertex toscaElement = null;
                GraphVertex modifier = null;
                try {
-                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = 
-                                       titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
-                       if(getVerticesRes.isRight()){
+                       Either<Map<String, GraphVertex>, TitanOperationStatus> getVerticesRes = titanDao.getVerticesByUniqueIdAndParseFlag(prepareParametersToGetVerticesForRequestCertification(toscaElementId, modifierId, ownerId));
+                       if (getVerticesRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, FAILED_TO_GET_VERTICES, toscaElementId);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getVerticesRes.right().value()));
                        }
-                       if(result == null){
+                       if (result == null) {
                                toscaElement = getVerticesRes.left().value().get(toscaElementId);
                                modifier = getVerticesRes.left().value().get(modifierId);
                                operation = getToscaElementOperation(toscaElement.getLabel());
                                toscaElement.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
                                toscaElement.setJsonMetadataField(JsonPresentationFields.USER_ID_LAST_UPDATER, modifier.getUniqueId());
                                toscaElement.addMetadataProperty(GraphPropertyEnum.STATE, nextState.name());
-                               
+
                                Either<GraphVertex, TitanOperationStatus> updateVertexRes = titanDao.updateVertex(toscaElement);
-                               if(updateVertexRes.isRight()){
+                               if (updateVertexRes.isRight()) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to update vertex {} . Status is {}. ", toscaElementId, updateVertexRes.right().value());
                                        result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(updateVertexRes.right().value()));
                                }
                        }
-                       if(result == null){
-                       // cancel certification process
+                       if (result == null) {
+                               // cancel certification process
                                status = handleRelationsUponCancelCertification(toscaElement, nextState);
-                               if(status != StorageOperationStatus.OK){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to handle relations upon cancel certification {}. Status is {}. ",
-                                                       toscaElement.getUniqueId(), status);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to handle relations upon cancel certification {}. Status is {}. ", toscaElement.getUniqueId(), status);
                                }
                        }
-                       if(result == null){
-                       // fail certification   
+                       if (result == null) {
+                               // fail certification
                                status = handleRelationsUponFailCertification(toscaElement, nextState);
-                               if(status != StorageOperationStatus.OK){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to handle relations upon fail certification {}. Status is {}. ",
-                                                       toscaElement.getUniqueId(), status);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to handle relations upon fail certification {}. Status is {}. ", toscaElement.getUniqueId(), status);
                                }
-                       } 
+                       }
                        if (result == null) {
                                result = operation.getToscaElement(toscaElementId);
                        }
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during cancel or fail certification of tosca element {}. {}. ",
-                                       toscaElementId, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during cancel or fail certification of tosca element {}. {}. ", toscaElementId, e.getMessage());
                }
                return result;
        }
-       
+
        public Either<GraphVertex, TitanOperationStatus> findUser(String userId) {
                return findUserVertex(userId);
        }
-       
-       private Either<Boolean, StorageOperationStatus> markToscaElementsAsDeleted(ToscaElementOperation operation,     List<GraphVertex> toscaElements) {
+
+       private Either<Boolean, StorageOperationStatus> markToscaElementsAsDeleted(ToscaElementOperation operation, List<GraphVertex> toscaElements) {
                Either<Boolean, StorageOperationStatus> result = Either.left(true);
                for (GraphVertex resourceToDelete : toscaElements) {
-                       if(!((String)resourceToDelete.getJsonMetadataField(JsonPresentationFields.LIFECYCLE_STATE)).equals(LifecycleStateEnum.CERTIFIED.name())){
+                       if (!((String) resourceToDelete.getJsonMetadataField(JsonPresentationFields.LIFECYCLE_STATE)).equals(LifecycleStateEnum.CERTIFIED.name())) {
                                Either<GraphVertex, StorageOperationStatus> deleteElementRes = operation.markComponentToDelete(resourceToDelete);
                                if (deleteElementRes.isRight()) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete tosca element {}. Status is {}. ", resourceToDelete.getUniqueId(), deleteElementRes.right().value());
@@ -489,7 +513,6 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                }
                return result;
        }
-               
 
        private StorageOperationStatus handleRelationsOfNewestCertifiedToscaElement(GraphVertex toscaElement, GraphVertex certifiedToscaElement) {
                StorageOperationStatus result = null;
@@ -498,46 +521,53 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                // add rfc relation to preserve follower information
                // get user of certification request
                certReqUserEdgeIter = toscaElement.getVertex().edges(Direction.IN, GraphEdgeLabels.LAST_STATE.name());
-               if(certReqUserEdgeIter == null || !certReqUserEdgeIter.hasNext()){
+               if (certReqUserEdgeIter == null || !certReqUserEdgeIter.hasNext()) {
                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to find rfc relation during certification clone. ");
                        result = StorageOperationStatus.NOT_FOUND;
                }
+               if (result == null) {
+                       TitanOperationStatus createVersionEdgeStatus = titanDao.createEdge(toscaElement, certifiedToscaElement, EdgeLabelEnum.VERSION, new HashMap<>());
+                       if (createVersionEdgeStatus != TitanOperationStatus.OK) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create version edge from last element {} to new certified element {}. status=", toscaElement.getUniqueId(),certifiedToscaElement.getUniqueId(), createVersionEdgeStatus);
+                               result = DaoStatusConverter.convertTitanStatusToStorageStatus(createVersionEdgeStatus);
+                       }
+               }
                if(result == null){
-                       
-                       while(certReqUserEdgeIter.hasNext()){
+
+                       while (certReqUserEdgeIter.hasNext()) {
                                Edge edge = certReqUserEdgeIter.next();
-                               if(((String)titanDao.getProperty(edge, EdgePropertyEnum.STATE)).equals(LifecycleStateEnum.READY_FOR_CERTIFICATION.name()) ){
+                               if (((String) titanDao.getProperty(edge, EdgePropertyEnum.STATE)).equals(LifecycleStateEnum.READY_FOR_CERTIFICATION.name())) {
                                        foundEdge = edge;
                                        break;
                                }
-                               
+
                        }
-                       if(foundEdge == null){
+                       if (foundEdge == null) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to find rfc relation during certification clone. ");
                                result = StorageOperationStatus.NOT_FOUND;
                        }
                }
-               if(result == null){
+               if (result == null) {
                        TitanOperationStatus createEdgeRes = titanDao.createEdge(foundEdge.outVertex(), certifiedToscaElement.getVertex(), EdgeLabelEnum.LAST_STATE, foundEdge);
                        if (createEdgeRes != TitanOperationStatus.OK) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create rfc relation for component {}. status=", certifiedToscaElement.getUniqueId(), createEdgeRes);
                                result = DaoStatusConverter.convertTitanStatusToStorageStatus(createEdgeRes);
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = StorageOperationStatus.OK;
                }
                return result;
        }
-       
+
        private StorageOperationStatus handleRelationsUponFailCertification(GraphVertex toscaElement, LifecycleStateEnum nextState) {
                StorageOperationStatus result = null;
                TitanOperationStatus status = null;
                Edge originEdge;
                Vertex user = null;
-               if(nextState == LifecycleStateEnum.NOT_CERTIFIED_CHECKIN){
-               // fail certification   
-               // delete relation CERTIFICATION_IN_PROGRESS
+               if (nextState == LifecycleStateEnum.NOT_CERTIFIED_CHECKIN) {
+                       // fail certification
+                       // delete relation CERTIFICATION_IN_PROGRESS
                        Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
                        properties.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFICATION_IN_PROGRESS);
 
@@ -547,29 +577,29 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete state edge. Status is {}. ", status);
                                result = StorageOperationStatus.INCONSISTENCY;
                        }
-                       if(result == null){
-                       // delete relation READY_FOR_CERTIFICATION
+                       if (result == null) {
+                               // delete relation READY_FOR_CERTIFICATION
                                properties.put(GraphPropertyEnum.STATE, LifecycleStateEnum.READY_FOR_CERTIFICATION);
                                deleteResult = titanDao.deleteBelongingEdgeByCriteria(toscaElement, EdgeLabelEnum.LAST_STATE, properties);
-                               if(deleteResult.isRight()){
+                               if (deleteResult.isRight()) {
                                        status = deleteResult.right().value();
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete last state edge. Status is {}. ", status);
                                        result = StorageOperationStatus.INCONSISTENCY;
                                }
                        }
-                       if(result == null){
-                       // delete relation NOT_CERTIFIED_CHECKIN (in order to change to STATE)
+                       if (result == null) {
+                               // delete relation NOT_CERTIFIED_CHECKIN (in order to change to STATE)
                                properties.put(GraphPropertyEnum.STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
                                deleteResult = titanDao.deleteBelongingEdgeByCriteria(toscaElement, EdgeLabelEnum.LAST_STATE, properties);
-                               if(deleteResult.isRight()){
+                               if (deleteResult.isRight()) {
                                        status = deleteResult.right().value();
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete last state edge. Status is {}. ", status);
                                        result = StorageOperationStatus.INCONSISTENCY;
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                // create new STATE relation NOT_CERTIFIED_CHECKIN
-                               originEdge =  deleteResult.left().value();
+                               originEdge = deleteResult.left().value();
                                user = originEdge.outVertex();
                                status = titanDao.createEdge(user, toscaElement.getVertex(), EdgeLabelEnum.STATE, originEdge);
                                if (status != TitanOperationStatus.OK) {
@@ -577,17 +607,17 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                                        result = StorageOperationStatus.INCONSISTENCY;
                                }
                        }
-                       if(result == null){
-                       // delete relation LAST_MODIFIER (in order to change tester to designer)
+                       if (result == null) {
+                               // delete relation LAST_MODIFIER (in order to change tester to designer)
                                deleteResult = titanDao.deleteBelongingEdgeByCriteria(toscaElement, EdgeLabelEnum.LAST_MODIFIER, new HashMap<>());
                                if (status != TitanOperationStatus.OK) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create last modifier edge. Status is {}. ", status);
                                        result = StorageOperationStatus.INCONSISTENCY;
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                // create new LAST_MODIFIER relation
-                               originEdge =  deleteResult.left().value();
+                               originEdge = deleteResult.left().value();
                                status = titanDao.createEdge(user, toscaElement.getVertex(), EdgeLabelEnum.LAST_MODIFIER, originEdge);
                                if (status != TitanOperationStatus.OK) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create last modifier edge. Status is {}. ", status);
@@ -595,7 +625,7 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                                }
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = StorageOperationStatus.OK;
                }
                return result;
@@ -604,27 +634,27 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
        private StorageOperationStatus handleRelationsUponCancelCertification(GraphVertex toscaElement, LifecycleStateEnum nextState) {
                StorageOperationStatus result = null;
                Edge originEdge;
-               if(nextState == LifecycleStateEnum.READY_FOR_CERTIFICATION){
-               // delete relation CERTIFICATION_IN_PROGRESS
+               if (nextState == LifecycleStateEnum.READY_FOR_CERTIFICATION) {
+                       // delete relation CERTIFICATION_IN_PROGRESS
                        Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
                        properties.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFICATION_IN_PROGRESS);
                        Either<Edge, TitanOperationStatus> deleteResult = titanDao.deleteBelongingEdgeByCriteria(toscaElement, EdgeLabelEnum.STATE, properties);
-                       
+
                        if (deleteResult.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete state edge. Status is  {}. ", deleteResult.right().value());
                                result = StorageOperationStatus.INCONSISTENCY;
                        }
-                       if(result == null){
+                       if (result == null) {
                                // delete relation READY_FOR_CERTIFICATION (LAST_STATE)
                                properties.put(GraphPropertyEnum.STATE, nextState);
                                deleteResult = titanDao.deleteBelongingEdgeByCriteria(toscaElement, EdgeLabelEnum.LAST_STATE, properties);
-                               
+
                                if (deleteResult.isRight()) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete last state edge. Status is {}. ", deleteResult.right().value());
                                        result = StorageOperationStatus.INCONSISTENCY;
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                // create relation READY_FOR_CERTIFICATION (STATE)
                                originEdge = deleteResult.left().value();
                                TitanOperationStatus status = titanDao.createEdge(originEdge.outVertex(), toscaElement.getVertex(), EdgeLabelEnum.STATE, originEdge);
@@ -633,43 +663,43 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                                        result = StorageOperationStatus.INCONSISTENCY;
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                result = StorageOperationStatus.OK;
                        }
                }
                return result;
        }
 
-       private StorageOperationStatus handleRelationsOfPreviousToscaElementBeforeCertifying(GraphVertex toscaElement,  GraphVertex modifier, Integer majorVersion) {
+       private StorageOperationStatus handleRelationsOfPreviousToscaElementBeforeCertifying(GraphVertex toscaElement, GraphVertex modifier, Integer majorVersion) {
                StorageOperationStatus result = null;
                if (majorVersion > 0) {
                        Either<Vertex, StorageOperationStatus> findRes = findLastCertifiedToscaElementVertex(toscaElement);
-                       if(findRes.isRight()){
+                       if (findRes.isRight()) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to fetch last certified tosca element {} . Status is {}. ", toscaElement.getMetadataProperty(GraphPropertyEnum.NAME), findRes.right().value());
                                result = findRes.right().value();
                        }
-                       if(result == null){
+                       if (result == null) {
                                Vertex lastCertifiedVertex = findRes.left().value();
                                Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
                                properties.put(GraphPropertyEnum.IS_HIGHEST_VERSION, false);
                                TitanOperationStatus status = titanDao.updateVertexMetadataPropertiesWithJson(lastCertifiedVertex, properties);
                                if (status != TitanOperationStatus.OK) {
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to set highest version  of tosca element {} to [{}]. Status is {}", toscaElement.getUniqueId(), false, status);
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to set highest version  of tosca element {} to [{}]. Status is {}", toscaElement.getUniqueId(), false, status);
                                        result = DaoStatusConverter.convertTitanStatusToStorageStatus(status);
                                }
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = StorageOperationStatus.OK;
                }
                return result;
        }
-       
+
        private StorageOperationStatus handleRelationsUponRequestForCertification(GraphVertex toscaElement, GraphVertex modifier, GraphVertex owner) {
                TitanOperationStatus status;
                StorageOperationStatus result = null;
-                       
-               if (((String)toscaElement.getMetadataProperty(GraphPropertyEnum.STATE)).equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+
+               if (((String) toscaElement.getMetadataProperty(GraphPropertyEnum.STATE)).equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
                        // remove CHECKOUT relation
                        Either<Edge, TitanOperationStatus> deleteRes = titanDao.deleteEdge(owner, toscaElement, EdgeLabelEnum.STATE);
                        if (deleteRes.isRight()) {
@@ -677,7 +707,7 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete edge. Status is {}. ", status);
                                result = DaoStatusConverter.convertTitanStatusToStorageStatus(status);
                        }
-                       if(result == null){
+                       if (result == null) {
                                // create CHECKIN relation
                                Map<EdgePropertyEnum, Object> properties = new EnumMap<>(EdgePropertyEnum.class);
                                properties.put(EdgePropertyEnum.STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKIN);
@@ -693,54 +723,54 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                                result = DaoStatusConverter.convertTitanStatusToStorageStatus(status);
                        }
                }
-               if(result == null){
+               if (result == null) {
                        // create RFC relation
                        Map<EdgePropertyEnum, Object> properties = new EnumMap<>(EdgePropertyEnum.class);
                        properties.put(EdgePropertyEnum.STATE, LifecycleStateEnum.READY_FOR_CERTIFICATION);
                        status = titanDao.createEdge(modifier.getVertex(), toscaElement.getVertex(), EdgeLabelEnum.STATE, properties);
                        if (status != TitanOperationStatus.OK) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create edge. Status is {}", status);
-                               result =  DaoStatusConverter.convertTitanStatusToStorageStatus(status);
+                               result = DaoStatusConverter.convertTitanStatusToStorageStatus(status);
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = StorageOperationStatus.OK;
                }
                return result;
        }
-       
-       private StorageOperationStatus handleRelationsUponCertification(GraphVertex toscaElement, GraphVertex modifier, GraphVertex owner) {
+
+       private StorageOperationStatus handleRelationsUponCertification(GraphVertex toscaElement, GraphVertex modifier, GraphVertex owner) {
 
                StorageOperationStatus result = null;
                TitanOperationStatus status = titanDao.replaceEdgeLabel(owner.getVertex(), toscaElement.getVertex(), EdgeLabelEnum.STATE, EdgeLabelEnum.LAST_STATE);
                if (status != TitanOperationStatus.OK) {
                        result = DaoStatusConverter.convertTitanStatusToStorageStatus(status);
                }
-               if(result == null){
+               if (result == null) {
                        Map<EdgePropertyEnum, Object> properties = new EnumMap<>(EdgePropertyEnum.class);
                        properties.put(EdgePropertyEnum.STATE, LifecycleStateEnum.CERTIFICATION_IN_PROGRESS);
                        status = titanDao.createEdge(modifier, toscaElement, EdgeLabelEnum.STATE, properties);
                        if (status != TitanOperationStatus.OK) {
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"failed to create edge. Status is {}", status);
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "failed to create edge. Status is {}", status);
                                result = DaoStatusConverter.convertTitanStatusToStorageStatus(status);
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = StorageOperationStatus.OK;
                }
                return result;
        }
-       
+
        private Either<Vertex, StorageOperationStatus> findLastCertifiedToscaElementVertex(GraphVertex toscaElement) {
                return findLastCertifiedToscaElementVertexRecursively(toscaElement.getVertex());
        }
 
        private Either<Vertex, StorageOperationStatus> findLastCertifiedToscaElementVertexRecursively(Vertex vertex) {
-               if(isCertifiedVersion((String)vertex.property(GraphPropertyEnum.VERSION.getProperty()).value())){
+               if (isCertifiedVersion((String) vertex.property(GraphPropertyEnum.VERSION.getProperty()).value())) {
                        return Either.left(vertex);
                }
                Iterator<Edge> edgeIter = vertex.edges(Direction.IN, EdgeLabelEnum.VERSION.name());
-               if(!edgeIter.hasNext()){
+               if (!edgeIter.hasNext()) {
                        return Either.right(StorageOperationStatus.NOT_FOUND);
                }
                return findLastCertifiedToscaElementVertexRecursively(edgeIter.next().outVertex());
@@ -748,131 +778,350 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
 
        private boolean isCertifiedVersion(String version) {
                String[] versionParts = version.split(VERSION_DELIMETER_REGEXP);
-               if(Integer.parseInt(versionParts[0]) > 0 && Integer.parseInt(versionParts[1]) == 0){
+               if (Integer.parseInt(versionParts[0]) > 0 && Integer.parseInt(versionParts[1]) == 0) {
                        return true;
                }
                return false;
        }
 
        private StorageOperationStatus updateOldToscaElementBeforeUndoCheckout(Vertex previousVersionToscaElement) {
-               
+
                StorageOperationStatus result = StorageOperationStatus.OK;
                String previousVersion = (String) previousVersionToscaElement.property(GraphPropertyEnum.VERSION.getProperty()).value();
                if (!previousVersion.endsWith(".0")) {
-                       try{
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.TRACE, "Going to update vertex of previous version of tosca element",
-                                               previousVersionToscaElement.property(GraphPropertyEnum.NORMALIZED_NAME.getProperty()));
-                               
+                       try {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.TRACE, "Going to update vertex of previous version of tosca element", previousVersionToscaElement.property(GraphPropertyEnum.NORMALIZED_NAME.getProperty()));
+
                                Map<String, Object> propertiesToUpdate = new HashMap<>();
                                propertiesToUpdate.put(GraphPropertyEnum.IS_HIGHEST_VERSION.getProperty(), true);
-                               Map<String, Object> jsonMetadataMap =
-                                               JsonParserUtils.parseToJson((String)previousVersionToscaElement.property(GraphPropertyEnum.METADATA.getProperty()).value());
+                               Map<String, Object> jsonMetadataMap = JsonParserUtils.parseToJson((String) previousVersionToscaElement.property(GraphPropertyEnum.METADATA.getProperty()).value());
                                jsonMetadataMap.put(GraphPropertyEnum.IS_HIGHEST_VERSION.getProperty(), true);
                                propertiesToUpdate.put(GraphPropertyEnum.METADATA.getProperty(), JsonParserUtils.jsonToString(jsonMetadataMap));
-                               
+
                                titanDao.setVertexProperties(previousVersionToscaElement, propertiesToUpdate);
-                               
+
                                Iterator<Edge> edgesIter = previousVersionToscaElement.edges(Direction.IN, EdgeLabelEnum.LAST_STATE.name());
-                               if(!edgesIter.hasNext()){
+                               if (!edgesIter.hasNext()) {
                                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to fetch last modifier vertex for tosca element {}. ", previousVersionToscaElement.property(GraphPropertyEnum.NORMALIZED_NAME.getProperty()));
                                        result = StorageOperationStatus.NOT_FOUND;
                                } else {
                                        Edge lastStateEdge = edgesIter.next();
                                        Vertex lastModifier = lastStateEdge.outVertex();
-                                       TitanOperationStatus replaceRes =
-                                                       titanDao.replaceEdgeLabel(lastModifier, previousVersionToscaElement, lastStateEdge, EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE);
+                                       TitanOperationStatus replaceRes = titanDao.replaceEdgeLabel(lastModifier, previousVersionToscaElement, lastStateEdge, EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE);
                                        if (replaceRes != TitanOperationStatus.OK) {
-                                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to replace label from {} to {}. status = {}",  EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE, replaceRes);
-                                               result =  StorageOperationStatus.INCONSISTENCY;
+                                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to replace label from {} to {}. status = {}", EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE, replaceRes);
+                                               result = StorageOperationStatus.INCONSISTENCY;
                                                if (replaceRes != TitanOperationStatus.INVALID_ID) {
                                                        result = DaoStatusConverter.convertTitanStatusToStorageStatus(replaceRes);
                                                }
                                        }
                                }
-                       } catch (Exception e){
+                       } catch (Exception e) {
                                CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during update previous tosca element {} before undo checkout. {} ", e.getMessage());
                        }
                }
                return result;
        }
+
        private StorageOperationStatus updatePreviousVersion(GraphVertex toscaElementVertex, GraphVertex ownerVertex) {
                StorageOperationStatus result = null;
                String ownerId = (String) ownerVertex.getMetadataProperty(GraphPropertyEnum.USERID);
                String toscaElementId = toscaElementVertex.getUniqueId();
-               if(!toscaElementVertex.getMetadataProperty(GraphPropertyEnum.STATE).equals(LifecycleStateEnum.CERTIFIED.name())){
+               if (!toscaElementVertex.getMetadataProperty(GraphPropertyEnum.STATE).equals(LifecycleStateEnum.CERTIFIED.name())) {
                        toscaElementVertex.addMetadataProperty(GraphPropertyEnum.IS_HIGHEST_VERSION, false);
                        Either<GraphVertex, TitanOperationStatus> updateVertexRes = titanDao.updateVertex(toscaElementVertex);
                        if (updateVertexRes.isRight()) {
                                TitanOperationStatus titatStatus = updateVertexRes.right().value();
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,
-                                               "Failed to update tosca element vertex {}. Status is  {}", toscaElementVertex.getUniqueId(), titatStatus);
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to update tosca element vertex {}. Status is  {}", toscaElementVertex.getUniqueId(), titatStatus);
                                result = DaoStatusConverter.convertTitanStatusToStorageStatus(titatStatus);
                        }
                        Either<Edge, TitanOperationStatus> deleteEdgeRes = null;
-                       if(result == null){
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.TRACE,"Going to replace edge with label {} to label {} from {} to {}. ",
-                                               EdgeLabelEnum.STATE , EdgeLabelEnum.LAST_STATE, ownerId, toscaElementId);
-                               
+                       if (result == null) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.TRACE, "Going to replace edge with label {} to label {} from {} to {}. ", EdgeLabelEnum.STATE, EdgeLabelEnum.LAST_STATE, ownerId, toscaElementId);
+
                                deleteEdgeRes = titanDao.deleteEdge(ownerVertex, toscaElementVertex, EdgeLabelEnum.STATE);
-                               if(deleteEdgeRes.isRight()){
+                               if (deleteEdgeRes.isRight()) {
                                        TitanOperationStatus titanStatus = deleteEdgeRes.right().value();
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,
-                                                       "Failed to delete edge with label {} from {} to {}. Status is {} ",
-                                                       EdgeLabelEnum.STATE , EdgeLabelEnum.LAST_STATE, ownerId, toscaElementId, titanStatus);
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete edge with label {} from {} to {}. Status is {} ", EdgeLabelEnum.STATE, EdgeLabelEnum.LAST_STATE, ownerId, toscaElementId, titanStatus);
                                        if (!titanStatus.equals(TitanOperationStatus.INVALID_ID)) {
                                                result = DaoStatusConverter.convertTitanStatusToStorageStatus(titanStatus);
-                                       } else{
+                                       } else {
                                                result = StorageOperationStatus.INCONSISTENCY;
                                        }
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                TitanOperationStatus createEdgeRes = titanDao.createEdge(ownerVertex.getVertex(), toscaElementVertex.getVertex(), EdgeLabelEnum.LAST_STATE, deleteEdgeRes.left().value());
-                               if(createEdgeRes != TitanOperationStatus.OK){
+                               if (createEdgeRes != TitanOperationStatus.OK) {
                                        result = DaoStatusConverter.convertTitanStatusToStorageStatus(createEdgeRes);
                                }
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = StorageOperationStatus.OK;
                }
                return result;
        }
-       
-       private Either<ToscaElement, StorageOperationStatus> cloneToscaElementForCheckout(GraphVertex toscaElementVertex,       GraphVertex modifierVertex) {
-               
+
+       private Either<ToscaElement, StorageOperationStatus> cloneToscaElementForCheckout(GraphVertex toscaElementVertex, GraphVertex modifierVertex) {
+
                Either<ToscaElement, StorageOperationStatus> result = null;
                Either<GraphVertex, StorageOperationStatus> cloneResult = null;
                ToscaElementOperation operation = getToscaElementOperation(toscaElementVertex.getLabel());
                // check if component with the next version doesn't exist.
                Iterator<Edge> nextVersionComponentIter = toscaElementVertex.getVertex().edges(Direction.OUT, EdgeLabelEnum.VERSION.name());
-               if(nextVersionComponentIter != null && nextVersionComponentIter.hasNext()){
+               if (nextVersionComponentIter != null && nextVersionComponentIter.hasNext()) {
                        String fetchedVersion = (String) nextVersionComponentIter.next().inVertex().property(GraphPropertyEnum.VERSION.getProperty()).value();
                        String fetchedName = (String) nextVersionComponentIter.next().inVertex().property(GraphPropertyEnum.NORMALIZED_NAME.getProperty()).value();
                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to checkout component {} with version {}. The component with name {} and version {} was fetched from graph as existing following version. ",
                                        toscaElementVertex.getMetadataProperty(GraphPropertyEnum.NORMALIZED_NAME).toString(), toscaElementVertex.getMetadataProperty(GraphPropertyEnum.VERSION).toString(), fetchedName, fetchedVersion);
                        result = Either.right(StorageOperationStatus.ENTITY_ALREADY_EXISTS);
                }
-               if(result == null){
+               if (result == null) {
                        cloneResult = operation.cloneToscaElement(toscaElementVertex, cloneGraphVertexForCheckout(toscaElementVertex, modifierVertex), modifierVertex);
-                       if(cloneResult.isRight()){
+                       if (cloneResult.isRight()) {
                                result = Either.right(cloneResult.right().value());
                        }
                }
+               GraphVertex clonedVertex = null;
                if (result == null) {
+                       clonedVertex = cloneResult.left().value();
                        TitanOperationStatus status = titanDao.createEdge(toscaElementVertex.getVertex(), cloneResult.left().value().getVertex(), EdgeLabelEnum.VERSION, new HashMap<>());
                        if (status != TitanOperationStatus.OK) {
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create edge with label {} from vertex {} to tosca element vertex {} on graph. Status is {}. ", EdgeLabelEnum.VERSION, toscaElementVertex.getMetadataProperty(GraphPropertyEnum.NORMALIZED_NAME),
-                                               cloneResult.left().value().getMetadataProperty(GraphPropertyEnum.NORMALIZED_NAME), status);
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create edge with label {} from vertex {} to tosca element vertex {} on graph. Status is {}. ", EdgeLabelEnum.VERSION,
+                                               toscaElementVertex.getMetadataProperty(GraphPropertyEnum.NORMALIZED_NAME), cloneResult.left().value().getMetadataProperty(GraphPropertyEnum.NORMALIZED_NAME), status);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = operation.getToscaElement(cloneResult.left().value().getUniqueId());
+                       if (result.isRight()) {
+                               return result;
+                       }
+
+                       ToscaElement toscaElement = result.left().value();
+                       if (toscaElement.getToscaType() == ToscaElementTypeEnum.TopologyTemplate) {
+                               result = handleFixTopologyTemplate(toscaElementVertex, result, operation, clonedVertex, toscaElement);
+                       }
+               }
+               return result;
+       }
+
+       private Either<ToscaElement, StorageOperationStatus> handleFixTopologyTemplate(GraphVertex toscaElementVertex, Either<ToscaElement, StorageOperationStatus> result, ToscaElementOperation operation, GraphVertex clonedVertex,
+                       ToscaElement toscaElement) {
+               TopologyTemplate topologyTemplate = (TopologyTemplate) toscaElement;
+               Map<String, MapPropertiesDataDefinition> instInputs = topologyTemplate.getInstInputs();
+               Map<String, MapGroupsDataDefinition> instGroups = topologyTemplate.getInstGroups();
+               Map<String, MapArtifactDataDefinition> instArtifactsMap = topologyTemplate.getInstanceArtifacts();
+               Map<String, ToscaElement> origCompMap = new HashMap<>();
+               if (instInputs == null) {
+                       instInputs = new HashMap<>();
+               }
+               if (instGroups == null) {
+                       instGroups = new HashMap<>();
+               }
+               if (instArtifactsMap == null) {
+                       instArtifactsMap = new HashMap<>();
+               }
+               Map<String, ComponentInstanceDataDefinition> instancesMap = topologyTemplate.getComponentInstances();
+               boolean isAddInstGroup = instGroups == null || instGroups.isEmpty();
+               boolean needUpdateComposition = false;
+
+               if (instancesMap != null && !instancesMap.isEmpty()) {
+                       for (ComponentInstanceDataDefinition vfInst : instancesMap.values()) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "vfInst name is {} . OriginType {}. ", vfInst.getName(), vfInst.getOriginType());
+                               if (vfInst.getOriginType().name().equals(OriginTypeEnum.VF.name())) {
+                                       collectInstanceInputAndGroups(instInputs, instGroups, instArtifactsMap, origCompMap, isAddInstGroup, vfInst, clonedVertex);
+                               }
+                               needUpdateComposition = needUpdateComposition || fixToscaComponentName(vfInst, origCompMap);
+                               if(needUpdateComposition){
+                                       instancesMap.put(vfInst.getUniqueId(), vfInst);
+                               }
+                       }
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "before add to graph instInputs {}  instGroups {} needUpdateComposition {}", instInputs, instGroups, needUpdateComposition);
+                       if (!instInputs.isEmpty()) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "before add inst inputs {} ", instInputs == null ? 0 : instInputs.size());
+                               GraphVertex toscaDataVertex = null;
+                               Either<GraphVertex, TitanOperationStatus> instInpVertexEither = titanDao.getChildVertex(toscaElementVertex, EdgeLabelEnum.INST_INPUTS, JsonParseFlagEnum.ParseJson);
+                               if (instInpVertexEither.isLeft()) {
+                                       toscaDataVertex = instInpVertexEither.left().value();
+                               }
+
+                               StorageOperationStatus status = handleToscaData(clonedVertex, VertexTypeEnum.INST_INPUTS, EdgeLabelEnum.INST_INPUTS, toscaDataVertex, instInputs);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to update instance inputs . Status is {}. ", status);
+                                       result = Either.right(status);
+                                       return result;
+                               }
+
+                       }
+                       if (!instGroups.isEmpty()) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "before add inst groups {} ", instGroups == null ? 0 : instGroups.size());
+                               GraphVertex toscaDataVertex = null;
+                               Either<GraphVertex, TitanOperationStatus> instGrVertexEither = titanDao.getChildVertex(toscaElementVertex, EdgeLabelEnum.INST_GROUPS, JsonParseFlagEnum.ParseJson);
+                               if (instGrVertexEither.isLeft()) {
+                                       toscaDataVertex = instGrVertexEither.left().value();
+                               }
+
+                               StorageOperationStatus status = handleToscaData(clonedVertex, VertexTypeEnum.INST_GROUPS, EdgeLabelEnum.INST_GROUPS, toscaDataVertex, instGroups);
+                               if (status != StorageOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to update instance group . Status is {}. ", status);
+                                       result = Either.right(status);
+                                       return result;
+                               }
+
+                       }
+                       if (needUpdateComposition) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "before update Instances ");
+                               Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) clonedVertex.getJson();
+                               CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
+                               compositionDataDefinition.setComponentInstances(instancesMap);
+                               Either<GraphVertex, TitanOperationStatus> updateElement = titanDao.updateVertex(clonedVertex);
+                               if (updateElement.isRight()) {
+                                       TitanOperationStatus status = updateElement.right().value();
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to update instances on metadata vertex . Status is {}. ", status);
+                                       result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
+                                       return result;
+                               }
+                       }
+
+                       result = operation.getToscaElement(clonedVertex.getUniqueId());
+
+               } else {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "RI map empty on component {}", toscaElement.getUniqueId());
                }
                return result;
        }
 
+       private boolean fixToscaComponentName(ComponentInstanceDataDefinition vfInst, Map<String, ToscaElement> origCompMap) {
+               if (vfInst.getToscaComponentName() == null || vfInst.getToscaComponentName().isEmpty()) {
+                       String ciUid = vfInst.getUniqueId();
+                       String origCompUid = vfInst.getComponentUid();
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "fixToscaComponentName:: Ri id {} . origin component id is {}. type is{} ", ciUid, origCompUid, vfInst.getOriginType());
+                       ToscaElement origComp = null;
+                       if (!origCompMap.containsKey(origCompUid)) {
+                               Either<ToscaElement, StorageOperationStatus> origCompEither;
+                               if (vfInst.getOriginType() == null || vfInst.getOriginType().name().equals(OriginTypeEnum.VF.name())) {
+                                       origCompEither = topologyTemplateOperation.getToscaElement(origCompUid);
+                               }else{
+                                       origCompEither = nodeTypeOperation.getToscaElement(origCompUid);
+                               }
+                               if (origCompEither.isRight()) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to find orig component {} . Status is {}. ", origCompEither.right().value());
+                                       return false;
+                               }
+                               origComp =  origCompEither.left().value();
+                               origCompMap.put(origCompUid, origComp);
+                       } else {
+                               origComp = origCompMap.get(origCompUid);
+                       }
+                       String toscaName = (String) origComp.getMetadataValue(JsonPresentationFields.TOSCA_RESOURCE_NAME);
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Origin component id is {}. toscaName {}", origCompUid, toscaName);
+                       vfInst.setToscaComponentName(toscaName);
+                       return true;
+               }
+               return false;
+       }
+
+       private void collectInstanceInputAndGroups(Map<String, MapPropertiesDataDefinition> instInputs, Map<String, MapGroupsDataDefinition> instGroups, Map<String, MapArtifactDataDefinition> instArtifactsMap, Map<String, ToscaElement> origCompMap,
+                       boolean isAddInstGroup, ComponentInstanceDataDefinition vfInst, GraphVertex clonedVertex) {
+               String ciUid = vfInst.getUniqueId();
+               String origCompUid = vfInst.getComponentUid();
+               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "collectInstanceInputAndGroups:: Ri id {} . origin component id is {}. ", ciUid, origCompUid);
+               TopologyTemplate origComp = null;
+               if (!origCompMap.containsKey(origCompUid)) {
+                       Either<ToscaElement, StorageOperationStatus> origCompEither = topologyTemplateOperation.getToscaElement(origCompUid);
+                       if (origCompEither.isRight()) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to find orig component {} . Status is {}. ", origCompEither.right().value());
+                               return;
+                       }
+                       origComp = (TopologyTemplate) origCompEither.left().value();
+                       origCompMap.put(origCompUid, origComp);
+               } else {
+                       origComp = (TopologyTemplate) origCompMap.get(origCompUid);
+               }
+               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Orig component {}. ", origComp.getUniqueId());
+
+               Map<String, PropertyDataDefinition> origInputs = origComp.getInputs();
+               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Orig component inputs size {}. ", origInputs == null ? 0 : origInputs.size());
+               if (origInputs != null) {
+                       if (!instInputs.containsKey(ciUid)) {
+                               MapPropertiesDataDefinition instProperties = new MapPropertiesDataDefinition(origInputs);
+                               instInputs.put(ciUid, instProperties);
+                       } else {
+
+                               MapPropertiesDataDefinition instInputMap = instInputs.get(ciUid);
+                               Map<String, PropertyDataDefinition> instProp = instInputMap.getMapToscaDataDefinition();
+                               origInputs.forEach((propName, propMap) -> {
+                                       if (!instProp.containsKey(propName)) {
+                                               instProp.put(propName, propMap);
+                                       }
+                               });
+                       }
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "ComponentInstanseInputs {}. ", instInputs.get(ciUid));
+               }
+
+               if (isAddInstGroup) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "before create group instance. ");
+                       List<GroupDataDefinition> filteredGroups = null;
+
+                       
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "check vf groups before filter. Size is {} ", filteredGroups == null ? 0 : filteredGroups.size());
+                       if (origComp.getGroups() != null && !origComp.getGroups().isEmpty()) {
+                               filteredGroups = origComp.getGroups().values().stream().filter(g -> g.getType().equals(VF_MODULE)).collect(Collectors.toList());
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "check vf groups . Size is {} ", filteredGroups == null ? 0 : filteredGroups.size());
+                       }
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "check vf groups after filter. Size is {} ", filteredGroups == null ? 0 : filteredGroups.size());
+                       if (CollectionUtils.isNotEmpty(filteredGroups)) {
+                               MapArtifactDataDefinition instArifacts = null;
+                               if(!instArtifactsMap.containsKey(ciUid)){
+                               
+                                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "istance artifacts not found ");
+                                               
+                                               Map<String, ArtifactDataDefinition> deploymentArtifacts = origComp.getDeploymentArtifacts();
+                                               
+                                               
+                                               instArifacts = new MapArtifactDataDefinition(deploymentArtifacts);
+                                                addToscaDataDeepElementsBlockToToscaElement(clonedVertex, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, instArifacts, ciUid);
+                                               
+                                                instArtifactsMap.put(ciUid, instArifacts);
+                                               
+                               }else{
+                                       instArifacts = instArtifactsMap.get(ciUid);
+                               }
+                                       
+                               if(instArifacts != null){
+                                       Map<String, ArtifactDataDefinition> instDeplArtifMap = instArifacts.getMapToscaDataDefinition();
+                               
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "check group dep artifacts. Size is {} ", instDeplArtifMap == null ? 0 : instDeplArtifMap.values().size());
+                                       Map<String, GroupInstanceDataDefinition> groupInstanceToCreate = new HashMap<>();
+                                       for(GroupDataDefinition group:filteredGroups){
+                                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "create new groupInstance  {} ", group.getName());
+                                               GroupInstanceDataDefinition groupInstance = buildGroupInstanceDataDefinition(group, vfInst);
+                                               List<String> artifactsUid = new ArrayList<>();
+                                               List<String> artifactsId = new ArrayList<>();
+                                               for (ArtifactDataDefinition artifact : instDeplArtifMap.values()) {
+                                                       //CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "create new groupInstance  {} ", artifact.getA);
+                                                       Optional<String> op = group.getArtifacts().stream().filter(p -> p.equals(artifact.getGeneratedFromId())).findAny();
+                                                       if (op.isPresent()) {
+                                                               artifactsUid.add(artifact.getArtifactUUID());
+                                                               artifactsId.add(artifact.getUniqueId());
+                                                               
+                                                       }
+                                               }
+                                               groupInstance.setGroupInstanceArtifacts(artifactsId);
+                                               groupInstance.setGroupInstanceArtifactsUuid(artifactsUid);
+                                               groupInstanceToCreate.put(groupInstance.getName(), groupInstance);
+                                       }
+                                       if (MapUtils.isNotEmpty(groupInstanceToCreate)) {
+                                               instGroups.put(vfInst.getUniqueId(), new MapGroupsDataDefinition(groupInstanceToCreate));
+       
+                                       }
+                               }
+                       }
+               }
+       }
+
        private GraphVertex cloneGraphVertexForCheckout(GraphVertex toscaElementVertex, GraphVertex modifierVertex) {
                GraphVertex nextVersionToscaElementVertex = new GraphVertex();
                String uniqueId = UniqueIdBuilder.buildComponentUniqueId();
@@ -881,11 +1130,11 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                nextVersionToscaElementVertex.setUniqueId(uniqueId);
                nextVersionToscaElementVertex.setLabel(toscaElementVertex.getLabel());
                nextVersionToscaElementVertex.setType(toscaElementVertex.getType());
-               
+
                nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.UNIQUE_ID, uniqueId);
                nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.COMPONENT_TYPE, nextVersionToscaElementVertex.getType().name());
                String nextVersion = getNextVersion((String) toscaElementVertex.getMetadataProperty(GraphPropertyEnum.VERSION));
-               if(isFirstCheckoutAfterCertification(nextVersion)){
+               if (isFirstCheckoutAfterCertification(nextVersion)) {
                        nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.UUID, IdBuilderUtils.generateUUID());
                }
                nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.VERSION, nextVersion);
@@ -895,7 +1144,7 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                if (toscaElementVertex.getType() == ComponentTypeEnum.SERVICE && toscaElementVertex.getMetadataProperty(GraphPropertyEnum.STATE).equals(LifecycleStateEnum.CERTIFIED.name())) {
                        nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.DISTRIBUTION_STATUS, DistributionStatusEnum.DISTRIBUTION_NOT_APPROVED.getValue());
                }
-               if(!MapUtils.isEmpty(toscaElementVertex.getMetadataJson())){
+               if (!MapUtils.isEmpty(toscaElementVertex.getMetadataJson())) {
                        nextVersionToscaElementVertex.setMetadataJson(new HashMap<String, Object>(toscaElementVertex.getMetadataJson()));
                        nextVersionToscaElementVertex.updateMetadataJsonWithCurrentMetadataProperties();
                }
@@ -904,73 +1153,70 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                nextVersionToscaElementVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, currTime);
                nextVersionToscaElementVertex.setJsonMetadataField(JsonPresentationFields.USER_ID_CREATOR, modifierVertex.getUniqueId());
                nextVersionToscaElementVertex.setJsonMetadataField(JsonPresentationFields.USER_ID_LAST_UPDATER, modifierVertex.getUniqueId());
-               if(toscaElementVertex.getType() == ComponentTypeEnum.SERVICE) {
+               if (toscaElementVertex.getType() == ComponentTypeEnum.SERVICE) {
                        nextVersionToscaElementVertex.setJsonMetadataField(JsonPresentationFields.CONFORMANCE_LEVEL, ConfigurationManager.getConfigurationManager().getConfiguration().getToscaConformanceLevel());
                }
-               
-               if(!MapUtils.isEmpty(toscaElementVertex.getJson())){
+
+               if (!MapUtils.isEmpty(toscaElementVertex.getJson())) {
                        nextVersionToscaElementVertex.setJson(new HashMap<String, ToscaDataDefinition>(toscaElementVertex.getJson()));
                }
                return nextVersionToscaElementVertex;
        }
-       
+
        private Either<GraphVertex, StorageOperationStatus> cloneToscaElementForCertify(GraphVertex toscaElementVertex, GraphVertex modifierVertex, Integer majorVersion) {
                Either<GraphVertex, StorageOperationStatus> result;
                Either<List<GraphVertex>, StorageOperationStatus> deleteResult = null;
                GraphVertex clonedToscaElement = null;
                result = getToscaElementOperation(toscaElementVertex.getLabel()).cloneToscaElement(toscaElementVertex, cloneGraphVertexForCertify(toscaElementVertex, modifierVertex, majorVersion), modifierVertex);
-               if(result.isRight()){
+               if (result.isRight()) {
                        CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to clone tosca element {} for certification. Sattus is {}. ", toscaElementVertex.getUniqueId(), result.right().value());
-               }
-               else{
+               } else {
                        clonedToscaElement = result.left().value();
                        deleteResult = deleteAllPreviousNotCertifiedVersions(toscaElementVertex);
-                       if(deleteResult.isRight()){
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete all previous npt certified versions of tosca element {}. Status is {}. ",
-                                               toscaElementVertex.getUniqueId(), deleteResult.right().value());
+                       if (deleteResult.isRight()) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete all previous npt certified versions of tosca element {}. Status is {}. ", toscaElementVertex.getUniqueId(), deleteResult.right().value());
                                result = Either.right(deleteResult.right().value());
                        }
                }
-               if(result.isLeft()){
+               if (result.isLeft()) {
                        result = handlePreviousVersionRelation(clonedToscaElement, deleteResult.left().value(), majorVersion);
                }
                return result;
        }
-       
+
        private Either<GraphVertex, StorageOperationStatus> handlePreviousVersionRelation(GraphVertex clonedToscaElement, List<GraphVertex> deletedVersions, Integer majorVersion) {
                Either<GraphVertex, StorageOperationStatus> result = null;
                Vertex previousCertifiedToscaElement = null;
-               if(majorVersion > 0){
-                       List<GraphVertex> firstMinorVersionVertex = deletedVersions.stream()
-                                       .filter(gv->getMinorVersion((String)gv.getMetadataProperty(GraphPropertyEnum.VERSION)) == 1).collect(Collectors.toList());
-                       
-                       if(CollectionUtils.isEmpty(firstMinorVersionVertex)){
+               if (majorVersion > 0) {
+                       List<GraphVertex> firstMinorVersionVertex = deletedVersions.stream().filter(gv -> getMinorVersion((String) gv.getMetadataProperty(GraphPropertyEnum.VERSION)) == 1).collect(Collectors.toList());
+
+                       if (CollectionUtils.isEmpty(firstMinorVersionVertex)) {
                                result = Either.right(StorageOperationStatus.NOT_FOUND);
                        } else {
                                previousCertifiedToscaElement = getPreviousCertifiedToscaElement(firstMinorVersionVertex.get(0));
-                               if(previousCertifiedToscaElement == null){
+                               if (previousCertifiedToscaElement == null) {
                                        result = Either.right(StorageOperationStatus.NOT_FOUND);
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                TitanOperationStatus status = titanDao.createEdge(previousCertifiedToscaElement, clonedToscaElement.getVertex(), EdgeLabelEnum.VERSION, new HashMap<>());
                                if (status != TitanOperationStatus.OK) {
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create edge with label {} from vertex {} to tosca element vertex {} on graph. Status is {}. ", EdgeLabelEnum.VERSION, previousCertifiedToscaElement.property(GraphPropertyEnum.UNIQUE_ID.getProperty()),
-                                                       clonedToscaElement.getUniqueId(), status);
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to create edge with label {} from vertex {} to tosca element vertex {} on graph. Status is {}. ", EdgeLabelEnum.VERSION,
+                                                       previousCertifiedToscaElement.property(GraphPropertyEnum.UNIQUE_ID.getProperty()), clonedToscaElement.getUniqueId(), status);
                                        result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
                                }
                        }
                }
-               if(result == null){
+               if (result == null) {
                        result = Either.left(clonedToscaElement);
                }
                return result;
        }
 
        private Vertex getPreviousCertifiedToscaElement(GraphVertex graphVertex) {
-               
+
                Iterator<Edge> edges = graphVertex.getVertex().edges(Direction.IN, EdgeLabelEnum.VERSION.name());
-               if(edges.hasNext()){
+               if (edges.hasNext()) {
                        return edges.next().outVertex();
                }
                return null;
@@ -978,7 +1224,7 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
 
        private Either<List<GraphVertex>, StorageOperationStatus> deleteAllPreviousNotCertifiedVersions(GraphVertex toscaElementVertex) {
                Either<List<GraphVertex>, StorageOperationStatus> result = null;
-               
+
                ToscaElementOperation operation = getToscaElementOperation(toscaElementVertex.getLabel());
                List<GraphVertex> previosVersions = null;
                Object uuid = toscaElementVertex.getMetadataProperty(GraphPropertyEnum.UUID);
@@ -987,28 +1233,28 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                        Map<GraphPropertyEnum, Object> properties = new HashMap<>();
                        properties.put(GraphPropertyEnum.UUID, uuid);
                        properties.put(GraphPropertyEnum.NAME, componentName);
-                       Either<List<GraphVertex>, TitanOperationStatus> getToscaElementsRes= titanDao.getByCriteria(toscaElementVertex.getLabel(), properties, JsonParseFlagEnum.ParseMetadata);
+                       Either<List<GraphVertex>, TitanOperationStatus> getToscaElementsRes = titanDao.getByCriteria(toscaElementVertex.getLabel(), properties, JsonParseFlagEnum.ParseMetadata);
                        if (getToscaElementsRes.isRight()) {
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getToscaElementsRes.right().value()));
                        }
-                       if(result == null){
+                       if (result == null) {
                                previosVersions = getToscaElementsRes.left().value();
                                Either<Boolean, StorageOperationStatus> deleteResult = markToscaElementsAsDeleted(operation, getToscaElementsRes.left().value());
-                               if(deleteResult.isRight()){
+                               if (deleteResult.isRight()) {
                                        result = Either.right(deleteResult.right().value());
                                }
                        }
-                       if(result == null){
+                       if (result == null) {
                                result = Either.left(previosVersions);
                        }
-               } catch (Exception e){
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Exception occured during deleteng all tosca elements by UUID {} and name {}. {} ", uuid, componentName, e.getMessage());
+               } catch (Exception e) {
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Exception occured during deleteng all tosca elements by UUID {} and name {}. {} ", uuid, componentName, e.getMessage());
                }
                return result;
        }
 
        private GraphVertex cloneGraphVertexForCertify(GraphVertex toscaElementVertex, GraphVertex modifierVertex, Integer majorVersion) {
-               
+
                GraphVertex nextVersionToscaElementVertex = new GraphVertex();
                String uniqueId = IdBuilderUtils.generateUniqueId();
                Map<GraphPropertyEnum, Object> metadataProperties = new HashMap<>(toscaElementVertex.getMetadataProperties());
@@ -1016,7 +1262,7 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                nextVersionToscaElementVertex.setUniqueId(uniqueId);
                nextVersionToscaElementVertex.setLabel(toscaElementVertex.getLabel());
                nextVersionToscaElementVertex.setType(toscaElementVertex.getType());
-               
+
                nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.UNIQUE_ID, uniqueId);
                nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.COMPONENT_TYPE, nextVersionToscaElementVertex.getType().name());
                nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.VERSION, (majorVersion + 1) + VERSION_DELIMETER + "0");
@@ -1026,20 +1272,20 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
                nextVersionToscaElementVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, null);
                nextVersionToscaElementVertex.setJsonMetadataField(JsonPresentationFields.USER_ID_CREATOR, modifierVertex.getUniqueId());
                nextVersionToscaElementVertex.setJsonMetadataField(JsonPresentationFields.USER_ID_LAST_UPDATER, modifierVertex.getUniqueId());
-               
+
                if (toscaElementVertex.getType() == ComponentTypeEnum.SERVICE && toscaElementVertex.getMetadataProperty(GraphPropertyEnum.STATE).equals(LifecycleStateEnum.CERTIFIED)) {
                        nextVersionToscaElementVertex.addMetadataProperty(GraphPropertyEnum.DISTRIBUTION_STATUS, DistributionStatusEnum.DISTRIBUTION_NOT_APPROVED.getValue());
                }
-               if(!MapUtils.isEmpty(toscaElementVertex.getMetadataJson())){
+               if (!MapUtils.isEmpty(toscaElementVertex.getMetadataJson())) {
                        nextVersionToscaElementVertex.setMetadataJson(new HashMap<String, Object>(toscaElementVertex.getMetadataJson()));
                        nextVersionToscaElementVertex.updateMetadataJsonWithCurrentMetadataProperties();
                }
-               if(!MapUtils.isEmpty(toscaElementVertex.getJson())){
+               if (!MapUtils.isEmpty(toscaElementVertex.getJson())) {
                        nextVersionToscaElementVertex.setJson(new HashMap<String, ToscaDataDefinition>(toscaElementVertex.getJson()));
                }
                return nextVersionToscaElementVertex;
        }
-       
+
        private ComponentParametersView buildComponentParametersViewAfterCheckin() {
                ComponentParametersView componentParametersView = new ComponentParametersView();
                componentParametersView.disableAll();
@@ -1050,141 +1296,141 @@ public class ToscaElementLifecycleOperation extends BaseOperation {
        private Either<GraphVertex, StorageOperationStatus> checkinToscaELement(LifecycleStateEnum currState, GraphVertex toscaElementVertex, GraphVertex ownerVertex, GraphVertex modifierVertex, LifecycleStateEnum nextState) {
                Either<GraphVertex, StorageOperationStatus> updateRelationsRes;
                Either<GraphVertex, StorageOperationStatus> result = changeStateToCheckedIn(currState, toscaElementVertex, ownerVertex, modifierVertex);
-               if(result.isLeft()) {
+               if (result.isLeft()) {
                        toscaElementVertex.addMetadataProperty(GraphPropertyEnum.STATE, nextState.name());
                        toscaElementVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
                        result = updateToscaElementVertexMetadataPropertiesAndJson(toscaElementVertex);
                }
-               if(result.isLeft()){
+               if (result.isLeft()) {
                        updateRelationsRes = updateLastModifierEdge(toscaElementVertex, ownerVertex, modifierVertex);
-                       if(updateRelationsRes.isRight()){
+                       if (updateRelationsRes.isRight()) {
                                result = Either.right(updateRelationsRes.right().value());
                        }
                }
                return result;
        }
 
-       private Either<GraphVertex, StorageOperationStatus> updateToscaElementVertexMetadataPropertiesAndJson(GraphVertex toscaElementVertex){
-               
+       private Either<GraphVertex, StorageOperationStatus> updateToscaElementVertexMetadataPropertiesAndJson(GraphVertex toscaElementVertex) {
+
                Either<GraphVertex, StorageOperationStatus> result;
-               
+
                Either<GraphVertex, TitanOperationStatus> updateVertexRes = titanDao.updateVertex(toscaElementVertex);
                if (updateVertexRes.isRight()) {
                        TitanOperationStatus titatStatus = updateVertexRes.right().value();
-                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to update state of tosca element vertex {} metadata. Status is  {}", toscaElementVertex.getUniqueId(), titatStatus);
+                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to update state of tosca element vertex {} metadata. Status is  {}", toscaElementVertex.getUniqueId(), titatStatus);
                        result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(titatStatus));
                } else {
                        result = Either.left(updateVertexRes.left().value());
                }
                return result;
        }
-       
+
        private Either<GraphVertex, StorageOperationStatus> changeStateToCheckedIn(LifecycleStateEnum currState, GraphVertex toscaElementVertex, GraphVertex ownerVertex, GraphVertex modifierVertex) {
                Either<GraphVertex, StorageOperationStatus> result = null;
                LifecycleStateEnum nextState = LifecycleStateEnum.NOT_CERTIFIED_CHECKIN;
                String faileToUpdateStateMsg = "Failed to update state of tosca element {}. Status is  {}";
-               
+
                if (currState == LifecycleStateEnum.READY_FOR_CERTIFICATION) {
-                       //In case of cancel "ready for certification" remove last state edge with "STATE" property equals to "NOT_CERTIFIED_CHECKIN" 
+                       // In case of cancel "ready for certification" remove last state edge with "STATE" property equals to "NOT_CERTIFIED_CHECKIN"
                        Map<GraphPropertyEnum, Object> vertexProperties = new HashMap<>();
                        vertexProperties.put(GraphPropertyEnum.STATE, nextState);
-                       Either<Edge, TitanOperationStatus>  deleteResult = titanDao.deleteBelongingEdgeByCriteria(toscaElementVertex, EdgeLabelEnum.LAST_STATE, vertexProperties);
+                       Either<Edge, TitanOperationStatus> deleteResult = titanDao.deleteBelongingEdgeByCriteria(toscaElementVertex, EdgeLabelEnum.LAST_STATE, vertexProperties);
                        if (deleteResult.isRight()) {
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,faileToUpdateStateMsg, toscaElementVertex.getUniqueId(), deleteResult.right().value());
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"failed to update last state relation");
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, faileToUpdateStateMsg, toscaElementVertex.getUniqueId(), deleteResult.right().value());
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "failed to update last state relation");
                                result = Either.right(StorageOperationStatus.INCONSISTENCY);
                        }
                }
-               if(result == null) {
-                       //Remove CHECKOUT relation
+               if (result == null) {
+                       // Remove CHECKOUT relation
                        Either<Edge, TitanOperationStatus> deleteEdgeResult = titanDao.deleteEdge(ownerVertex, toscaElementVertex, EdgeLabelEnum.STATE);
                        if (deleteEdgeResult.isRight()) {
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,faileToUpdateStateMsg, toscaElementVertex.getUniqueId());
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, faileToUpdateStateMsg, toscaElementVertex.getUniqueId());
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(deleteEdgeResult.right().value()));
                        }
                }
-               if(result == null) {
-                       //Create CHECKIN relation
+               if (result == null) {
+                       // Create CHECKIN relation
                        Map<EdgePropertyEnum, Object> edgeProperties = new HashMap<>();
                        edgeProperties.put(EdgePropertyEnum.STATE, nextState);
                        TitanOperationStatus createEdgeRes = titanDao.createEdge(modifierVertex.getVertex(), toscaElementVertex.getVertex(), EdgeLabelEnum.STATE, edgeProperties);
                        if (createEdgeRes != TitanOperationStatus.OK) {
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,faileToUpdateStateMsg, toscaElementVertex.getUniqueId());
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, faileToUpdateStateMsg, toscaElementVertex.getUniqueId());
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(createEdgeRes));
                        }
                }
-               if(result == null) {
+               if (result == null) {
                        result = Either.left(toscaElementVertex);
                }
                return result;
        }
 
-       private Either<GraphVertex, StorageOperationStatus> updateLastModifierEdge( GraphVertex toscaElementVertex, GraphVertex ownerVertex, GraphVertex modifierVertex) {
+       private Either<GraphVertex, StorageOperationStatus> updateLastModifierEdge(GraphVertex toscaElementVertex, GraphVertex ownerVertex, GraphVertex modifierVertex) {
                Either<GraphVertex, StorageOperationStatus> result = null;
-               if(!modifierVertex.getMetadataProperties().get(GraphPropertyEnum.USERID).equals(ownerVertex.getMetadataProperties().get(GraphPropertyEnum.USERID))){
+               if (!modifierVertex.getMetadataProperties().get(GraphPropertyEnum.USERID).equals(ownerVertex.getMetadataProperties().get(GraphPropertyEnum.USERID))) {
                        Either<Edge, TitanOperationStatus> deleteEdgeRes = titanDao.deleteEdge(ownerVertex, toscaElementVertex, EdgeLabelEnum.LAST_MODIFIER);
-                       if(deleteEdgeRes.isRight()){
-                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to delete last modifier {} to tosca element {}. Edge type is {}", ownerVertex.getUniqueId(), ownerVertex.getUniqueId(), EdgeLabelEnum.LAST_MODIFIER);
+                       if (deleteEdgeRes.isRight()) {
+                               CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to delete last modifier {} to tosca element {}. Edge type is {}", ownerVertex.getUniqueId(), ownerVertex.getUniqueId(), EdgeLabelEnum.LAST_MODIFIER);
                                result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(deleteEdgeRes.right().value()));
                        }
-                       if(result == null) {
+                       if (result == null) {
                                TitanOperationStatus createEdgeRes = titanDao.createEdge(modifierVertex.getVertex(), toscaElementVertex.getVertex(), EdgeLabelEnum.LAST_MODIFIER, new HashMap<>());
-                               
-                               if(createEdgeRes != TitanOperationStatus.OK){
-                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG,"Failed to associate user {} to component {}. Edge type is {}", modifierVertex.getUniqueId(), ownerVertex.getUniqueId(), EdgeLabelEnum.LAST_MODIFIER);
+
+                               if (createEdgeRes != TitanOperationStatus.OK) {
+                                       CommonUtility.addRecordToLog(logger, LogLevelEnum.DEBUG, "Failed to associate user {} to component {}. Edge type is {}", modifierVertex.getUniqueId(), ownerVertex.getUniqueId(), EdgeLabelEnum.LAST_MODIFIER);
                                        result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(createEdgeRes));
-                               } else{
+                               } else {
                                        result = Either.left(modifierVertex);
                                }
                        }
-               } else{
+               } else {
                        result = Either.left(ownerVertex);
                }
                return result;
        }
 
-       private Map<String, ImmutablePair<GraphPropertyEnum ,JsonParseFlagEnum>> prepareParametersToGetVerticesForCheckin(String toscaElementId, String modifierId,     String ownerId) {
-               Map<String, ImmutablePair<GraphPropertyEnum ,JsonParseFlagEnum>> verticesToGetParameters = new HashMap<>();
+       private Map<String, ImmutablePair<GraphPropertyEnum, JsonParseFlagEnum>> prepareParametersToGetVerticesForCheckin(String toscaElementId, String modifierId, String ownerId) {
+               Map<String, ImmutablePair<GraphPropertyEnumJsonParseFlagEnum>> verticesToGetParameters = new HashMap<>();
                verticesToGetParameters.put(toscaElementId, new ImmutablePair<>(GraphPropertyEnum.UNIQUE_ID, JsonParseFlagEnum.ParseMetadata));
-               verticesToGetParameters.put(modifierId, new ImmutablePair<>(GraphPropertyEnum.USERID,JsonParseFlagEnum.NoParse));
-               verticesToGetParameters.put(ownerId, new ImmutablePair<>(GraphPropertyEnum.USERID,JsonParseFlagEnum.NoParse));
+               verticesToGetParameters.put(modifierId, new ImmutablePair<>(GraphPropertyEnum.USERID, JsonParseFlagEnum.NoParse));
+               verticesToGetParameters.put(ownerId, new ImmutablePair<>(GraphPropertyEnum.USERID, JsonParseFlagEnum.NoParse));
                return verticesToGetParameters;
        }
-       
-       private  Map<String, ImmutablePair<GraphPropertyEnum ,JsonParseFlagEnum>> prepareParametersToGetVerticesForRequestCertification(String toscaElementId, String modifierId,       String ownerId) {
-               Map<String, ImmutablePair<GraphPropertyEnum ,JsonParseFlagEnum>> verticesToGetParameters = new HashMap<>();
+
+       private Map<String, ImmutablePair<GraphPropertyEnum, JsonParseFlagEnum>> prepareParametersToGetVerticesForRequestCertification(String toscaElementId, String modifierId, String ownerId) {
+               Map<String, ImmutablePair<GraphPropertyEnumJsonParseFlagEnum>> verticesToGetParameters = new HashMap<>();
                verticesToGetParameters.put(toscaElementId, new ImmutablePair<>(GraphPropertyEnum.UNIQUE_ID, JsonParseFlagEnum.ParseAll));
-               verticesToGetParameters.put(modifierId, new ImmutablePair<>(GraphPropertyEnum.USERID,JsonParseFlagEnum.NoParse));
-               verticesToGetParameters.put(ownerId, new ImmutablePair<>(GraphPropertyEnum.USERID,JsonParseFlagEnum.NoParse));
+               verticesToGetParameters.put(modifierId, new ImmutablePair<>(GraphPropertyEnum.USERID, JsonParseFlagEnum.NoParse));
+               verticesToGetParameters.put(ownerId, new ImmutablePair<>(GraphPropertyEnum.USERID, JsonParseFlagEnum.NoParse));
                return verticesToGetParameters;
        }
-       
-       private Map<String, ImmutablePair<GraphPropertyEnum ,JsonParseFlagEnum>> prepareParametersToGetVerticesForCheckout(String toscaElementId, String modifierId,    String ownerId) {
-                Map<String, ImmutablePair<GraphPropertyEnum ,JsonParseFlagEnum>> verticesToGetParameters = new HashMap<>();
+
+       private Map<String, ImmutablePair<GraphPropertyEnum, JsonParseFlagEnum>> prepareParametersToGetVerticesForCheckout(String toscaElementId, String modifierId, String ownerId) {
+               Map<String, ImmutablePair<GraphPropertyEnum, JsonParseFlagEnum>> verticesToGetParameters = new HashMap<>();
                verticesToGetParameters.put(toscaElementId, new ImmutablePair<>(GraphPropertyEnum.UNIQUE_ID, JsonParseFlagEnum.ParseAll));
-               verticesToGetParameters.put(modifierId, new ImmutablePair<>(GraphPropertyEnum.USERID,JsonParseFlagEnum.NoParse));
-               verticesToGetParameters.put(ownerId, new ImmutablePair<>(GraphPropertyEnum.USERID,JsonParseFlagEnum.NoParse));
+               verticesToGetParameters.put(modifierId, new ImmutablePair<>(GraphPropertyEnum.USERID, JsonParseFlagEnum.NoParse));
+               verticesToGetParameters.put(ownerId, new ImmutablePair<>(GraphPropertyEnum.USERID, JsonParseFlagEnum.NoParse));
                return verticesToGetParameters;
        }
-       
+
        private String getNextVersion(String currVersion) {
                String[] versionParts = currVersion.split(VERSION_DELIMETER_REGEXP);
                Integer minorVersion = Integer.parseInt(versionParts[1]) + 1;
                return versionParts[0] + VERSION_DELIMETER + minorVersion;
        }
-       
+
        private Integer getMinorVersion(String version) {
                String[] versionParts = version.split(VERSION_DELIMETER_REGEXP);
                return Integer.parseInt(versionParts[1]);
        }
-       
+
        private Integer getMajorVersion(String version) {
                String[] versionParts = version.split(VERSION_DELIMETER_REGEXP);
                return Integer.parseInt(versionParts[0]);
        }
-       
+
        private boolean isFirstCheckoutAfterCertification(String version) {
-               if(Integer.parseInt(version.split(VERSION_DELIMETER_REGEXP)[0]) != 0 && Integer.parseInt(version.split(VERSION_DELIMETER_REGEXP)[1]) == 1){
+               if (Integer.parseInt(version.split(VERSION_DELIMETER_REGEXP)[0]) != 0 && Integer.parseInt(version.split(VERSION_DELIMETER_REGEXP)[1]) == 1) {
                        return true;
                }
                return false;